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:@":"]; NSArray *msf = [time componentsSeparatedByString:@":"];
size_t count = [msf count]; size_t count = [msf count];
if (count < 1 || count > 3) { if (count != 1 && count != 3) {
continue; continue;
} }
double seconds = 0; double seconds;
BOOL timeInSamples = NO;
if (count == 1) if (count == 1) {
seconds = [[msf objectAtIndex:0] floatValue] / 75; seconds = [[msf objectAtIndex:0] floatValue];
else if (count == 2) timeInSamples = YES;
seconds = [[msf objectAtIndex:0] intValue] + ([[msf objectAtIndex:1] floatValue]/75); }
else if (count == 3) else
seconds = (60*[[msf objectAtIndex:0] intValue]) + [[msf objectAtIndex:1] intValue] + ([[msf objectAtIndex:2] floatValue]/75); seconds = (60*[[msf objectAtIndex:0] intValue]) + [[msf objectAtIndex:1] intValue] + ([[msf objectAtIndex:2] floatValue]/75);
if (track == nil) { if (track == nil) {
@ -197,17 +198,18 @@
//Need to add basePath, and convert to URL //Need to add basePath, and convert to URL
[entries addObject: [entries addObject:
[CueSheetTrack trackWithURL:[self urlForPath:path relativeTo:filename] [CueSheetTrack trackWithURL:[self urlForPath:path relativeTo:filename]
track: track track:track
time: seconds time:seconds
artist:artist timeInSamples:timeInSamples
album:album artist:artist
title:title album:album
genre:genre title:title
year:year genre:genre
albumGain:albumGain year:year
albumPeak:albumPeak albumGain:albumGain
trackGain:trackGain albumPeak:albumPeak
trackPeak:trackPeak]]; trackGain:trackGain
trackPeak:trackPeak]];
trackAdded = YES; trackAdded = YES;
} }
else if ([command isEqualToString:@"PERFORMER"]) else if ([command isEqualToString:@"PERFORMER"])

View file

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

View file

@ -25,10 +25,11 @@
float trackPeak; float trackPeak;
double time; //Starting time for the track 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)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 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; - (NSString *)track;
@ -45,5 +46,6 @@
- (float)trackPeak; - (float)trackPeak;
- (double)time; - (double)time;
- (BOOL)timeInSamples;
@end @end

View file

@ -11,12 +11,12 @@
@implementation CueSheetTrack @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]; self = [super init];
if (self) if (self)
@ -30,6 +30,7 @@
year = [y copy]; year = [y copy];
time = s; time = s;
timeInSamples = tis;
self->albumGain = albumGain; self->albumGain = albumGain;
self->albumPeak = albumPeak; self->albumPeak = albumPeak;
@ -55,6 +56,11 @@
return time; return time;
} }
- (BOOL)timeInSamples
{
return timeInSamples;
}
- (NSString *)artist - (NSString *)artist
{ {
return artist; return artist;