Skip to content
Open
Show file tree
Hide file tree
Changes from 14 commits
Commits
Show all changes
36 commits
Select commit Hold shift + click to select a range
4681f27
add ohos project
May 8, 2026
4d2d21b
support ohos project
May 13, 2026
400face
fix: system info
May 13, 2026
f26cbdb
add json file
May 13, 2026
94af617
support vulkan
May 13, 2026
bb285e7
fix overlay
May 14, 2026
3040740
filter cores dir
May 14, 2026
8356240
init load info.zip
May 14, 2026
834df47
fix notice background color
May 15, 2026
6497dc1
fix touch control
May 17, 2026
6db3702
ohos: handle key event
May 18, 2026
46a9610
ohos: follows the C89 standard
May 18, 2026
4aff504
ohos: fix use vulkan_ohos.h
May 18, 2026
a0eff9d
ohos: fix enumeration value 'CAMERA_OHOS' not handled in switch [-We…
May 18, 2026
6f451c4
ohos: add native event handle
May 18, 2026
993a6f0
ohos: support fullScreen
May 18, 2026
6bdfedc
ohos: add screen orientarion
May 18, 2026
6b935b3
ohos: exit save config
May 18, 2026
003b647
ohos: menu_scale_factor 0.75
May 19, 2026
fea1e86
ohos: fix aspectRatio
May 19, 2026
2cd2abc
ohos: modify default menu setting
May 19, 2026
3c847f3
ohos: fix touch
May 19, 2026
d3a9978
ohos: fix touch control
May 24, 2026
afb9b38
ohos: fix joypad
May 24, 2026
7b0655c
ohos: Remove non-standard formatting.
May 28, 2026
0dfa41e
ohos: README.md add HarmonyOS
May 28, 2026
b1046d9
Merge commit '90d631c6107818a37661e5b3f3830d0431641f5b' into ohos
May 28, 2026
8dac88d
ohos: fix build
May 28, 2026
d8b7598
Merge commit '4a0c27429ff989752604473104a3bf1adfb0f3a0' into ohos
Jun 27, 2026
2de8781
ohos: fix StopApp
Jun 27, 2026
c38c668
ohos: fix input driver
Jun 27, 2026
d1e8a86
ohos: add ohaudio driver
Jun 15, 2026
5062de3
ohos: fix ohaudio driver
Jun 15, 2026
a6126cc
ohos: fix vulkan video width height
Jun 15, 2026
e62e674
ohos: fix ohaudio
Jun 27, 2026
6c33ada
ohos: fix cheevos
Jun 27, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
58 changes: 49 additions & 9 deletions audio/drivers/opensl.c
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,10 @@
#ifdef ANDROID
#include <SLES/OpenSLES_Android.h>
#endif
#ifdef __OHOS__
#include <SLES/OpenSLES_OpenHarmony.h>
#include "string.h"
#endif

#include <rthreads/rthreads.h>

Expand All @@ -43,7 +47,12 @@ typedef struct sl

SLObjectItf output_mix;
SLObjectItf buffer_queue_object;
#ifdef ANDROID
SLAndroidSimpleBufferQueueItf buffer_queue;
#endif
#ifdef __OHOS__
SLOHBufferQueueItf buffer_queue;
#endif
SLPlayItf player;

slock_t *lock;
Expand All @@ -56,13 +65,23 @@ typedef struct sl
bool nonblock;
bool is_paused;
} sl_t;

static void opensl_callback(SLAndroidSimpleBufferQueueItf bq, void *ctx)
#ifdef ANDROID
static void opensl_callback( SLAndroidSimpleBufferQueueItf bq, void *ctx)
{
sl_t *sl = (sl_t*)ctx;
__sync_fetch_and_sub(&sl->buffered_blocks, 1);
scond_signal(sl->cond);
}
#else
static void opensl_callback(SLOHBufferQueueItf bq, void *ctx, SLuint32 size)
{
sl_t *sl = (sl_t*)ctx;
__sync_fetch_and_sub(&sl->buffered_blocks, 1);
scond_signal(sl->cond);
}
#endif



