summaryrefslogtreecommitdiff
path: root/apps/playback.c
diff options
context:
space:
mode:
authorJonathan Gordon <rockbox@jdgordon.info>2009-07-20 05:18:18 +0000
committerJonathan Gordon <rockbox@jdgordon.info>2009-07-20 05:18:18 +0000
commit24b136f62de82d7419751b6aaeae0ad3d8497bea (patch)
treeb9bcfd07ca26f3da2f0ce500fc39e0719b3cbb8a /apps/playback.c
parent4c4fb82d9c112ccbcc4c94a7d85fe82d09801844 (diff)
downloadrockbox-24b136f62de82d7419751b6aaeae0ad3d8497bea.tar.gz
rockbox-24b136f62de82d7419751b6aaeae0ad3d8497bea.zip
rework cuesheet support:
swcodec: search for a .cue during buffering (with the possibility of adding embedded cuesheets later) hwcodec: search for a .cue when the id3 info for the current track is requested for the first time (disk should be spining so non issue) major beenfit from this is simplofy cuesheet handling code a bit... if mp3entry.cuesheet != NULL then there is a valid cuesheet.. no need to worry about if its enabled and preloaded. There is the possibility of putting the next/prev subtrack handling inside the playback code (as well as the id3 updating stuff (see FS#9789 for more info), but thats probably not a good idea. git-svn-id: svn://svn.rockbox.org/rockbox/trunk@21978 a1c6a512-1295-4272-9138-f99709370657
Diffstat (limited to 'apps/playback.c')
-rw-r--r--apps/playback.c42
1 files changed, 42 insertions, 0 deletions
diff --git a/apps/playback.c b/apps/playback.c
index cee89d3bbb..7bd3f252ae 100644
--- a/apps/playback.c
+++ b/apps/playback.c
@@ -210,6 +210,9 @@ static struct mp3entry *thistrack_id3, /* the currently playing track */
210 * next track otherwise */ 210 * next track otherwise */
211static struct mp3entry unbuffered_id3; /* the id3 for the first unbuffered track */ 211static struct mp3entry unbuffered_id3; /* the id3 for the first unbuffered track */
212 212
213/* for cuesheet support */
214static struct cuesheet *curr_cue = NULL;
215
213/* Track info structure about songs in the file buffer (A/C-) */ 216/* Track info structure about songs in the file buffer (A/C-) */
214struct track_info { 217struct track_info {
215 int audio_hid; /* The ID for the track's buffer handle */ 218 int audio_hid; /* The ID for the track's buffer handle */
@@ -218,6 +221,7 @@ struct track_info {
218#ifdef HAVE_ALBUMART 221#ifdef HAVE_ALBUMART
219 int aa_hid; /* The ID for the track's album art handle */ 222 int aa_hid; /* The ID for the track's album art handle */
220#endif 223#endif
224 int cuesheet_hid; /* The ID for the track's parsed cueesheet handle */
221 225
222 size_t filesize; /* File total length */ 226 size_t filesize; /* File total length */
223 227
@@ -384,6 +388,13 @@ static bool clear_track_info(struct track_info *track)
384 } 388 }
385#endif 389#endif
386 390
391 if (track->cuesheet_hid >= 0) {
392 if (bufclose(track->cuesheet_hid))
393 track->cuesheet_hid = -1;
394 else
395 return false;
396 }
397
387 track->filesize = 0; 398 track->filesize = 0;
388 track->taginfo_ready = false; 399 track->taginfo_ready = false;
389 400
@@ -566,6 +577,12 @@ struct mp3entry* audio_current_track(void)
566 if (cur_idx == track_ridx && *thistrack_id3->path) 577 if (cur_idx == track_ridx && *thistrack_id3->path)
567 { 578 {
568 /* The usual case */ 579 /* The usual case */
580 if (tracks[cur_idx].cuesheet_hid >= 0)
581 {
582 bufread(tracks[cur_idx].cuesheet_hid, sizeof(struct cuesheet), curr_cue);
583 thistrack_id3->cuesheet = curr_cue;
584 cue_spoof_id3(thistrack_id3->cuesheet, thistrack_id3);
585 }
569 return thistrack_id3; 586 return thistrack_id3;
570 } 587 }
571 else if (automatic_skip && offset == -1 && *othertrack_id3->path) 588 else if (automatic_skip && offset == -1 && *othertrack_id3->path)
@@ -574,6 +591,12 @@ struct mp3entry* audio_current_track(void)
574 but the audio being played is still the same (now previous) track. 591 but the audio being played is still the same (now previous) track.
575 othertrack_id3.elapsed is being updated in an ISR by 592 othertrack_id3.elapsed is being updated in an ISR by
576 codec_pcmbuf_position_callback */ 593 codec_pcmbuf_position_callback */
594 if (tracks[cur_idx].cuesheet_hid >= 0)
595 {
596 bufread(tracks[cur_idx].cuesheet_hid, sizeof(struct cuesheet), curr_cue);
597 othertrack_id3->cuesheet = curr_cue;
598 cue_spoof_id3(othertrack_id3->cuesheet, othertrack_id3);
599 }
577 return othertrack_id3; 600 return othertrack_id3;
578 } 601 }
579 602
@@ -1826,7 +1849,21 @@ static void audio_finish_load_track(void)
1826 1849
1827 return; 1850 return;
1828 } 1851 }
1852 /* Try to load a cuesheet for the track */
1853 if (curr_cue)
1854 {
1855 char cuepath[MAX_PATH];
1829 1856
1857 struct cuesheet temp_cue;
1858
1859 if (look_for_cuesheet_file(track_id3->path, cuepath) &&
1860 parse_cuesheet(cuepath, &temp_cue))
1861 {
1862 strcpy(temp_cue.audio_filename, track_id3->path);
1863 tracks[track_widx].cuesheet_hid =
1864 bufalloc(&temp_cue, sizeof(struct cuesheet), TYPE_CUESHEET);
1865 }
1866 }
1830#ifdef HAVE_ALBUMART 1867#ifdef HAVE_ALBUMART
1831 if (tracks[track_widx].aa_hid < 0 && gui_sync_wps_uses_albumart()) 1868 if (tracks[track_widx].aa_hid < 0 && gui_sync_wps_uses_albumart())
1832 { 1869 {
@@ -2602,6 +2639,10 @@ void audio_init(void)
2602 thistrack_id3 = &mp3entry_buf[0]; 2639 thistrack_id3 = &mp3entry_buf[0];
2603 othertrack_id3 = &mp3entry_buf[1]; 2640 othertrack_id3 = &mp3entry_buf[1];
2604 2641
2642 /* cuesheet support */
2643 if (global_settings.cuesheet)
2644 curr_cue = (struct cuesheet*)buffer_alloc(sizeof(struct cuesheet));
2645
2605 /* initialize the buffer */ 2646 /* initialize the buffer */
2606 filebuf = audiobuf; 2647 filebuf = audiobuf;
2607 2648
@@ -2648,6 +2689,7 @@ void audio_init(void)
2648#ifdef HAVE_ALBUMART 2689#ifdef HAVE_ALBUMART
2649 tracks[i].aa_hid = -1; 2690 tracks[i].aa_hid = -1;
2650#endif 2691#endif
2692 tracks[i].cuesheet_hid = -1;
2651 } 2693 }
2652 2694
2653 add_event(BUFFER_EVENT_REBUFFER, false, buffering_handle_rebuffer_callback); 2695 add_event(BUFFER_EVENT_REBUFFER, false, buffering_handle_rebuffer_callback);