[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