1
0
Fork 0
forked from len0rd/rockbox

SWCODEC Playback: Seriously mess with it and get rid of (at least some ;) race conditions.

git-svn-id: svn://svn.rockbox.org/rockbox/trunk@13361 a1c6a512-1295-4272-9138-f99709370657
This commit is contained in:
Michael Sevakis 2007-05-08 22:56:12 +00:00
parent e88078f9f5
commit 1c59b101df
2 changed files with 29 additions and 34 deletions

View file

@ -112,11 +112,14 @@ void fade(bool fade_in)
sleep(1); sleep(1);
} }
audio_pause(); audio_pause();
#if CONFIG_CODEC != SWCODEC
#ifndef SIMULATOR #ifndef SIMULATOR
/* let audio thread run and wait for the mas to run out of data */ /* let audio thread run and wait for the mas to run out of data */
while (!mp3_pause_done()) while (!mp3_pause_done())
#endif #endif
sleep(HZ/10); sleep(HZ/10);
#endif
/* reset volume to what it was before the fade */ /* reset volume to what it was before the fade */
sound_set_volume(global_settings.volume); sound_set_volume(global_settings.volume);

View file

@ -138,7 +138,7 @@ enum {
Q_AUDIO_FLUSH, Q_AUDIO_FLUSH,
Q_AUDIO_TRACK_CHANGED, Q_AUDIO_TRACK_CHANGED,
Q_AUDIO_DIR_SKIP, Q_AUDIO_DIR_SKIP,
Q_AUDIO_NEW_PLAYLIST, Q_AUDIO_UNUSED_0, /* Free. Previously Q_AUDIO_NEW_PLAYLIST */
Q_AUDIO_POSTINIT, Q_AUDIO_POSTINIT,
Q_AUDIO_FILL_BUFFER, Q_AUDIO_FILL_BUFFER,
#if MEM > 8 #if MEM > 8
@ -400,11 +400,6 @@ bool mp3_is_playing(void)
return voice_is_playing; return voice_is_playing;
} }
bool mp3_pause_done(void)
{
return pcm_is_paused();
}
void mpeg_id3_options(bool _v1first) void mpeg_id3_options(bool _v1first)
{ {
v1first = _v1first; v1first = _v1first;
@ -673,22 +668,9 @@ void audio_play(long offset)
#endif #endif
/* Start playback */ /* Start playback */
if (playing && offset <= 0) LOGFQUEUE("audio >| audio Q_AUDIO_PLAY: %l", offset);
{ /* Don't return until playback has actually stopped */
LOGFQUEUE("audio > audio Q_AUDIO_NEW_PLAYLIST"); queue_send(&audio_queue, Q_AUDIO_PLAY, offset);
queue_post(&audio_queue, Q_AUDIO_NEW_PLAYLIST, 0);
}
else
{
LOGFQUEUE("audio > audio Q_AUDIO_STOP");
queue_post(&audio_queue, Q_AUDIO_STOP, 0);
LOGFQUEUE("audio > audio Q_AUDIO_PLAY");
queue_post(&audio_queue, Q_AUDIO_PLAY, offset);
}
/* Don't return until playback has actually started */
while (!playing)
yield();
} }
void audio_stop(void) void audio_stop(void)
@ -701,14 +683,16 @@ void audio_stop(void)
void audio_pause(void) void audio_pause(void)
{ {
LOGFQUEUE("audio > audio Q_AUDIO_PAUSE"); LOGFQUEUE("audio >| audio Q_AUDIO_PAUSE");
queue_post(&audio_queue, Q_AUDIO_PAUSE, true); /* Don't return until playback has actually paused */
queue_send(&audio_queue, Q_AUDIO_PAUSE, true);
} }
void audio_resume(void) void audio_resume(void)
{ {
LOGFQUEUE("audio > audio Q_AUDIO_PAUSE resume"); LOGFQUEUE("audio >| audio Q_AUDIO_PAUSE resume");
queue_post(&audio_queue, Q_AUDIO_PAUSE, false); /* Don't return until playback has actually resumed */
queue_send(&audio_queue, Q_AUDIO_PAUSE, false);
} }
void audio_next(void) void audio_next(void)
@ -3342,13 +3326,14 @@ static void audio_play_start(size_t offset)
#endif #endif
/* Wait for any previously playing audio to flush - TODO: Not necessary? */ /* Wait for any previously playing audio to flush - TODO: Not necessary? */
paused = false;
audio_stop_codec_flush(); audio_stop_codec_flush();
track_changed = true; track_changed = true;
playlist_end = false; playlist_end = false;
playing = true; playing = true;
paused = false;
ci.new_track = 0; ci.new_track = 0;
ci.seek_time = 0; ci.seek_time = 0;
wps_offset = 0; wps_offset = 0;
@ -3368,6 +3353,9 @@ static void audio_play_start(size_t offset)
last_peek_offset = -1; last_peek_offset = -1;
/* Officially playing */
queue_reply(&audio_queue, 1);
audio_fill_file_buffer(true, false, offset); audio_fill_file_buffer(true, false, offset);
} }
@ -3420,6 +3408,10 @@ static void audio_new_playlist(void)
/* Signal the codec to initiate a track change forward */ /* Signal the codec to initiate a track change forward */
new_playlist = true; new_playlist = true;
ci.new_track = 1; ci.new_track = 1;
/* Officially playing */
queue_reply(&audio_queue, 1);
audio_fill_file_buffer(false, true, 0); audio_fill_file_buffer(false, true, 0);
} }
@ -3635,8 +3627,13 @@ static void audio_thread(void)
case Q_AUDIO_PLAY: case Q_AUDIO_PLAY:
LOGFQUEUE("audio < Q_AUDIO_PLAY"); LOGFQUEUE("audio < Q_AUDIO_PLAY");
audio_clear_track_entries(false); if (playing && ev.data <= 0)
audio_new_playlist();
else
{
audio_stop_playback();
audio_play_start((size_t)ev.data); audio_play_start((size_t)ev.data);
}
break ; break ;
case Q_AUDIO_STOP: case Q_AUDIO_STOP:
@ -3690,11 +3687,6 @@ static void audio_thread(void)
audio_initiate_dir_change(ev.data); audio_initiate_dir_change(ev.data);
break; break;
case Q_AUDIO_NEW_PLAYLIST:
LOGFQUEUE("audio < Q_AUDIO_NEW_PLAYLIST");
audio_new_playlist();
break;
case Q_AUDIO_FLUSH: case Q_AUDIO_FLUSH:
LOGFQUEUE("audio < Q_AUDIO_FLUSH"); LOGFQUEUE("audio < Q_AUDIO_FLUSH");
audio_invalidate_tracks(); audio_invalidate_tracks();