CueSheet parser: Support quirky FLAC generated CueSheets that contain sample counts instead of frames
This commit is contained in:
parent
ccbfc6ec4b
commit
a1522aeb6e
4 changed files with 45 additions and 27 deletions
|
@ -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"])
|
||||||
|
|
|
@ -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];
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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;
|
||||||
|
|
Loading…
Reference in a new issue