forked from len0rd/rockbox
Added Benjamin Metzlers bookmarking feature (patch #669440)
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@4227 a1c6a512-1295-4272-9138-f99709370657
This commit is contained in:
parent
50b6358272
commit
a108ec2ebd
17 changed files with 1545 additions and 42 deletions
1105
apps/bookmark.c
Normal file
1105
apps/bookmark.c
Normal file
File diff suppressed because it is too large
Load diff
33
apps/bookmark.h
Normal file
33
apps/bookmark.h
Normal file
|
|
@ -0,0 +1,33 @@
|
||||||
|
/***************************************************************************
|
||||||
|
* __________ __ ___.
|
||||||
|
* Open \______ \ ____ ____ | | _\_ |__ _______ ___
|
||||||
|
* Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
|
||||||
|
* Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
|
||||||
|
* Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
|
||||||
|
* \/ \/ \/ \/ \/
|
||||||
|
*
|
||||||
|
* Copyright (C) 2003 by Benjamin Metzler
|
||||||
|
*
|
||||||
|
* All files in this archive are subject to the GNU General Public License.
|
||||||
|
* See the file COPYING in the source tree root for full license agreement.
|
||||||
|
*
|
||||||
|
* This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
|
||||||
|
* KIND, either express or implied.
|
||||||
|
*
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
#ifndef __BOOKMARK_H__
|
||||||
|
#define __BOOKMARK_H__
|
||||||
|
|
||||||
|
#include <stdbool.h>
|
||||||
|
|
||||||
|
bool bookmark_menu(void);
|
||||||
|
bool bookmark_autobookmark(void);
|
||||||
|
bool bookmark_create_menu(void);
|
||||||
|
bool bookmark_mrb_load(void);
|
||||||
|
bool bookmark_autoload(char* file);
|
||||||
|
bool bookmark_load(char* file, bool autoload);
|
||||||
|
void bookmark_play(char* resume_file, int index, int offset, int seed);
|
||||||
|
|
||||||
|
#endif /* __BOOKMARK_H__ */
|
||||||
|
|
||||||
|
|
@ -1848,6 +1848,128 @@ desc: in settings_menu, option to turn display+buttos by 180 degreed
|
||||||
eng: "Upside Down"
|
eng: "Upside Down"
|
||||||
new:
|
new:
|
||||||
|
|
||||||
|
#Auto bookmark prompts
|
||||||
|
id: LANG_BOOKMARK_AUTOLOAD_QUERY
|
||||||
|
desc: prompt for user to decide to create a bookmark
|
||||||
|
eng: "Load Last Bookmark?"
|
||||||
|
new:
|
||||||
|
|
||||||
|
id: LANG_AUTO_BOOKMARK_QUERY
|
||||||
|
desc: prompt for user to decide to create an bookmark
|
||||||
|
eng: "Create a Bookmark?"
|
||||||
|
new:
|
||||||
|
|
||||||
|
# Bookmark Select Menu Text
|
||||||
|
id: LANG_BOOKMARK_SELECT_LIST_BOOKMARKS
|
||||||
|
desc: From the auto-load screen, allows user to list all bookmarks
|
||||||
|
eng: "Down = List"
|
||||||
|
new:
|
||||||
|
|
||||||
|
id: LANG_BOOKMARK_SELECT_EXIT
|
||||||
|
desc: From the bookmark list screen, allows user to exit
|
||||||
|
eng: "OFF = Exit"
|
||||||
|
new:
|
||||||
|
|
||||||
|
id: LANG_BOOKMARK_SELECT_BOOKMARK_TEXT
|
||||||
|
desc: Used on the bookmark select window to label bookmark number
|
||||||
|
eng: "Bookmark"
|
||||||
|
new:
|
||||||
|
|
||||||
|
id: LANG_BOOKMARK_SELECT_INDEX_TEXT
|
||||||
|
desc: Used on the bookmark select window to label index number
|
||||||
|
eng: "Index"
|
||||||
|
new:
|
||||||
|
|
||||||
|
id: LANG_BOOKMARK_SELECT_TIME_TEXT
|
||||||
|
desc: Used on the bookmark select window to label elapsed time
|
||||||
|
eng: "Time"
|
||||||
|
new:
|
||||||
|
|
||||||
|
id: LANG_BOOKMARK_SELECT_PLAY
|
||||||
|
desc: Used on the bookmark select window to indicated the play option
|
||||||
|
eng: "PLAY = Select"
|
||||||
|
new:
|
||||||
|
|
||||||
|
id: LANG_BOOKMARK_SELECT_DELETE
|
||||||
|
desc: Used on the bookmark select window to indicated the bookmark delete option
|
||||||
|
eng: "ON+Play = Delete"
|
||||||
|
new:
|
||||||
|
|
||||||
|
# Bookmark creation/failure text
|
||||||
|
id: LANG_BOOKMARK_CREATE_SUCCESS
|
||||||
|
desc: Indicates bookmark was successfully created
|
||||||
|
eng: "Bookmark Created"
|
||||||
|
new:
|
||||||
|
|
||||||
|
id: LANG_BOOKMARK_CREATE_FAILURE
|
||||||
|
desc: Indicates bookmark was not created
|
||||||
|
eng: "Bookmark Failed!"
|
||||||
|
new:
|
||||||
|
|
||||||
|
# Bookmark creation/failure text
|
||||||
|
id: LANG_BOOKMARK_LOAD_EMPTY
|
||||||
|
desc: Indicates bookmark was empty
|
||||||
|
eng: "Bookmark Empty"
|
||||||
|
new:
|
||||||
|
|
||||||
|
# Bookmark Settings Text
|
||||||
|
id: LANG_BOOKMARK_SETTINGS
|
||||||
|
desc: in general settings
|
||||||
|
eng: "Bookmarking"
|
||||||
|
new:
|
||||||
|
|
||||||
|
id: LANG_BOOKMARK_SETTINGS_AUTOLOAD
|
||||||
|
desc: prompt for user to decide to create a bookmark
|
||||||
|
eng: "Load Last Bookmark"
|
||||||
|
new:
|
||||||
|
|
||||||
|
id: LANG_BOOKMARK_SETTINGS_AUTOCREATE
|
||||||
|
desc: prompt for user to decide to create an bookmark
|
||||||
|
eng: "Bookmark on Stop"
|
||||||
|
new:
|
||||||
|
|
||||||
|
id: LANG_BOOKMARK_SETTINGS_MAINTAIN_RECENT_BOOKMARKS
|
||||||
|
desc: Configuration option to maintain a list of recent bookmarks
|
||||||
|
eng: "Maintain a List of Recent Bookmarks?"
|
||||||
|
new:
|
||||||
|
|
||||||
|
id: LANG_BOOKMARK_SETTINGS_RECENT_ONLY_YES
|
||||||
|
desc: Save in recent bookmarks only
|
||||||
|
eng: "Yes - Recent only"
|
||||||
|
new:
|
||||||
|
|
||||||
|
id: LANG_BOOKMARK_SETTINGS_RECENT_ONLY_ASK
|
||||||
|
desc: Save in recent bookmarks only
|
||||||
|
eng: "Ask - Recent only"
|
||||||
|
new:
|
||||||
|
|
||||||
|
|
||||||
|
id: LANG_BOOKMARK_SETTINGS_UNIQUE_ONLY
|
||||||
|
desc: Save only on bookmark for each playlist in recent bookmarks
|
||||||
|
eng: "Unique only"
|
||||||
|
new:
|
||||||
|
|
||||||
|
# Main Bookmarks Menu
|
||||||
|
id: LANG_BOOKMARK_MENU
|
||||||
|
desc: Text on main menu to get to bookmark commands
|
||||||
|
eng: "Bookmarks"
|
||||||
|
new:
|
||||||
|
|
||||||
|
id: LANG_BOOKMARK_MENU_CREATE
|
||||||
|
desc: Used off of the bookmark menu to create a bookmark
|
||||||
|
eng: "Create Bookmark"
|
||||||
|
new:
|
||||||
|
|
||||||
|
id: LANG_BOOKMARK_MENU_LIST
|
||||||
|
desc: Used off of the bookmark menu to list available bookmarks for the currently playing directory or M3U
|
||||||
|
eng: "List Bookmarks"
|
||||||
|
new:
|
||||||
|
|
||||||
|
id: LANG_BOOKMARK_MENU_RECENT_BOOKMARKS
|
||||||
|
desc: Text for the menu text to access the most recent bookmarks list
|
||||||
|
eng: "Recent Bookmarks"
|
||||||
|
new:
|
||||||
|
|
||||||
id: LANG_RECORD_PRERECORD
|
id: LANG_RECORD_PRERECORD
|
||||||
desc: in recording and radio screen
|
desc: in recording and radio screen
|
||||||
eng: "Prerecording"
|
eng: "Prerecording"
|
||||||
|
|
|
||||||
|
|
@ -40,6 +40,7 @@
|
||||||
#include "status.h"
|
#include "status.h"
|
||||||
#include "fat.h"
|
#include "fat.h"
|
||||||
#include "sleeptimer.h"
|
#include "sleeptimer.h"
|
||||||
|
#include "bookmark.h"
|
||||||
#include "wps.h"
|
#include "wps.h"
|
||||||
#include "buffer.h"
|
#include "buffer.h"
|
||||||
#include "screens.h"
|
#include "screens.h"
|
||||||
|
|
@ -269,7 +270,10 @@ bool main_menu(void)
|
||||||
int i = 0;
|
int i = 0;
|
||||||
|
|
||||||
/* main menu */
|
/* main menu */
|
||||||
struct menu_items items[14];
|
struct menu_items items[15];
|
||||||
|
|
||||||
|
items[i].desc = str(LANG_BOOKMARK_MENU);
|
||||||
|
items[i++].function = bookmark_menu;
|
||||||
|
|
||||||
items[i].desc = str(LANG_SOUND_SETTINGS);
|
items[i].desc = str(LANG_SOUND_SETTINGS);
|
||||||
items[i++].function = sound_menu;
|
items[i++].function = sound_menu;
|
||||||
|
|
|
||||||
|
|
@ -172,6 +172,10 @@ static void empty_playlist(bool resume)
|
||||||
playlist.first_index = 0;
|
playlist.first_index = 0;
|
||||||
playlist.amount = 0;
|
playlist.amount = 0;
|
||||||
playlist.last_insert_pos = -1;
|
playlist.last_insert_pos = -1;
|
||||||
|
playlist.seed = 0;
|
||||||
|
playlist.shuffle_modified = false;
|
||||||
|
playlist.deleted = false;
|
||||||
|
playlist.num_inserted_tracks = 0;
|
||||||
playlist.shuffle_flush = false;
|
playlist.shuffle_flush = false;
|
||||||
|
|
||||||
if (!resume)
|
if (!resume)
|
||||||
|
|
@ -412,6 +416,7 @@ static int add_track_to_playlist(char *filename, int position, bool queue,
|
||||||
playlist.indices[insert_position] = flags | seek_pos;
|
playlist.indices[insert_position] = flags | seek_pos;
|
||||||
|
|
||||||
playlist.amount++;
|
playlist.amount++;
|
||||||
|
playlist.num_inserted_tracks++;
|
||||||
|
|
||||||
return insert_position;
|
return insert_position;
|
||||||
}
|
}
|
||||||
|
|
@ -528,16 +533,24 @@ static int add_directory_to_playlist(char *dirname, int *position, bool queue,
|
||||||
static int remove_track_from_playlist(int position, bool write)
|
static int remove_track_from_playlist(int position, bool write)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
|
bool inserted;
|
||||||
|
|
||||||
if (playlist.amount <= 0)
|
if (playlist.amount <= 0)
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
|
inserted = playlist.indices[position] & PLAYLIST_INSERT_TYPE_MASK;
|
||||||
|
|
||||||
/* shift indices now that track has been removed */
|
/* shift indices now that track has been removed */
|
||||||
for (i=position; i<playlist.amount; i++)
|
for (i=position; i<playlist.amount; i++)
|
||||||
playlist.indices[i] = playlist.indices[i+1];
|
playlist.indices[i] = playlist.indices[i+1];
|
||||||
|
|
||||||
playlist.amount--;
|
playlist.amount--;
|
||||||
|
|
||||||
|
if (inserted)
|
||||||
|
playlist.num_inserted_tracks--;
|
||||||
|
else
|
||||||
|
playlist.deleted = true;
|
||||||
|
|
||||||
/* update stored indices if needed */
|
/* update stored indices if needed */
|
||||||
if (position < playlist.index)
|
if (position < playlist.index)
|
||||||
playlist.index--;
|
playlist.index--;
|
||||||
|
|
@ -622,6 +635,10 @@ static int randomise_playlist(unsigned int seed, bool start_current, bool write)
|
||||||
/* indices have been moved so last insert position is no longer valid */
|
/* indices have been moved so last insert position is no longer valid */
|
||||||
playlist.last_insert_pos = -1;
|
playlist.last_insert_pos = -1;
|
||||||
|
|
||||||
|
playlist.seed = seed;
|
||||||
|
if (playlist.num_inserted_tracks > 0 || playlist.deleted)
|
||||||
|
playlist.shuffle_modified = true;
|
||||||
|
|
||||||
if (write)
|
if (write)
|
||||||
{
|
{
|
||||||
/* Don't write to disk immediately. Instead, save in settings and
|
/* Don't write to disk immediately. Instead, save in settings and
|
||||||
|
|
@ -652,6 +669,8 @@ static int sort_playlist(bool start_current, bool write)
|
||||||
/* indices have been moved so last insert position is no longer valid */
|
/* indices have been moved so last insert position is no longer valid */
|
||||||
playlist.last_insert_pos = -1;
|
playlist.last_insert_pos = -1;
|
||||||
|
|
||||||
|
if (!playlist.num_inserted_tracks && !playlist.deleted)
|
||||||
|
playlist.shuffle_modified = false;
|
||||||
if (write && playlist.control_fd >= 0)
|
if (write && playlist.control_fd >= 0)
|
||||||
{
|
{
|
||||||
/* Don't write to disk immediately. Instead, save in settings and
|
/* Don't write to disk immediately. Instead, save in settings and
|
||||||
|
|
@ -1898,9 +1917,26 @@ int playlist_next(int steps)
|
||||||
return index;
|
return index;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool playlist_modified(void)
|
||||||
|
{
|
||||||
|
if ((mpeg_status() & MPEG_STATUS_PLAY))
|
||||||
|
{
|
||||||
|
if (playlist.shuffle_modified ||
|
||||||
|
playlist.deleted ||
|
||||||
|
playlist.num_inserted_tracks > 0)
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
int playlist_get_seed(void)
|
||||||
|
{
|
||||||
|
return playlist.seed;
|
||||||
|
}
|
||||||
|
|
||||||
/* Get resume info for current playing song. If return value is -1 then
|
/* Get resume info for current playing song. If return value is -1 then
|
||||||
settings shouldn't be saved. */
|
settings shouldn't be saved. */
|
||||||
int playlist_get_resume_info(short *resume_index)
|
int playlist_get_resume_info(int *resume_index)
|
||||||
{
|
{
|
||||||
*resume_index = playlist.index;
|
*resume_index = playlist.index;
|
||||||
|
|
||||||
|
|
@ -1924,6 +1960,16 @@ int playlist_get_first_index(void)
|
||||||
return playlist.first_index;
|
return playlist.first_index;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
char *playlist_get_name(char *buf, int buf_size)
|
||||||
|
{
|
||||||
|
snprintf(buf, buf_size, "%s", playlist.filename);
|
||||||
|
|
||||||
|
if (!buf[0])
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
return buf;
|
||||||
|
}
|
||||||
|
|
||||||
/* returns number of tracks in playlist (includes queued/inserted tracks) */
|
/* returns number of tracks in playlist (includes queued/inserted tracks) */
|
||||||
int playlist_amount(void)
|
int playlist_amount(void)
|
||||||
{
|
{
|
||||||
|
|
@ -1937,12 +1983,12 @@ char *playlist_name(char *buf, int buf_size)
|
||||||
|
|
||||||
snprintf(buf, buf_size, "%s", playlist.filename+playlist.dirlen);
|
snprintf(buf, buf_size, "%s", playlist.filename+playlist.dirlen);
|
||||||
|
|
||||||
if (0 == buf[0])
|
if (!buf[0])
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
/* Remove extension */
|
/* Remove extension */
|
||||||
sep = strrchr(buf, '.');
|
sep = strrchr(buf, '.');
|
||||||
if (NULL != sep)
|
if (sep)
|
||||||
*sep = 0;
|
*sep = 0;
|
||||||
|
|
||||||
return buf;
|
return buf;
|
||||||
|
|
@ -2001,7 +2047,7 @@ int playlist_save(char *filename)
|
||||||
|
|
||||||
/* use current working directory as base for pathname */
|
/* use current working directory as base for pathname */
|
||||||
if (format_track_path(tmp_buf, filename, sizeof(tmp_buf),
|
if (format_track_path(tmp_buf, filename, sizeof(tmp_buf),
|
||||||
strlen(filename)+1, getcwd(NULL, -1)) < 0)
|
strlen(filename)+1, getcwd(NULL, -1)) < 0)
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
fd = open(tmp_buf, O_CREAT|O_WRONLY|O_TRUNC);
|
fd = open(tmp_buf, O_CREAT|O_WRONLY|O_TRUNC);
|
||||||
|
|
@ -2043,15 +2089,14 @@ int playlist_save(char *filename)
|
||||||
|
|
||||||
if (fprintf(fd, "%s\n", tmp_buf) < 0)
|
if (fprintf(fd, "%s\n", tmp_buf) < 0)
|
||||||
{
|
{
|
||||||
splash(HZ*2, true,
|
splash(HZ*2, true, str(LANG_PLAYLIST_CONTROL_UPDATE_ERROR));
|
||||||
str(LANG_PLAYLIST_CONTROL_UPDATE_ERROR));
|
|
||||||
result = -1;
|
result = -1;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
count++;
|
count++;
|
||||||
|
|
||||||
if ((count%PLAYLIST_DISPLAY_COUNT) == 0)
|
if ((count % PLAYLIST_DISPLAY_COUNT) == 0)
|
||||||
display_playlist_count(count, str(LANG_PLAYLIST_SAVE_COUNT));
|
display_playlist_count(count, str(LANG_PLAYLIST_SAVE_COUNT));
|
||||||
|
|
||||||
yield();
|
yield();
|
||||||
|
|
|
||||||
|
|
@ -39,11 +39,16 @@ struct playlist_info
|
||||||
char *buffer; /* buffer for in-ram playlists */
|
char *buffer; /* buffer for in-ram playlists */
|
||||||
int buffer_size; /* size of buffer */
|
int buffer_size; /* size of buffer */
|
||||||
int buffer_end_pos; /* last position where buffer was written */
|
int buffer_end_pos; /* last position where buffer was written */
|
||||||
short index; /* index of current playing track */
|
int index; /* index of current playing track */
|
||||||
short first_index; /* index of first song in playlist */
|
int first_index; /* index of first song in playlist */
|
||||||
int amount; /* number of tracks in the index */
|
int amount; /* number of tracks in the index */
|
||||||
int last_insert_pos; /* last position we inserted a track */
|
int last_insert_pos; /* last position we inserted a track */
|
||||||
bool shuffle_flush; /* Does shuffle value need to be flushed? */
|
int seed; /* shuffle seed */
|
||||||
|
bool shuffle_modified; /* has playlist been shuffled with
|
||||||
|
inserted tracks? */
|
||||||
|
bool deleted; /* have any tracks been deleted? */
|
||||||
|
int num_inserted_tracks; /* number of tracks inserted */
|
||||||
|
bool shuffle_flush; /* does shuffle value need to be flushed? */
|
||||||
struct mutex control_mutex; /* mutex for control file access */
|
struct mutex control_mutex; /* mutex for control file access */
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
@ -75,13 +80,16 @@ int playlist_start(int start_index, int offset);
|
||||||
bool playlist_check(int steps);
|
bool playlist_check(int steps);
|
||||||
char *playlist_peek(int steps);
|
char *playlist_peek(int steps);
|
||||||
int playlist_next(int steps);
|
int playlist_next(int steps);
|
||||||
int playlist_get_resume_info(short *resume_index);
|
int playlist_get_resume_info(int *resume_index);
|
||||||
int playlist_get_display_index(void);
|
int playlist_get_display_index(void);
|
||||||
int playlist_get_first_index(void);
|
int playlist_get_first_index(void);
|
||||||
int playlist_amount(void);
|
int playlist_amount(void);
|
||||||
char *playlist_name(char *buf, int buf_size);
|
char *playlist_name(char *buf, int buf_size);
|
||||||
int playlist_get_track_info(int index, struct playlist_track_info* info);
|
int playlist_get_track_info(int index, struct playlist_track_info* info);
|
||||||
int playlist_save(char *filename);
|
int playlist_save(char *filename);
|
||||||
|
int playlist_get_seed(void);
|
||||||
|
char *playlist_get_name(char *buf, int buf_size);
|
||||||
|
bool playlist_modified(void);
|
||||||
|
|
||||||
enum {
|
enum {
|
||||||
PLAYLIST_PREPEND = -1,
|
PLAYLIST_PREPEND = -1,
|
||||||
|
|
|
||||||
|
|
@ -80,7 +80,7 @@ struct playlist_viewer_info {
|
||||||
int char_width; /* Width (in pixels) of a character */
|
int char_width; /* Width (in pixels) of a character */
|
||||||
|
|
||||||
int num_tracks; /* Number of tracks in playlist */
|
int num_tracks; /* Number of tracks in playlist */
|
||||||
short current_playing_track;/* Index of current playing track */
|
int current_playing_track; /* Index of current playing track */
|
||||||
|
|
||||||
int num_loaded; /* Number of track entries loaded in viewer */
|
int num_loaded; /* Number of track entries loaded in viewer */
|
||||||
int first_index; /* Index of first loaded track */
|
int first_index; /* Index of first loaded track */
|
||||||
|
|
@ -643,7 +643,7 @@ bool playlist_viewer(void)
|
||||||
|
|
||||||
while (!exit)
|
while (!exit)
|
||||||
{
|
{
|
||||||
short track;
|
int track;
|
||||||
|
|
||||||
/* Timeout so we can determine if play status has changed */
|
/* Timeout so we can determine if play status has changed */
|
||||||
button = button_get_w_tmo(HZ/2);
|
button = button_get_w_tmo(HZ/2);
|
||||||
|
|
|
||||||
|
|
@ -68,6 +68,7 @@ unsigned char bitmap_icons_6x8[LastIcon][6] =
|
||||||
{ 0x2a, 0x7f, 0x41, 0x41, 0x7f, 0x2a }, /* UCL flash file: chip */
|
{ 0x2a, 0x7f, 0x41, 0x41, 0x7f, 0x2a }, /* UCL flash file: chip */
|
||||||
{ 0x70, 0x70, 0x7f, 0x7f, 0x70, 0x70 }, /* Chip8 game: joystick */
|
{ 0x70, 0x70, 0x7f, 0x7f, 0x70, 0x70 }, /* Chip8 game: joystick */
|
||||||
{ 0x5d, 0x7f, 0x5d, 0x7f, 0x5d, 0x7f }, /* Video file: film strip */
|
{ 0x5d, 0x7f, 0x5d, 0x7f, 0x5d, 0x7f }, /* Video file: film strip */
|
||||||
|
{ 0xff, 0x81, 0xaf, 0xaa, 0x8c, 0xf8 }, /* Bookmark file */
|
||||||
};
|
};
|
||||||
|
|
||||||
unsigned char bitmap_icons_7x8[][7] =
|
unsigned char bitmap_icons_7x8[][7] =
|
||||||
|
|
|
||||||
|
|
@ -30,6 +30,7 @@ enum icons_6x8 {
|
||||||
Selected, Cursor, Wps, Mod_Ajz,
|
Selected, Cursor, Wps, Mod_Ajz,
|
||||||
Font, Language, Text, Config,
|
Font, Language, Text, Config,
|
||||||
Plugin, Flashfile, Chip8, Video,
|
Plugin, Flashfile, Chip8, Video,
|
||||||
|
Bookmark,
|
||||||
LastIcon
|
LastIcon
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -56,6 +56,7 @@
|
||||||
#include "language.h"
|
#include "language.h"
|
||||||
#include "wps-display.h"
|
#include "wps-display.h"
|
||||||
#include "powermgmt.h"
|
#include "powermgmt.h"
|
||||||
|
#include "bookmark.h"
|
||||||
#include "sprintf.h"
|
#include "sprintf.h"
|
||||||
#include "keyboard.h"
|
#include "keyboard.h"
|
||||||
#include "version.h"
|
#include "version.h"
|
||||||
|
|
@ -143,7 +144,7 @@ Rest of config block, only saved to disk:
|
||||||
caption backlight (bit 1)
|
caption backlight (bit 1)
|
||||||
car adapter mode (bit 2)
|
car adapter mode (bit 2)
|
||||||
line_in (Player only) (bit 3)
|
line_in (Player only) (bit 3)
|
||||||
0xAF [available/unused]
|
0xAF <most-recent-bookmarks, auto-bookmark, autoload>
|
||||||
0xB0 peak meter clip hold timeout (bit 0-4), peak meter performance (bit 7)
|
0xB0 peak meter clip hold timeout (bit 0-4), peak meter performance (bit 7)
|
||||||
0xB1 peak meter release step size, peak_meter_dbfs (bit 7)
|
0xB1 peak meter release step size, peak_meter_dbfs (bit 7)
|
||||||
0xB2 peak meter min either in -db or in percent
|
0xB2 peak meter min either in -db or in percent
|
||||||
|
|
@ -419,6 +420,9 @@ int settings_save( void )
|
||||||
((global_settings.caption_backlight & 1) << 1) |
|
((global_settings.caption_backlight & 1) << 1) |
|
||||||
((global_settings.car_adapter_mode & 1) << 2) |
|
((global_settings.car_adapter_mode & 1) << 2) |
|
||||||
((global_settings.line_in & 1) << 3));
|
((global_settings.line_in & 1) << 3));
|
||||||
|
config_block[0xaf] = ((global_settings.usemrb << 5) |
|
||||||
|
(global_settings.autocreatebookmark << 2) |
|
||||||
|
(global_settings.autoloadbookmark));
|
||||||
config_block[0xb0] = (unsigned char)global_settings.peak_meter_clip_hold |
|
config_block[0xb0] = (unsigned char)global_settings.peak_meter_clip_hold |
|
||||||
(global_settings.peak_meter_performance ? 0x80 : 0);
|
(global_settings.peak_meter_performance ? 0x80 : 0);
|
||||||
config_block[0xb1] = global_settings.peak_meter_release |
|
config_block[0xb1] = global_settings.peak_meter_release |
|
||||||
|
|
@ -771,6 +775,9 @@ void settings_load(void)
|
||||||
if (config_block[0xa9] != 0xff)
|
if (config_block[0xa9] != 0xff)
|
||||||
global_settings.jump_scroll_delay = config_block[0xa9];
|
global_settings.jump_scroll_delay = config_block[0xa9];
|
||||||
#endif
|
#endif
|
||||||
|
global_settings.usemrb = (config_block[0xaf] >> 5) & 3;
|
||||||
|
global_settings.autocreatebookmark = (config_block[0xaf] >> 2) & 7;
|
||||||
|
global_settings.autoloadbookmark = (config_block[0xaf]) & 3;
|
||||||
}
|
}
|
||||||
|
|
||||||
settings_apply();
|
settings_apply();
|
||||||
|
|
@ -1128,6 +1135,21 @@ bool settings_load_config(char* file)
|
||||||
set_cfg_option(&global_settings.recursive_dir_insert, value,
|
set_cfg_option(&global_settings.recursive_dir_insert, value,
|
||||||
options, 3);
|
options, 3);
|
||||||
}
|
}
|
||||||
|
else if (!strcasecmp(name, "autoload bookmarks"))
|
||||||
|
{
|
||||||
|
static char* options[] = {"off", "on", "ask"};
|
||||||
|
set_cfg_option(&global_settings.autoloadbookmark, value, options, 3);
|
||||||
|
}
|
||||||
|
else if (!strcasecmp(name, "autocreate bookmarks"))
|
||||||
|
{
|
||||||
|
static char* options[] = {"off", "on", "ask","recent only - yes","recent only - ask"};
|
||||||
|
set_cfg_option(&global_settings.autocreatebookmark, value, options, 5);
|
||||||
|
}
|
||||||
|
else if (!strcasecmp(name, "use most-recent-bookmarks"))
|
||||||
|
{
|
||||||
|
static char* options[] = {"off", "on", "unique only"};
|
||||||
|
set_cfg_option(&global_settings.usemrb, value, options, 3);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
close(fd);
|
close(fd);
|
||||||
|
|
@ -1143,6 +1165,7 @@ bool settings_save_config(void)
|
||||||
int fd, i, value;
|
int fd, i, value;
|
||||||
char filename[MAX_PATH];
|
char filename[MAX_PATH];
|
||||||
char* boolopt[] = {"off","on"};
|
char* boolopt[] = {"off","on"};
|
||||||
|
char* triopt[] = {"off","on","ask"};
|
||||||
|
|
||||||
/* find unused filename */
|
/* find unused filename */
|
||||||
for (i=0; ; i++) {
|
for (i=0; ; i++) {
|
||||||
|
|
@ -1431,11 +1454,27 @@ bool settings_save_config(void)
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
fprintf(fd, "#\r\n# Bookmarking\r\n#\r\n");
|
||||||
|
{
|
||||||
|
fprintf(fd, "autoload bookmarks: %s\r\n",
|
||||||
|
triopt[global_settings.autoloadbookmark]);
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
static char* options[] = {"off", "on", "ask","recent only - on", "recent only - ask"};
|
||||||
|
fprintf(fd, "autocreate bookmarks: %s\r\n",
|
||||||
|
options[global_settings.autocreatebookmark]);
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
static char* options[] = {"off", "on", "unique only"};
|
||||||
|
fprintf(fd, "UseMRB: %s\r\n", options[global_settings.usemrb]);
|
||||||
|
}
|
||||||
|
|
||||||
fprintf(fd, "#\r\n# Playlists\r\n#\r\n");
|
fprintf(fd, "#\r\n# Playlists\r\n#\r\n");
|
||||||
{
|
{
|
||||||
static char* options[] = {"off", "on", "ask"};
|
|
||||||
fprintf(fd, "recursive directory insert: %s\r\n",
|
fprintf(fd, "recursive directory insert: %s\r\n",
|
||||||
options[global_settings.recursive_dir_insert]);
|
triopt[global_settings.recursive_dir_insert]);
|
||||||
}
|
}
|
||||||
|
|
||||||
close(fd);
|
close(fd);
|
||||||
|
|
@ -1528,6 +1567,9 @@ void settings_reset(void) {
|
||||||
global_settings.lang_file[0] = 0;
|
global_settings.lang_file[0] = 0;
|
||||||
global_settings.runtime = 0;
|
global_settings.runtime = 0;
|
||||||
global_settings.topruntime = 0;
|
global_settings.topruntime = 0;
|
||||||
|
global_settings.autocreatebookmark = BOOKMARK_NO;
|
||||||
|
global_settings.autoloadbookmark = BOOKMARK_NO;
|
||||||
|
global_settings.usemrb = BOOKMARK_NO;
|
||||||
global_settings.fade_on_stop = true;
|
global_settings.fade_on_stop = true;
|
||||||
global_settings.caption_backlight = false;
|
global_settings.caption_backlight = false;
|
||||||
global_settings.car_adapter_mode = false;
|
global_settings.car_adapter_mode = false;
|
||||||
|
|
|
||||||
|
|
@ -38,6 +38,12 @@
|
||||||
#define RESUME_ASK_ONCE 2
|
#define RESUME_ASK_ONCE 2
|
||||||
#define RESUME_ON 3
|
#define RESUME_ON 3
|
||||||
|
|
||||||
|
#define BOOKMARK_NO 0
|
||||||
|
#define BOOKMARK_YES 1
|
||||||
|
#define BOOKMARK_ASK 2
|
||||||
|
#define BOOKMARK_UNIQUE_ONLY 2
|
||||||
|
#define BOOKMARK_RECENT_ONLY_YES 3
|
||||||
|
#define BOOKMARK_RECENT_ONLY_ASK 4
|
||||||
#define FF_REWIND_1000 0
|
#define FF_REWIND_1000 0
|
||||||
#define FF_REWIND_2000 1
|
#define FF_REWIND_2000 1
|
||||||
#define FF_REWIND_3000 2
|
#define FF_REWIND_3000 2
|
||||||
|
|
@ -109,8 +115,8 @@ struct user_settings
|
||||||
/* resume settings */
|
/* resume settings */
|
||||||
|
|
||||||
int resume; /* resume option: 0=off, 1=ask, 2=on */
|
int resume; /* resume option: 0=off, 1=ask, 2=on */
|
||||||
short resume_index; /* index in playlist (-1 for no active resume) */
|
int resume_index; /* index in playlist (-1 for no active resume) */
|
||||||
short resume_first_index; /* index of first track in playlist */
|
int resume_first_index; /* index of first track in playlist */
|
||||||
int resume_offset; /* byte offset in mp3 file */
|
int resume_offset; /* byte offset in mp3 file */
|
||||||
int resume_seed; /* shuffle seed (-1=no resume shuffle 0=sorted
|
int resume_seed; /* shuffle seed (-1=no resume shuffle 0=sorted
|
||||||
>0=shuffled) */
|
>0=shuffled) */
|
||||||
|
|
@ -161,6 +167,11 @@ struct user_settings
|
||||||
int bidir_limit; /* bidir scroll length limit */
|
int bidir_limit; /* bidir scroll length limit */
|
||||||
int scroll_delay; /* delay (in 1/10s) before starting scroll */
|
int scroll_delay; /* delay (in 1/10s) before starting scroll */
|
||||||
int scroll_step; /* pixels to advance per update */
|
int scroll_step; /* pixels to advance per update */
|
||||||
|
|
||||||
|
/* auto bookmark settings */
|
||||||
|
int autoloadbookmark; /* auto load option: 0=off, 1=ask, 2=on */
|
||||||
|
int autocreatebookmark; /* auto create option: 0=off, 1=ask, 2=on */
|
||||||
|
int usemrb; /* use MRB list: 0=No, 1=Yes*/
|
||||||
#ifdef HAVE_LCD_CHARCELLS
|
#ifdef HAVE_LCD_CHARCELLS
|
||||||
int jump_scroll; /* Fast jump when scrolling */
|
int jump_scroll; /* Fast jump when scrolling */
|
||||||
int jump_scroll_delay; /* Delay between jump scroll screens */
|
int jump_scroll_delay; /* Delay between jump scroll screens */
|
||||||
|
|
@ -205,6 +216,7 @@ bool set_option(char* string, void* variable, enum optiontype type,
|
||||||
bool set_int(char* string, char* unit, int* variable,
|
bool set_int(char* string, char* unit, int* variable,
|
||||||
void (*function)(int), int step, int min, int max );
|
void (*function)(int), int step, int min, int max );
|
||||||
bool set_time(char* string, int timedate[]);
|
bool set_time(char* string, int timedate[]);
|
||||||
|
int read_line(int fd, char* buffer, int buffer_size);
|
||||||
void set_file(char* filename, char* setting, int maxlen);
|
void set_file(char* filename, char* setting, int maxlen);
|
||||||
|
|
||||||
#ifdef HAVE_MAS3587F
|
#ifdef HAVE_MAS3587F
|
||||||
|
|
|
||||||
|
|
@ -438,6 +438,40 @@ static bool resume(void)
|
||||||
names, 4, NULL );
|
names, 4, NULL );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static bool autocreatebookmark(void)
|
||||||
|
{
|
||||||
|
char* names[] = { str(LANG_SET_BOOL_NO),
|
||||||
|
str(LANG_SET_BOOL_YES),
|
||||||
|
str(LANG_RESUME_SETTING_ASK),
|
||||||
|
str(LANG_BOOKMARK_SETTINGS_RECENT_ONLY_YES),
|
||||||
|
str(LANG_BOOKMARK_SETTINGS_RECENT_ONLY_ASK) };
|
||||||
|
|
||||||
|
return set_option( str(LANG_BOOKMARK_SETTINGS_AUTOCREATE),
|
||||||
|
&global_settings.autocreatebookmark, INT,
|
||||||
|
names, 5, NULL );
|
||||||
|
}
|
||||||
|
|
||||||
|
static bool autoloadbookmark(void)
|
||||||
|
{
|
||||||
|
char* names[] = { str(LANG_SET_BOOL_NO),
|
||||||
|
str(LANG_SET_BOOL_YES),
|
||||||
|
str(LANG_RESUME_SETTING_ASK) };
|
||||||
|
|
||||||
|
return set_option( str(LANG_BOOKMARK_SETTINGS_AUTOLOAD),
|
||||||
|
&global_settings.autoloadbookmark, INT,
|
||||||
|
names, 3, NULL );
|
||||||
|
}
|
||||||
|
|
||||||
|
static bool useMRB(void)
|
||||||
|
{
|
||||||
|
char* names[] = { str(LANG_SET_BOOL_NO),
|
||||||
|
str(LANG_SET_BOOL_YES),
|
||||||
|
str(LANG_BOOKMARK_SETTINGS_UNIQUE_ONLY)};
|
||||||
|
|
||||||
|
return set_option( str(LANG_BOOKMARK_SETTINGS_MAINTAIN_RECENT_BOOKMARKS),
|
||||||
|
&global_settings.usemrb, INT,
|
||||||
|
names, 3, NULL );
|
||||||
|
}
|
||||||
static bool backlight_on_when_charging(void)
|
static bool backlight_on_when_charging(void)
|
||||||
{
|
{
|
||||||
bool result = set_bool(str(LANG_BACKLIGHT_ON_WHEN_CHARGING),
|
bool result = set_bool(str(LANG_BACKLIGHT_ON_WHEN_CHARGING),
|
||||||
|
|
@ -789,6 +823,23 @@ static bool playback_settings_menu(void)
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static bool bookmark_settings_menu(void)
|
||||||
|
{
|
||||||
|
int m;
|
||||||
|
bool result;
|
||||||
|
|
||||||
|
struct menu_items items[] = {
|
||||||
|
{ str(LANG_BOOKMARK_SETTINGS_AUTOCREATE), autocreatebookmark},
|
||||||
|
{ str(LANG_BOOKMARK_SETTINGS_AUTOLOAD), autoloadbookmark},
|
||||||
|
{ str(LANG_BOOKMARK_SETTINGS_MAINTAIN_RECENT_BOOKMARKS), useMRB},
|
||||||
|
};
|
||||||
|
|
||||||
|
m=menu_init( items, sizeof items / sizeof(struct menu_items) );
|
||||||
|
result = menu_run(m);
|
||||||
|
menu_exit(m);
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
static bool reset_settings(void)
|
static bool reset_settings(void)
|
||||||
{
|
{
|
||||||
bool done=false;
|
bool done=false;
|
||||||
|
|
@ -966,6 +1017,7 @@ bool settings_menu(void)
|
||||||
{ str(LANG_CUSTOM_FONT), font_browse },
|
{ str(LANG_CUSTOM_FONT), font_browse },
|
||||||
#endif
|
#endif
|
||||||
{ str(LANG_SYSTEM), system_settings_menu },
|
{ str(LANG_SYSTEM), system_settings_menu },
|
||||||
|
{ str(LANG_BOOKMARK_SETTINGS),bookmark_settings_menu },
|
||||||
{ str(LANG_SAVE_SETTINGS), settings_save_config },
|
{ str(LANG_SAVE_SETTINGS), settings_save_config },
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
||||||
107
apps/tree.c
107
apps/tree.c
|
|
@ -49,6 +49,7 @@
|
||||||
#include "language.h"
|
#include "language.h"
|
||||||
#include "screens.h"
|
#include "screens.h"
|
||||||
#include "keyboard.h"
|
#include "keyboard.h"
|
||||||
|
#include "bookmark.h"
|
||||||
#include "onplay.h"
|
#include "onplay.h"
|
||||||
#include "buffer.h"
|
#include "buffer.h"
|
||||||
#include "plugin.h"
|
#include "plugin.h"
|
||||||
|
|
@ -83,6 +84,9 @@ static struct
|
||||||
{ ".fnt", TREE_ATTR_FONT,Font },
|
{ ".fnt", TREE_ATTR_FONT,Font },
|
||||||
{ ".ch8", TREE_ATTR_CH8, Chip8 },
|
{ ".ch8", TREE_ATTR_CH8, Chip8 },
|
||||||
{ ".rvf", TREE_ATTR_RVF, Video },
|
{ ".rvf", TREE_ATTR_RVF, Video },
|
||||||
|
{ ".bmark",TREE_ATTR_BMARK,Bookmark },
|
||||||
|
#else
|
||||||
|
{ ".bmark", TREE_ATTR_BMARK, -1 },
|
||||||
#endif
|
#endif
|
||||||
#ifndef SIMULATOR
|
#ifndef SIMULATOR
|
||||||
#ifdef HAVE_LCD_BITMAP
|
#ifdef HAVE_LCD_BITMAP
|
||||||
|
|
@ -118,6 +122,7 @@ static int boot_size = 0;
|
||||||
static int boot_cluster;
|
static int boot_cluster;
|
||||||
static bool boot_changed = false;
|
static bool boot_changed = false;
|
||||||
|
|
||||||
|
static bool start_wps = false;
|
||||||
static bool dirbrowse(char *root, int *dirfilter);
|
static bool dirbrowse(char *root, int *dirfilter);
|
||||||
|
|
||||||
void browse_root(void)
|
void browse_root(void)
|
||||||
|
|
@ -646,9 +651,7 @@ static void start_resume(bool ask_once)
|
||||||
playlist_start(global_settings.resume_index,
|
playlist_start(global_settings.resume_index,
|
||||||
global_settings.resume_offset);
|
global_settings.resume_offset);
|
||||||
|
|
||||||
status_set_playmode(STATUS_PLAY);
|
start_wps = true;
|
||||||
status_draw(true);
|
|
||||||
wps_show();
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
return;
|
return;
|
||||||
|
|
@ -930,6 +933,7 @@ static bool dirbrowse(char *root, int *dirfilter)
|
||||||
|
|
||||||
#ifdef HAVE_RECORDER_KEYPAD
|
#ifdef HAVE_RECORDER_KEYPAD
|
||||||
case BUTTON_OFF:
|
case BUTTON_OFF:
|
||||||
|
bookmark_autobookmark();
|
||||||
mpeg_stop();
|
mpeg_stop();
|
||||||
status_set_playmode(STATUS_STOP);
|
status_set_playmode(STATUS_STOP);
|
||||||
status_draw(false);
|
status_draw(false);
|
||||||
|
|
@ -988,6 +992,12 @@ static bool dirbrowse(char *root, int *dirfilter)
|
||||||
lcd_stop_scroll();
|
lcd_stop_scroll();
|
||||||
switch ( file->attr & TREE_ATTR_MASK ) {
|
switch ( file->attr & TREE_ATTR_MASK ) {
|
||||||
case TREE_ATTR_M3U:
|
case TREE_ATTR_M3U:
|
||||||
|
if (bookmark_autoload(buf))
|
||||||
|
{
|
||||||
|
restore = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
if (playlist_create(currdir, file->name) != -1)
|
if (playlist_create(currdir, file->name) != -1)
|
||||||
{
|
{
|
||||||
if (global_settings.playlist_shuffle)
|
if (global_settings.playlist_shuffle)
|
||||||
|
|
@ -999,6 +1009,12 @@ static bool dirbrowse(char *root, int *dirfilter)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case TREE_ATTR_MPA:
|
case TREE_ATTR_MPA:
|
||||||
|
if (bookmark_autoload(currdir))
|
||||||
|
{
|
||||||
|
restore = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
if (playlist_create(currdir, NULL) != -1)
|
if (playlist_create(currdir, NULL) != -1)
|
||||||
{
|
{
|
||||||
start_index =
|
start_index =
|
||||||
|
|
@ -1051,6 +1067,12 @@ static bool dirbrowse(char *root, int *dirfilter)
|
||||||
restore = true;
|
restore = true;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case TREE_ATTR_BMARK:
|
||||||
|
bookmark_load(buf, false);
|
||||||
|
restore = true;
|
||||||
|
reload_dir = true;
|
||||||
|
break;
|
||||||
|
|
||||||
case TREE_ATTR_TXT:
|
case TREE_ATTR_TXT:
|
||||||
plugin_load("/.rockbox/rocks/viewer.rock",buf);
|
plugin_load("/.rockbox/rocks/viewer.rock",buf);
|
||||||
restore = true;
|
restore = true;
|
||||||
|
|
@ -1122,15 +1144,7 @@ static bool dirbrowse(char *root, int *dirfilter)
|
||||||
settings_save();
|
settings_save();
|
||||||
}
|
}
|
||||||
|
|
||||||
status_set_playmode(STATUS_PLAY);
|
start_wps = true;
|
||||||
status_draw(false);
|
|
||||||
lcd_stop_scroll();
|
|
||||||
if ( wps_show() == SYS_USB_CONNECTED ) {
|
|
||||||
reload_root = true;
|
|
||||||
}
|
|
||||||
#ifdef HAVE_LCD_BITMAP
|
|
||||||
tree_max_on_screen = (LCD_HEIGHT - MARGIN_Y) / fh;
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
else if (*dirfilter > NUM_FILTER_MODES)
|
else if (*dirfilter > NUM_FILTER_MODES)
|
||||||
exit_func = true;
|
exit_func = true;
|
||||||
|
|
@ -1238,13 +1252,7 @@ static bool dirbrowse(char *root, int *dirfilter)
|
||||||
{
|
{
|
||||||
if (mpeg_status() & MPEG_STATUS_PLAY)
|
if (mpeg_status() & MPEG_STATUS_PLAY)
|
||||||
{
|
{
|
||||||
lcd_stop_scroll();
|
start_wps=true;
|
||||||
if (wps_show() == SYS_USB_CONNECTED)
|
|
||||||
reload_root = true;
|
|
||||||
#ifdef HAVE_LCD_BITMAP
|
|
||||||
tree_max_on_screen = (LCD_HEIGHT - MARGIN_Y) / fh;
|
|
||||||
#endif
|
|
||||||
restore = true;
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
|
@ -1293,6 +1301,18 @@ static bool dirbrowse(char *root, int *dirfilter)
|
||||||
if ( button )
|
if ( button )
|
||||||
ata_spin();
|
ata_spin();
|
||||||
|
|
||||||
|
if (start_wps)
|
||||||
|
{
|
||||||
|
lcd_stop_scroll();
|
||||||
|
if (wps_show() == SYS_USB_CONNECTED)
|
||||||
|
reload_root = true;
|
||||||
|
#ifdef HAVE_LCD_BITMAP
|
||||||
|
tree_max_on_screen = (LCD_HEIGHT - MARGIN_Y) / fh;
|
||||||
|
#endif
|
||||||
|
restore = true;
|
||||||
|
start_wps=false;
|
||||||
|
}
|
||||||
|
|
||||||
/* do we need to rescan dir? */
|
/* do we need to rescan dir? */
|
||||||
if (reload_dir || reload_root ||
|
if (reload_dir || reload_root ||
|
||||||
lastfilter != *dirfilter ||
|
lastfilter != *dirfilter ||
|
||||||
|
|
@ -1313,6 +1333,7 @@ static bool dirbrowse(char *root, int *dirfilter)
|
||||||
lastfilter = *dirfilter;
|
lastfilter = *dirfilter;
|
||||||
lastsortcase = global_settings.sort_case;
|
lastsortcase = global_settings.sort_case;
|
||||||
restore = true;
|
restore = true;
|
||||||
|
while (button_get(false)); /* clear button queue */
|
||||||
}
|
}
|
||||||
|
|
||||||
if (exit_func)
|
if (exit_func)
|
||||||
|
|
@ -1507,3 +1528,51 @@ void tree_init(void)
|
||||||
name_buffer = buffer_alloc(name_buffer_size);
|
name_buffer = buffer_alloc(name_buffer_size);
|
||||||
dircache = buffer_alloc(max_files_in_dir * sizeof(struct entry));
|
dircache = buffer_alloc(max_files_in_dir * sizeof(struct entry));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void bookmark_play(char *resume_file, int index, int offset, int seed)
|
||||||
|
{
|
||||||
|
int len=strlen(resume_file);
|
||||||
|
|
||||||
|
if (!strcasecmp(&resume_file[len-4], ".m3u"))
|
||||||
|
{
|
||||||
|
char* slash;
|
||||||
|
// check that the file exists
|
||||||
|
int fd = open(resume_file, O_RDONLY);
|
||||||
|
if(fd<0)
|
||||||
|
return;
|
||||||
|
close(fd);
|
||||||
|
|
||||||
|
slash = strrchr(resume_file,'/');
|
||||||
|
if (slash)
|
||||||
|
{
|
||||||
|
char* cp;
|
||||||
|
*slash=0;
|
||||||
|
|
||||||
|
cp=resume_file;
|
||||||
|
if (!cp[0])
|
||||||
|
cp="/";
|
||||||
|
|
||||||
|
if (playlist_create(cp, slash+1) != -1)
|
||||||
|
{
|
||||||
|
if (global_settings.playlist_shuffle)
|
||||||
|
playlist_shuffle(seed, -1);
|
||||||
|
playlist_start(index,offset);
|
||||||
|
}
|
||||||
|
*slash='/';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
lastdir[0]='\0';
|
||||||
|
if (playlist_create(resume_file, NULL) != -1)
|
||||||
|
{
|
||||||
|
resume_directory(resume_file);
|
||||||
|
if (global_settings.playlist_shuffle)
|
||||||
|
playlist_shuffle(seed, -1);
|
||||||
|
playlist_start(index,offset);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
status_set_playmode(STATUS_PLAY);
|
||||||
|
start_wps=true;
|
||||||
|
}
|
||||||
|
|
|
||||||
|
|
@ -39,6 +39,7 @@ struct entry {
|
||||||
#define TREE_ATTR_UCL 0x0A00 /* rockbox flash image */
|
#define TREE_ATTR_UCL 0x0A00 /* rockbox flash image */
|
||||||
#define TREE_ATTR_CH8 0x0B00 /* chip-8 game */
|
#define TREE_ATTR_CH8 0x0B00 /* chip-8 game */
|
||||||
#define TREE_ATTR_RVF 0x0C00 /* rockbox video file */
|
#define TREE_ATTR_RVF 0x0C00 /* rockbox video file */
|
||||||
|
#define TREE_ATTR_BMARK 0x0D00 /* book mark file */
|
||||||
#define TREE_ATTR_MASK 0xFFC0 /* which bits tree.c uses (above) */
|
#define TREE_ATTR_MASK 0xFFC0 /* which bits tree.c uses (above) */
|
||||||
|
|
||||||
void tree_init(void);
|
void tree_init(void);
|
||||||
|
|
|
||||||
|
|
@ -45,6 +45,7 @@
|
||||||
#include "peakmeter.h"
|
#include "peakmeter.h"
|
||||||
#endif
|
#endif
|
||||||
#include "lang.h"
|
#include "lang.h"
|
||||||
|
#include "bookmark.h"
|
||||||
#define FF_REWIND_MAX_PERCENT 3 /* cap ff/rewind step size at max % of file */
|
#define FF_REWIND_MAX_PERCENT 3 /* cap ff/rewind step size at max % of file */
|
||||||
/* 3% of 30min file == 54s step size */
|
/* 3% of 30min file == 54s step size */
|
||||||
|
|
||||||
|
|
@ -943,7 +944,7 @@ int wps_show(void)
|
||||||
case BUTTON_RC_STOP:
|
case BUTTON_RC_STOP:
|
||||||
#endif
|
#endif
|
||||||
#ifdef BUTTON_OFF
|
#ifdef BUTTON_OFF
|
||||||
case BUTTON_OFF:
|
case BUTTON_OFF | BUTTON_REL:
|
||||||
#else
|
#else
|
||||||
case BUTTON_STOP | BUTTON_REL:
|
case BUTTON_STOP | BUTTON_REL:
|
||||||
if ( lastbutton != BUTTON_STOP )
|
if ( lastbutton != BUTTON_STOP )
|
||||||
|
|
@ -985,6 +986,7 @@ int wps_show(void)
|
||||||
fade(0);
|
fade(0);
|
||||||
|
|
||||||
lcd_stop_scroll();
|
lcd_stop_scroll();
|
||||||
|
bookmark_autobookmark();
|
||||||
mpeg_stop();
|
mpeg_stop();
|
||||||
status_set_playmode(STATUS_STOP);
|
status_set_playmode(STATUS_STOP);
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -102,7 +102,7 @@ FIRMSRCS = $(LCDSRSC) id3.c mp3data.c usb.c mpeg.c mp3_playback.c \
|
||||||
APPS = main.c tree.c menu.c credits.c main_menu.c icons.c language.c \
|
APPS = main.c tree.c menu.c credits.c main_menu.c icons.c language.c \
|
||||||
playlist.c wps.c wps-display.c settings.c status.c \
|
playlist.c wps.c wps-display.c settings.c status.c \
|
||||||
screens.c peakmeter.c sleeptimer.c keyboard.c onplay.c\
|
screens.c peakmeter.c sleeptimer.c keyboard.c onplay.c\
|
||||||
misc.c plugin.c playlist_viewer.c
|
misc.c plugin.c playlist_viewer.c bookmark.c
|
||||||
|
|
||||||
MENUS = settings_menu.c sound_menu.c playlist_menu.c
|
MENUS = settings_menu.c sound_menu.c playlist_menu.c
|
||||||
|
|
||||||
|
|
@ -204,6 +204,9 @@ $(OBJDIR)/playlist.o: $(APPDIR)/playlist.c
|
||||||
$(OBJDIR)/playlist_viewer.o: $(APPDIR)/playlist_viewer.c
|
$(OBJDIR)/playlist_viewer.o: $(APPDIR)/playlist_viewer.c
|
||||||
$(CC) $(APPCFLAGS) -c $< -o $@
|
$(CC) $(APPCFLAGS) -c $< -o $@
|
||||||
|
|
||||||
|
$(OBJDIR)/bookmark.o: $(APPDIR)/bookmark.c
|
||||||
|
$(CC) $(APPCFLAGS) -c $< -o $@
|
||||||
|
|
||||||
$(OBJDIR)/plugin.o: $(APPDIR)/plugin.c plugin-win32.h
|
$(OBJDIR)/plugin.o: $(APPDIR)/plugin.c plugin-win32.h
|
||||||
$(CC) $(APPCFLAGS) -c $< -o $@
|
$(CC) $(APPCFLAGS) -c $< -o $@
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -102,7 +102,7 @@ FIRMSRCS = $(LCDSRSC) id3.c debug.c usb.c mpeg.c mp3_playback.c power.c\
|
||||||
APPS = main.c tree.c menu.c credits.c main_menu.c language.c\
|
APPS = main.c tree.c menu.c credits.c main_menu.c language.c\
|
||||||
playlist.c wps.c wps-display.c settings.c status.c icons.c\
|
playlist.c wps.c wps-display.c settings.c status.c icons.c\
|
||||||
screens.c peakmeter.c sleeptimer.c keyboard.c onplay.c\
|
screens.c peakmeter.c sleeptimer.c keyboard.c onplay.c\
|
||||||
misc.c plugin.c playlist_viewer.c
|
misc.c plugin.c playlist_viewer.c bookmark.c
|
||||||
|
|
||||||
MENUS = settings_menu.c sound_menu.c playlist_menu.c
|
MENUS = settings_menu.c sound_menu.c playlist_menu.c
|
||||||
|
|
||||||
|
|
@ -202,6 +202,9 @@ $(OBJDIR)/playlist.o: $(APPDIR)/playlist.c
|
||||||
$(OBJDIR)/playlist_viewer.o: $(APPDIR)/playlist_viewer.c
|
$(OBJDIR)/playlist_viewer.o: $(APPDIR)/playlist_viewer.c
|
||||||
$(CC) $(APPCFLAGS) -c $< -o $@
|
$(CC) $(APPCFLAGS) -c $< -o $@
|
||||||
|
|
||||||
|
$(OBJDIR)/bookmark.o: $(APPDIR)/bookmark.c
|
||||||
|
$(CC) $(APPCFLAGS) -c $< -o $@
|
||||||
|
|
||||||
$(OBJDIR)/build.lang: $(APPDIR)/lang/$(LANGUAGE).lang
|
$(OBJDIR)/build.lang: $(APPDIR)/lang/$(LANGUAGE).lang
|
||||||
perl $(TOOLSDIR)/uplang $(APPDIR)/lang/english.lang $< > $@
|
perl $(TOOLSDIR)/uplang $(APPDIR)/lang/english.lang $< > $@
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue