# HG changeset patch # User Michael Pavone # Date 1707455149 28800 # Node ID b8d894f7f9dc8b04d58def4473f51822baf31320 # Parent 2ee25a487e2b7f65973bd097b30d8cdf673a395f Fix playback of ADPCM blocks with an odd number of samples diff -r 2ee25a487e2b -r b8d894f7f9dc pico_pcm.c --- 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; }