FS#11808 - Major playlist handling changes (on disk playlists)
* Playlists are treated similar to directories in the browser, they now open in the viewer when selected instead of automatically starting the playlist. * Make the "Playlists" main menu item useful, it now displays the playlist catalog (and has been renamed accordingly) * Default to storing playlists in the catalog * Add a UI to move the catalog directory (other minor stuff too) git-svn-id: svn://svn.rockbox.org/rockbox/trunk@30177 a1c6a512-1295-4272-9138-f99709370657
This commit is contained in:
parent
4983d052a0
commit
97a4c1efa4
|
@ -1,4 +1,4 @@
|
|||
/***************************************************************************
|
||||
/***************************************************************************
|
||||
* __________ __ ___.
|
||||
* Open \______ \ ____ ____ | | _\_ |__ _______ ___
|
||||
* Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
|
||||
|
@ -43,6 +43,7 @@
|
|||
#include "filetree.h"
|
||||
#include "misc.h"
|
||||
#include "strnatcmp.h"
|
||||
#include "playlist_viewer.h"
|
||||
#ifdef HAVE_LCD_BITMAP
|
||||
#include "keyboard.h"
|
||||
#endif
|
||||
|
@ -445,13 +446,8 @@ int ft_enter(struct tree_context* c)
|
|||
|
||||
switch ( file->attr & FILE_ATTR_MASK ) {
|
||||
case FILE_ATTR_M3U:
|
||||
play = ft_play_playlist(buf, c->currdir, file->name);
|
||||
|
||||
if (play)
|
||||
{
|
||||
start_index = 0;
|
||||
}
|
||||
|
||||
if (!bookmark_autoload(buf))
|
||||
playlist_viewer_ex(buf);
|
||||
break;
|
||||
|
||||
case FILE_ATTR_AUDIO:
|
||||
|
|
|
@ -502,7 +502,7 @@
|
|||
</phrase>
|
||||
<phrase>
|
||||
id: LANG_PLAYLISTS
|
||||
desc: in the main menu and file view setting
|
||||
desc: in the file view setting
|
||||
user: core
|
||||
<source>
|
||||
*: "Playlists"
|
||||
|
@ -6544,7 +6544,7 @@
|
|||
</phrase>
|
||||
<phrase>
|
||||
id: LANG_CATALOG
|
||||
desc: in onplay menu
|
||||
desc: in main menu and onplay menu
|
||||
user: core
|
||||
<source>
|
||||
*: "Playlist Catalog"
|
||||
|
@ -12757,3 +12757,45 @@
|
|||
*: "Rewind on Pause"
|
||||
</voice>
|
||||
</phrase>
|
||||
<phrase>
|
||||
id: LANG_SET_AS_PLAYLISTCAT_DIR
|
||||
desc: used in the onplay menu to set a playlist catalog dir
|
||||
user: core
|
||||
<source>
|
||||
*: "Set As Playlist Catalog Directory"
|
||||
</source>
|
||||
<dest>
|
||||
*: "Set As Playlist Catalog Directory"
|
||||
</dest>
|
||||
<voice>
|
||||
*: "Set As Playlist Catalog Directory"
|
||||
</voice>
|
||||
</phrase>
|
||||
<phrase>
|
||||
id: LANG_RESET_PLAYLISTCAT_DIR
|
||||
desc:
|
||||
user: core
|
||||
<source>
|
||||
*: "Reset Playlist Catalog Directory"
|
||||
</source>
|
||||
<dest>
|
||||
*: "Reset Playlist Catalog Directory"
|
||||
</dest>
|
||||
<voice>
|
||||
*: "Reset Playlist Catalog Directory"
|
||||
</voice>
|
||||
</phrase>
|
||||
<phrase>
|
||||
id: LANG_CURRENT_PLAYLIST
|
||||
desc: Used when you need to say playlist, also voiced
|
||||
user: core
|
||||
<source>
|
||||
*: "Current Playlist"
|
||||
</source>
|
||||
<dest>
|
||||
*: "Current Playlist"
|
||||
</dest>
|
||||
<voice>
|
||||
*: "Current Playlist"
|
||||
</voice>
|
||||
</phrase>
|
||||
|
|
|
@ -21,6 +21,7 @@
|
|||
|
||||
#include <stdbool.h>
|
||||
#include <string.h>
|
||||
#include <stdio.h>
|
||||
#include "config.h"
|
||||
#include "lang.h"
|
||||
#include "action.h"
|
||||
|
@ -35,20 +36,28 @@
|
|||
#include "playlist_viewer.h"
|
||||
#include "talk.h"
|
||||
#include "playlist_catalog.h"
|
||||
#include "splash.h"
|
||||
|
||||
int save_playlist_screen(struct playlist_info* playlist)
|
||||
{
|
||||
char temp[MAX_PATH+1];
|
||||
char temp[MAX_PATH+1], *dot;
|
||||
int len;
|
||||
|
||||
|
||||
playlist_get_name(playlist, temp, sizeof(temp)-1);
|
||||
len = strlen(temp);
|
||||
|
||||
if (len > 4 && !strcasecmp(&temp[len-4], ".m3u"))
|
||||
dot = strrchr(temp, '.');
|
||||
if (!dot)
|
||||
{
|
||||
/* folder of some type */
|
||||
if (temp[1] != '\0')
|
||||
strcpy(&temp[len-1], ".m3u8");
|
||||
else
|
||||
snprintf(temp, sizeof(temp), "%s%s",
|
||||
catalog_get_directory(), DEFAULT_DYNAMIC_PLAYLIST_NAME);
|
||||
}
|
||||
else if (len > 4 && !strcasecmp(dot, ".m3u"))
|
||||
strcat(temp, "8");
|
||||
|
||||
if (len <= 5 || strcasecmp(&temp[len-5], ".m3u8"))
|
||||
strcpy(temp, DEFAULT_DYNAMIC_PLAYLIST_NAME);
|
||||
|
||||
if (!kbd_input(temp, sizeof(temp)))
|
||||
{
|
||||
|
@ -63,27 +72,45 @@ int save_playlist_screen(struct playlist_info* playlist)
|
|||
|
||||
static int playlist_view_(void)
|
||||
{
|
||||
return GO_TO_PLAYLIST_VIEWER;
|
||||
playlist_viewer_ex(NULL);
|
||||
return 0;
|
||||
}
|
||||
|
||||
MENUITEM_FUNCTION(create_playlist_item, 0, ID2P(LANG_CREATE_PLAYLIST),
|
||||
(int(*)(void))create_playlist, NULL, NULL, Icon_NOICON);
|
||||
MENUITEM_FUNCTION(view_cur_playlist, MENU_FUNC_CHECK_RETVAL,
|
||||
MENUITEM_FUNCTION(view_cur_playlist, 0,
|
||||
ID2P(LANG_VIEW_DYNAMIC_PLAYLIST),
|
||||
(int(*)(void))playlist_view_, NULL, NULL, Icon_NOICON);
|
||||
MENUITEM_FUNCTION(save_playlist, MENU_FUNC_USEPARAM, ID2P(LANG_SAVE_DYNAMIC_PLAYLIST),
|
||||
(int(*)(void*))save_playlist_screen,
|
||||
NULL, NULL, Icon_NOICON);
|
||||
MENUITEM_FUNCTION(catalog, 0, ID2P(LANG_CATALOG_VIEW),
|
||||
(int(*)(void))catalog_view_playlists,
|
||||
NULL, NULL, Icon_NOICON);
|
||||
MENUITEM_SETTING(recursive_dir_insert, &global_settings.recursive_dir_insert, NULL);
|
||||
MENUITEM_SETTING(warn_on_erase, &global_settings.warnon_erase_dynplaylist, NULL);
|
||||
static int clear_catalog_directory(void)
|
||||
{
|
||||
catalog_set_directory(NULL);
|
||||
settings_save();
|
||||
splash(HZ, ID2P(LANG_RESET_DONE_CLEAR));
|
||||
return false;
|
||||
}
|
||||
MENUITEM_FUNCTION(clear_catalog_directory_item, 0, ID2P(LANG_RESET_PLAYLISTCAT_DIR),
|
||||
clear_catalog_directory, NULL, NULL, Icon_file_view_menu);
|
||||
|
||||
/* Playlist viewer settings submenu */
|
||||
MENUITEM_SETTING(show_icons, &global_settings.playlist_viewer_icons, NULL);
|
||||
MENUITEM_SETTING(show_indices, &global_settings.playlist_viewer_indices, NULL);
|
||||
MENUITEM_SETTING(track_display,
|
||||
&global_settings.playlist_viewer_track_display, NULL);
|
||||
MAKE_MENU(viewer_settings_menu, ID2P(LANG_PLAYLISTVIEWER_SETTINGS),
|
||||
NULL, Icon_Playlist,
|
||||
&show_icons, &show_indices, &track_display);
|
||||
|
||||
|
||||
MAKE_MENU(playlist_settings, ID2P(LANG_PLAYLISTS), NULL,
|
||||
Icon_Playlist,
|
||||
&recursive_dir_insert, &warn_on_erase);
|
||||
&viewer_settings_menu, &recursive_dir_insert, &warn_on_erase);
|
||||
MAKE_MENU(playlist_options, ID2P(LANG_PLAYLISTS), NULL,
|
||||
Icon_Playlist,
|
||||
&create_playlist_item, &view_cur_playlist, &save_playlist, &catalog);
|
||||
&create_playlist_item, &view_cur_playlist,
|
||||
&save_playlist, &clear_catalog_directory_item);
|
||||
|
||||
|
|
|
@ -113,7 +113,8 @@ enum current_activity {
|
|||
ACTIVITY_PLUGINBROWSER,
|
||||
ACTIVITY_QUICKSCREEN,
|
||||
ACTIVITY_PITCHSCREEN,
|
||||
ACTIVITY_OPTIONSELECT
|
||||
ACTIVITY_OPTIONSELECT,
|
||||
ACTIVITY_PLAYLISTBROWSER
|
||||
};
|
||||
|
||||
#if CONFIG_CODEC == SWCODEC
|
||||
|
|
|
@ -315,7 +315,7 @@ MENUITEM_FUNCTION(view_playlist_item, 0, ID2P(LANG_VIEW),
|
|||
view_playlist, NULL,
|
||||
treeplaylist_callback, Icon_Playlist);
|
||||
|
||||
MAKE_ONPLAYMENU( tree_playlist_menu, ID2P(LANG_PLAYLIST),
|
||||
MAKE_ONPLAYMENU( tree_playlist_menu, ID2P(LANG_CURRENT_PLAYLIST),
|
||||
treeplaylist_callback, Icon_Playlist,
|
||||
|
||||
/* view */
|
||||
|
@ -382,6 +382,12 @@ static int treeplaylist_callback(int action,
|
|||
return action;
|
||||
}
|
||||
|
||||
void onplay_show_playlist_menu(char* track_name)
|
||||
{
|
||||
selected_file = track_name;
|
||||
selected_file_attr = FILE_ATTR_AUDIO;
|
||||
do_menu(&tree_playlist_menu, NULL, NULL, false);
|
||||
}
|
||||
|
||||
/* playlist catalog options */
|
||||
static bool cat_add_to_a_playlist(void)
|
||||
|
@ -395,23 +401,37 @@ static bool cat_add_to_a_new_playlist(void)
|
|||
return catalog_add_to_a_playlist(selected_file, selected_file_attr,
|
||||
true, NULL);
|
||||
}
|
||||
static int clipboard_callback(int action,const struct menu_item_ex *this_item);
|
||||
static bool set_catalogdir(void)
|
||||
{
|
||||
catalog_set_directory(selected_file);
|
||||
settings_save();
|
||||
return false;
|
||||
}
|
||||
MENUITEM_FUNCTION(set_catalogdir_item, 0, ID2P(LANG_SET_AS_PLAYLISTCAT_DIR),
|
||||
set_catalogdir, NULL, clipboard_callback, Icon_Playlist);
|
||||
|
||||
static int cat_playlist_callback(int action,
|
||||
const struct menu_item_ex *this_item);
|
||||
MENUITEM_FUNCTION(cat_view_lists, 0, ID2P(LANG_CATALOG_VIEW),
|
||||
catalog_view_playlists, 0,
|
||||
cat_playlist_callback, Icon_Playlist);
|
||||
MENUITEM_FUNCTION(cat_add_to_list, 0, ID2P(LANG_CATALOG_ADD_TO),
|
||||
cat_add_to_a_playlist, 0, NULL, Icon_Playlist);
|
||||
MENUITEM_FUNCTION(cat_add_to_new, 0, ID2P(LANG_CATALOG_ADD_TO_NEW),
|
||||
cat_add_to_a_new_playlist, 0, NULL, Icon_Playlist);
|
||||
MAKE_ONPLAYMENU(cat_playlist_menu, ID2P(LANG_CATALOG),
|
||||
cat_playlist_callback, Icon_Playlist,
|
||||
&cat_view_lists, &cat_add_to_list, &cat_add_to_new);
|
||||
&cat_add_to_list, &cat_add_to_new, &set_catalogdir_item);
|
||||
|
||||
void onplay_show_playlist_cat_menu(char* track_name)
|
||||
{
|
||||
selected_file = track_name;
|
||||
selected_file_attr = FILE_ATTR_AUDIO;
|
||||
do_menu(&cat_playlist_menu, NULL, NULL, false);
|
||||
}
|
||||
|
||||
static int cat_playlist_callback(int action,
|
||||
const struct menu_item_ex *this_item)
|
||||
{
|
||||
(void)this_item;
|
||||
if (!selected_file ||
|
||||
(((selected_file_attr & FILE_ATTR_MASK) != FILE_ATTR_AUDIO) &&
|
||||
((selected_file_attr & FILE_ATTR_MASK) != FILE_ATTR_M3U) &&
|
||||
|
@ -430,12 +450,7 @@ static int cat_playlist_callback(int action,
|
|||
switch (action)
|
||||
{
|
||||
case ACTION_REQUEST_MENUITEM:
|
||||
if (this_item == &cat_view_lists)
|
||||
{
|
||||
return action;
|
||||
}
|
||||
else if ((audio_status() & AUDIO_STATUS_PLAY) ||
|
||||
context != CONTEXT_WPS)
|
||||
if ((audio_status() & AUDIO_STATUS_PLAY) || context != CONTEXT_WPS)
|
||||
{
|
||||
return action;
|
||||
}
|
||||
|
@ -1100,7 +1115,8 @@ static int clipboard_callback(int action,const struct menu_item_ex *this_item)
|
|||
{
|
||||
/* only for directories */
|
||||
if (this_item == &delete_dir_item ||
|
||||
this_item == &set_startdir_item
|
||||
this_item == &set_startdir_item ||
|
||||
this_item == &set_catalogdir_item
|
||||
#ifdef HAVE_RECORDING
|
||||
|| this_item == &set_recdir_item
|
||||
#endif
|
||||
|
|
|
@ -48,4 +48,8 @@ enum hotkey_action {
|
|||
};
|
||||
#endif
|
||||
|
||||
/* needed for the playlist viewer.. eventually clean this up */
|
||||
void onplay_show_playlist_cat_menu(char* track_name);
|
||||
void onplay_show_playlist_menu(char* track_name);
|
||||
|
||||
#endif
|
||||
|
|
|
@ -43,6 +43,8 @@
|
|||
#include "debug.h"
|
||||
#include "playlist_catalog.h"
|
||||
#include "talk.h"
|
||||
#include "playlist_viewer.h"
|
||||
#include "bookmark.h"
|
||||
|
||||
/* Use for recursive directory search */
|
||||
struct add_track_context {
|
||||
|
@ -59,9 +61,9 @@ static int playlist_dir_length;
|
|||
static bool playlist_dir_exists = false;
|
||||
|
||||
/* Retrieve playlist directory from config file and verify it exists */
|
||||
static bool initialized = false;
|
||||
static int initialize_catalog(void)
|
||||
{
|
||||
static bool initialized = false;
|
||||
|
||||
if (!initialized)
|
||||
{
|
||||
|
@ -110,6 +112,27 @@ static int initialize_catalog(void)
|
|||
return 0;
|
||||
}
|
||||
|
||||
void catalog_set_directory(const char* directory)
|
||||
{
|
||||
if (directory == NULL)
|
||||
{
|
||||
global_settings.playlist_catalog_dir[0] = '\0';
|
||||
}
|
||||
else
|
||||
{
|
||||
strcpy(global_settings.playlist_catalog_dir, directory);
|
||||
}
|
||||
initialized = false;
|
||||
initialize_catalog();
|
||||
}
|
||||
|
||||
const char* catalog_get_directory(void)
|
||||
{
|
||||
if (initialize_catalog() == -1)
|
||||
return "";
|
||||
return playlist_dir;
|
||||
}
|
||||
|
||||
/* Display all playlists in catalog. Selected "playlist" is returned.
|
||||
If "view" mode is set then we're not adding anything into playlist. */
|
||||
static int display_playlists(char* playlist, bool view)
|
||||
|
@ -126,6 +149,8 @@ static int display_playlists(char* playlist, bool view)
|
|||
browse.buf = selected_playlist;
|
||||
browse.bufsize = sizeof(selected_playlist);
|
||||
|
||||
restart:
|
||||
browse.flags &= ~BROWSE_SELECTED;
|
||||
rockbox_browse(&browse);
|
||||
|
||||
if (browse.flags & BROWSE_SELECTED)
|
||||
|
@ -135,9 +160,12 @@ static int display_playlists(char* playlist, bool view)
|
|||
|
||||
if (view)
|
||||
{
|
||||
char *filename = strrchr(selected_playlist, '/')+1;
|
||||
/* In view mode, selecting a playlist starts playback */
|
||||
ft_play_playlist(selected_playlist, playlist_dir, filename);
|
||||
|
||||
if (!bookmark_autoload(selected_playlist))
|
||||
{
|
||||
if (playlist_viewer_ex(selected_playlist) == PLAYLIST_VIEWER_CANCEL)
|
||||
goto restart;
|
||||
}
|
||||
result = 0;
|
||||
}
|
||||
else
|
||||
|
@ -311,8 +339,6 @@ bool catalog_add_to_a_playlist(const char* sel, int sel_attr,
|
|||
snprintf(playlist, MAX_PATH, "%s/%s.m3u8",
|
||||
playlist_dir,
|
||||
(name!=NULL && (sel_attr & ATTR_DIRECTORY))?name+1:"");
|
||||
if (kbd_input(playlist, MAX_PATH))
|
||||
return false;
|
||||
}
|
||||
else
|
||||
strcpy(playlist, m3u8name);
|
||||
|
@ -323,6 +349,9 @@ bool catalog_add_to_a_playlist(const char* sel, int sel_attr,
|
|||
strcat(playlist, "8");
|
||||
else if(len <= 5 || strcasecmp(&playlist[len-5], ".m3u8"))
|
||||
strcat(playlist, ".m3u8");
|
||||
|
||||
if (kbd_input(playlist, MAX_PATH))
|
||||
return false;
|
||||
}
|
||||
else
|
||||
{
|
||||
|
|
|
@ -21,6 +21,12 @@
|
|||
#ifndef _PLAYLIST_CATALOG_H_
|
||||
#define _PLAYLIST_CATALOG_H_
|
||||
|
||||
/* Gets the configured playlist catalog dir */
|
||||
const char* catalog_get_directory(void);
|
||||
|
||||
/* Set the playlist catalog dir */
|
||||
void catalog_set_directory(const char* directory);
|
||||
|
||||
/*
|
||||
* View list of playlists in catalog.
|
||||
* ret : true if no error
|
||||
|
|
|
@ -125,7 +125,6 @@ static void format_line(const struct playlist_entry* track, char* str,
|
|||
|
||||
static bool update_playlist(bool force);
|
||||
static int onplay_menu(int index);
|
||||
static bool viewer_menu(void);
|
||||
static int save_playlist_func(void);
|
||||
|
||||
static void playlist_buffer_init(struct playlist_buffer *pb, char *names_buffer,
|
||||
|
@ -437,6 +436,9 @@ static bool update_playlist(bool force)
|
|||
return true;
|
||||
}
|
||||
|
||||
MENUITEM_FUNCTION(save_playlist_item, 0, ID2P(LANG_SAVE_DYNAMIC_PLAYLIST),
|
||||
save_playlist_func, 0, NULL, Icon_NOICON);
|
||||
|
||||
/* Menu of playlist commands. Invoked via ON+PLAY on main viewer screen.
|
||||
Returns -1 if USB attached, 0 if no playlist change, and 1 if playlist
|
||||
changed. */
|
||||
|
@ -446,9 +448,9 @@ static int onplay_menu(int index)
|
|||
struct playlist_entry * current_track =
|
||||
playlist_buffer_get_track(&viewer.buffer, index);
|
||||
MENUITEM_STRINGLIST(menu_items, ID2P(LANG_PLAYLIST), NULL,
|
||||
ID2P(LANG_PLAYLIST), ID2P(LANG_CATALOG),
|
||||
ID2P(LANG_REMOVE), ID2P(LANG_MOVE),
|
||||
ID2P(LANG_CATALOG_ADD_TO), ID2P(LANG_CATALOG_ADD_TO_NEW),
|
||||
ID2P(LANG_PLAYLISTVIEWER_SETTINGS));
|
||||
ID2P(LANG_SAVE_DYNAMIC_PLAYLIST));
|
||||
bool current = (current_track->index == viewer.current_playing_track);
|
||||
|
||||
result = do_menu(&menu_items, NULL, NULL, false);
|
||||
|
@ -465,6 +467,16 @@ static int onplay_menu(int index)
|
|||
switch (result)
|
||||
{
|
||||
case 0:
|
||||
/* playlist */
|
||||
onplay_show_playlist_menu(current_track->name);
|
||||
ret = 0;
|
||||
break;
|
||||
case 1:
|
||||
/* add to catalog */
|
||||
onplay_show_playlist_cat_menu(current_track->name);
|
||||
ret = 0;
|
||||
break;
|
||||
case 2:
|
||||
/* delete track */
|
||||
playlist_delete(viewer.playlist, current_track->index);
|
||||
if (current)
|
||||
|
@ -490,43 +502,22 @@ static int onplay_menu(int index)
|
|||
}
|
||||
ret = 1;
|
||||
break;
|
||||
case 1:
|
||||
case 3:
|
||||
/* move track */
|
||||
viewer.moving_track = index;
|
||||
viewer.moving_playlist_index = current_track->index;
|
||||
ret = 0;
|
||||
break;
|
||||
case 2: /* add to catalog */
|
||||
case 3: /* add to a new one */
|
||||
catalog_add_to_a_playlist(current_track->name,
|
||||
FILE_ATTR_AUDIO,
|
||||
result == 3, NULL);
|
||||
case 4:
|
||||
/* save playlist */
|
||||
save_playlist_screen(viewer.playlist);
|
||||
ret = 0;
|
||||
break;
|
||||
case 4: /* playlist viewer settings */
|
||||
/* true on usb connect */
|
||||
ret = viewer_menu() ? -1 : 0;
|
||||
break;
|
||||
}
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
/* Menu of viewer options. Invoked via F1(r) or Menu(p). */
|
||||
MENUITEM_SETTING(show_icons, &global_settings.playlist_viewer_icons, NULL);
|
||||
MENUITEM_SETTING(show_indices, &global_settings.playlist_viewer_indices, NULL);
|
||||
MENUITEM_SETTING(track_display,
|
||||
&global_settings.playlist_viewer_track_display, NULL);
|
||||
MENUITEM_FUNCTION(save_playlist_item, 0, ID2P(LANG_SAVE_DYNAMIC_PLAYLIST),
|
||||
save_playlist_func, 0, NULL, Icon_NOICON);
|
||||
MAKE_MENU(viewer_settings_menu, ID2P(LANG_PLAYLISTVIEWER_SETTINGS),
|
||||
NULL, Icon_Playlist,
|
||||
&show_icons, &show_indices, &track_display, &save_playlist_item);
|
||||
static bool viewer_menu(void)
|
||||
{
|
||||
return do_menu(&viewer_settings_menu, NULL, NULL, false) == MENU_ATTACHED_USB;
|
||||
}
|
||||
|
||||
/* Save playlist to disk */
|
||||
static int save_playlist_func(void)
|
||||
{
|
||||
|
@ -712,7 +703,10 @@ enum playlist_viewer_result playlist_viewer_ex(const char* filename)
|
|||
gui_synclist_draw(&playlist_lists);
|
||||
}
|
||||
else
|
||||
{
|
||||
exit = true;
|
||||
ret = PLAYLIST_VIEWER_CANCEL;
|
||||
}
|
||||
break;
|
||||
}
|
||||
case ACTION_STD_OK:
|
||||
|
@ -739,20 +733,31 @@ enum playlist_viewer_result playlist_viewer_ex(const char* filename)
|
|||
else if (!viewer.playlist)
|
||||
{
|
||||
/* play new track */
|
||||
playlist_start(current_track->index, 0);
|
||||
update_playlist(false);
|
||||
if (!global_settings.party_mode)
|
||||
{
|
||||
playlist_start(current_track->index, 0);
|
||||
update_playlist(false);
|
||||
}
|
||||
}
|
||||
else
|
||||
else if (!global_settings.party_mode)
|
||||
{
|
||||
int start_index = current_track->index;
|
||||
if (!warn_on_pl_erase())
|
||||
{
|
||||
gui_synclist_draw(&playlist_lists);
|
||||
break;
|
||||
}
|
||||
/* New playlist */
|
||||
if (playlist_set_current(viewer.playlist) < 0)
|
||||
goto exit;
|
||||
|
||||
playlist_start(current_track->index, 0);
|
||||
if (global_settings.playlist_shuffle)
|
||||
start_index = playlist_shuffle(current_tick, start_index);
|
||||
playlist_start(start_index, 0);
|
||||
|
||||
/* Our playlist is now the current list */
|
||||
if (!playlist_viewer_init(&viewer, NULL, true))
|
||||
goto exit;
|
||||
exit = true;
|
||||
}
|
||||
gui_synclist_draw(&playlist_lists);
|
||||
|
||||
|
|
|
@ -29,6 +29,7 @@ bool search_playlist(void);
|
|||
|
||||
enum playlist_viewer_result {
|
||||
PLAYLIST_VIEWER_OK,
|
||||
PLAYLIST_VIEWER_CANCEL,
|
||||
PLAYLIST_VIEWER_USB,
|
||||
PLAYLIST_VIEWER_MAINMENU,
|
||||
};
|
||||
|
|
|
@ -60,6 +60,7 @@
|
|||
#include "bookmark.h"
|
||||
#include "playlist.h"
|
||||
#include "playlist_viewer.h"
|
||||
#include "playlist_catalog.h"
|
||||
#include "menus/exported_menus.h"
|
||||
#ifdef HAVE_RTC_ALARM
|
||||
#include "rtc.h"
|
||||
|
@ -335,7 +336,21 @@ static int miscscrn(void * param)
|
|||
return GO_TO_ROOT;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
static int playlist_view_catalog(void * param)
|
||||
{
|
||||
/* kludge untill catalog_view_playlists() returns something useful */
|
||||
int old_playstatus = audio_status();
|
||||
(void)param;
|
||||
push_current_activity(ACTIVITY_PLAYLISTBROWSER);
|
||||
catalog_view_playlists();
|
||||
pop_current_activity();
|
||||
if (!old_playstatus && audio_status())
|
||||
return GO_TO_WPS;
|
||||
return GO_TO_PREVIOUS;
|
||||
}
|
||||
|
||||
static int playlist_view(void * param)
|
||||
{
|
||||
(void)param;
|
||||
|
@ -397,9 +412,9 @@ static const struct root_items items[] = {
|
|||
|
||||
[GO_TO_RECENTBMARKS] = { load_bmarks, NULL, &bookmark_settings_menu },
|
||||
[GO_TO_BROWSEPLUGINS] = { miscscrn, &plugin_menu, NULL },
|
||||
[GO_TO_PLAYLISTS_SCREEN] = { miscscrn, &playlist_options,
|
||||
&playlist_settings },
|
||||
[GO_TO_PLAYLIST_VIEWER] = { playlist_view, NULL, NULL },
|
||||
[GO_TO_PLAYLISTS_SCREEN] = { playlist_view_catalog, NULL,
|
||||
&playlist_options },
|
||||
[GO_TO_PLAYLIST_VIEWER] = { playlist_view, NULL, &playlist_options },
|
||||
[GO_TO_SYSTEM_SCREEN] = { miscscrn, &info_menu, &system_menu },
|
||||
|
||||
};
|
||||
|
@ -415,6 +430,10 @@ MENUITEM_RETURNVALUE(db_browser, ID2P(LANG_TAGCACHE), GO_TO_DBBROWSER,
|
|||
#endif
|
||||
MENUITEM_RETURNVALUE(rocks_browser, ID2P(LANG_PLUGINS), GO_TO_BROWSEPLUGINS,
|
||||
NULL, Icon_Plugin);
|
||||
|
||||
MENUITEM_RETURNVALUE(playlist_browser, ID2P(LANG_CATALOG), GO_TO_PLAYLIST_VIEWER,
|
||||
NULL, Icon_Playlist);
|
||||
|
||||
static char *get_wps_item_name(int selected_item, void * data, char *buffer)
|
||||
{
|
||||
(void)selected_item; (void)data; (void)buffer;
|
||||
|
@ -437,7 +456,7 @@ MENUITEM_RETURNVALUE(menu_, ID2P(LANG_SETTINGS), GO_TO_MAINMENU,
|
|||
MENUITEM_RETURNVALUE(bookmarks, ID2P(LANG_BOOKMARK_MENU_RECENT_BOOKMARKS),
|
||||
GO_TO_RECENTBMARKS, item_callback,
|
||||
Icon_Bookmark);
|
||||
MENUITEM_RETURNVALUE(playlists, ID2P(LANG_PLAYLISTS), GO_TO_PLAYLISTS_SCREEN,
|
||||
MENUITEM_RETURNVALUE(playlists, ID2P(LANG_CATALOG), GO_TO_PLAYLISTS_SCREEN,
|
||||
NULL, Icon_Playlist);
|
||||
MENUITEM_RETURNVALUE(system_menu_, ID2P(LANG_SYSTEM), GO_TO_SYSTEM_SCREEN,
|
||||
NULL, Icon_System_menu);
|
||||
|
|
11
apps/tree.c
11
apps/tree.c
|
@ -917,8 +917,15 @@ bool create_playlist(void)
|
|||
{
|
||||
char filename[MAX_PATH];
|
||||
|
||||
snprintf(filename, sizeof filename, "%s.m3u8",
|
||||
tc.currdir[1] ? tc.currdir : "/root");
|
||||
if (tc.currdir[1])
|
||||
snprintf(filename, sizeof filename, "%s.m3u8", tc.currdir);
|
||||
else
|
||||
snprintf(filename, sizeof filename, "%s/all.m3u8",
|
||||
catalog_get_directory());
|
||||
|
||||
|
||||
if (kbd_input(filename, MAX_PATH))
|
||||
return false;
|
||||
splashf(0, "%s %s", str(LANG_CREATING), filename);
|
||||
|
||||
trigger_cpu_boost();
|
||||
|
|
Loading…
Reference in New Issue