Mercurial > repos > blastem
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)