Cog/Plugins/vgmstream/vgmstream/VGMContainer.m
Christopher Snowhill 94f915b892 VGMStream Input: Fix subsong files dumping tracks
Fixed an issue with individual files that reference single subsongs
inadvertently dumping all tracks in the referenced bank to the playlist,
instead of only adding the one bookmark or txtp file. Now it matches the
behavior of foobar2000.

Signed-off-by: Christopher Snowhill <kode54@gmail.com>
2022-04-20 01:50:44 -07:00

95 lines
2.1 KiB
Objective-C

//
// VGMContainer.m
// VGMStream
//
// Created by Christopher Snowhill on 9/1/17.
// Copyright 2017 __LoSnoCo__. All rights reserved.
//
#import "VGMContainer.h"
#import "VGMDecoder.h"
#import "VGMInterface.h"
#import "Logging.h"
@implementation VGMContainer
+ (void)initialize {
register_log_callback();
}
+ (NSArray *)fileTypes {
return [VGMDecoder fileTypes];
}
+ (NSArray *)mimeTypes {
return nil;
}
+ (float)priority {
return [VGMDecoder priority];
}
+ (NSArray *)urlsForContainerURL:(NSURL *)url {
NSString *path = [[url absoluteString] stringByRemovingPercentEncoding];
if([url fragment]) {
// input url might be a TXTP with fragment parameters, in which case
// we need to parse that anyway
NSString *frag = [url fragment];
NSUInteger len = [frag length];
if(len < 5 || ![[frag substringFromIndex:len - 5] isEqualToString:@".txtp"]) {
// input url already has fragment defined - no need to expand further
return [NSMutableArray arrayWithObject:url];
}
path = [path stringByAppendingFormat:@"%%23%@", frag];
url = [NSURL fileURLWithPath:[path stringByRemovingPercentEncoding]];
}
VGMSTREAM *stream = init_vgmstream_from_cogfile([path UTF8String], 0);
if(!stream) {
ALog(@"Open failed for file: %@", [url absoluteString]);
return @[];
}
if(stream->stream_index > 0) {
close_vgmstream(stream);
return @[];
}
VGMInfoCache *sharedMyCache = [VGMInfoCache sharedCache];
NSMutableArray *tracks = [NSMutableArray array];
NSURL *trackurl;
int i;
int subsongs = stream->num_streams;
if(subsongs == 0)
subsongs = 1;
{
trackurl = [NSURL URLWithString:[[url absoluteString] stringByAppendingString:@"#1"]];
[sharedMyCache stuffURL:trackurl stream:stream];
[tracks addObject:trackurl];
}
for(i = 2; i <= subsongs; ++i) {
close_vgmstream(stream);
stream = init_vgmstream_from_cogfile([path UTF8String], i);
if(!stream)
return @[];
trackurl = [NSURL URLWithString:[[url absoluteString] stringByAppendingFormat:@"#%i", i]];
[sharedMyCache stuffURL:trackurl stream:stream];
[tracks addObject:trackurl];
}
close_vgmstream(stream);
return tracks;
}
@end