summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorWilliam Wilgus <wilgus.william@gmail.com>2024-07-12 00:15:19 -0400
committerWilliam Wilgus <wilgus.william@gmail.com>2024-07-12 00:35:32 -0400
commita2747a1bd1afeeb1205fd26ada22f09f1feff81c (patch)
treedb22d851f5540d7e0dbb4aa556626a5d93a72275
parentbdb5bf1511501bd8a1c478986041e6c9f26cae3e (diff)
downloadrockbox-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.c139
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
124static struct playlist_viewer viewer; 130static 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
228static 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)
236static 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
243static int load_track_title(char* buffer, size_t bufsz, char *filename) 247static 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
262static int playlist_entry_load(struct playlist_entry *entry, int index, 265static 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 601static enum pv_onplay_result
585static 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
626static 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}
632static 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
608static enum pv_onplay_result open_pictureflow(const struct playlist_entry *current_track) 639static 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
629static enum pv_onplay_result delete_track(int current_track_index, 646static 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
794static 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
777static const char* playlist_callback_name(int selected_item, 800static 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,
822static int playlist_callback_voice(int selected_item, void *data) 838static 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())