New bookmarks contain pitch and speed info. Old bookmarks still work, behavior unchanged.
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@25576 a1c6a512-1295-4272-9138-f99709370657
This commit is contained in:
parent
4702770933
commit
55064f7b7d
1 changed files with 50 additions and 22 deletions
|
@ -42,6 +42,7 @@
|
||||||
#include "plugin.h"
|
#include "plugin.h"
|
||||||
#include "file.h"
|
#include "file.h"
|
||||||
#include "filefuncs.h"
|
#include "filefuncs.h"
|
||||||
|
#include "dsp.h"
|
||||||
|
|
||||||
#define MAX_BOOKMARKS 10
|
#define MAX_BOOKMARKS 10
|
||||||
#define MAX_BOOKMARK_SIZE 350
|
#define MAX_BOOKMARK_SIZE 350
|
||||||
|
@ -61,8 +62,9 @@ struct bookmark_list
|
||||||
char* items[];
|
char* items[];
|
||||||
};
|
};
|
||||||
|
|
||||||
/* bookmark flags */
|
/* flags for optional bookmark tokens */
|
||||||
#define F_BMFILES 0x01
|
#define BM_PITCH 0x01
|
||||||
|
#define BM_SPEED 0x02
|
||||||
|
|
||||||
/* bookmark values */
|
/* bookmark values */
|
||||||
static struct {
|
static struct {
|
||||||
|
@ -72,6 +74,9 @@ static struct {
|
||||||
long resume_time;
|
long resume_time;
|
||||||
int repeat_mode;
|
int repeat_mode;
|
||||||
bool shuffle;
|
bool shuffle;
|
||||||
|
/* optional values */
|
||||||
|
int pitch;
|
||||||
|
int speed;
|
||||||
} bm;
|
} bm;
|
||||||
|
|
||||||
static bool add_bookmark(const char* bookmark_file_name, const char* bookmark,
|
static bool add_bookmark(const char* bookmark_file_name, const char* bookmark,
|
||||||
|
@ -82,7 +87,7 @@ static void say_bookmark(const char* bookmark,
|
||||||
int bookmark_id, bool show_playlist_name);
|
int bookmark_id, bool show_playlist_name);
|
||||||
static bool play_bookmark(const char* bookmark);
|
static bool play_bookmark(const char* bookmark);
|
||||||
static bool generate_bookmark_file_name(const char *in);
|
static bool generate_bookmark_file_name(const char *in);
|
||||||
static bool parse_bookmark(const char *bookmark, const int flags);
|
static bool parse_bookmark(const char *bookmark, const bool get_filenames);
|
||||||
static int buffer_bookmarks(struct bookmark_list* bookmarks, int first_line);
|
static int buffer_bookmarks(struct bookmark_list* bookmarks, int first_line);
|
||||||
static const char* get_bookmark_info(int list_index,
|
static const char* get_bookmark_info(int list_index,
|
||||||
void* data,
|
void* data,
|
||||||
|
@ -285,7 +290,7 @@ static bool add_bookmark(const char* bookmark_file_name, const char* bookmark,
|
||||||
|
|
||||||
cp = strchr(global_read_buffer,'/');
|
cp = strchr(global_read_buffer,'/');
|
||||||
tmp = strrchr(global_read_buffer,';');
|
tmp = strrchr(global_read_buffer,';');
|
||||||
if (parse_bookmark(global_read_buffer, 0) &&
|
if (parse_bookmark(global_read_buffer, false) &&
|
||||||
(!unique || len != tmp -cp || strncmp(playlist,cp,len)))
|
(!unique || len != tmp -cp || strncmp(playlist,cp,len)))
|
||||||
{
|
{
|
||||||
bookmark_count++;
|
bookmark_count++;
|
||||||
|
@ -334,20 +339,27 @@ static char* create_bookmark()
|
||||||
|
|
||||||
/* create the bookmark */
|
/* create the bookmark */
|
||||||
snprintf(global_bookmark, sizeof(global_bookmark),
|
snprintf(global_bookmark, sizeof(global_bookmark),
|
||||||
"%d;%ld;%d;%d;%ld;%d;%d;%s;%s",
|
/* new optional bookmark token descriptors should be inserted
|
||||||
|
just before the "%s;%s" in this line... */
|
||||||
|
">%d;%d;%ld;%d;%ld;%d;%d;%d;%d;%s;%s",
|
||||||
|
/* ... their flags should go here ... */
|
||||||
|
BM_PITCH | BM_SPEED,
|
||||||
resume_index,
|
resume_index,
|
||||||
id3->offset,
|
id3->offset,
|
||||||
playlist_get_seed(NULL),
|
playlist_get_seed(NULL),
|
||||||
0,
|
|
||||||
id3->elapsed,
|
id3->elapsed,
|
||||||
global_settings.repeat_mode,
|
global_settings.repeat_mode,
|
||||||
global_settings.playlist_shuffle,
|
global_settings.playlist_shuffle,
|
||||||
|
/* ...and their values should go here */
|
||||||
|
sound_get_pitch(),
|
||||||
|
dsp_get_timestretch(),
|
||||||
|
/* more mandatory tokens */
|
||||||
playlist_get_name(NULL, global_temp_buffer,
|
playlist_get_name(NULL, global_temp_buffer,
|
||||||
sizeof(global_temp_buffer)),
|
sizeof(global_temp_buffer)),
|
||||||
file+1);
|
file+1);
|
||||||
|
|
||||||
/* checking to see if the bookmark is valid */
|
/* checking to see if the bookmark is valid */
|
||||||
if (parse_bookmark(global_bookmark, 0))
|
if (parse_bookmark(global_bookmark, false))
|
||||||
return global_bookmark;
|
return global_bookmark;
|
||||||
else
|
else
|
||||||
return NULL;
|
return NULL;
|
||||||
|
@ -563,9 +575,7 @@ static const char* get_bookmark_info(int list_index,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
const int flags = F_BMFILES;
|
if (!parse_bookmark(bookmarks->items[index - bookmarks->start], true))
|
||||||
|
|
||||||
if (!parse_bookmark(bookmarks->items[index - bookmarks->start], flags))
|
|
||||||
{
|
{
|
||||||
return list_index % 2 == 0 ? (char*) str(LANG_BOOKMARK_INVALID) : " ";
|
return list_index % 2 == 0 ? (char*) str(LANG_BOOKMARK_INVALID) : " ";
|
||||||
}
|
}
|
||||||
|
@ -832,9 +842,7 @@ static void say_bookmark(const char* bookmark,
|
||||||
{
|
{
|
||||||
bool is_dir;
|
bool is_dir;
|
||||||
|
|
||||||
const int flags = F_BMFILES;
|
if (!parse_bookmark(bookmark, true))
|
||||||
|
|
||||||
if (!parse_bookmark(bookmark, flags))
|
|
||||||
{
|
{
|
||||||
talk_id(LANG_BOOKMARK_INVALID, false);
|
talk_id(LANG_BOOKMARK_INVALID, false);
|
||||||
return;
|
return;
|
||||||
|
@ -888,12 +896,16 @@ static void say_bookmark(const char* bookmark,
|
||||||
/* ------------------------------------------------------------------------*/
|
/* ------------------------------------------------------------------------*/
|
||||||
static bool play_bookmark(const char* bookmark)
|
static bool play_bookmark(const char* bookmark)
|
||||||
{
|
{
|
||||||
const int flags = F_BMFILES;
|
/* preset pitch and speed to 100% in case bookmark doesn't have info */
|
||||||
|
bm.pitch = sound_get_pitch();
|
||||||
|
bm.speed = dsp_get_timestretch();
|
||||||
|
|
||||||
if (parse_bookmark(bookmark, flags))
|
if (parse_bookmark(bookmark, true))
|
||||||
{
|
{
|
||||||
global_settings.repeat_mode = bm.repeat_mode;
|
global_settings.repeat_mode = bm.repeat_mode;
|
||||||
global_settings.playlist_shuffle = bm.shuffle;
|
global_settings.playlist_shuffle = bm.shuffle;
|
||||||
|
sound_set_pitch(bm.pitch);
|
||||||
|
dsp_set_timestretch(bm.speed);
|
||||||
return bookmark_play(global_temp_buffer, bm.resume_index,
|
return bookmark_play(global_temp_buffer, bm.resume_index,
|
||||||
bm.resume_offset, bm.resume_seed, global_filename);
|
bm.resume_offset, bm.resume_seed, global_filename);
|
||||||
}
|
}
|
||||||
|
@ -924,27 +936,43 @@ static const char* long_token(const char* s, long* dest)
|
||||||
|
|
||||||
/* ----------------------------------------------------------------------- */
|
/* ----------------------------------------------------------------------- */
|
||||||
/* This function takes a bookmark and parses it. This function also */
|
/* This function takes a bookmark and parses it. This function also */
|
||||||
/* validates the bookmark. Flags are set to indicate which bookmark */
|
/* validates the bookmark. The parse_filenames flag indicates whether */
|
||||||
/* tokens are to be processed. */
|
/* the filename tokens are to be extracted. */
|
||||||
/* ----------------------------------------------------------------------- */
|
/* ----------------------------------------------------------------------- */
|
||||||
static bool parse_bookmark(const char *bookmark, const int flags)
|
static bool parse_bookmark(const char *bookmark, const bool parse_filenames)
|
||||||
{
|
{
|
||||||
const char* s = bookmark;
|
const char* s = bookmark;
|
||||||
const char* end;
|
const char* end;
|
||||||
|
|
||||||
#define FLAG(a) (flags & a)
|
|
||||||
#define GET_INT_TOKEN(var) s = long_token(s, (long *)&var)
|
#define GET_INT_TOKEN(var) s = long_token(s, (long *)&var)
|
||||||
#define GET_BOOL_TOKEN(var) var = (atoi(s)!=0); s = skip_token(s)
|
#define GET_BOOL_TOKEN(var) var = (atoi(s)!=0); s = skip_token(s)
|
||||||
|
|
||||||
|
/* if new format bookmark, extract the optional content flags,
|
||||||
|
otherwise treat as an original format bookmark */
|
||||||
|
int opt_flags = 0;
|
||||||
|
bool new_format = (strchr(s, '>') == s);
|
||||||
|
if (new_format)
|
||||||
|
{
|
||||||
|
s++;
|
||||||
|
GET_INT_TOKEN(opt_flags);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* extract all original bookmark tokens */
|
||||||
GET_INT_TOKEN(bm.resume_index);
|
GET_INT_TOKEN(bm.resume_index);
|
||||||
GET_INT_TOKEN(bm.resume_offset);
|
GET_INT_TOKEN(bm.resume_offset);
|
||||||
GET_INT_TOKEN(bm.resume_seed);
|
GET_INT_TOKEN(bm.resume_seed);
|
||||||
/* skip deprecated token */
|
if (!new_format) /* skip deprecated token */
|
||||||
s = skip_token(s);
|
s = skip_token(s);
|
||||||
GET_INT_TOKEN(bm.resume_time);
|
GET_INT_TOKEN(bm.resume_time);
|
||||||
GET_INT_TOKEN(bm.repeat_mode);
|
GET_INT_TOKEN(bm.repeat_mode);
|
||||||
GET_BOOL_TOKEN(bm.shuffle);
|
GET_BOOL_TOKEN(bm.shuffle);
|
||||||
|
|
||||||
|
/* extract all optional bookmark tokens */
|
||||||
|
if (opt_flags & BM_PITCH)
|
||||||
|
GET_INT_TOKEN(bm.pitch);
|
||||||
|
if (opt_flags & BM_SPEED)
|
||||||
|
GET_INT_TOKEN(bm.speed);
|
||||||
|
|
||||||
if (*s == 0)
|
if (*s == 0)
|
||||||
{
|
{
|
||||||
return false;
|
return false;
|
||||||
|
@ -953,7 +981,7 @@ static bool parse_bookmark(const char *bookmark, const int flags)
|
||||||
end = strchr(s, ';');
|
end = strchr(s, ';');
|
||||||
|
|
||||||
/* extract file names */
|
/* extract file names */
|
||||||
if (FLAG(F_BMFILES))
|
if (parse_filenames)
|
||||||
{
|
{
|
||||||
size_t len = (end == NULL) ? strlen(s) : (size_t) (end - s);
|
size_t len = (end == NULL) ? strlen(s) : (size_t) (end - s);
|
||||||
len = MIN(TEMP_BUF_SIZE - 1, len);
|
len = MIN(TEMP_BUF_SIZE - 1, len);
|
||||||
|
|
Loading…
Reference in a new issue