summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMiika Pekkarinen <miipekk@ihme.org>2005-06-30 16:28:40 +0000
committerMiika Pekkarinen <miipekk@ihme.org>2005-06-30 16:28:40 +0000
commit3b90707fdd85a4b21258f6e11f10e15e0f668e3d (patch)
tree88a28be98ee3872e2a7ee473c11b1975394e5197
parent8764bbc275c4b299f22a706d67c1b20240af94fb (diff)
downloadrockbox-3b90707fdd85a4b21258f6e11f10e15e0f668e3d.zip
rockbox-3b90707fdd85a4b21258f6e11f10e15e0f668e3d.tar.gz
rockbox-3b90707fdd85a4b21258f6e11f10e15e0f668e3d.tar.bz2
rockbox-3b90707fdd85a4b21258f6e11f10e15e0f668e3d.tar.xz
Fixed a bug where a few seconds from end of a song was cut out.
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@6951 a1c6a512-1295-4272-9138-f99709370657
-rw-r--r--apps/playback.c10
-rw-r--r--firmware/pcm_playback.c23
2 files changed, 9 insertions, 24 deletions
diff --git a/apps/playback.c b/apps/playback.c
index 8b4cc6e..76c8b29 100644
--- a/apps/playback.c
+++ b/apps/playback.c
@@ -1003,8 +1003,7 @@ void audio_update_trackinfo(void)
if (buf_ridx >= codecbuflen)
buf_ridx -= codecbuflen;
- if (!pcm_crossfade_init())
- pcm_flush_audio();
+ pcm_crossfade_init();
if (!filling)
pcm_set_boost_mode(false);
@@ -1156,11 +1155,11 @@ void audio_thread(void)
switch (ev.id) {
case AUDIO_PLAY:
logf("starting...");
+ playing = true;
ci.stop_codec = true;
ci.reload_codec = false;
ci.seek_time = 0;
- if (!pcm_crossfade_init())
- pcm_flush_audio();
+ pcm_crossfade_init();
audio_play_start((int)ev.data);
break ;
@@ -1325,9 +1324,10 @@ void audio_play(int offset)
{
logf("audio_play");
ci.stop_codec = true;
+ if (!pcm_crossfade_init())
+ pcm_flush_audio();
pcm_play_pause(true);
paused = false;
- playing = true;
queue_post(&audio_queue, AUDIO_PLAY, (void *)offset);
}
diff --git a/firmware/pcm_playback.c b/firmware/pcm_playback.c
index a7ee5ce..04630f1 100644
--- a/firmware/pcm_playback.c
+++ b/firmware/pcm_playback.c
@@ -415,7 +415,7 @@ bool pcm_crossfade_init(void)
*/
void pcm_flush_audio(void)
{
- if (crossfade_init || crossfade_active)
+ if (crossfade_init || crossfade_active || !pcm_playing)
return ;
crossfade_mode = CFM_FLUSH;
@@ -640,30 +640,15 @@ bool pcm_insert_buffer(char *buf, long length)
memcpy(&audiobuffer[audiobuffer_pos+audiobuffer_fillpos],
buf, copy_n);
buf += copy_n;
- audiobuffer_free -= copy_n;
+ audiobuffer_fillpos += copy_n;
length -= copy_n;
/* Pre-buffer to meet CHUNK_SIZE requirement */
if (copy_n + audiobuffer_fillpos < CHUNK_SIZE && length == 0) {
- audiobuffer_fillpos += copy_n;
return true;
}
-
- copy_n += audiobuffer_fillpos;
-
- while (!pcm_play_add_chunk(&audiobuffer[audiobuffer_pos],
- copy_n, pcm_event_handler)) {
- pcm_boost(false);
- yield();
- }
- pcm_event_handler = NULL;
-
- audiobuffer_pos += copy_n;
- audiobuffer_fillpos = 0;
-
- if (audiobuffer_pos >= PCMBUF_SIZE) {
- audiobuffer_pos = 0;
- }
+
+ pcm_flush_fillpos();
}
return true;