diff options
author | roman.artiukhin <bahusdrive@gmail.com> | 2023-03-26 12:12:52 +0300 |
---|---|---|
committer | Aidan MacDonald <amachronic@protonmail.com> | 2023-10-22 08:21:22 -0400 |
commit | 4fb37ecbc692fdbb2e46aeaccf411caf631f9699 (patch) | |
tree | f08d9d8c842b4cfff395927cecdd4951f1316ab5 | |
parent | 5c36643132a044dcc656dc0eae895e145bd932d0 (diff) | |
download | rockbox-4fb37ecbc6.tar.gz rockbox-4fb37ecbc6.zip |
Skip Length across tracks
Allows to use Prev button to skip length from the end of previous track.
Can be enabled with:
Settings -> Playback Settings -> Skip Length set to some time interval
and
Settings -> Playback Settings -> Rewind Across Tracks set to Yes
Change-Id: I99f234035a8a5acc9cbfe05ea83971ec5ddc59ea
-rw-r--r-- | apps/gui/wps.c | 14 | ||||
-rw-r--r-- | apps/playback.c | 41 |
2 files changed, 43 insertions, 12 deletions
diff --git a/apps/gui/wps.c b/apps/gui/wps.c index 10c971fcc4..2a595f74e6 100644 --- a/apps/gui/wps.c +++ b/apps/gui/wps.c @@ -464,7 +464,21 @@ static void play_hop(int direction) if (direction > 0) next_track(); else if (direction < 0) + { + if (step > 0 && global_settings.rewind_across_tracks && elapsed < DEFAULT_SKIP_THRESH && playlist_check(-1)) + { + bool audio_paused = (audio_status() & AUDIO_STATUS_PAUSE)?true:false; + if (!audio_paused) + audio_pause(); + audio_prev(); + audio_ff_rewind(-step); + if (!audio_paused) + audio_resume(); + return; + } + prev_track(DEFAULT_SKIP_THRESH); + } return; } else if (direction == 1 && step >= remaining) diff --git a/apps/playback.c b/apps/playback.c index 9d5a6569ae..18a3bad5b7 100644 --- a/apps/playback.c +++ b/apps/playback.c @@ -123,6 +123,9 @@ static enum audio_buffer_state /** Main state control **/ static bool ff_rw_mode SHAREDBSS_ATTR = false; /* Pre-ff-rewind mode (A,O-) */ +static long seek_on_finish_load_time = 0; +static int seek_on_finish_load_id3_hid = 0; + static enum play_status { PLAY_STOPPED = 0, @@ -1590,8 +1593,16 @@ static bool audio_start_codec(bool auto_skip) return false; } + bool delayed_seek = false; + if (info.id3_hid == seek_on_finish_load_id3_hid) + { + cur_id3->elapsed = seek_on_finish_load_time; + cur_id3->offset = 0; + delayed_seek = true; + } + #ifdef HAVE_TAGCACHE - bool autoresume_enable = global_settings.autoresume_enable; + bool autoresume_enable = !delayed_seek && global_settings.autoresume_enable; if (autoresume_enable && !(cur_id3->elapsed || cur_id3->offset)) { @@ -1641,8 +1652,8 @@ static bool audio_start_codec(bool auto_skip) and back again will cause accumulation of silent rewinds - that's not our job to track directly nor could it be in any reasonable way */ - resume_rewind_adjust_progress(cur_id3, &cur_id3->elapsed, - &cur_id3->offset); + if (!delayed_seek) + resume_rewind_adjust_progress(cur_id3, &cur_id3->elapsed, &cur_id3->offset); /* Update the codec API with the metadata and track info */ id3_write(CODEC_ID3, cur_id3); @@ -2429,6 +2440,9 @@ static void audio_on_finish_load_track(int id3_hid) { audio_handle_track_load_status(LOAD_TRACK_ERR_START_CODEC); } + + seek_on_finish_load_time = 0; + seek_on_finish_load_id3_hid = 0; } /* Called when handles other than metadata handles have finished buffering @@ -3161,6 +3175,12 @@ static void audio_on_ff_rewind(long time) track_event_flags = TEF_NONE; + if (time < 0) + { + time = id3->length + time; + if (time < 0) + time = 0; + } /* Send event before clobbering the time if rewinding. */ if (time == 0) { @@ -3201,18 +3221,15 @@ static void audio_on_ff_rewind(long time) /* Track must complete the loading _now_ since a codec and audio handle are needed in order to do the seek */ bool finish_load = cur_info.audio_hid < 0; - - if (finish_load && - audio_finish_load_track(&cur_info) != LOAD_TRACK_READY) + if (finish_load) { - /* Call above should push any load sequence - no need for - halt_decoding_track here if no skip was pending here because - there would not be a codec started if no audio handle was yet - opened */ - break; + seek_on_finish_load_time = time; + seek_on_finish_load_id3_hid = cur_info.id3_hid; + // Wait till playback thread receives finish load track event and seek then + return; } - if (pending == TRACK_SKIP_AUTO || finish_load) + if (pending == TRACK_SKIP_AUTO) { if (!bufreadid3(cur_info.id3_hid, ci_id3) || !audio_init_codec(&cur_info, ci_id3)) |