diff options
author | William Wilgus <wilgus.william@gmail.com> | 2024-07-12 00:15:19 -0400 |
---|---|---|
committer | William Wilgus <wilgus.william@gmail.com> | 2024-07-12 00:35:32 -0400 |
commit | a2747a1bd1afeeb1205fd26ada22f09f1feff81c (patch) | |
tree | db22d851f5540d7e0dbb4aa556626a5d93a72275 | |
parent | bdb5bf1511501bd8a1c478986041e6c9f26cae3e (diff) | |
download | rockbox-a2747a1bd1afeeb1205fd26ada22f09f1feff81c.tar.gz rockbox-a2747a1bd1afeeb1205fd26ada22f09f1feff81c.zip |
Playlist_viewer.c clean-up and a bit of optimization
Change-Id: I049020ab5da0b3b3c6495a4be1bc8f296d472e01
-rw-r--r-- | apps/playlist_viewer.c | 139 |
1 files changed, 77 insertions, 62 deletions
diff --git a/apps/playlist_viewer.c b/apps/playlist_viewer.c index 68fec4e153..685c24af40 100644 --- a/apps/playlist_viewer.c +++ b/apps/playlist_viewer.c | |||
@@ -118,9 +118,15 @@ struct playlist_viewer { | |||
118 | or -1 if nothing is currently being moved */ | 118 | or -1 if nothing is currently being moved */ |
119 | int moving_playlist_index; /* Playlist-relative index (as opposed to | 119 | int moving_playlist_index; /* Playlist-relative index (as opposed to |
120 | viewer-relative index) of moving track */ | 120 | viewer-relative index) of moving track */ |
121 | bool (*track_metadata)(struct mp3entry* id3, | ||
122 | int fd, | ||
123 | const char* trackname, | ||
124 | int flags); /* Title display metadata lookup fn */ | ||
121 | struct playlist_buffer buffer; | 125 | struct playlist_buffer buffer; |
122 | }; | 126 | }; |
123 | 127 | ||
128 | |||
129 | |||
124 | static struct playlist_viewer viewer; | 130 | static struct playlist_viewer viewer; |
125 | 131 | ||
126 | /* Used when viewing playlists on disk */ | 132 | /* Used when viewing playlists on disk */ |
@@ -199,7 +205,7 @@ static void playlist_buffer_load_entries(struct playlist_buffer *pb, int index, | |||
199 | 205 | ||
200 | /* playlist_buffer_load_entries_screen() | 206 | /* playlist_buffer_load_entries_screen() |
201 | * This function is called when the currently selected item gets too close | 207 | * This function is called when the currently selected item gets too close |
202 | * to the start or the end of the loaded part of the playlis, or when | 208 | * to the start or the end of the loaded part of the playlist, or when |
203 | * the list callback requests a playlist item that has not been loaded yet | 209 | * the list callback requests a playlist item that has not been loaded yet |
204 | * | 210 | * |
205 | * reference_track is either the currently selected track, or the track that | 211 | * reference_track is either the currently selected track, or the track that |
@@ -209,41 +215,40 @@ static void playlist_buffer_load_entries_screen(struct playlist_buffer * pb, | |||
209 | enum direction direction, | 215 | enum direction direction, |
210 | int reference_track) | 216 | int reference_track) |
211 | { | 217 | { |
218 | int start; | ||
212 | if (direction == FORWARD) | 219 | if (direction == FORWARD) |
213 | { | 220 | { |
214 | int min_start = reference_track-2*screens[0].getnblines(); | 221 | int min_start = reference_track-2*screens[0].getnblines(); |
215 | while (min_start < 0) | 222 | while (min_start < 0) |
216 | min_start += viewer.num_tracks; | 223 | min_start += viewer.num_tracks; |
217 | min_start %= viewer.num_tracks; | 224 | start = min_start % viewer.num_tracks; |
218 | playlist_buffer_load_entries(pb, min_start, FORWARD); | ||
219 | } | 225 | } |
220 | else | 226 | else |
221 | { | 227 | { |
222 | int max_start = reference_track+2*screens[0].getnblines(); | 228 | int max_start = reference_track+2*screens[0].getnblines(); |
223 | max_start %= viewer.num_tracks; | 229 | start = max_start % viewer.num_tracks; |
224 | playlist_buffer_load_entries(pb, max_start, BACKWARD); | ||
225 | } | 230 | } |
231 | |||
232 | playlist_buffer_load_entries(pb, start, direction); | ||
226 | } | 233 | } |
227 | 234 | ||
228 | static bool retrieve_track_metadata(struct mp3entry *id3, const char *filename, int flags) | ||
229 | { | ||
230 | bool success = true; | ||
231 | #if defined(HAVE_TC_RAMCACHE) && defined(HAVE_DIRCACHE) | 235 | #if defined(HAVE_TC_RAMCACHE) && defined(HAVE_DIRCACHE) |
236 | static bool try_track_ram_metadata(struct mp3entry* id3, int fd, const char* trackname, int flags) | ||
237 | { | ||
238 | /* used for title display mode */ | ||
232 | /* try to get the id3 data from the database */ | 239 | /* try to get the id3 data from the database */ |
233 | /* the database, doesn't store frequency, file size or codec (g4470) ChrisS*/ | 240 | if (tagcache_fill_tags(id3, trackname)) |
234 | if (!(flags & METADATA_EXCLUDE_ID3_PATH) || !tagcache_fill_tags(id3, filename)) | 241 | return true; |
235 | #endif | ||
236 | /* fall back to reading the file from disk */ | 242 | /* fall back to reading the file from disk */ |
237 | { | 243 | return get_metadata_ex(id3, fd, trackname, flags); |
238 | success = get_metadata_ex(id3, -1, filename, flags); | ||
239 | } | ||
240 | return success; | ||
241 | } | 244 | } |
245 | #endif | ||
242 | 246 | ||
243 | static int load_track_title(char* buffer, size_t bufsz, char *filename) | 247 | static int load_track_title(char* buffer, size_t bufsz, char *filename) |
244 | { | 248 | { |
249 | size_t len = 0; | ||
245 | struct mp3entry id3; | 250 | struct mp3entry id3; |
246 | if (retrieve_track_metadata(&id3, filename, METADATA_EXCLUDE_ID3_PATH) | 251 | if (viewer.track_metadata(&id3, -1, filename, METADATA_EXCLUDE_ID3_PATH) |
247 | && id3.title && id3.title[0] != '\0') | 252 | && id3.title && id3.title[0] != '\0') |
248 | { | 253 | { |
249 | const char *artist = id3.artist; | 254 | const char *artist = id3.artist; |
@@ -252,11 +257,9 @@ static int load_track_title(char* buffer, size_t bufsz, char *filename) | |||
252 | if(!artist) | 257 | if(!artist) |
253 | artist = str(LANG_TAGNAVI_UNTAGGED); | 258 | artist = str(LANG_TAGNAVI_UNTAGGED); |
254 | 259 | ||
255 | size_t len = snprintf(buffer, bufsz, "%s - %s", artist, id3.title) + 1; | 260 | len = snprintf(buffer, bufsz, "%s - %s", artist, id3.title) + 1; |
256 | if (len < bufsz) | ||
257 | return len; | ||
258 | } | 261 | } |
259 | return 0; /*Failure*/ | 262 | return len; |
260 | } | 263 | } |
261 | 264 | ||
262 | static int playlist_entry_load(struct playlist_entry *entry, int index, | 265 | static int playlist_entry_load(struct playlist_entry *entry, int index, |
@@ -288,6 +291,8 @@ static int playlist_entry_load(struct playlist_entry *entry, int index, | |||
288 | name_buffer += len; | 291 | name_buffer += len; |
289 | remaining_size -= len; | 292 | remaining_size -= len; |
290 | int tlen = load_track_title(name_buffer, remaining_size, info.filename); | 293 | int tlen = load_track_title(name_buffer, remaining_size, info.filename); |
294 | if (tlen > remaining_size) | ||
295 | return -1; /*Failure */ | ||
291 | if (tlen > 0) | 296 | if (tlen > 0) |
292 | { | 297 | { |
293 | entry->title = name_buffer; | 298 | entry->title = name_buffer; |
@@ -439,6 +444,17 @@ static bool playlist_viewer_init(struct playlist_viewer * viewer, | |||
439 | file = filename+1; | 444 | file = filename+1; |
440 | } | 445 | } |
441 | viewer->title = file; | 446 | viewer->title = file; |
447 | #if defined(HAVE_TC_RAMCACHE) && defined(HAVE_DIRCACHE) | ||
448 | if (global_settings.tagcache_ram == TAGCACHE_RAM_ON && | ||
449 | tagcache_is_usable() && tagcache_is_in_ram()) | ||
450 | { | ||
451 | viewer->track_metadata = try_track_ram_metadata; | ||
452 | } | ||
453 | else | ||
454 | #endif | ||
455 | { | ||
456 | viewer->track_metadata = get_metadata_ex; | ||
457 | } | ||
442 | 458 | ||
443 | if (is_playing) | 459 | if (is_playing) |
444 | { | 460 | { |
@@ -533,8 +549,8 @@ static bool update_playlist(bool force) | |||
533 | else | 549 | else |
534 | viewer.current_playing_track = -1; | 550 | viewer.current_playing_track = -1; |
535 | int nb_tracks = playlist_amount_ex(viewer.playlist); | 551 | int nb_tracks = playlist_amount_ex(viewer.playlist); |
536 | force = force || nb_tracks != viewer.num_tracks; | 552 | |
537 | if (force) | 553 | if (force || nb_tracks != viewer.num_tracks) |
538 | { | 554 | { |
539 | /* Reload tracks */ | 555 | /* Reload tracks */ |
540 | viewer.num_tracks = nb_tracks; | 556 | viewer.num_tracks = nb_tracks; |
@@ -572,7 +588,8 @@ static enum pv_onplay_result show_track_info(const struct playlist_entry *curren | |||
572 | } | 588 | } |
573 | else | 589 | else |
574 | { | 590 | { |
575 | id3_retrieval_successful = retrieve_track_metadata(&id3, current_track->name, 0); | 591 | /* Read from disk, the database, doesn't store frequency, file size or codec (g4470) ChrisS*/ |
592 | id3_retrieval_successful = get_metadata(&id3, -1, current_track->name); | ||
576 | } | 593 | } |
577 | 594 | ||
578 | return id3_retrieval_successful && | 595 | return id3_retrieval_successful && |
@@ -580,16 +597,18 @@ static enum pv_onplay_result show_track_info(const struct playlist_entry *curren | |||
580 | viewer.num_tracks, NULL, 1) ? PV_ONPLAY_USB : PV_ONPLAY_UNCHANGED; | 597 | viewer.num_tracks, NULL, 1) ? PV_ONPLAY_USB : PV_ONPLAY_UNCHANGED; |
581 | } | 598 | } |
582 | 599 | ||
583 | 600 | #if defined(HAVE_HOTKEY) || defined(HAVE_TAGCACHE) | |
584 | #ifdef HAVE_HOTKEY | 601 | static enum pv_onplay_result |
585 | static enum pv_onplay_result open_with(const struct playlist_entry *current_track) | 602 | open_with_plugin(const struct playlist_entry *current_track, |
603 | const char* plugin_name, | ||
604 | int (*loadplugin)(const char* plugin, const char* file)) | ||
586 | { | 605 | { |
587 | char selected_track[MAX_PATH]; | 606 | char selected_track[MAX_PATH]; |
588 | close_playlist_viewer(); /* don't pop activity yet – relevant for plugin_load */ | 607 | close_playlist_viewer(); /* don't pop activity yet – relevant for plugin_load */ |
589 | 608 | ||
590 | strmemccpy(selected_track, current_track->name, sizeof(selected_track)); | 609 | strmemccpy(selected_track, current_track->name, sizeof(selected_track)); |
591 | 610 | ||
592 | int plugin_return = filetype_list_viewers(selected_track); | 611 | int plugin_return = loadplugin(plugin_name, selected_track); |
593 | pop_current_activity_without_refresh(); | 612 | pop_current_activity_without_refresh(); |
594 | 613 | ||
595 | switch (plugin_return) | 614 | switch (plugin_return) |
@@ -602,29 +621,27 @@ static enum pv_onplay_result open_with(const struct playlist_entry *current_trac | |||
602 | return PV_ONPLAY_CLOSED; | 621 | return PV_ONPLAY_CLOSED; |
603 | } | 622 | } |
604 | } | 623 | } |
624 | |||
625 | #ifdef HAVE_HOTKEY | ||
626 | static int list_viewers(const char* plugin, const char* file) | ||
627 | { | ||
628 | /* dummy function to match prototype with filetype_load_plugin */ | ||
629 | (void)plugin; | ||
630 | return filetype_list_viewers(file); | ||
631 | } | ||
632 | static enum pv_onplay_result open_with(const struct playlist_entry *current_track) | ||
633 | { | ||
634 | return open_with_plugin(current_track, "", &list_viewers); | ||
635 | } | ||
605 | #endif /* HAVE_HOTKEY */ | 636 | #endif /* HAVE_HOTKEY */ |
606 | 637 | ||
607 | #ifdef HAVE_TAGCACHE | 638 | #ifdef HAVE_TAGCACHE |
608 | static enum pv_onplay_result open_pictureflow(const struct playlist_entry *current_track) | 639 | static enum pv_onplay_result open_pictureflow(const struct playlist_entry *current_track) |
609 | { | 640 | { |
610 | char selected_track[MAX_PATH]; | 641 | return open_with_plugin(current_track, "pictureflow", &filetype_load_plugin); |
611 | close_playlist_viewer(); /* don't pop activity yet – relevant for plugin_load */ | ||
612 | |||
613 | strmemccpy(selected_track, current_track->name, sizeof(selected_track)); | ||
614 | int plugin_return = filetype_load_plugin((void *)"pictureflow", selected_track); | ||
615 | pop_current_activity_without_refresh(); | ||
616 | |||
617 | switch (plugin_return) | ||
618 | { | ||
619 | case PLUGIN_USB_CONNECTED: | ||
620 | return PV_ONPLAY_USB_CLOSED; | ||
621 | case PLUGIN_GOTO_WPS: | ||
622 | return PV_ONPLAY_WPS_CLOSED; | ||
623 | default: | ||
624 | return PV_ONPLAY_CLOSED; | ||
625 | } | ||
626 | } | 642 | } |
627 | #endif | 643 | #endif |
644 | #endif /*defined(HAVE_HOTKEY) || defined(HAVE_TAGCACHE)*/ | ||
628 | 645 | ||
629 | static enum pv_onplay_result delete_track(int current_track_index, | 646 | static enum pv_onplay_result delete_track(int current_track_index, |
630 | int index, bool current_was_playing) | 647 | int index, bool current_was_playing) |
@@ -774,16 +791,18 @@ static int get_track_num(struct playlist_viewer *local_viewer, | |||
774 | return selected_item; | 791 | return selected_item; |
775 | } | 792 | } |
776 | 793 | ||
794 | static struct playlist_entry* pv_get_track(struct playlist_viewer *local_viewer, int selected_item) | ||
795 | { | ||
796 | int track_num = get_track_num(local_viewer, selected_item); | ||
797 | return playlist_buffer_get_track(&(local_viewer->buffer), track_num); | ||
798 | } | ||
799 | |||
777 | static const char* playlist_callback_name(int selected_item, | 800 | static const char* playlist_callback_name(int selected_item, |
778 | void *data, | 801 | void *data, |
779 | char *buffer, | 802 | char *buffer, |
780 | size_t buffer_len) | 803 | size_t buffer_len) |
781 | { | 804 | { |
782 | struct playlist_viewer *local_viewer = (struct playlist_viewer *)data; | 805 | struct playlist_entry *track = pv_get_track(data, selected_item); |
783 | |||
784 | int track_num = get_track_num(local_viewer, selected_item); | ||
785 | struct playlist_entry *track = | ||
786 | playlist_buffer_get_track(&(local_viewer->buffer), track_num); | ||
787 | 806 | ||
788 | format_line(track, buffer, buffer_len); | 807 | format_line(track, buffer, buffer_len); |
789 | 808 | ||
@@ -795,10 +814,7 @@ static enum themable_icons playlist_callback_icons(int selected_item, | |||
795 | void *data) | 814 | void *data) |
796 | { | 815 | { |
797 | struct playlist_viewer *local_viewer = (struct playlist_viewer *)data; | 816 | struct playlist_viewer *local_viewer = (struct playlist_viewer *)data; |
798 | 817 | struct playlist_entry *track = pv_get_track(local_viewer, selected_item); | |
799 | int track_num = get_track_num(local_viewer, selected_item); | ||
800 | struct playlist_entry *track = | ||
801 | playlist_buffer_get_track(&(local_viewer->buffer), track_num); | ||
802 | 818 | ||
803 | if (track->index == local_viewer->current_playing_track) | 819 | if (track->index == local_viewer->current_playing_track) |
804 | { | 820 | { |
@@ -822,10 +838,8 @@ static enum themable_icons playlist_callback_icons(int selected_item, | |||
822 | static int playlist_callback_voice(int selected_item, void *data) | 838 | static int playlist_callback_voice(int selected_item, void *data) |
823 | { | 839 | { |
824 | struct playlist_viewer *local_viewer = (struct playlist_viewer *)data; | 840 | struct playlist_viewer *local_viewer = (struct playlist_viewer *)data; |
825 | struct playlist_entry *track= | 841 | struct playlist_entry *track = pv_get_track(local_viewer, selected_item); |
826 | playlist_buffer_get_track(&(local_viewer->buffer), | 842 | |
827 | selected_item); | ||
828 | (void)selected_item; | ||
829 | if(global_settings.playlist_viewer_icons) { | 843 | if(global_settings.playlist_viewer_icons) { |
830 | if (track->index == local_viewer->current_playing_track) | 844 | if (track->index == local_viewer->current_playing_track) |
831 | talk_id(LANG_NOW_PLAYING, true); | 845 | talk_id(LANG_NOW_PLAYING, true); |
@@ -1024,16 +1038,17 @@ enum playlist_viewer_result playlist_viewer_ex(const char* filename, | |||
1024 | viewer.moving_track = -1; | 1038 | viewer.moving_track = -1; |
1025 | viewer.moving_playlist_index = -1; | 1039 | viewer.moving_playlist_index = -1; |
1026 | } | 1040 | } |
1041 | else if (global_settings.party_mode) | ||
1042 | { | ||
1043 | /* Nothing to do */ | ||
1044 | } | ||
1027 | else if (!viewer.playlist) | 1045 | else if (!viewer.playlist) |
1028 | { | 1046 | { |
1029 | /* play new track */ | 1047 | /* play new track */ |
1030 | if (!global_settings.party_mode) | 1048 | playlist_start(current_track->index, 0, 0); |
1031 | { | 1049 | update_playlist(false); |
1032 | playlist_start(current_track->index, 0, 0); | ||
1033 | update_playlist(false); | ||
1034 | } | ||
1035 | } | 1050 | } |
1036 | else if (!global_settings.party_mode) | 1051 | else |
1037 | { | 1052 | { |
1038 | int start_index = current_track->index; | 1053 | int start_index = current_track->index; |
1039 | if (!warn_on_pl_erase()) | 1054 | if (!warn_on_pl_erase()) |