diff options
Diffstat (limited to 'apps')
-rw-r--r-- | apps/playback.c | 23 |
1 files changed, 16 insertions, 7 deletions
diff --git a/apps/playback.c b/apps/playback.c index 1677e3138b..f05cb9ef8a 100644 --- a/apps/playback.c +++ b/apps/playback.c | |||
@@ -280,6 +280,15 @@ bool codec_pcmbuf_insert_split_callback(void *ch1, void *ch2, | |||
280 | src[0] = ch1; | 280 | src[0] = ch1; |
281 | src[1] = ch2; | 281 | src[1] = ch2; |
282 | 282 | ||
283 | while (paused) | ||
284 | { | ||
285 | if (pcm_is_playing()) | ||
286 | pcm_play_pause(false); | ||
287 | sleep(1); | ||
288 | if (ci.stop_codec || ci.reload_codec || ci.seek_time) | ||
289 | return true; | ||
290 | } | ||
291 | |||
283 | if (dsp_stereo_mode() == STEREO_NONINTERLEAVED) | 292 | if (dsp_stereo_mode() == STEREO_NONINTERLEAVED) |
284 | { | 293 | { |
285 | length *= 2; /* Length is per channel */ | 294 | length *= 2; /* Length is per channel */ |
@@ -738,7 +747,7 @@ void codec_track_changed(void) | |||
738 | void yield_codecs(void) | 747 | void yield_codecs(void) |
739 | { | 748 | { |
740 | yield(); | 749 | yield(); |
741 | if (!pcm_is_playing()) | 750 | if (!pcm_is_playing() && !paused) |
742 | sleep(5); | 751 | sleep(5); |
743 | while ((pcmbuf_is_crossfade_active() || pcmbuf_is_lowdata()) | 752 | while ((pcmbuf_is_crossfade_active() || pcmbuf_is_lowdata()) |
744 | && !ci.stop_codec && playing && queue_empty(&audio_queue) | 753 | && !ci.stop_codec && playing && queue_empty(&audio_queue) |
@@ -1416,7 +1425,6 @@ void audio_update_trackinfo(void) | |||
1416 | 1425 | ||
1417 | static void audio_stop_playback(void) | 1426 | static void audio_stop_playback(void) |
1418 | { | 1427 | { |
1419 | paused = false; | ||
1420 | playing = false; | 1428 | playing = false; |
1421 | filling = false; | 1429 | filling = false; |
1422 | ci.stop_codec = true; | 1430 | ci.stop_codec = true; |
@@ -1427,7 +1435,7 @@ static void audio_stop_playback(void) | |||
1427 | pcmbuf_play_stop(); | 1435 | pcmbuf_play_stop(); |
1428 | while (audio_codec_loaded) | 1436 | while (audio_codec_loaded) |
1429 | yield(); | 1437 | yield(); |
1430 | pcm_play_pause(true); | 1438 | |
1431 | track_count = 0; | 1439 | track_count = 0; |
1432 | /* Mark all entries null. */ | 1440 | /* Mark all entries null. */ |
1433 | audio_clear_track_entries(false); | 1441 | audio_clear_track_entries(false); |
@@ -1643,8 +1651,6 @@ void audio_thread(void) | |||
1643 | 1651 | ||
1644 | logf("starting..."); | 1652 | logf("starting..."); |
1645 | playing = true; | 1653 | playing = true; |
1646 | paused = false; | ||
1647 | pcm_play_pause(true); | ||
1648 | ci.stop_codec = true; | 1654 | ci.stop_codec = true; |
1649 | ci.reload_codec = false; | 1655 | ci.reload_codec = false; |
1650 | ci.seek_time = 0; | 1656 | ci.seek_time = 0; |
@@ -1663,7 +1669,9 @@ void audio_thread(void) | |||
1663 | 1669 | ||
1664 | case AUDIO_PAUSE: | 1670 | case AUDIO_PAUSE: |
1665 | logf("audio_pause"); | 1671 | logf("audio_pause"); |
1666 | pcm_play_pause(false); | 1672 | /* We will pause the pcm playback in audiobuffer insert function |
1673 | to prevent a loop inside the pcm buffer. */ | ||
1674 | // pcm_play_pause(false); | ||
1667 | paused = true; | 1675 | paused = true; |
1668 | break ; | 1676 | break ; |
1669 | 1677 | ||
@@ -1921,6 +1929,8 @@ void audio_play(int offset) | |||
1921 | { | 1929 | { |
1922 | logf("audio_play"); | 1930 | logf("audio_play"); |
1923 | last_index = -1; | 1931 | last_index = -1; |
1932 | paused = false; | ||
1933 | pcm_play_pause(true); | ||
1924 | queue_post(&audio_queue, AUDIO_PLAY, (void *)offset); | 1934 | queue_post(&audio_queue, AUDIO_PLAY, (void *)offset); |
1925 | } | 1935 | } |
1926 | 1936 | ||
@@ -1963,7 +1973,6 @@ void audio_ff_rewind(int newpos) | |||
1963 | if (playing) { | 1973 | if (playing) { |
1964 | pcmbuf_play_stop(); | 1974 | pcmbuf_play_stop(); |
1965 | ci.seek_time = newpos+1; | 1975 | ci.seek_time = newpos+1; |
1966 | paused = false; | ||
1967 | } | 1976 | } |
1968 | } | 1977 | } |
1969 | 1978 | ||