Commit graph

391 commits

Author SHA1 Message Date
William Wilgus
3b9d804bdf [coverity] playlist.c format_track_path() guard NULL pointers
Change-Id: If029477ef9f38ee57b3afb7901d7429319675cc5
2024-06-07 00:38:20 -04:00
William Wilgus
1b7d35126b [coverity] playlist.c pl_save_update_control fix rest of potential fd leaks
Change-Id: I65a8ac6a2ce68c5fd3cde570c3ff1b2e737d911d
2024-06-04 17:18:30 -04:00
William Wilgus
afba86f0f7 [coverity] playlist.c pl_save_update_control() close fd on error
Change-Id: Ib44e86a36540e65a15eed3e9b99106734379250d
2024-06-02 22:14:27 -04:00
William Wilgus
f4a044e561 [coverity] playlist.c get_track_filename() uninitialized buffer
format_track_path() uses path_append_ex() which might use strlen on the
existing buffer likely a false positive but cheap enough to guard against

Change-Id: I7061a434460f235fc58016f9dcf2dfe4633b9f59
2024-06-02 21:40:20 -04:00
Christian Soffke
3d7d1d4d5b plugins: properties: show track info for whole playlist
Track Info can now be displayed for the set of
all tracks contained in a  playlist. This lets
you calculate a playlist's length, for example,
even if it is not currently playing.

This functionality can be accessed from the
existing "Properties" screen for a selected
playlist file. A line has been added at the
very bottom to show Track Info.

Change-Id: I311532b7cfa9e29d46c0cd5623ba4c06c1dd5b5f
2024-06-01 11:55:36 -04:00
Christian Soffke
446496c221 Have Repeat Shuffle turn on Shuffle
When "Repeat Shuffle" is enabled, it may make sense
to visibly turn on the Shuffle setting once a playlist
ends and starts from the beginning again.

This seems to fix a few issues:

- After (an unmodified) playlist has been shuffled,
bookmarks now behave correctly in terms of restoring
the playlist's shuffled state and using the correct resume
index. This wasn't the case before. The alternative may be
to set the playlist as modified once it is shuffled, to
prevent creation of bookmarks from that point on.

- Lets you return to the un-shuffled state of the playlist at
any point

- Icon makes it easy to tell if the "unmodified" playlist has
been shuffled already, or not, which wasn't obvious before.

Change-Id: I41af04b041fdc7774c9d9267aaf983ec9d402e13
2024-04-23 05:24:48 +02:00
Christian Soffke
ea5ce8034b Replace "Reload After Saving" with option to remove queued tracks
The "Reload After Saving" setting was added in
g3347 (4f83e66) to solve FS#13287, by allowing
you to bookmark a modified playlist after saving,
without having to manually reload it first.

Since the rewrite of playlist_save in g5192
(90e3571), a modified playlist doesn't have to be
reloaded anymore in order to be bookmarked after
it's been saved, unless it contains queued tracks.

To cover the remaining use cases of the previously
available option, Rockbox will now offer to remove
any queued tracks from a playlist when saving it.

Change-Id: I2d6f12bcce14d8ff41a4d921ce84d628774103ac
2024-04-21 18:28:16 +02:00
William Wilgus
cb3b5397b3 Revert "Extend path_append_ex to truncate compname, remove some strmemdupa"
This reverts commit dbe20d453d.

Reason for revert: Crashes ipod Classic

Change-Id: I9ea329ce73383535353832d17c7c5e494e5ad516
2023-11-23 21:26:13 -05:00
William Wilgus
dbe20d453d Extend path_append_ex to truncate compname, remove some strmemdupa
remove some duplicated strings previously allocd off the stack

just removing string duplications that are easily handled with truncation
now available with path_append_ex()

this also has an advantage of less stack used in worst case scenarios

