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