diff options
| author | Michael Sevakis <jethead71@rockbox.org> | 2009-02-12 02:04:26 +0000 |
|---|---|---|
| committer | Michael Sevakis <jethead71@rockbox.org> | 2009-02-12 02:04:26 +0000 |
| commit | e6bac4c6f4b56fcc045b777ee1f086029c40ffa3 (patch) | |
| tree | c65067661f95eeecd7c626b95a6ac3a279718a0a | |
| parent | 911cc69ebd037f8fa17b77590b2e3e99ea6b0644 (diff) | |
| download | rockbox-e6bac4c6f4b56fcc045b777ee1f086029c40ffa3.zip rockbox-e6bac4c6f4b56fcc045b777ee1f086029c40ffa3.tar.gz rockbox-e6bac4c6f4b56fcc045b777ee1f086029c40ffa3.tar.bz2 rockbox-e6bac4c6f4b56fcc045b777ee1f086029c40ffa3.tar.xz | |
Gigabeat S: Handle any DMA playback errors reported and stop in that case (none are expected but it's better to handle than ignore).
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@19983 a1c6a512-1295-4272-9138-f99709370657
| -rw-r--r-- | firmware/target/arm/imx31/gigabeat-s/pcm-imx31.c | 15 |
1 files changed, 9 insertions, 6 deletions
diff --git a/firmware/target/arm/imx31/gigabeat-s/pcm-imx31.c b/firmware/target/arm/imx31/gigabeat-s/pcm-imx31.c index 7aa7a2a..39c0bc4 100644 --- a/firmware/target/arm/imx31/gigabeat-s/pcm-imx31.c +++ b/firmware/target/arm/imx31/gigabeat-s/pcm-imx31.c @@ -51,7 +51,7 @@ static struct dma_data dma_play_data = static void play_dma_callback(void) { unsigned char *start; - size_t size; + size_t size = 0; pcm_more_callback_type get_more = pcm_callback_for_more; if (dma_play_data.locked != 0) @@ -61,13 +61,11 @@ static void play_dma_callback(void) return; } - if (get_more == NULL || (get_more(&start, &size), size == 0)) + if (dma_play_bd.mode.status & BD_RROR) { - /* Callback missing or no more DMA to do */ - pcm_play_dma_stop(); - pcm_play_dma_stopped_callback(); + /* Stop on error */ } - else + else if (get_more != NULL && (get_more(&start, &size), size != 0)) { start = (void*)(((unsigned long)start + 3) & ~3); size &= ~3; @@ -79,7 +77,12 @@ static void play_dma_callback(void) dma_play_bd.mode.command = TRANSFER_16BIT; dma_play_bd.mode.status = BD_DONE | BD_WRAP | BD_INTR; sdma_channel_run(DMA_PLAY_CH_NUM); + return; } + + /* Error, callback missing or no more DMA to do */ + pcm_play_dma_stop(); + pcm_play_dma_stopped_callback(); } void pcm_play_lock(void) |