# HG changeset patch # User Michael Pavone # Date 1700628431 28800 # Node ID 03e6ac327ba05e874cf07aeaeeb660c647506d96 # Parent ee0cc07dc4064a5eeec927d23938e2a596653a3d Handle changes to sample rate while content is running diff -r ee0cc07dc406 -r 03e6ac327ba0 genesis.c --- 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) diff -r ee0cc07dc406 -r 03e6ac327ba0 segacd.c --- 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); diff -r ee0cc07dc406 -r 03e6ac327ba0 segacd.h --- 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_ diff -r ee0cc07dc406 -r 03e6ac327ba0 sms.c --- 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)