#define GOTO_IF_FAIL(x) do { \
if ((res = (x)) != SL_RESULT_SUCCESS) \
Expand Down Expand Up @@ -105,17 +124,26 @@ static void *sl_init(const char *device, unsigned rate, unsigned latency,
SLDataFormat_PCM fmt_pcm = {0};
SLDataSource audio_src = {0};
SLDataSink audio_sink = {0};
#ifdef ANDROID
SLDataLocator_AndroidSimpleBufferQueue loc_bufq = {0};
#endif
#ifdef OHOS
SLDataLocator_BufferQueue loc_bufq = {0};
#endif
SLDataLocator_OutputMix loc_outmix = {0};
SLresult res = 0;
#ifdef __ANDROID__
SLInterfaceID id = SL_IID_ANDROIDSIMPLEBUFFERQUEUE;
#endif
#ifdef OHOS
SLInterfaceID id = SL_IID_OH_BUFFERQUEUE;
#endif
SLboolean req = SL_BOOLEAN_TRUE;
sl_t *sl = (sl_t*)calloc(1, sizeof(sl_t));

(void)device;
if (!sl)
goto error;

RARCH_LOG("[OpenSL] Requested audio latency: %u ms.\n", latency);

GOTO_IF_FAIL(slCreateEngine(&sl->engine_object, 0, NULL, 0, NULL, NULL));
Expand All @@ -132,10 +160,13 @@ static void *sl_init(const char *device, unsigned rate, unsigned latency,

sl->buf_count = (latency * 4 * rate + 500) / 1000;
sl->buf_count = (sl->buf_count + sl->buf_size / 2) / sl->buf_size;

if (sl->buf_count < 2)
sl->buf_count = 2;

#ifdef __OHOS__
// ohos support max 3
sl->buf_count = 3;
#endif
sl->buffer = (uint8_t**)calloc(sizeof(uint8_t*), sl->buf_count);
if (!sl->buffer)
goto error;
Expand All @@ -160,8 +191,12 @@ static void *sl_init(const char *device, unsigned rate, unsigned latency,

audio_src.pLocator = &loc_bufq;
audio_src.pFormat = &fmt_pcm;

#ifdef __ANDROID__
loc_bufq.locatorType = SL_DATALOCATOR_ANDROIDSIMPLEBUFFERQUEUE;
#endif
#ifdef __OHOS__
loc_bufq.locatorType = SL_DATALOCATOR_BUFFERQUEUE;
#endif
loc_bufq.numBuffers = sl->buf_count;

loc_outmix.locatorType = SL_DATALOCATOR_OUTPUTMIX;
Expand All @@ -173,9 +208,13 @@ static void *sl_init(const char *device, unsigned rate, unsigned latency,
&audio_src, &audio_sink,
1, &id, &req));
GOTO_IF_FAIL(SLObjectItf_Realize(sl->buffer_queue_object, SL_BOOLEAN_FALSE));

#ifdef __ANDROID__
GOTO_IF_FAIL(SLObjectItf_GetInterface(sl->buffer_queue_object, SL_IID_ANDROIDSIMPLEBUFFERQUEUE,
&sl->buffer_queue));
#else
GOTO_IF_FAIL(SLObjectItf_GetInterface(sl->buffer_queue_object, SL_IID_OH_BUFFERQUEUE,
&sl->buffer_queue));
#endif

sl->cond = scond_new();
sl->lock = slock_new();
Expand All @@ -186,8 +225,9 @@ static void *sl_init(const char *device, unsigned rate, unsigned latency,
sl->buffered_blocks = sl->buf_count;
sl->buffer_index = 0;

for (i = 0; i < sl->buf_count; i++)
(*sl->buffer_queue)->Enqueue(sl->buffer_queue, sl->buffer[i], sl->buf_size);
for (i = 0; i < sl->buf_count; i++)
(*sl->buffer_queue)->Enqueue(sl->buffer_queue, sl->buffer[i], sl->buf_size);


GOTO_IF_FAIL(SLObjectItf_GetInterface(sl->buffer_queue_object, SL_IID_PLAY, &sl->player));
GOTO_IF_FAIL(SLPlayItf_SetPlayState(sl->player, SL_PLAYSTATE_PLAYING));
Expand Down
8 changes: 7 additions & 1 deletion config.def.h
Original file line number Diff line number Diff line change
Expand Up @@ -1204,7 +1204,7 @@

/* Desired audio latency in milliseconds. Might not be honored
* if driver can't provide given latency. */
#if defined(ANDROID) || defined(RETROFW) || defined(MIYOO) || (defined(EMSCRIPTEN) && defined(HAVE_AL))
#if defined(ANDROID) || defined (OHOS) || defined(RETROFW) || defined(MIYOO) || (defined(EMSCRIPTEN) && defined(HAVE_AL))
/* For most Android devices, 64ms is way too low. */
#define DEFAULT_OUT_LATENCY 128
#define DEFAULT_IN_LATENCY 128
Expand All @@ -1213,8 +1213,14 @@
#define DEFAULT_IN_LATENCY 64
#endif

#ifdef __OHOS__
/* OHOS has a bug that blocks the thread */
#define DEFAULT_AUDIO_SYNC false
#else

/* Will sync audio. (recommended) */
#define DEFAULT_AUDIO_SYNC true
#endif

/* Audio rate control. */
#if !defined(RARCH_CONSOLE)
Expand Down
20 changes: 19 additions & 1 deletion configuration.c
Original file line number Diff line number Diff line change
Expand Up @@ -217,7 +217,8 @@ enum input_driver_enum
INPUT_RWEBINPUT,
INPUT_DOS,
INPUT_WINRAW,
INPUT_NULL
INPUT_NULL,
INPUT_OHOS
};

enum joypad_driver_enum
Expand All @@ -236,6 +237,7 @@ enum joypad_driver_enum
JOYPAD_UDEV,
JOYPAD_LINUXRAW,
JOYPAD_ANDROID,
JOYPAD_OHOS,
JOYPAD_SDL,
JOYPAD_SDL_DINGUX,
JOYPAD_DOS,
Expand All @@ -252,6 +254,7 @@ enum camera_driver_enum
CAMERA_V4L2 = JOYPAD_NULL + 1,
CAMERA_RWEBCAM,
CAMERA_ANDROID,
CAMERA_OHOS,
CAMERA_AVFOUNDATION,
CAMERA_PIPEWIRE,
CAMERA_FFMPEG,
Expand Down Expand Up @@ -448,6 +451,8 @@ static const enum video_driver_enum VIDEO_DEFAULT_DRIVER = VIDEO_METAL;
static const enum video_driver_enum VIDEO_DEFAULT_DRIVER = VIDEO_D3D11;
#elif defined(HAVE_VITA2D)
static const enum video_driver_enum VIDEO_DEFAULT_DRIVER = VIDEO_VITA2D;
#elif defined (OHOS)
static const enum video_driver_enum VIDEO_DEFAULT_DRIVER = VIDEO_GL;
#elif defined(HAVE_OPENGL) || defined(HAVE_OPENGLES) || defined(HAVE_PSGL)
static const enum video_driver_enum VIDEO_DEFAULT_DRIVER = VIDEO_GL;
#elif defined(HAVE_OPENGL_CORE) && !defined(__HAIKU__)
Expand Down Expand Up @@ -633,6 +638,8 @@ static const enum input_driver_enum INPUT_DEFAULT_DRIVER = INPUT_XENON360;
static const enum input_driver_enum INPUT_DEFAULT_DRIVER = INPUT_XINPUT;
#elif defined(ANDROID)
static const enum input_driver_enum INPUT_DEFAULT_DRIVER = INPUT_ANDROID;
#elif defined (OHOS)
static const enum input_driver_enum INPUT_DEFAULT_DRIVER = INPUT_OHOS;
#elif defined(EMSCRIPTEN) && defined(HAVE_SDL2)
static const enum input_driver_enum INPUT_DEFAULT_DRIVER = INPUT_SDL2;
#elif defined(WEBOS) && defined(HAVE_SDL2)
Expand Down Expand Up @@ -713,6 +720,8 @@ static const enum joypad_driver_enum JOYPAD_DEFAULT_DRIVER = JOYPAD_SDL_DINGUX;
static const enum joypad_driver_enum JOYPAD_DEFAULT_DRIVER = JOYPAD_DINPUT;
#elif defined(HAVE_UDEV)
static const enum joypad_driver_enum JOYPAD_DEFAULT_DRIVER = JOYPAD_UDEV;
#elif defined(OHOS)
static const enum joypad_driver_enum JOYPAD_DEFAULT_DRIVER = JOYPAD_OHOS;
#elif defined(__linux) && !defined(ANDROID)
static const enum joypad_driver_enum JOYPAD_DEFAULT_DRIVER = JOYPAD_LINUXRAW;
#elif defined(HAVE_WINRAWINPUT)
Expand Down Expand Up @@ -741,6 +750,9 @@ static const enum camera_driver_enum CAMERA_DEFAULT_DRIVER = CAMERA_V4L2;
static const enum camera_driver_enum CAMERA_DEFAULT_DRIVER = CAMERA_RWEBCAM;
#elif defined(ANDROID)
static const enum camera_driver_enum CAMERA_DEFAULT_DRIVER = CAMERA_ANDROID;
#elif defined(__OHOS__)
// TODO
static const enum camera_driver_enum CAMERA_DEFAULT_DRIVER = CAMERA_NULL;
#elif defined(HAVE_PIPEWIRE)
static const enum camera_driver_enum CAMERA_DEFAULT_DRIVER = CAMERA_PIPEWIRE;
#elif defined(HAVE_FFMPEG)
Expand Down Expand Up @@ -1187,6 +1199,8 @@ const char *config_get_default_input(void)
{
case INPUT_ANDROID:
return "android";
case INPUT_OHOS:
return "ohos";
case INPUT_PS4:
return "ps4";
case INPUT_PS3:
Expand Down Expand Up @@ -1291,6 +1305,8 @@ const char *config_get_default_joypad(void)
return "linuxraw";
case JOYPAD_ANDROID:
return "android";
case JOYPAD_OHOS:
return "ohos";
case JOYPAD_SDL:
#ifdef HAVE_SDL2
return "sdl2";
Expand Down Expand Up @@ -1337,6 +1353,8 @@ const char *config_get_default_camera(void)
return "rwebcam";
case CAMERA_ANDROID:
return "android";
case CAMERA_OHOS:
return "ohos";
case CAMERA_AVFOUNDATION:
return "avfoundation";
case CAMERA_PIPEWIRE:
Expand Down
2 changes: 2 additions & 0 deletions deps/glslang/glslang/glslang/OSDependent/Unix/ossource.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -72,6 +72,8 @@ void OS_CleanupThreadData(void)
{
#ifdef __ANDROID__
DetachThreadLinux(NULL);
#elif defined(__OHOS__)
DetachThreadLinux(NULL);
#else
int old_cancel_state, old_cancel_type;
void *cleanupArg = NULL;
Expand Down
1 change: 0 additions & 1 deletion frontend/drivers/platform_ctr.c
Original file line number Diff line number Diff line change
Expand Up @@ -406,7 +406,6 @@ void gfxSetFramebufferInfo(gfxScreen_t screen, u8 id)
#ifdef CONSOLE_LOG
PrintConsole* ctrConsole;
#endif

static void frontend_ctr_init(void* data)
{
#ifndef IS_SALAMANDER
Expand Down
Loading
Loading