Mercurial > repos > blastem
diff pico_pcm.c @ 2435:b8d894f7f9dc
Fix playback of ADPCM blocks with an odd number of samples
author | Michael Pavone <pavone@retrodev.com> |
---|---|
date | Thu, 08 Feb 2024 21:05:49 -0800 |
parents | 2ee25a487e2b |
children | f50b9ed42ebd |
line wrap: on
line diff
--- a/pico_pcm.c Thu Feb 08 20:44:44 2024 -0800 +++ b/pico_pcm.c Thu Feb 08 21:05:49 2024 -0800 @@ -157,11 +157,13 @@ case 0x40: pcm->rate = (cmd & 0x3F); pcm->samples = 256; + pcm->nibble_store = 0; break; case 0x80: pcm->rate = (cmd & 0x3F); //FIXME: this probably does not happen instantly pcm->samples = pcm_fifo_read(pcm) + 1; + pcm->nibble_store = 0; break; case 0xC0: //FIXME: this probably does not happen instantly @@ -170,6 +172,7 @@ // Is this correct behavior if it does work? pcm->counter = pcm->rate = pcm_fifo_read(pcm) & 0x3F; pcm->samples = (pcm_fifo_read(pcm) + 1) * ((cmd & 7) + 1); + pcm->nibble_store = 0; break; } } @@ -194,11 +197,17 @@ void pico_pcm_data_write(pico_pcm *pcm, uint16_t value) { + if (pcm->fifo_read == pcm->fifo_write) { + puts("ADPCM fifo overflow"); + } if (pcm->fifo_read == sizeof(pcm->fifo)) { pcm->fifo_read = pcm->fifo_write; } pcm->fifo[pcm->fifo_write++] = value >> 8; pcm->fifo_write &= sizeof(pcm->fifo)-1; + if (pcm->fifo_read == pcm->fifo_write) { + puts("ADPCM fifo overflow"); + } pcm->fifo[pcm->fifo_write++] = value; pcm->fifo_write &= sizeof(pcm->fifo)-1; }