diff --git a/apps/cuesheet.c b/apps/cuesheet.c index 9bac3681f3..ce7714fa44 100644 --- a/apps/cuesheet.c +++ b/apps/cuesheet.c @@ -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); diff --git a/apps/cuesheet.h b/apps/cuesheet.h index 51e38605ca..3fe9c1f453 100644 --- a/apps/cuesheet.h +++ b/apps/cuesheet.h @@ -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); diff --git a/apps/gui/gwps-common.c b/apps/gui/gwps-common.c index 5524c1490e..b25168f252 100644 --- a/apps/gui/gwps-common.c +++ b/apps/gui/gwps-common.c @@ -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); diff --git a/apps/metadata.c b/apps/metadata.c index 54bb40413e..430bd3cbe5 100644 --- a/apps/metadata.c +++ b/apps/metadata.c @@ -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; } diff --git a/apps/playback.c b/apps/playback.c index abc2e9ef30..25dec7a9ff 100644 --- a/apps/playback.c +++ b/apps/playback.c @@ -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)