summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMichael Sevakis <jethead71@rockbox.org>2011-05-25 08:35:31 +0000
committerMichael Sevakis <jethead71@rockbox.org>2011-05-25 08:35:31 +0000
commitcaf907eef137dea6e29468d3311ce8197217900f (patch)
tree1e2b818d93277d7809d7de973edbabe4646333fe
parent2e3162f039fdb4d48aa5c9a1bf6c11ac9439a514 (diff)
downloadrockbox-caf907eef137dea6e29468d3311ce8197217900f.tar.gz
rockbox-caf907eef137dea6e29468d3311ce8197217900f.tar.bz2
rockbox-caf907eef137dea6e29468d3311ce8197217900f.zip
Workaround an occasional problem where album art or cuesheets might not be ready by the time the track change event is send which can result in the WPS not immediately being aware that the handles are ready. A better solution will be sought that hopefully doesn't require the additional event.
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@29923 a1c6a512-1295-4272-9138-f99709370657
-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))