diff options
Diffstat (limited to 'firmware')
-rw-r--r-- | firmware/mpeg.c | 22 |
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 */ |