diff --git a/apps/appevents.h b/apps/appevents.h index a303491ae9..36e19b0df7 100644 --- a/apps/appevents.h +++ b/apps/appevents.h @@ -31,11 +31,19 @@ /** Playback events **/ enum { + /* Playback is starting from a stopped state */ PLAYBACK_EVENT_START_PLAYBACK = (EVENT_CLASS_PLAYBACK|1), + /* Audio has begun buffering for decoding track (or is already completed) */ PLAYBACK_EVENT_TRACK_BUFFER, + /* Handles for current user track are ready (other than audio or codec) */ + PLAYBACK_EVENT_CUR_TRACK_READY, + /* Current user track finished */ PLAYBACK_EVENT_TRACK_FINISH, + /* A new current user track has begun */ PLAYBACK_EVENT_TRACK_CHANGE, + /* A manual skip is about to be processed */ PLAYBACK_EVENT_TRACK_SKIP, + /* Next track medadata was just loaded */ PLAYBACK_EVENT_NEXTTRACKID3_AVAILABLE, }; diff --git a/apps/gui/wps.c b/apps/gui/wps.c index 0103ace53c..e686fcc533 100644 --- a/apps/gui/wps.c +++ b/apps/gui/wps.c @@ -1203,6 +1203,11 @@ static void wps_state_init(void) /* add the WPS track event callbacks */ add_event(PLAYBACK_EVENT_TRACK_CHANGE, false, track_changed_callback); add_event(PLAYBACK_EVENT_NEXTTRACKID3_AVAILABLE, false, nextid3available_callback); +#if CONFIG_CODEC == SWCODEC + /* Use the same callback as ..._TRACK_CHANGE for when remaining handles have + finished */ + add_event(PLAYBACK_EVENT_CUR_TRACK_READY, false, track_changed_callback); +#endif #ifdef AUDIO_FAST_SKIP_PREVIEW add_event(PLAYBACK_EVENT_TRACK_SKIP, false, track_skip_callback); #endif diff --git a/apps/playback.c b/apps/playback.c index 2fbc4a85a1..2775e8a95b 100644 --- a/apps/playback.c +++ b/apps/playback.c @@ -1716,6 +1716,17 @@ static int audio_finish_load_track(struct track_info *info) } #endif + /* All handles available to external routines are ready - audio and codec + information is private */ + + if (info == track_list_user_current(0)) + { + /* Send only when the track handles could not all be opened ahead of + time for the user's current track - otherwise everything is ready + by the time PLAYBACK_EVENT_TRACK_CHANGE is sent */ + send_event(PLAYBACK_EVENT_CUR_TRACK_READY, id3_get(PLAYING_ID3)); + } + #ifdef HAVE_CODEC_BUFFERING /* Try to buffer a codec for the track */ if (info != cur_info && !audio_buffer_codec(info, track_id3))