summaryrefslogtreecommitdiff
path: root/firmware/mpeg.c
diff options
context:
space:
mode:
authorLinus Nielsen Feltzing <linus@haxx.se>2003-04-12 09:38:33 +0000
committerLinus Nielsen Feltzing <linus@haxx.se>2003-04-12 09:38:33 +0000
commit35c417f1d4cfa303fc1ab97718a5a47a7378f095 (patch)
treeb46c300e7542acfa8da90c36aac7e1e4c2d57ebd /firmware/mpeg.c
parent434b7d90ede78443db1c7e3ecb07067b9e2b842b (diff)
downloadrockbox-35c417f1d4cfa303fc1ab97718a5a47a7378f095.tar.gz
rockbox-35c417f1d4cfa303fc1ab97718a5a47a7378f095.zip
Fixed the dreaded 'silent play' bug
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@3541 a1c6a512-1295-4272-9138-f99709370657
Diffstat (limited to 'firmware/mpeg.c')
-rw-r--r--firmware/mpeg.c22
1 files changed, 15 insertions, 7 deletions
diff --git a/firmware/mpeg.c b/firmware/mpeg.c
index 7e63bf21e3..30530ed85b 100644
--- a/firmware/mpeg.c
+++ b/firmware/mpeg.c
@@ -1239,7 +1239,7 @@ static bool swap_one_chunk(void)
1239 else 1239 else
1240 amount_to_swap = MIN(mp3buf_write - mp3buf_swapwrite, 1240 amount_to_swap = MIN(mp3buf_write - mp3buf_swapwrite,
1241 amount_to_swap); 1241 amount_to_swap);
1242 1242
1243 bitswap(mp3buf + mp3buf_swapwrite, amount_to_swap); 1243 bitswap(mp3buf + mp3buf_swapwrite, amount_to_swap);
1244 1244
1245 mp3buf_swapwrite += amount_to_swap; 1245 mp3buf_swapwrite += amount_to_swap;
@@ -1583,7 +1583,7 @@ static void mpeg_thread(void)
1583 int unplayed_space_left, unswapped_space_left; 1583 int unplayed_space_left, unswapped_space_left;
1584 1584
1585 /* We are changing to a position that's already in 1585 /* We are changing to a position that's already in
1586 memory */ 1586 memory, so we just move the DMA read pointer. */
1587 mp3buf_read = mp3buf_write - diffpos; 1587 mp3buf_read = mp3buf_write - diffpos;
1588 if (mp3buf_read < 0) 1588 if (mp3buf_read < 0)
1589 { 1589 {
@@ -1593,6 +1593,19 @@ static void mpeg_thread(void)
1593 unplayed_space_left = get_unplayed_space(); 1593 unplayed_space_left = get_unplayed_space();
1594 unswapped_space_left = get_unswapped_space(); 1594 unswapped_space_left = get_unswapped_space();
1595 1595
1596 /* If unswapped_space_left is larger than
1597 unplayed_space_left, it means that the swapwrite pointer
1598 hasn't yet advanced up to the new location of the read
1599 pointer. We just move it, there is no need to swap
1600 data that won't be played anyway. */
1601
1602 if (unswapped_space_left > unplayed_space_left)
1603 {
1604 DEBUGF("Moved swapwrite\n");
1605 mp3buf_swapwrite = mp3buf_read;
1606 play_pending = true;
1607 }
1608
1596 if (mpeg_file>=0 && unplayed_space_left < low_watermark) 1609 if (mpeg_file>=0 && unplayed_space_left < low_watermark)
1597 { 1610 {
1598 /* We need to load more data before starting */ 1611 /* We need to load more data before starting */
@@ -1600,11 +1613,6 @@ static void mpeg_thread(void)
1600 queue_post(&mpeg_queue, MPEG_NEED_DATA, 0); 1613 queue_post(&mpeg_queue, MPEG_NEED_DATA, 0);
1601 play_pending = true; 1614 play_pending = true;
1602 } 1615 }
1603 else if (unswapped_space_left > unplayed_space_left)
1604 {
1605 mp3buf_swapwrite = mp3buf_read;
1606 play_pending = true;
1607 }
1608 else 1616 else
1609 { 1617 {
1610 /* resume will start at new position */ 1618 /* resume will start at new position */