Add the possibility to store cuesheets in /.rockbox/cue. The code will look for a cuesheet there in case there wasn't one in the same folder as the audio file. This is to reduce the clutter created by one cuesheet per audio file in some places.
Also some duplicate code was replaced by a function call. git-svn-id: svn://svn.rockbox.org/rockbox/trunk@13508 a1c6a512-1295-4272-9138-f99709370657
This commit is contained in:
parent
1bae792e5c
commit
6579818b43
5 changed files with 29 additions and 24 deletions
|
@ -41,11 +41,13 @@
|
|||
#include "playback.h"
|
||||
#include "cuesheet.h"
|
||||
|
||||
#define CUE_DIR ROCKBOX_DIR "/cue"
|
||||
|
||||
#if CONFIG_CODEC != SWCODEC
|
||||
/* special trickery because the hwcodec playback engine is in firmware/ */
|
||||
static bool cuesheet_handler(const char *filename)
|
||||
{
|
||||
return cuesheet_is_enabled() && look_for_cuesheet_file(filename);
|
||||
return cuesheet_is_enabled() && look_for_cuesheet_file(filename, NULL);
|
||||
}
|
||||
#endif
|
||||
|
||||
|
@ -68,8 +70,9 @@ bool cuesheet_is_enabled(void)
|
|||
return (curr_cue != NULL);
|
||||
}
|
||||
|
||||
bool look_for_cuesheet_file(const char *trackpath)
|
||||
bool look_for_cuesheet_file(const char *trackpath, char *found_cue_path)
|
||||
{
|
||||
DEBUGF("look for cue file\n");
|
||||
char cuepath[MAX_PATH];
|
||||
strncpy(cuepath, trackpath, MAX_PATH);
|
||||
char *dot = strrchr(cuepath, '.');
|
||||
|
@ -78,13 +81,22 @@ bool look_for_cuesheet_file(const char *trackpath)
|
|||
int fd = open(cuepath,O_RDONLY);
|
||||
if (fd < 0)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
else
|
||||
{
|
||||
close(fd);
|
||||
return true;
|
||||
strcpy(cuepath, CUE_DIR);
|
||||
strcat(cuepath, strrchr(trackpath, '/'));
|
||||
char *dot = strrchr(cuepath, '.');
|
||||
strcpy(dot, ".cue");
|
||||
fd = open(cuepath,O_RDONLY);
|
||||
if (fd < 0)
|
||||
{
|
||||
if (found_cue_path)
|
||||
found_cue_path = NULL;
|
||||
return false;
|
||||
}
|
||||
}
|
||||
close(fd);
|
||||
if (found_cue_path)
|
||||
strncpy(found_cue_path, cuepath, MAX_PATH);
|
||||
return true;
|
||||
}
|
||||
|
||||
static char *skip_whitespace(char* buf)
|
||||
|
@ -122,6 +134,7 @@ bool parse_cuesheet(char *file, struct cuesheet *cue)
|
|||
char line[MAX_PATH];
|
||||
char *s;
|
||||
|
||||
DEBUGF("cue parse\n");
|
||||
int fd = open(file,O_RDONLY);
|
||||
if (fd < 0)
|
||||
{
|
||||
|
@ -271,9 +284,7 @@ void browse_cuesheet(struct cuesheet *cue)
|
|||
|
||||
if (id3 && *id3->path && strcmp(id3->path, "No file!"))
|
||||
{
|
||||
strncpy(cuepath, id3->path, MAX_PATH);
|
||||
dot = strrchr(cuepath, '.');
|
||||
strcpy(dot, ".cue");
|
||||
look_for_cuesheet_file(id3->path, cuepath);
|
||||
}
|
||||
|
||||
if (id3 && id3->cuesheet_type && !strcmp(cue->path, cuepath))
|
||||
|
@ -294,9 +305,7 @@ void browse_cuesheet(struct cuesheet *cue)
|
|||
id3 = audio_current_track();
|
||||
if (id3 && *id3->path && strcmp(id3->path, "No file!"))
|
||||
{
|
||||
strncpy(cuepath, id3->path, MAX_PATH);
|
||||
dot = strrchr(cuepath, '.');
|
||||
strcpy(dot, ".cue");
|
||||
look_for_cuesheet_file(id3->path, cuepath);
|
||||
if (id3->cuesheet_type && !strcmp(cue->path, cuepath))
|
||||
{
|
||||
sel = gui_synclist_get_sel_pos(&lists);
|
||||
|
|
|
@ -58,7 +58,7 @@ bool cuesheet_is_enabled(void);
|
|||
void cuesheet_init(void);
|
||||
|
||||
/* looks if there is a cuesheet file that has a name matching "trackpath" */
|
||||
bool look_for_cuesheet_file(const char *trackpath);
|
||||
bool look_for_cuesheet_file(const char *trackpath, char *found_cue_path);
|
||||
|
||||
/* parse cuesheet "file" and store the information in "cue" */
|
||||
bool parse_cuesheet(char *file, struct cuesheet *cue);
|
||||
|
|
|
@ -389,11 +389,9 @@ bool update(struct gui_wps *gwps)
|
|||
/* We need to parse the new cuesheet */
|
||||
|
||||
char cuepath[MAX_PATH];
|
||||
strncpy(cuepath, gwps->state->id3->path, MAX_PATH);
|
||||
char *dot = strrchr(cuepath, '.');
|
||||
strcpy(dot, ".cue");
|
||||
|
||||
if (parse_cuesheet(cuepath, curr_cue))
|
||||
if (look_for_cuesheet_file(gwps->state->id3->path, cuepath) &&
|
||||
parse_cuesheet(cuepath, curr_cue))
|
||||
{
|
||||
gwps->state->id3->cuesheet_type = 1;
|
||||
strcpy(curr_cue->audio_filename, gwps->state->id3->path);
|
||||
|
|
|
@ -2369,7 +2369,7 @@ bool get_metadata(struct track_info* track, int fd, const char* trackname,
|
|||
/* We have successfully read the metadata from the file */
|
||||
|
||||
#ifndef __PCTOOL__
|
||||
if (cuesheet_is_enabled() && look_for_cuesheet_file(trackname))
|
||||
if (cuesheet_is_enabled() && look_for_cuesheet_file(trackname, NULL))
|
||||
{
|
||||
track->id3.cuesheet_type = 1;
|
||||
}
|
||||
|
|
|
@ -2762,13 +2762,11 @@ static bool audio_load_track(int offset, bool start_play, bool rebuffer)
|
|||
if (cuesheet_is_enabled() && tracks[track_widx].id3.cuesheet_type == 1)
|
||||
{
|
||||
char cuepath[MAX_PATH];
|
||||
strncpy(cuepath, trackname, MAX_PATH);
|
||||
char *dot = strrchr(cuepath, '.');
|
||||
strcpy(dot, ".cue");
|
||||
|
||||
struct cuesheet *cue = start_play ? curr_cue : temp_cue;
|
||||
|
||||
if (parse_cuesheet(cuepath, cue))
|
||||
if (look_for_cuesheet_file(trackname, cuepath) &&
|
||||
parse_cuesheet(cuepath, cue))
|
||||
{
|
||||
strcpy((cue)->audio_filename, trackname);
|
||||
if (start_play)
|
||||
|
|
Loading…
Reference in a new issue