From 87d4d1203c502b7ad0c90f39f3de2b48f7c4f9af Mon Sep 17 00:00:00 2001 From: Miika Pekkarinen Date: Thu, 30 Jun 2005 20:02:56 +0000 Subject: Fixed a crash with pcm audio pausing. This should prevent many crashes from happening. git-svn-id: svn://svn.rockbox.org/rockbox/trunk@6954 a1c6a512-1295-4272-9138-f99709370657 --- firmware/pcm_playback.c | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) (limited to 'firmware') diff --git a/firmware/pcm_playback.c b/firmware/pcm_playback.c index 04630f100f..cad835e20e 100644 --- a/firmware/pcm_playback.c +++ b/firmware/pcm_playback.c @@ -137,6 +137,7 @@ static void dma_stop(void) { pcm_playing = false; + DCR0 = 0; /* Reset the FIFO */ IIS2CONFIG = 0x800; } @@ -260,12 +261,19 @@ void pcm_play_pause(bool play) { if(pcm_paused && play && pcmbuf_unplayed_bytes) { + logf("unpause"); + /* Reset chunk size so dma has enough data to fill the fifo. */ + SAR0 = (unsigned long)next_start; + BCR0 = next_size; /* Enable the FIFO and force one write to it */ IIS2CONFIG = (pcm_freq << 12) | 0x300; - DCR0 |= DMA_START; + DCR0 |= DMA_EEXT | DMA_START; } else if(!pcm_paused && !play) { + logf("pause"); + /* Disable DMA peripheral request. */ + DCR0 &= ~DMA_EEXT; IIS2CONFIG = 0x800; } pcm_paused = !play; @@ -283,7 +291,7 @@ void DMA0(void) int res = DSR0; DSR0 = 1; /* Clear interrupt */ - + /* Stop on error */ if(res & 0x70) { -- cgit v1.2.3