changeset 2384:03e6ac327ba0

Handle changes to sample rate while content is running
author Michael Pavone <pavone@retrodev.com>
date Tue, 21 Nov 2023 20:47:11 -0800
parents ee0cc07dc406
children ce9f5a42c481
files genesis.c segacd.c segacd.h sms.c
diffstat 4 files changed, 21 insertions(+), 1 deletions(-) [+]
line wrap: on
line diff
--- a/genesis.c	Tue Nov 21 20:32:00 2023 -0800
+++ b/genesis.c	Tue Nov 21 20:47:11 2023 -0800
@@ -1806,6 +1806,12 @@
 	genesis_context *gen = (genesis_context *)system;
 	setup_io_devices(config, &system->info, &gen->io);
 	set_audio_config(gen);
+	//sample rate may have changed
+	ym_adjust_master_clock(gen->ym, gen->master_clock);
+	psg_adjust_master_clock(gen->psg, gen->master_clock);
+	if (gen->expansion) {
+		segacd_config_updated(gen->expansion);
+	}
 }
 
 static void start_vgm_log(system_header *system, char *filename)
--- a/segacd.c	Tue Nov 21 20:32:00 2023 -0800
+++ b/segacd.c	Tue Nov 21 20:47:11 2023 -0800
@@ -1566,6 +1566,7 @@
 	};
 
 	segacd_context *cd = calloc(sizeof(segacd_context), 1);
+	cd->speed_percent = 100;
 	uint32_t firmware_size;
 	uint8_t region = force_region;
 	if (!region) {
@@ -1843,11 +1844,20 @@
 {
 	uint32_t scd_cycle = gen_cycle_to_scd(cd->genesis->ym->current_cycle, cd->genesis);
 	scd_run(cd, scd_cycle);
-	uint32_t new_clock = ((uint64_t)SCD_MCLKS * (uint64_t)percent) / 100;
+	cd->speed_percent = percent;
+	uint32_t new_clock = ((uint64_t)SCD_MCLKS * (uint64_t)cd->speed_percent) / 100;
 	rf5c164_adjust_master_clock(&cd->pcm, new_clock);
 	cdd_fader_set_speed_percent(&cd->fader, percent);
 }
 
+void segacd_config_updated(segacd_context *cd)
+{
+	//sample rate may have changed
+	uint32_t new_clock = ((uint64_t)SCD_MCLKS * (uint64_t)cd->speed_percent) / 100;
+	rf5c164_adjust_master_clock(&cd->pcm, new_clock);
+	cdd_fader_set_speed_percent(&cd->fader, cd->speed_percent);
+}
+
 static uint8_t *copy_chars(uint8_t *dst, uint8_t *str)
 {
 	size_t len = strlen(str);
--- a/segacd.h	Tue Nov 21 20:32:00 2023 -0800
+++ b/segacd.h	Tue Nov 21 20:47:11 2023 -0800
@@ -25,6 +25,7 @@
 	uint32_t        graphics_cycle;
 	uint32_t        base;
 	uint32_t        m68k_pc;
+	uint32_t        speed_percent;
 	uint32_t        graphics_x;
 	uint32_t        graphics_y;
 	uint32_t        graphics_dx;
@@ -69,5 +70,6 @@
 void segacd_serialize(segacd_context *cd, serialize_buffer *buf, uint8_t all);
 void segacd_register_section_handlers(segacd_context *cd, deserialize_buffer *buf);
 void segacd_format_bram(uint8_t *buffer, size_t size);
+void segacd_config_updated(segacd_context *cd);
 
 #endif //SEGACD_H_
--- a/sms.c	Tue Nov 21 20:32:00 2023 -0800
+++ b/sms.c	Tue Nov 21 20:47:11 2023 -0800
@@ -683,6 +683,8 @@
 {
 	sms_context *sms = (sms_context *)system;
 	setup_io_devices(config, &system->info, &sms->io);
+	//sample rate may have changed
+	psg_adjust_master_clock(sms->psg, sms->master_clock);
 }
 
 static void toggle_debug_view(system_header *system, uint8_t debug_view)