cue: prepend pregap to the beginning of the track

.. rather then append to the end of the previous one

Cuebreakpoints from the cuetools package has three modes of operation,
and the default is to append pregap (INDEX 00) to the end of the
previous track. This is the behavior most compliant to the existing
cue files.

Here is the patch which fixes the issue. I borrowed bits of
implementation from cuebreakpoints. I assumed that the whole audio
file must be covered by head-to-head going tracks, which is how
hardware CD players probably work. In cue_tag I changed rounding from
rounding up to rounding down because the thing in mpd which calculates
actual track duration (and current position) rounds it down, and I
didn't want to see in my playlist values different from whose in a
now-playing progress bar.

I've compared the resultant mpd behaviour with "mplayer -ss MM:SS.MS"
where the time was supplied by cuebreakpoints and noticed that mplayer
started each track a bit earlier then mpd, though this was the same
before the patch.
This commit is contained in:
Orivej Desh 2010-03-28 19:34:16 +02:00 committed by Max Kellermann
parent e9beea072d
commit 635791d1cd
2 changed files with 22 additions and 4 deletions

View File

@ -178,9 +178,16 @@ cue_tag(struct Cd *cd, unsigned tnum)
if (tag == NULL)
return NULL;
tag->time = track_get_length(track)
- track_get_index(track, 1)
+ track_get_zero_pre(track);
track = cd_get_track(cd, tnum+1);
if (track != NULL)
tag->time += track_get_index(track, 1)
- track_get_zero_pre(track);
/* libcue returns the track duration in frames, and there are
75 frames per second; this formula rounds up */
tag->time = (track_get_length(track) + 74) / 75;
75 frames per second; this formula rounds down */
tag->time = tag->time / 75;
return tag;
}

View File

@ -102,10 +102,21 @@ cue_playlist_read(struct playlist_provider *_playlist)
song = song_remote_new(filename);
song->tag = tag;
song->start_ms = (track_get_start(track) * 1000) / 75;
song->end_ms = ((track_get_start(track) + track_get_length(track))
song->start_ms = ((track_get_start(track)
+ track_get_index(track, 1)
- track_get_zero_pre(track)) * 1000) / 75;
song->end_ms = ((track_get_start(track) + track_get_length(track)
- track_get_index(track, 1)
+ track_get_zero_pre(track))
* 1000) / 75;
/* append pregap of the next track to the end of this one */
track = cd_get_track(playlist->cd, playlist->next);
if (track != NULL)
song->end_ms = ((track_get_start(track)
+ track_get_index(track, 1)
- track_get_zero_pre(track)) * 1000) / 75;
return song;
}