comparison 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
comparison
equal deleted inserted replaced
2383:ee0cc07dc406 2384:03e6ac327ba0
1564 {0xFF8000, 0xFF8200, 0x0001FF, .read_16 = sub_gate_read16, .write_16 = sub_gate_write16, .read_8 = sub_gate_read8, .write_8 = sub_gate_write8}, 1564 {0xFF8000, 0xFF8200, 0x0001FF, .read_16 = sub_gate_read16, .write_16 = sub_gate_write16, .read_8 = sub_gate_read8, .write_8 = sub_gate_write8},
1565 {0xFD0000, 0xFE0000, 0xFFFFFF, .read_16 = laseractive_read16, .write_16 = laseractive_write16, .read_8 = laseractive_read8, .write_8 = laseractive_write8} 1565 {0xFD0000, 0xFE0000, 0xFFFFFF, .read_16 = laseractive_read16, .write_16 = laseractive_write16, .read_8 = laseractive_read8, .write_8 = laseractive_write8}
1566 }; 1566 };
1567 1567
1568 segacd_context *cd = calloc(sizeof(segacd_context), 1); 1568 segacd_context *cd = calloc(sizeof(segacd_context), 1);
1569 cd->speed_percent = 100;
1569 uint32_t firmware_size; 1570 uint32_t firmware_size;
1570 uint8_t region = force_region; 1571 uint8_t region = force_region;
1571 if (!region) { 1572 if (!region) {
1572 char * def_region = tern_find_path_default(config, "system\0default_region\0", (tern_val){.ptrval = "U"}, TVAL_PTR).ptrval; 1573 char * def_region = tern_find_path_default(config, "system\0default_region\0", (tern_val){.ptrval = "U"}, TVAL_PTR).ptrval;
1573 if (!info->regions || (info->regions & translate_region_char(toupper(*def_region)))) { 1574 if (!info->regions || (info->regions & translate_region_char(toupper(*def_region)))) {
1841 1842
1842 void segacd_set_speed_percent(segacd_context *cd, uint32_t percent) 1843 void segacd_set_speed_percent(segacd_context *cd, uint32_t percent)
1843 { 1844 {
1844 uint32_t scd_cycle = gen_cycle_to_scd(cd->genesis->ym->current_cycle, cd->genesis); 1845 uint32_t scd_cycle = gen_cycle_to_scd(cd->genesis->ym->current_cycle, cd->genesis);
1845 scd_run(cd, scd_cycle); 1846 scd_run(cd, scd_cycle);
1846 uint32_t new_clock = ((uint64_t)SCD_MCLKS * (uint64_t)percent) / 100; 1847 cd->speed_percent = percent;
1848 uint32_t new_clock = ((uint64_t)SCD_MCLKS * (uint64_t)cd->speed_percent) / 100;
1847 rf5c164_adjust_master_clock(&cd->pcm, new_clock); 1849 rf5c164_adjust_master_clock(&cd->pcm, new_clock);
1848 cdd_fader_set_speed_percent(&cd->fader, percent); 1850 cdd_fader_set_speed_percent(&cd->fader, percent);
1851 }
1852
1853 void segacd_config_updated(segacd_context *cd)
1854 {
1855 //sample rate may have changed
1856 uint32_t new_clock = ((uint64_t)SCD_MCLKS * (uint64_t)cd->speed_percent) / 100;
1857 rf5c164_adjust_master_clock(&cd->pcm, new_clock);
1858 cdd_fader_set_speed_percent(&cd->fader, cd->speed_percent);
1849 } 1859 }
1850 1860
1851 static uint8_t *copy_chars(uint8_t *dst, uint8_t *str) 1861 static uint8_t *copy_chars(uint8_t *dst, uint8_t *str)
1852 { 1862 {
1853 size_t len = strlen(str); 1863 size_t len = strlen(str);