comparison 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
comparison
equal deleted inserted replaced
2434:2ee25a487e2b 2435:b8d894f7f9dc
155 pcm->counter = (cmd & 0x3F) * 160; 155 pcm->counter = (cmd & 0x3F) * 160;
156 break; 156 break;
157 case 0x40: 157 case 0x40:
158 pcm->rate = (cmd & 0x3F); 158 pcm->rate = (cmd & 0x3F);
159 pcm->samples = 256; 159 pcm->samples = 256;
160 pcm->nibble_store = 0;
160 break; 161 break;
161 case 0x80: 162 case 0x80:
162 pcm->rate = (cmd & 0x3F); 163 pcm->rate = (cmd & 0x3F);
163 //FIXME: this probably does not happen instantly 164 //FIXME: this probably does not happen instantly
164 pcm->samples = pcm_fifo_read(pcm) + 1; 165 pcm->samples = pcm_fifo_read(pcm) + 1;
166 pcm->nibble_store = 0;
165 break; 167 break;
166 case 0xC0: 168 case 0xC0:
167 //FIXME: this probably does not happen instantly 169 //FIXME: this probably does not happen instantly
168 //TODO: Does repeat mode even work on this chip? 170 //TODO: Does repeat mode even work on this chip?
169 // Does it work on a uPD7759 in slave mode? 171 // Does it work on a uPD7759 in slave mode?
170 // Is this correct behavior if it does work? 172 // Is this correct behavior if it does work?
171 pcm->counter = pcm->rate = pcm_fifo_read(pcm) & 0x3F; 173 pcm->counter = pcm->rate = pcm_fifo_read(pcm) & 0x3F;
172 pcm->samples = (pcm_fifo_read(pcm) + 1) * ((cmd & 7) + 1); 174 pcm->samples = (pcm_fifo_read(pcm) + 1) * ((cmd & 7) + 1);
175 pcm->nibble_store = 0;
173 break; 176 break;
174 } 177 }
175 } 178 }
176 } 179 }
177 } 180 }
192 //TODO: update low-pass filter 195 //TODO: update low-pass filter
193 } 196 }
194 197
195 void pico_pcm_data_write(pico_pcm *pcm, uint16_t value) 198 void pico_pcm_data_write(pico_pcm *pcm, uint16_t value)
196 { 199 {
200 if (pcm->fifo_read == pcm->fifo_write) {
201 puts("ADPCM fifo overflow");
202 }
197 if (pcm->fifo_read == sizeof(pcm->fifo)) { 203 if (pcm->fifo_read == sizeof(pcm->fifo)) {
198 pcm->fifo_read = pcm->fifo_write; 204 pcm->fifo_read = pcm->fifo_write;
199 } 205 }
200 pcm->fifo[pcm->fifo_write++] = value >> 8; 206 pcm->fifo[pcm->fifo_write++] = value >> 8;
201 pcm->fifo_write &= sizeof(pcm->fifo)-1; 207 pcm->fifo_write &= sizeof(pcm->fifo)-1;
208 if (pcm->fifo_read == pcm->fifo_write) {
209 puts("ADPCM fifo overflow");
210 }
202 pcm->fifo[pcm->fifo_write++] = value; 211 pcm->fifo[pcm->fifo_write++] = value;
203 pcm->fifo_write &= sizeof(pcm->fifo)-1; 212 pcm->fifo_write &= sizeof(pcm->fifo)-1;
204 } 213 }
205 214
206 uint16_t pico_pcm_ctrl_read(pico_pcm *pcm) 215 uint16_t pico_pcm_ctrl_read(pico_pcm *pcm)