diff options
author | Brandon Low <lostlogic@rockbox.org> | 2006-04-13 02:46:34 +0000 |
---|---|---|
committer | Brandon Low <lostlogic@rockbox.org> | 2006-04-13 02:46:34 +0000 |
commit | b1fa534f140b456ec23e7aaa2c2e345c2d1b43b6 (patch) | |
tree | 931cb661e874d264ad4c9c240eebae006802df58 | |
parent | 7dea1f92340419ef0281ea24c548b558c3bd7888 (diff) |
Simplify audio startup, and remove some unnecessary code
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@9640 a1c6a512-1295-4272-9138-f99709370657
-rw-r--r-- | apps/playback.c | 102 |
1 files changed, 36 insertions, 66 deletions
diff --git a/apps/playback.c b/apps/playback.c index a6aa95ea4c..38e002f9be 100644 --- a/apps/playback.c +++ b/apps/playback.c @@ -231,7 +231,7 @@ static void mp3_set_elapsed(struct mp3entry* id3); int mp3_get_file_pos(void); static void audio_clear_track_entries(bool clear_unbuffered); -static void initialize_buffer_fill(bool start_play, bool short_fill); +static void initialize_buffer_fill(bool clear_tracks, bool short_fill); static void audio_fill_file_buffer( bool start_play, bool short_fill, size_t offset); @@ -779,7 +779,7 @@ static void rebuffer_and_seek(size_t newpos) track_widx = track_ridx; last_peek_offset = 0; - initialize_buffer_fill(false, true); + initialize_buffer_fill(true, true); if (newpos > AUDIO_REBUFFER_GUESS_SIZE) cur_ti->start_pos = newpos - AUDIO_REBUFFER_GUESS_SIZE; @@ -1505,7 +1505,26 @@ static void audio_stop_playback(bool resume) static void audio_play_start(size_t offset) { - long parameter; +#ifdef CONFIG_TUNER + /* check if radio is playing */ + if (get_radio_status() != FMRADIO_OFF) + radio_stop(); +#endif + + /* Wait for any previously playing audio to flush */ + if (audio_codec_loaded) + { + playing = false; + queue_empty(&codec_queue); + stop_codec_flush(); + } + + track_changed = true; + playlist_end = false; + + playing = true; + ci.reload_codec = false; + ci.seek_time = 0; if (current_fd >= 0) { close(current_fd); @@ -1517,14 +1536,12 @@ static void audio_play_start(size_t offset) buf_ridx = buf_widx = 0; filebufused = 0; - memset(&tracks[0], 0, sizeof(struct track_info)); + /* Mark all entries null. */ + memset(tracks, 0, sizeof(struct track_info) * MAX_TRACK); last_peek_offset = -1; - if (offset == 0) parameter = -1; - else parameter = offset; - - queue_post(&audio_queue, Q_AUDIO_FILL_BUFFER, (void *)parameter); + audio_fill_file_buffer(true, true, offset); } /* Send callback events to notify about new tracks. */ @@ -1563,7 +1580,7 @@ static void generate_postbuffer_events(void) } } -static void initialize_buffer_fill(bool start_play, bool short_fill) +static void initialize_buffer_fill(bool clear_tracks, bool short_fill) { if (short_fill) { filling_short = true; @@ -1581,7 +1598,8 @@ static void initialize_buffer_fill(bool start_play, bool short_fill) if (filling) return ; - audio_clear_track_entries(start_play); + if (clear_tracks) + audio_clear_track_entries(false); logf("Starting buffer fill"); pcmbuf_set_boost_mode(true); @@ -1595,7 +1613,7 @@ static void initialize_buffer_fill(bool start_play, bool short_fill) static void audio_fill_file_buffer( bool start_play, bool short_fill, size_t offset) { - initialize_buffer_fill(start_play, short_fill); + initialize_buffer_fill(!start_play, short_fill); /* If we have a partially buffered track, continue loading, * otherwise load a new track */ @@ -1773,30 +1791,16 @@ static void initiate_dir_change(long direction) void audio_thread(void) { struct event ev; - int last_tick = 0; - bool play_pending = false; /* At first initialize audio system in background. */ playback_init(); while (1) { - if (play_pending) - { - queue_wait_w_tmo(&audio_queue, &ev, 0); - if (ev.id == SYS_TIMEOUT) - { - ev.id = Q_AUDIO_PLAY; - ev.data = 0; - } - } - else if (filling) + if (filling) { queue_wait_w_tmo(&audio_queue, &ev, 0); if (ev.id == SYS_TIMEOUT) - { ev.id = Q_AUDIO_FILL_BUFFER; - ev.data = (void *)0; - } } else queue_wait_w_tmo(&audio_queue, &ev, HZ); @@ -1804,48 +1808,15 @@ void audio_thread(void) switch (ev.id) { case Q_AUDIO_FILL_BUFFER: - { - bool start_play = (bool)ev.data; - if (!filling && !start_play) - if (ci.stop_codec || ci.reload_codec || playlist_end) - break; - audio_fill_file_buffer( - start_play, start_play, abs((long)ev.data)); - break; - } - case Q_AUDIO_PLAY: - /* Don't start playing immediately if user is skipping tracks - * fast to prevent UI lag. */ - last_peek_offset = 0; - track_changed = true; - playlist_end = false; - if (current_tick - last_tick < HZ/2) - { - play_pending = true; - break ; - } - play_pending = false; - last_tick = current_tick; - -#ifdef CONFIG_TUNER - /* check if radio is playing */ - if (get_radio_status() != FMRADIO_OFF) { - radio_stop(); - } -#endif + if (!filling) + if (!playing || playlist_end || ci.stop_codec) + break; + audio_fill_file_buffer(false, false, 0); + break; + case Q_AUDIO_PLAY: logf("starting..."); - - playing = true; - ci.stop_codec = true; - ci.reload_codec = false; - ci.seek_time = 0; - - while (audio_codec_loaded) - yield(); - audio_play_start((size_t)ev.data); - break ; case Q_AUDIO_STOP: @@ -1861,7 +1832,6 @@ void audio_thread(void) case Q_AUDIO_SKIP: logf("audio_skip"); - last_tick = current_tick; playlist_end = false; initiate_track_change((long)ev.data); break; |