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