Change-Id: I3a43e33ef8a8c36599e4c6c036a0ccdd8ed0c883
2023-11-19 12:00:02 -05:00
Christian Soffke
5114827937 Fix: Rotate indices after saving playlist w/ first_index > 0
When saving the current playlist, entries written out
to disk were rotated, but its indices were not, resulting
in first_index being out of sync between the two. Thus,
an incorrect index was used for any playlist commands,
from the moment you saved the playlist until the next
time you resumed, which didn't produce the right playlist.

Change-Id: Ie4b02ce9e07e565b1b15c938cc4b820db08e8f1f
2023-11-15 23:49:53 +01:00
Christian Soffke
bd93f9f96f Increase playlist control file's version number
This should have probably been included in e9b4275,
since a control file generated with that build will
potentially cause issues when used with older versions,
in case -8 appears as an insert position.

Change-Id: I4a7097a2bd33c0dbbdad481a341b49be505f34f7
2023-11-12 02:49:20 +01:00
Christian Soffke
a82b30735d Fix queued track when resuming after PLAYLIST_COMMAND_CLEAR
PLAYLIST_COMMAND_CLEAR needs to save the index of the
currently playing track, or a track with index 0 will
be left queued after resuming from control commands

Change-Id: If7449bff92acd556b03c46e82301e8fec5c997d7
2023-11-11 00:36:14 +01:00
Christian Soffke
ba14aecd5e Fix INSERT_LAST_SHUFFLED when playlist's first_index > 0
Tracks were inserted into the middle of the playlist

Change-Id: I2a665fd3e0fe9d8900d6555e6affc5cb3d7513f8
2023-11-11 00:36:14 +01:00
Christian Soffke
d4f1247aec Playlists: Fix moving songs in reshuffled playlist
The current index wasn't always correct after moving
in a playlist with first index > 0

Change-Id: Ifbcc1e00ed0ec5b26e2176d7971cc5c1e15a8840
2023-11-11 00:36:14 +01:00
Christian Soffke
e9b4275d1f Playlists: Fix resuming from control commands with first_index > 0
add_track_to_playlist_unlocked only increased a playlist's
first index as necessary when its position parameter was
negative (i.e. one of the special insert positions was
specified).

A negative value was not stored in the control file, but
was always converted into an absolute position. Thus, any
adjustments to first_index weren't repeated when resuming
from the control file.

In particular, shuffled playlists were affected (in case of
first_index > 0), when inserting at positions <= first_index,
including appending a track to the end of a playlist. This
works by inserting at first_index and increasing first_index
by 1 afterwards.

Similarly, adding tracks in a shuffled fashion could increase
first index, whenever that was the value randomly calculated
for a track position, effectively appending it (I assume this
is on purpose).

To make sure that first_index adjustments are recovered when
resuming from the control file, and to be able to differentiate
between a prepended or appended track, store the special value
PLAYLIST_INSERT_LAST_ROTATED as the insert position in the
control file whenever first_index would have been used before,
and a special position (other than PLAYLIST_PREPEND) was
provided to the function.

Change-Id: I31f26796627fb136daeddd046cb1892bdf1b4014
2023-11-11 00:36:14 +01:00
William Wilgus
7ac4d34dd6 Playlist slight optimizations for playlist_resume
Change-Id: I766ce032a9b6b36d750a9231ff9f5d5a0167e5a5
2023-11-09 21:03:25 -05:00
William Wilgus
154f10c2d2 boost cpu when resuming playlists
Change-Id: I6184075945b59b3fce2882dd56567b5cf3cb174b
2023-11-02 23:48:54 -04:00
Christian Soffke
332a0fa968 Playlist sort/shuffle: Fix data type
I noticed that setting first_index to the
current track when shuffling a playlist
could fail in the Simulator.

Change-Id: Ic9467bd46a93aa2d2b765271110b0baee7058208
2023-11-01 15:35:58 -04:00
Christian Soffke
d77c417fd1 Fix bookmarking/reloading after saving shuffled playlist
The resume index into the playlist file
that was used for bookmarks created immediately
after saving a shuffled playlist, or for reloading
the saved playlist (in case "Reload After Saving"
was enabled), tended to be incorrect.

