summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--apps/appevents.h8
-rw-r--r--apps/gui/wps.c5
-rw-r--r--apps/playback.c11
3 files changed, 24 insertions, 0 deletions
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))