summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorWilliam Wilgus <wilgus.william@gmail.com>2023-09-19 08:15:07 -0400
committerWilliam Wilgus <me.theuser@yahoo.com>2023-09-19 19:47:22 -0400
commite01055a287500d8cc90cda3b4816d3dc2f07bde4 (patch)
tree4779332d98be4ce97692e2326e410b613124b7bb
parent3dbf5a97ad3ad8164d07a990e787feece1616f49 (diff)
downloadrockbox-e01055a287500d8cc90cda3b4816d3dc2f07bde4.tar.gz
rockbox-e01055a287500d8cc90cda3b4816d3dc2f07bde4.zip
[RFC] REPEAT_ONE manual track skip
I recently added track skipping while REPEAT_ONE was set currently by registering a track skip callback I'm not entirely happy with the additional constant overhead of the event callback Instead I went looking for a way to distinguish a pending track skip from some limited testing it appears to work just as well to compare playback's skip_pending == TRACK_SKIP_AUTO but the lack of lifetime control worries me slightly Change-Id: Ic71b4c3925e991f5a1216d16ecd3af6cc777ef1e
-rw-r--r--apps/playback.c6
-rw-r--r--apps/playlist.c18
2 files changed, 9 insertions, 15 deletions
diff --git a/apps/playback.c b/apps/playback.c
index f698bed024..865d0d724f 100644
--- a/apps/playback.c
+++ b/apps/playback.c
@@ -3687,6 +3687,12 @@ void audio_resume(void)
3687 audio_queue_send(Q_AUDIO_PAUSE, false); 3687 audio_queue_send(Q_AUDIO_PAUSE, false);
3688} 3688}
3689 3689
3690/* Internal function used by REPEAT_ONE */
3691bool audio_pending_track_skip_is_auto(void)
3692{
3693 return (skip_pending == TRACK_SKIP_AUTO);
3694}
3695
3690/* Skip the specified number of tracks forward or backward from the current */ 3696/* Skip the specified number of tracks forward or backward from the current */
3691void audio_skip(int offset) 3697void audio_skip(int offset)
3692{ 3698{
diff --git a/apps/playlist.c b/apps/playlist.c
index 673b46c950..7c37333bd8 100644
--- a/apps/playlist.c
+++ b/apps/playlist.c
@@ -167,22 +167,11 @@
167#define PLAYLIST_SKIPPED 0x10000000 167#define PLAYLIST_SKIPPED 0x10000000
168 168
169static struct playlist_info current_playlist; 169static struct playlist_info current_playlist;
170/* REPEAT_ONE support functions */ 170/* REPEAT_ONE support function from playback.c */
171static long last_manual_skip_tick = 0; 171extern bool audio_pending_track_skip_is_auto(void);
172
173static inline bool is_manual_skip(void) 172static inline bool is_manual_skip(void)
174{ 173{
175 return (last_manual_skip_tick + HZ/2 > current_tick); 174 return !audio_pending_track_skip_is_auto();
176}
177
178static void track_change_callback(unsigned short id, void *param)
179{
180 (void)id;
181 unsigned int flags = ((struct track_event *)param)->flags;
182 if ((flags & TEF_AUTO_SKIP) != TEF_AUTO_SKIP)
183 {
184 last_manual_skip_tick = current_tick;
185 }
186} 175}
187 176
188/* Directory Cache*/ 177/* Directory Cache*/
@@ -1985,7 +1974,6 @@ void playlist_init(void)
1985 1974
1986 dc_thread_start(&current_playlist, false); 1975 dc_thread_start(&current_playlist, false);
1987#endif /* HAVE_DIRCACHE */ 1976#endif /* HAVE_DIRCACHE */
1988 add_event(PLAYBACK_EVENT_TRACK_CHANGE, track_change_callback);
1989} 1977}
1990 1978
1991/* 1979/*