The playlist file effectively isn't shuffled
anymore after saving it to a file, but the
resume index may still have to be rotated unless
playback has been stopped and resumed before
bookmarking, due to indices that are shifted
by first_index.

Change-Id: Id335a7a71adc216989d7b415bfa48237d92fd7b0
2023-10-30 14:09:51 -04:00
Christian Soffke
3f3e185460 Fix return value for playlist_get_resume_info
(Only) bookmark_is_bookmarkable_state()
seems to require a return value atm.

Change-Id: I701031285aad80a46ebca747d06f15d968c0e9c7
2023-10-30 13:57:01 -04:00
Christian Soffke
96dd251571 Remove playlist_shutdown from playlist_resume
This was added in 5e757b4 as a band-aid to
prevent control data from being discarded,
but has since become superfluous after
the removal of the control file cache in
2e99e21.

Change-Id: Ia7bd84f9442ec1103aee8d3c4454216719aa2d66
2023-10-30 18:49:42 +01:00
Christian Soffke
45746934c4 playlist_set_current: Fix outdated dircache filerefs
Entries from a previously playing playlist may not
have been replaced after selecting a track from
a different playlist in the Playlist Viewer when
playback was stopped (not paused), since the index
buffer of a playlist opened in the Playlist Viewer
is shared with the current playlist when nothing is
playing.

Change-Id: I939e302c73cabd0e9d969550143635e54db32bf0
2023-10-30 02:07:01 +01:00
Aidan MacDonald
90e35716e3 playlist: Rewrite playlist_save(), optimization & fixes
playlist_save() was a poorly thought out mess. This fixes the
glaring issues and hopefully ensures that saving the playlist
never loses state (such as queued tracks or modified status)
after save+resume.

Indices are now updated on the fly, which is faster and needs
no extra memory. But if an error occurs, the playlist will be
corrupted. There is currently no attempt to handle this since
errors should be unlikely, but some error handling needs to be
added in the future.

Change-Id: If8a5dbd6a596460be08ee0b7bab9f24337886ea4
2023-10-28 14:54:02 -04:00
Christian Soffke
759aaecdff Playlist Viewer: Eliminate 'dirty' flag
A playlist's explicit 'modified' flag is now used
for keeping track of whether it's been modified
in the Playlist Viewer, not just in case of the
currently playing list, but for other playlists
as well.

When you start playback of a track from the
Playlist Viewer, a playlist's 'modified'
status is now carried over to the current
playlist, so as to produce a warning when
there is an attempt to replace the list at
a later point. This also prevents (auto)
bookmarking of the playlist if it had been
modified in the Playlist Viewer prior to
becoming the current playlist. (Bugfix)

Change-Id: Ibc391fd69285f8a67d6ffb6d8c274df3d223974c
2023-10-18 18:23:57 +02:00
Christian Soffke
75befe19ef Hide Bookmark menu for new dynamically generated playlists
The bookmark menu with the option to create a bookmark
was inadvertently displayed for new dynamic playlists,
that had no associated folder or playlist file on disk.
(e.g. after selecting some track from the database for
playback), until the playlist was modified by the user.

Change-Id: I9d6809e4d03603c651459415327f28e38162ad53
2023-10-10 12:03:52 -04:00
Aidan MacDonald
7ccbd705f4 playlist: Rework playlist modified detection and dirplay
The modified state is now an explicit flag that has to be
set whenever a user-triggered modification occurs. This is
recorded in the control file to ensure it doesn't get lost
after resume. There may be some places I missed where the
modified flag should be set/cleared, but it seems to work
well enough right now.

Change-Id: I3bdba358fc495b4ca84e389ac6e7bcbef820c219
2023-10-01 11:05:29 -04:00
Aidan MacDonald
4745970974 playlist: Use PLAYLIST_QUEUED instead of PLAYLIST_QUEUE_MASK
We don't need two names for the same 1-bit field.

