CueSheet parser: Support quirky FLAC generated CueSheets that contain sample counts instead of frames

This commit is contained in:
Christopher Snowhill 2022-01-14 22:45:45 -08:00
parent ccbfc6ec4b
commit a1522aeb6e
4 changed files with 45 additions and 27 deletions

View file

@ -177,17 +177,18 @@
NSArray *msf = [time componentsSeparatedByString:@":"];
size_t count = [msf count];
if (count < 1 || count > 3) {
if (count != 1 && count != 3) {
continue;
}
double seconds = 0;
double seconds;
BOOL timeInSamples = NO;
if (count == 1)
seconds = [[msf objectAtIndex:0] floatValue] / 75;
else if (count == 2)
seconds = [[msf objectAtIndex:0] intValue] + ([[msf objectAtIndex:1] floatValue]/75);
else if (count == 3)
if (count == 1) {
seconds = [[msf objectAtIndex:0] floatValue];
timeInSamples = YES;
}
else
seconds = (60*[[msf objectAtIndex:0] intValue]) + [[msf objectAtIndex:1] intValue] + ([[msf objectAtIndex:2] floatValue]/75);
if (track == nil) {
@ -199,6 +200,7 @@
[CueSheetTrack trackWithURL:[self urlForPath:path relativeTo:filename]
track:track
time:seconds
timeInSamples:timeInSamples
artist:artist
album:album
title:title

View file

@ -114,10 +114,14 @@
bytesPerFrame = (bitsPerSample/8) * channels;
trackStart = [track time] * sampleRate;
double _trackStart = [track time];
if (![track timeInSamples]) _trackStart *= sampleRate;
trackStart = _trackStart;
if (nextTrack && (embedded || ([[[nextTrack url] absoluteString] isEqualToString:[[track url] absoluteString]]))) {
trackEnd = [nextTrack time] * sampleRate;
double _trackEnd = [nextTrack time];
if (![nextTrack timeInSamples]) _trackEnd *= sampleRate;
trackEnd = _trackEnd;
}
else {
trackEnd = [[properties objectForKey:@"totalFrames"] doubleValue];
@ -201,7 +205,9 @@
float sampleRate = [[[decoder properties] objectForKey:@"sampleRate"] floatValue];
trackStart = [track time] * sampleRate;
double _trackStart = [track time];
if (![track timeInSamples]) _trackStart *= sampleRate;
trackStart = _trackStart;
CueSheetTrack *nextTrack = nil;
if (i + 1 < [tracks count]) {
@ -209,7 +215,9 @@
}
if (nextTrack && (embedded || [[[nextTrack url] absoluteString] isEqualToString:[[track url] absoluteString]])) {
trackEnd = [nextTrack time] * sampleRate;
double _trackEnd = [nextTrack time];
if (![nextTrack timeInSamples]) _trackEnd *= sampleRate;
trackEnd = _trackEnd;
}
else {
trackEnd = [[[decoder properties] objectForKey:@"totalFrames"] longValue];

View file

@ -25,10 +25,11 @@
float trackPeak;
double time; //Starting time for the track
BOOL timeInSamples;
}
+ (id)trackWithURL:(NSURL *)u track:(NSString *)t time:(double)s artist:(NSString *)a album:(NSString *)b title:(NSString *)l genre:(NSString *)g year:(NSString *)y albumGain:(float)albumGain albumPeak:(float)albumPeak trackGain:(float)trackGain trackPeak:(float)trackPeak;
- (id)initWithURL:(NSURL *)u track:(NSString *)t time:(double)s artist:(NSString *)a album:(NSString *)b title:(NSString *)l genre:(NSString *)g year:(NSString *)y albumGain:(float)albumGain albumPeak:(float)albumPeak trackGain:(float)trackGain trackPeak:(float)trackPeak;
+ (id)trackWithURL:(NSURL *)u track:(NSString *)t time:(double)s timeInSamples:(BOOL)tis artist:(NSString *)a album:(NSString *)b title:(NSString *)l genre:(NSString *)g year:(NSString *)y albumGain:(float)albumGain albumPeak:(float)albumPeak trackGain:(float)trackGain trackPeak:(float)trackPeak;
- (id)initWithURL:(NSURL *)u track:(NSString *)t time:(double)s timeInSamples:(BOOL)tis artist:(NSString *)a album:(NSString *)b title:(NSString *)l genre:(NSString *)g year:(NSString *)y albumGain:(float)albumGain albumPeak:(float)albumPeak trackGain:(float)trackGain trackPeak:(float)trackPeak;
- (NSString *)track;
@ -45,5 +46,6 @@
- (float)trackPeak;
- (double)time;
- (BOOL)timeInSamples;
@end

View file

@ -11,12 +11,12 @@
@implementation CueSheetTrack
+ (id)trackWithURL:(NSURL *)u track:(NSString *)t time:(double)s artist:(NSString *)a album:(NSString *)b title:(NSString *)l genre:(NSString *)g year:(NSString *)y albumGain:(float)albumGain albumPeak:(float)albumPeak trackGain:(float)trackGain trackPeak:(float)trackPeak
+ (id)trackWithURL:(NSURL *)u track:(NSString *)t time:(double)s timeInSamples:(BOOL)tis artist:(NSString *)a album:(NSString *)b title:(NSString *)l genre:(NSString *)g year:(NSString *)y albumGain:(float)albumGain albumPeak:(float)albumPeak trackGain:(float)trackGain trackPeak:(float)trackPeak
{
return [[CueSheetTrack alloc] initWithURL:u track:t time:s artist:a album:b title:l genre:g year:y albumGain:albumGain albumPeak:albumPeak trackGain:trackGain trackPeak:trackPeak];
return [[CueSheetTrack alloc] initWithURL:u track:t time:s timeInSamples:tis artist:a album:b title:l genre:g year:y albumGain:albumGain albumPeak:albumPeak trackGain:trackGain trackPeak:trackPeak];
}
- (id)initWithURL:(NSURL *)u track:(NSString *)t time:(double)s artist:(NSString *)a album:(NSString *)b title:(NSString *)l genre:(NSString *)g year:(NSString *)y albumGain:(float)albumGain albumPeak:(float)albumPeak trackGain:(float)trackGain trackPeak:(float)trackPeak
- (id)initWithURL:(NSURL *)u track:(NSString *)t time:(double)s timeInSamples:(BOOL)tis artist:(NSString *)a album:(NSString *)b title:(NSString *)l genre:(NSString *)g year:(NSString *)y albumGain:(float)albumGain albumPeak:(float)albumPeak trackGain:(float)trackGain trackPeak:(float)trackPeak
{
self = [super init];
if (self)
@ -30,6 +30,7 @@
year = [y copy];
time = s;
timeInSamples = tis;
self->albumGain = albumGain;
self->albumPeak = albumPeak;
@ -55,6 +56,11 @@
return time;
}
- (BOOL)timeInSamples
{
return timeInSamples;
}
- (NSString *)artist
{
return artist;