changeset 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
files pico_pcm.c
diffstat 1 files changed, 9 insertions(+), 0 deletions(-) [+]
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;
 }