Change-Id: I71ed61198da8d6e4bf4d449d8704982918099f7d
2023-09-30 09:03:58 +01:00
William Wilgus
fcc82dfdca [BugFix] REPEAT_ONE manual track skip
Still having problems with determining the type of track change

lets try just watching the audio_next/prev functions

Change-Id: Ie4233ff4d4bf49792a6549d7bcd169ff4b1afd20
2023-09-23 00:52:38 -04:00
William Wilgus
e01055a287 [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
2023-09-19 19:47:22 -04:00
William Wilgus
f96f7cd941 [Feature] Skip to next file even if loop one is set.
repeat one till manually skipped

https://forums.rockbox.org/index.php/topic,54218.0.html

Change-Id: If2ea1cd892531c735c30c428dea3678806283a3b
2023-09-18 22:48:21 -04:00
William Wilgus
d8b995c642 speed up adding files from filetree WIP
open an insert context

add tracks using the opened context

release opened context and sync the playlist

Change-Id: Idea700ffcf42a38dc23e131c92a6c5d325833170
2023-09-12 22:07:41 -04:00
Aidan MacDonald
b1fac21e4e playlist: Fix wrong handling of playlists without UTF-8 BOM
add_indices_to_playlist() wrongly assumes playlist->utf8 means
the playlist has a UTF-8 BOM. It only means the file is UTF-8
encoded, and says nothing about the presence of a BOM.

Trying to seek past a BOM when there is none mangles the first
filename in the playlist. Avoid this by closing & reopening the
playlist, which ensures the BOM (or lack of it) gets detected
properly.

Change-Id: I222fa6fc31e941d0252f1895b393a51694b93b7c
2023-07-02 12:15:57 -04:00
Aidan MacDonald
3b1e95d480 playlist: Simplify get_track_filename()
Have get_track_filename() read track seek offset & insert type
itself to avoid duplicating code. Most callers are not interested
in that information, and only use it to call get_track_filename().

Change-Id: I46d50fda10e515f74e27eebdded8e281bbf4456f
2023-07-02 12:14:58 -04:00
Aidan MacDonald
9ba51e3552 playlist: Remove playlist_add()
It was only used in filetree.c. It's still implemented in Lua so
scripts using rb.playlist_add() won't break, but has been removed
from the Lua API "backend".

Change-Id: I5625a47f0692456008c6b10dee14755151d22f29
2023-07-02 12:14:33 -04:00
roman.artiukhin
67b98292a3 Temp quick fix for broken bookmarks
Mark playlist as not modified in playlist_resume

Change-Id: I8a9769a1fc1265f024da230e496eac9a10186097
2023-04-22 12:58:18 -04:00
Aidan MacDonald
2e99e2175b playlist: Remove control file cache
Control cache entries cost 24 bytes per command, but cacheable
commands are always less than that when written out to the file.
We can actually cache *more* data by writing commands directly
to the fd (native Rockbox has a 512-byte cache per fd) and it's
much simpler.

Change-Id: Ibb1b9ffa56ef17431b281419a04082e14d0cbd85
2023-03-24 19:02:56 +00:00
Aidan MacDonald
a4cfa8ae6a playlist: Unconditionally strip bogus dirs in playlist_peek()
The intent behind the check is to only do this if the filename
comes from an on-disk file. With the RAM buffer is gone this is
now "always" the case.

Change-Id: I4c26e32c482dde176b69a6071e9562e9955d7171
2023-03-24 19:02:56 +00:00
Aidan MacDonald
1f1893f520 playlist: Remove in-ram filename storage
Use the playlist control file for directory playback instead of
storing filenames in RAM. The implementation of that feature is
very iffy and probably responsible for random crashes that may
occur when skipping through directories rapidly.

Change-Id: I3863940cd4542410d8046a3ca47508b5d97309a1
2023-03-24 11:10:12 +00:00
Aidan MacDonald
ac1cbd5dd0 playlist: Clean up close_playlist_control_file()
Move locking outside the function since most callers already
hold the lock.

Change-Id: I4b6774e2322c86962b4cc7a5f33d13cd4ffb1c7b
2023-03-24 11:10:12 +00:00
Aidan MacDonald
e6534b051e playlist: Add helpers for opening/closing .m3u playlist
This helps maintainability and ensures the opening is done
consistently.

Change-Id: I7805716182dfa93f917d54d40f8e420e87da16b0
2023-03-24 06:36:23 -04:00
Aidan MacDonald
5eb24a9582 playlist: Cleanup get_next_dir()
Pass the direction as a signed integer to avoid jumping through
unnecessary hoops.

Change-Id: I1a36c3804b5f7103464f0d2ee69d060505261274
2023-03-24 06:12:01 -04:00
Aidan MacDonald
a64cad847e playlist: Simplify playlist modified detection
Any modifications to the playlist (insert, delete, shuffle, etc)
will cause the modified flag to be set. The flag is cleared when
the playlist is saved. Code that generates playlists can manually
clear the modified flag if appropriate; there is now a proper API
for this so the tagcache and pictureflow don't need to resort to
hacks.

Change-Id: I8d3c723265a41db07a13de3f1d2abb0444528d57
2023-03-23 13:01:23 -04:00
Aidan MacDonald
78718aa7eb playlist: Annotate locks as read/write
Distinguish read locks from write locks to aid converting the
mutex to an MRSW lock at some point in the future. Everything
is a write lock for now and a mutex is still used, so there's
no change in behavior.

Change-Id: I25aeed580580bdb0c3048fc7e1eaad1c32c30159
2023-01-29 08:24:48 -05:00
Aidan MacDonald
25bd3bc971 playlist: Optimize playlist_remove_all_tracks()
This was insanely slow for large playlists. Implement it as a
constant-time operation to avoid the O(N!) blowup, and add a
new "clear" command to the control file to avoid flooding it
with individual delete commands.

Change-Id: Ied82d1cba015591edd583f2a2ff6772108f4e176
2023-01-29 07:55:10 -05:00
Aidan MacDonald
2c4546ba99 playlist: Remove unused PLAYLIST_DELETE_CURRENT
Change-Id: I4d1a8798aca249d343ca27a9973213d427b73963
2023-01-29 07:32:26 -05:00
Aidan MacDonald
c0c1a6e5f0 Fix yellow 65b3ff81c5
Change-Id: Ibf99e4e6f98021b35d420520219287336bf25f0e
2023-01-23 14:46:02 +00:00
Aidan MacDonald
65b3ff81c5 playlist: Fix dircache scan thread deadlocks
Fix deadlocks in the dircache scan thread caused by incorrect
lock ordering. Mutating operations need to stop the thread to
prevent it from accessing invalid data; this must always be
done before taking the playlist lock to avoid deadlocking the
scan thread.

Change-Id: If719a8b28ed0b0b3eac068073581e606c4a5f58a
2023-01-23 12:24:12 +00:00
Aidan MacDonald
ce52d0c870 playlist: Fix mutex initialization
This is a one-time thing; make sure it doesn't happen more than once.

Change-Id: Ic42f48e5714dff2906c252ecd091989d2d6e5a86
2023-01-23 12:24:12 +00:00
Aidan MacDonald
2a40d42012 playlist: Refactor control cache flush
Make background control file flushing work on non-dircache targets.
It has nothing to do with dircache and doesn't belong in the dircache
scan thread.

Change-Id: I3f39261ccaebb5dce69e7db3d2e0c0c0c54f640b
2023-01-23 12:24:12 +00:00
Aidan MacDonald
fcb6239aba playlist: Remove current flag
Only current_playlist will have it set, so compare pointers instead.

Change-Id: I46dc7baef9699990962176db7c8796bba1e4809d
2023-01-23 12:24:12 +00:00