summaryrefslogtreecommitdiff
path: root/apps/cuesheet.c
diff options
context:
space:
mode:
Diffstat (limited to 'apps/cuesheet.c')
-rw-r--r--apps/cuesheet.c54
1 files changed, 19 insertions, 35 deletions
diff --git a/apps/cuesheet.c b/apps/cuesheet.c
index fa1d93f334..aaa2670a40 100644
--- a/apps/cuesheet.c
+++ b/apps/cuesheet.c
@@ -43,33 +43,6 @@
43 43
44#define CUE_DIR ROCKBOX_DIR "/cue" 44#define CUE_DIR ROCKBOX_DIR "/cue"
45 45
46struct cuesheet *curr_cue;
47
48#if CONFIG_CODEC != SWCODEC
49/* special trickery because the hwcodec playback engine is in firmware/ */
50static bool cuesheet_handler(const char *filename)
51{
52 return cuesheet_is_enabled() && look_for_cuesheet_file(filename, NULL);
53}
54#endif
55
56void cuesheet_init(void)
57{
58 if (global_settings.cuesheet) {
59 curr_cue = (struct cuesheet *)buffer_alloc(sizeof(struct cuesheet));
60#if CONFIG_CODEC != SWCODEC
61 audio_set_cuesheet_callback(cuesheet_handler);
62#endif
63 } else {
64 curr_cue = NULL;
65 }
66}
67
68bool cuesheet_is_enabled(void)
69{
70 return (curr_cue != NULL);
71}
72
73bool look_for_cuesheet_file(const char *trackpath, char *found_cue_path) 46bool look_for_cuesheet_file(const char *trackpath, char *found_cue_path)
74{ 47{
75 /* DEBUGF("look for cue file\n"); */ 48 /* DEBUGF("look for cue file\n"); */
@@ -134,7 +107,6 @@ bool parse_cuesheet(char *file, struct cuesheet *cue)
134 char *s; 107 char *s;
135 bool utf8 = false; 108 bool utf8 = false;
136 109
137 DEBUGF("cue parse\n");
138 int fd = open_utf8(file,O_RDONLY); 110 int fd = open_utf8(file,O_RDONLY);
139 if (fd < 0) 111 if (fd < 0)
140 { 112 {
@@ -293,12 +265,8 @@ void browse_cuesheet(struct cuesheet *cue)
293 gui_synclist_set_nb_items(&lists, 2*cue->track_count); 265 gui_synclist_set_nb_items(&lists, 2*cue->track_count);
294 gui_synclist_set_title(&lists, title, 0); 266 gui_synclist_set_title(&lists, title, 0);
295 267
296 if (id3 && *id3->path && strcmp(id3->path, "No file!"))
297 {
298 look_for_cuesheet_file(id3->path, cuepath);
299 }
300 268
301 if (id3 && id3->cuesheet_type && !strcmp(cue->path, cuepath)) 269 if (id3)
302 { 270 {
303 gui_synclist_select_item(&lists, 271 gui_synclist_select_item(&lists,
304 2*cue_find_current_track(cue, id3->elapsed)); 272 2*cue_find_current_track(cue, id3->elapsed));
@@ -317,7 +285,7 @@ void browse_cuesheet(struct cuesheet *cue)
317 if (id3 && *id3->path && strcmp(id3->path, "No file!")) 285 if (id3 && *id3->path && strcmp(id3->path, "No file!"))
318 { 286 {
319 look_for_cuesheet_file(id3->path, cuepath); 287 look_for_cuesheet_file(id3->path, cuepath);
320 if (id3->cuesheet_type && !strcmp(cue->path, cuepath)) 288 if (id3->cuesheet && !strcmp(cue->path, cuepath))
321 { 289 {
322 sel = gui_synclist_get_sel_pos(&lists); 290 sel = gui_synclist_get_sel_pos(&lists);
323 seek(cue->tracks[sel/2].offset); 291 seek(cue->tracks[sel/2].offset);
@@ -351,8 +319,9 @@ bool display_cuesheet_content(char* filename)
351 */ 319 */
352bool curr_cuesheet_skip(int direction, unsigned long curr_pos) 320bool curr_cuesheet_skip(int direction, unsigned long curr_pos)
353{ 321{
322 struct cuesheet *curr_cue = audio_current_track()->cuesheet;
354 int track = cue_find_current_track(curr_cue, curr_pos); 323 int track = cue_find_current_track(curr_cue, curr_pos);
355 324
356 if (direction >= 0 && track == curr_cue->track_count - 1) 325 if (direction >= 0 && track == curr_cue->track_count - 1)
357 { 326 {
358 /* we want to get out of the cuesheet */ 327 /* we want to get out of the cuesheet */
@@ -406,6 +375,7 @@ static inline void draw_veritcal_line_mark(struct screen * screen,
406void cue_draw_markers(struct screen *screen, unsigned long tracklen, 375void cue_draw_markers(struct screen *screen, unsigned long tracklen,
407 int x1, int x2, int y, int h) 376 int x1, int x2, int y, int h)
408{ 377{
378 struct cuesheet *curr_cue = audio_current_track()->cuesheet;
409 int i,xi; 379 int i,xi;
410 int w = x2 - x1; 380 int w = x2 - x1;
411 for (i=1; i < curr_cue->track_count; i++) 381 for (i=1; i < curr_cue->track_count; i++)
@@ -415,3 +385,17 @@ void cue_draw_markers(struct screen *screen, unsigned long tracklen,
415 } 385 }
416} 386}
417#endif 387#endif
388
389bool cuesheet_subtrack_changed(struct mp3entry *id3)
390{
391 struct cuesheet *cue = id3->cuesheet;
392 if (cue && (id3->elapsed < cue->curr_track->offset
393 || (cue->curr_track_idx < cue->track_count - 1
394 && id3->elapsed >= (cue->curr_track+1)->offset)))
395 {
396 cue_find_current_track(cue, id3->elapsed);
397 cue_spoof_id3(cue, id3);
398 return true;
399 }
400 return false;
401}