summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--firmware/pcm_playback.c17
1 files changed, 14 insertions, 3 deletions
diff --git a/firmware/pcm_playback.c b/firmware/pcm_playback.c
index 36c6ab6a75..6a190e4d23 100644
--- a/firmware/pcm_playback.c
+++ b/firmware/pcm_playback.c
@@ -75,6 +75,11 @@ static void dma_start(const void *addr, long size)
75 EBU1CONFIG = IIS_RESET | EBU_DEFPARM; 75 EBU1CONFIG = IIS_RESET | EBU_DEFPARM;
76#endif 76#endif
77 77
78 /** Prevent a very tiny pop from happening by muting audio
79 * until dma has been initialized. */
80 uda1380_mute(true);
81 sleep(HZ/16);
82
78 /* Set up DMA transfer */ 83 /* Set up DMA transfer */
79 SAR0 = ((unsigned long)addr); /* Source address */ 84 SAR0 = ((unsigned long)addr); /* Source address */
80 DAR0 = (unsigned long)&PDOR3; /* Destination address */ 85 DAR0 = (unsigned long)&PDOR3; /* Destination address */
@@ -87,6 +92,9 @@ static void dma_start(const void *addr, long size)
87 EBU1CONFIG = EBU_DEFPARM; 92 EBU1CONFIG = EBU_DEFPARM;
88#endif 93#endif
89 DCR0 = DMA_INT | DMA_EEXT | DMA_CS | DMA_SINC | DMA_START; 94 DCR0 = DMA_INT | DMA_EEXT | DMA_CS | DMA_SINC | DMA_START;
95
96 /* Now unmute the audio. */
97 uda1380_mute(false);
90} 98}
91 99
92/* Stops the DMA transfer and interrupt */ 100/* Stops the DMA transfer and interrupt */
@@ -215,7 +223,11 @@ long pcm_get_bytes_waiting(void)
215void pcm_play_stop(void) 223void pcm_play_stop(void)
216{ 224{
217 if (pcm_playing) { 225 if (pcm_playing) {
226 /* Same muting trick here to prevent a tiny pop. */
227 uda1380_mute(true);
228 sleep(HZ/16);
218 dma_stop(); 229 dma_stop();
230 uda1380_mute(false);
219 } 231 }
220} 232}
221 233
@@ -274,7 +286,7 @@ void DMA0(void)
274 /* Stop on error */ 286 /* Stop on error */
275 if(res & 0x70) 287 if(res & 0x70)
276 { 288 {
277 pcm_play_stop(); 289 dma_stop();
278 logf("DMA Error:0x%04x", res); 290 logf("DMA Error:0x%04x", res);
279 } 291 }
280 else 292 else
@@ -290,7 +302,7 @@ void DMA0(void)
290 else 302 else
291 { 303 {
292 /* Finished playing */ 304 /* Finished playing */
293 pcm_play_stop(); 305 dma_stop();
294 logf("DMA No Data:0x%04x", res); 306 logf("DMA No Data:0x%04x", res);
295 } 307 }
296 } 308 }
@@ -340,7 +352,6 @@ void pcm_init(void)
340 sleep(HZ/4); 352 sleep(HZ/4);
341 tlv320_mute(false); 353 tlv320_mute(false);
342#endif 354#endif
343
344 355
345 /* Call dma_stop to initialize everything. */ 356 /* Call dma_stop to initialize everything. */
346 dma_stop(); 357 dma_stop();