forked from len0rd/rockbox
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
This commit is contained in:
parent
8764bbc275
commit
3b90707fdd
2 changed files with 9 additions and 24 deletions
|
|
@ -1003,8 +1003,7 @@ void audio_update_trackinfo(void)
|
||||||
if (buf_ridx >= codecbuflen)
|
if (buf_ridx >= codecbuflen)
|
||||||
buf_ridx -= codecbuflen;
|
buf_ridx -= codecbuflen;
|
||||||
|
|
||||||
if (!pcm_crossfade_init())
|
pcm_crossfade_init();
|
||||||
pcm_flush_audio();
|
|
||||||
|
|
||||||
if (!filling)
|
if (!filling)
|
||||||
pcm_set_boost_mode(false);
|
pcm_set_boost_mode(false);
|
||||||
|
|
@ -1156,11 +1155,11 @@ void audio_thread(void)
|
||||||
switch (ev.id) {
|
switch (ev.id) {
|
||||||
case AUDIO_PLAY:
|
case AUDIO_PLAY:
|
||||||
logf("starting...");
|
logf("starting...");
|
||||||
|
playing = true;
|
||||||
ci.stop_codec = true;
|
ci.stop_codec = true;
|
||||||
ci.reload_codec = false;
|
ci.reload_codec = false;
|
||||||
ci.seek_time = 0;
|
ci.seek_time = 0;
|
||||||
if (!pcm_crossfade_init())
|
pcm_crossfade_init();
|
||||||
pcm_flush_audio();
|
|
||||||
audio_play_start((int)ev.data);
|
audio_play_start((int)ev.data);
|
||||||
break ;
|
break ;
|
||||||
|
|
||||||
|
|
@ -1325,9 +1324,10 @@ void audio_play(int offset)
|
||||||
{
|
{
|
||||||
logf("audio_play");
|
logf("audio_play");
|
||||||
ci.stop_codec = true;
|
ci.stop_codec = true;
|
||||||
|
if (!pcm_crossfade_init())
|
||||||
|
pcm_flush_audio();
|
||||||
pcm_play_pause(true);
|
pcm_play_pause(true);
|
||||||
paused = false;
|
paused = false;
|
||||||
playing = true;
|
|
||||||
queue_post(&audio_queue, AUDIO_PLAY, (void *)offset);
|
queue_post(&audio_queue, AUDIO_PLAY, (void *)offset);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -415,7 +415,7 @@ bool pcm_crossfade_init(void)
|
||||||
*/
|
*/
|
||||||
void pcm_flush_audio(void)
|
void pcm_flush_audio(void)
|
||||||
{
|
{
|
||||||
if (crossfade_init || crossfade_active)
|
if (crossfade_init || crossfade_active || !pcm_playing)
|
||||||
return ;
|
return ;
|
||||||
|
|
||||||
crossfade_mode = CFM_FLUSH;
|
crossfade_mode = CFM_FLUSH;
|
||||||
|
|
@ -640,30 +640,15 @@ bool pcm_insert_buffer(char *buf, long length)
|
||||||
memcpy(&audiobuffer[audiobuffer_pos+audiobuffer_fillpos],
|
memcpy(&audiobuffer[audiobuffer_pos+audiobuffer_fillpos],
|
||||||
buf, copy_n);
|
buf, copy_n);
|
||||||
buf += copy_n;
|
buf += copy_n;
|
||||||
audiobuffer_free -= copy_n;
|
audiobuffer_fillpos += copy_n;
|
||||||
length -= copy_n;
|
length -= copy_n;
|
||||||
|
|
||||||
/* Pre-buffer to meet CHUNK_SIZE requirement */
|
/* Pre-buffer to meet CHUNK_SIZE requirement */
|
||||||
if (copy_n + audiobuffer_fillpos < CHUNK_SIZE && length == 0) {
|
if (copy_n + audiobuffer_fillpos < CHUNK_SIZE && length == 0) {
|
||||||
audiobuffer_fillpos += copy_n;
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
copy_n += audiobuffer_fillpos;
|
pcm_flush_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;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue