[Scummvm-git-logs] scummvm master -> 9ead6b20af05e509531def3bbdc522e6c7cbdfd4
spleen1981
noreply at scummvm.org
Sun Mar 12 12:51:52 UTC 2023
This automated email contains information about 3 new commits which have been
pushed to the 'scummvm' repo located at https://github.com/scummvm/scummvm .
Summary:
0df0eedd47 LIBRETRO: add test for retro_wrap_emulator overloading
d70071079e LIBRETRO: move init code to retro_init and cleanup
9ead6b20af LIBRETRO: rework audio buffer
Commit: 0df0eedd47fdfee68f691cd0c0985bc6c766ba37
https://github.com/scummvm/scummvm/commit/0df0eedd47fdfee68f691cd0c0985bc6c766ba37
Author: Giovanni Cascione (ing.cascione at gmail.com)
Date: 2023-03-12T13:46:32+01:00
Commit Message:
LIBRETRO: add test for retro_wrap_emulator overloading
Changed paths:
backends/platform/libretro/src/libretro-threads.cpp
diff --git a/backends/platform/libretro/src/libretro-threads.cpp b/backends/platform/libretro/src/libretro-threads.cpp
index e4966b137e9..d457121d8ab 100644
--- a/backends/platform/libretro/src/libretro-threads.cpp
+++ b/backends/platform/libretro/src/libretro-threads.cpp
@@ -81,9 +81,11 @@ static void retro_wrap_emulator(void) {
retro_exit_to_main_thread();
}
+#ifndef USE_LIBCO
static void retro_wrap_emulator(void *args) {
retro_wrap_emulator();
}
+#endif
static void retro_free_emu_thread() {
#ifdef USE_LIBCO
Commit: d70071079e40d526d9eb329f15a537c0ddf6f32b
https://github.com/scummvm/scummvm/commit/d70071079e40d526d9eb329f15a537c0ddf6f32b
Author: Giovanni Cascione (ing.cascione at gmail.com)
Date: 2023-03-12T13:49:00+01:00
Commit Message:
LIBRETRO: move init code to retro_init and cleanup
Changed paths:
backends/platform/libretro/src/libretro.cpp
diff --git a/backends/platform/libretro/src/libretro.cpp b/backends/platform/libretro/src/libretro.cpp
index 39d835cec67..cb92ae360aa 100644
--- a/backends/platform/libretro/src/libretro.cpp
+++ b/backends/platform/libretro/src/libretro.cpp
@@ -59,20 +59,7 @@ static retro_audio_sample_batch_t audio_batch_cb = NULL;
static retro_environment_t environ_cb = NULL;
static retro_input_poll_t poll_cb = NULL;
static retro_input_state_t input_cb = NULL;
-
-void retro_set_video_refresh(retro_video_refresh_t cb) {
- video_cb = cb;
-}
-void retro_set_audio_sample(retro_audio_sample_t cb) {}
-void retro_set_audio_sample_batch(retro_audio_sample_batch_t cb) {
- audio_batch_cb = cb;
-}
-void retro_set_input_poll(retro_input_poll_t cb) {
- poll_cb = cb;
-}
-void retro_set_input_state(retro_input_state_t cb) {
- input_cb = cb;
-}
+static int retro_device = RETRO_DEVICE_JOYPAD;
// System analog stick range is -0x8000 to 0x8000
#define ANALOG_RANGE 0x8000
@@ -93,52 +80,53 @@ char cmd_params_num;
int adjusted_RES_W = 0;
int adjusted_RES_H = 0;
-void retro_set_environment(retro_environment_t cb) {
- environ_cb = cb;
- bool tmp = true;
+static void update_variables(void) {
+ struct retro_variable var;
- environ_cb(RETRO_ENVIRONMENT_SET_SUPPORT_NO_GAME, &tmp);
- libretro_set_core_options(environ_cb);
-}
+ var.key = "scummvm_gamepad_cursor_speed";
+ var.value = NULL;
+ gampad_cursor_speed = 1.0f;
+ if (environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var) && var.value) {
+ gampad_cursor_speed = (float)atof(var.value);
+ }
-unsigned retro_api_version(void) {
- return RETRO_API_VERSION;
-}
+ var.key = "scummvm_gamepad_cursor_acceleration_time";
+ var.value = NULL;
+ gamepad_acceleration_time = 0.2f;
+ if (environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var) && var.value) {
+ gamepad_acceleration_time = (float)atof(var.value);
+ }
-void retro_get_system_info(struct retro_system_info *info) {
- info->library_name = CORE_NAME;
-#if defined GIT_TAG
-#define __GIT_VERSION GIT_TAG
-#elif defined GIT_HASH
-#define __GIT_VERSION GIT_HASH "-" SCUMMVM_VERSION
-#else
-#define __GIT_VERSION ""
-#endif
- info->library_version = __GIT_VERSION;
- info->valid_extensions = "scummvm";
- info->need_fullpath = true;
- info->block_extract = false;
-}
+ var.key = "scummvm_analog_response";
+ var.value = NULL;
+ analog_response_is_quadratic = false;
+ if (environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var) && var.value) {
+ if (strcmp(var.value, "quadratic") == 0)
+ analog_response_is_quadratic = true;
+ }
-void retro_get_system_av_info(struct retro_system_av_info *info) {
- info->geometry.base_width = RES_W;
- info->geometry.base_height = RES_H;
- info->geometry.max_width = RES_W;
- info->geometry.max_height = RES_H;
- info->geometry.aspect_ratio = 4.0f / 3.0f;
- info->timing.fps = 60.0;
- info->timing.sample_rate = 48000.0;
-}
+ var.key = "scummvm_analog_deadzone";
+ var.value = NULL;
+ analog_deadzone = (int)(0.15f * ANALOG_RANGE);
+ if (environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var) && var.value) {
+ analog_deadzone = (int)(atoi(var.value) * 0.01f * ANALOG_RANGE);
+ }
-void retro_init(void) {
- struct retro_log_callback log;
- if (environ_cb(RETRO_ENVIRONMENT_GET_LOG_INTERFACE, &log))
- log_cb = log.log;
- else
- log_cb = NULL;
-}
+ var.key = "scummvm_mouse_speed";
+ var.value = NULL;
+ mouse_speed = 1.0f;
+ if (environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var) && var.value) {
+ mouse_speed = (float)atof(var.value);
+ }
-void retro_deinit(void) {}
+ var.key = "scummvm_speed_hack";
+ var.value = NULL;
+ speed_hack_is_enabled = false;
+ if (environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var) && var.value) {
+ if (strcmp(var.value, "enabled") == 0)
+ speed_hack_is_enabled = true;
+ }
+}
void parse_command_params(char *cmdline) {
int j = 0;
@@ -196,77 +184,101 @@ char *dirname(char *path) {
}
#endif
-static void update_variables(void) {
- struct retro_variable var;
+#if (defined(GEKKO) && !defined(WIIU)) || defined(__CELLOS_LV2__)
+int access(const char *path, int amode) {
+ RFILE *f;
+ int mode;
- var.key = "scummvm_gamepad_cursor_speed";
- var.value = NULL;
- gampad_cursor_speed = 1.0f;
- if (environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var) && var.value) {
- gampad_cursor_speed = (float)atof(var.value);
- }
+ switch (amode) {
+ // we don't really care if a file exists but isn't readable
+ case F_OK:
+ case R_OK:
+ mode = RETRO_VFS_FILE_ACCESS_READ;
+ break;
- var.key = "scummvm_gamepad_cursor_acceleration_time";
- var.value = NULL;
- gamepad_acceleration_time = 0.2f;
- if (environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var) && var.value) {
- gamepad_acceleration_time = (float)atof(var.value);
- }
+ case W_OK:
+ mode = RETRO_VFS_FILE_ACCESS_UPDATE_EXISTING;
+ break;
- var.key = "scummvm_analog_response";
- var.value = NULL;
- analog_response_is_quadratic = false;
- if (environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var) && var.value) {
- if (strcmp(var.value, "quadratic") == 0)
- analog_response_is_quadratic = true;
+ default:
+ return -1;
}
- var.key = "scummvm_analog_deadzone";
- var.value = NULL;
- analog_deadzone = (int)(0.15f * ANALOG_RANGE);
- if (environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var) && var.value) {
- analog_deadzone = (int)(atoi(var.value) * 0.01f * ANALOG_RANGE);
- }
+ f = filestream_open(path, RETRO_VFS_FILE_ACCESS_READ, RETRO_VFS_FILE_ACCESS_HINT_NONE);
- var.key = "scummvm_mouse_speed";
- var.value = NULL;
- mouse_speed = 1.0f;
- if (environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var) && var.value) {
- mouse_speed = (float)atof(var.value);
+ if (f) {
+ filestream_close(f);
+ return 0;
}
- var.key = "scummvm_speed_hack";
- var.value = NULL;
- speed_hack_is_enabled = false;
- if (environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var) && var.value) {
- if (strcmp(var.value, "enabled") == 0)
- speed_hack_is_enabled = true;
- }
+ return -1;
}
+#endif
-static int retro_device = RETRO_DEVICE_JOYPAD;
-void retro_set_controller_port_device(unsigned port, unsigned device) {
- if (port != 0) {
- if (log_cb)
- log_cb(RETRO_LOG_WARN, "Invalid controller port %d.\n", port);
- return;
- }
+void retro_set_video_refresh(retro_video_refresh_t cb) {
+ video_cb = cb;
+}
- switch (device) {
- case RETRO_DEVICE_JOYPAD:
- case RETRO_DEVICE_MOUSE:
- retro_device = device;
- break;
- default:
- if (log_cb)
- log_cb(RETRO_LOG_WARN, "Invalid controller device class %d.\n", device);
- break;
- }
+void retro_set_audio_sample(retro_audio_sample_t cb) {}
+
+void retro_set_audio_sample_batch(retro_audio_sample_batch_t cb) {
+ audio_batch_cb = cb;
}
-bool retro_load_game(const struct retro_game_info *game) {
+void retro_set_input_poll(retro_input_poll_t cb) {
+ poll_cb = cb;
+}
+
+void retro_set_input_state(retro_input_state_t cb) {
+ input_cb = cb;
+}
+
+void retro_set_environment(retro_environment_t cb) {
+ environ_cb = cb;
+ bool tmp = true;
+
+ environ_cb(RETRO_ENVIRONMENT_SET_SUPPORT_NO_GAME, &tmp);
+ libretro_set_core_options(environ_cb);
+}
+
+unsigned retro_api_version(void) {
+ return RETRO_API_VERSION;
+}
+
+void retro_get_system_info(struct retro_system_info *info) {
+ info->library_name = CORE_NAME;
+#if defined GIT_TAG
+#define __GIT_VERSION GIT_TAG
+#elif defined GIT_HASH
+#define __GIT_VERSION GIT_HASH "-" SCUMMVM_VERSION
+#else
+#define __GIT_VERSION ""
+#endif
+ info->library_version = __GIT_VERSION;
+ info->valid_extensions = "scummvm";
+ info->need_fullpath = true;
+ info->block_extract = false;
+}
+
+void retro_get_system_av_info(struct retro_system_av_info *info) {
+ info->geometry.base_width = RES_W;
+ info->geometry.base_height = RES_H;
+ info->geometry.max_width = RES_W;
+ info->geometry.max_height = RES_H;
+ info->geometry.aspect_ratio = 4.0f / 3.0f;
+ info->timing.fps = 60.0;
+ info->timing.sample_rate = 48000.0;
+}
+
+void retro_init(void) {
const char *sysdir;
const char *savedir;
+ struct retro_log_callback log;
+
+ if (environ_cb(RETRO_ENVIRONMENT_GET_LOG_INTERFACE, &log))
+ log_cb = log.log;
+ else
+ log_cb = NULL;
update_variables();
@@ -337,7 +349,30 @@ bool retro_load_game(const struct retro_game_info *game) {
}
g_system = retroBuildOS(speed_hack_is_enabled);
+}
+
+void retro_deinit(void) {}
+void retro_set_controller_port_device(unsigned port, unsigned device) {
+ if (port != 0) {
+ if (log_cb)
+ log_cb(RETRO_LOG_WARN, "Invalid controller port %d.\n", port);
+ return;
+ }
+
+ switch (device) {
+ case RETRO_DEVICE_JOYPAD:
+ case RETRO_DEVICE_MOUSE:
+ retro_device = device;
+ break;
+ default:
+ if (log_cb)
+ log_cb(RETRO_LOG_WARN, "Invalid controller device class %d.\n", device);
+ break;
+ }
+}
+
+bool retro_load_game(const struct retro_game_info *game) {
if (!g_system) {
if (log_cb)
log_cb(RETRO_LOG_ERROR, "[scummvm] Failed to initialize platform driver.\n");
@@ -525,35 +560,3 @@ void retro_cheat_set(unsigned unused, bool unused1, const char *unused2) {}
unsigned retro_get_region(void) {
return RETRO_REGION_NTSC;
}
-
-#if (defined(GEKKO) && !defined(WIIU)) || defined(__CELLOS_LV2__)
-int access(const char *path, int amode) {
- RFILE *f;
- int mode;
-
- switch (amode) {
- // we don't really care if a file exists but isn't readable
- case F_OK:
- case R_OK:
- mode = RETRO_VFS_FILE_ACCESS_READ;
- break;
-
- case W_OK:
- mode = RETRO_VFS_FILE_ACCESS_UPDATE_EXISTING;
- break;
-
- default:
- return -1;
- }
-
- f = filestream_open(path, RETRO_VFS_FILE_ACCESS_READ, RETRO_VFS_FILE_ACCESS_HINT_NONE);
-
- if (f) {
- filestream_close(f);
- return 0;
- }
-
- return -1;
-}
-#endif
-
Commit: 9ead6b20af05e509531def3bbdc522e6c7cbdfd4
https://github.com/scummvm/scummvm/commit/9ead6b20af05e509531def3bbdc522e6c7cbdfd4
Author: Giovanni Cascione (ing.cascione at gmail.com)
Date: 2023-03-12T13:51:15+01:00
Commit Message:
LIBRETRO: rework audio buffer
Changed paths:
backends/platform/libretro/include/os.h
backends/platform/libretro/src/libretro-os.cpp
backends/platform/libretro/src/libretro.cpp
diff --git a/backends/platform/libretro/include/os.h b/backends/platform/libretro/include/os.h
index 96041ec16f3..4712f3f5579 100644
--- a/backends/platform/libretro/include/os.h
+++ b/backends/platform/libretro/include/os.h
@@ -22,6 +22,9 @@
#ifndef BACKENDS_LIBRETRO_OS_H
#define BACKENDS_LIBRETRO_OS_H
+#define SAMPLE_RATE 48000
+#define REFRESH_RATE 60
+
// Preliminary scan results
#define TEST_GAME_OK_TARGET_FOUND 0
#define TEST_GAME_OK_ID_FOUND 1
diff --git a/backends/platform/libretro/src/libretro-os.cpp b/backends/platform/libretro/src/libretro-os.cpp
index ee3bb65a5d5..dc820a7c0de 100644
--- a/backends/platform/libretro/src/libretro-os.cpp
+++ b/backends/platform/libretro/src/libretro-os.cpp
@@ -393,7 +393,7 @@ public:
#else
_overlay.create(RES_W_OVERLAY, RES_H_OVERLAY, Graphics::PixelFormat(2, 5, 5, 5, 1, 10, 5, 0, 15));
#endif
- _mixer = new Audio::MixerImpl(48000);
+ _mixer = new Audio::MixerImpl(SAMPLE_RATE);
_timerManager = new DefaultTimerManager();
_mixer->setReady(true);
diff --git a/backends/platform/libretro/src/libretro.cpp b/backends/platform/libretro/src/libretro.cpp
index cb92ae360aa..4c0b9fc9abf 100644
--- a/backends/platform/libretro/src/libretro.cpp
+++ b/backends/platform/libretro/src/libretro.cpp
@@ -80,6 +80,34 @@ char cmd_params_num;
int adjusted_RES_W = 0;
int adjusted_RES_H = 0;
+static uint32 audio_latency = 0;
+static bool audio_buffer_status_support = false;
+static bool mute=true;
+
+static bool retro_audio_buff_active = false;
+static unsigned retro_audio_buff_occupancy = 0;
+static bool retro_audio_buff_underrun = false;
+
+static uint16 fps = 0;
+static uint16 sound_len = 0; // length in samples per frame
+static size_t sound_size = 0;
+
+static int16_t *sound_buffer = NULL; // pointer to output buffer
+
+static void audio_buffer_init(uint16 sample_rate, uint16 frame_rate) {
+ fps = 100.0 * frame_rate;
+ sound_len = (sample_rate * 100 + (fps >> 1)) / fps;
+ sound_size = sound_len << 2 * sizeof(int16_t);
+ if (sound_buffer)
+ sound_buffer = (int16_t *)realloc(sound_buffer, sound_size);
+ else
+ sound_buffer = (int16_t *)malloc(sound_size);
+ if (sound_buffer)
+ memset(sound_buffer, 0, sound_size);
+ else
+ log_cb(RETRO_LOG_ERROR, "audio_buffer_init error.\n");
+}
+
static void update_variables(void) {
struct retro_variable var;
@@ -266,15 +294,15 @@ void retro_get_system_av_info(struct retro_system_av_info *info) {
info->geometry.max_width = RES_W;
info->geometry.max_height = RES_H;
info->geometry.aspect_ratio = 4.0f / 3.0f;
- info->timing.fps = 60.0;
- info->timing.sample_rate = 48000.0;
+ info->timing.fps = REFRESH_RATE;
+ info->timing.sample_rate = SAMPLE_RATE;
}
void retro_init(void) {
const char *sysdir;
const char *savedir;
- struct retro_log_callback log;
+ struct retro_log_callback log;
if (environ_cb(RETRO_ENVIRONMENT_GET_LOG_INTERFACE, &log))
log_cb = log.log;
else
@@ -348,10 +376,17 @@ void retro_init(void) {
retroSetSaveDir(".");
}
+ // Check RETRO_ENVIRONMENT_SET_AUDIO_BUFFER_STATUS_CALLBACK support
+ audio_buffer_status_support = environ_cb(RETRO_ENVIRONMENT_SET_AUDIO_BUFFER_STATUS_CALLBACK, NULL);
+
+ audio_buffer_init(SAMPLE_RATE, REFRESH_RATE);
+
g_system = retroBuildOS(speed_hack_is_enabled);
}
-void retro_deinit(void) {}
+void retro_deinit(void) {
+ free(sound_buffer);
+}
void retro_set_controller_port_device(unsigned port, unsigned device) {
if (port != 0) {
@@ -393,7 +428,7 @@ bool retro_load_game(const struct retro_game_info *game) {
retro_msg.duration = 3000;
retro_msg.msg = "";
- const char * target_file_ext = ".scummvm";
+ const char *target_file_ext = ".scummvm";
int target_file_ext_pos = strlen(game->path) - strlen(target_file_ext);
// See if we are loading a .scummvm file.
@@ -489,9 +524,9 @@ void retro_run(void) {
return;
}
- bool updated = false;
- if (environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE_UPDATE, &updated) && updated)
- update_variables();
+ // Setting RA's video or audio driver to null will disable video/audio bits,
+ int audio_video_enable = 0;
+ environ_cb(RETRO_ENVIRONMENT_GET_AUDIO_VIDEO_ENABLE, &audio_video_enable);
retro_switch_to_emu_thread();
/* Mouse */
@@ -499,27 +534,40 @@ void retro_run(void) {
poll_cb();
retroProcessMouse(input_cb, retro_device, gampad_cursor_speed, gamepad_acceleration_time, analog_response_is_quadratic, analog_deadzone, mouse_speed);
- /* Upload video: TODO: Check the CANDUPE env value */
- const Graphics::Surface &screen = getScreen();
- video_cb(screen.getPixels(), screen.w, screen.h, screen.pitch);
- /* Upload audio */
- static uint32 buf[800];
- int count = ((Audio::MixerImpl *)g_system->getMixer())->mixCallback((byte *)buf, 800 * 4);
+ /* Upload video: TODO: Check the CANDUPE env value */
+ if (audio_video_enable & 1) {
+ const Graphics::Surface &screen = getScreen();
+ video_cb(screen.getPixels(), screen.w, screen.h, screen.pitch);
+ } else {
+ //check if it's the same avoiding the call to video_cb at all
+ video_cb(NULL, 0, 0, 0); // Set to NULL to skip frame rendering
+ }
+ /* Upload audio */
+ size_t count = 0;
+ if (audio_video_enable & 2) {
+ count = ((Audio::MixerImpl *)g_system->getMixer())->mixCallback((byte *)sound_buffer, sound_size);
+ }
+ mute = count ? false : true;
#if defined(_3DS)
/* Hack: 3DS will produce static noise
* unless we manually send a zeroed
* audio buffer when no samples are
* available (i.e. when the overlay
* is shown) */
- if (count == 0) {
- memset(buf, 0, 735 * sizeof(uint32));
- audio_batch_cb((int16_t *)buf, 735);
- } else
+ if (mute) {
+ audio_buffer_init(SAMPLE_RATE, REFRESH_RATE);
+ }
#endif
- audio_batch_cb((int16_t *)buf, count);
+ audio_batch_cb(mute ? NULL : sound_buffer, count); // Set to NULL to skip sound rendering
+
+ }
+
+ bool updated = false;
+ if (environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE_UPDATE, &updated) && updated) {
+ update_variables();
}
}
More information about the Scummvm-git-logs
mailing list