diff segacd.c @ 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 f8b5142c06aa
children cde4ea2b4929
line wrap: on
line diff
--- 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);