Compare commits
110 commits
main
...
swiftingly
Author | SHA1 | Date | |
---|---|---|---|
|
10464b6761 | ||
|
73c4360b1d | ||
|
da21cd7341 | ||
|
27478e5df2 | ||
|
d739e68e8e | ||
|
4ce180fb2a | ||
|
3c0ccd9d46 | ||
|
b24b9744c1 | ||
|
61778b7165 | ||
|
7d26150c26 | ||
|
35400e1320 | ||
3d94978f82 | |||
fe7c424843 | |||
|
1a4c140708 | ||
|
29c070a616 | ||
|
8b7418857d | ||
|
a35459719d | ||
|
802a86a3d8 | ||
|
f8d2837c4e | ||
|
112366c850 | ||
|
a1a8607a84 | ||
|
690153f561 | ||
|
b33e3ff6b3 | ||
|
bedfac4e33 | ||
|
66102a6cda | ||
|
b36ebfe740 | ||
|
2ed78a0639 | ||
|
ae019409c5 | ||
|
66262c2a71 | ||
|
f567750d56 | ||
|
2a99bb076f | ||
|
dd65665990 | ||
|
c477fbf553 | ||
|
03b3b43cfe | ||
|
9d8e278a57 | ||
|
ed9e352543 | ||
|
16fdc1de6a | ||
|
fc37e96099 | ||
|
03a2c0c16e | ||
|
206a3e42e7 | ||
|
6f6b5d6986 | ||
|
038b0b8067 | ||
|
a57827f4da | ||
|
39be3ab962 | ||
|
17df6cde4f | ||
|
2945de085d | ||
|
c2ef7d0e61 | ||
|
96a7255779 | ||
|
050aaaf852 | ||
|
5f52a4be81 | ||
|
5f2335b796 | ||
|
d33475953e | ||
|
7a56447271 | ||
|
b86ec3340f | ||
|
36c82a61e7 | ||
|
ab13b66755 | ||
|
86de03a1ab | ||
|
0f923e6072 | ||
|
cb2ce5675a | ||
|
1f56e5ef5a | ||
|
2663b5007d | ||
|
72572c9c7f | ||
|
3de7a34eb8 | ||
|
86d8f04966 | ||
|
b55955ef1c | ||
|
8e1175bbd4 | ||
|
62e2880b49 | ||
|
1ac3e5cd22 | ||
|
d2eb4af3d5 | ||
|
50b7390181 | ||
|
abf80c19ac | ||
|
b21a02fe1b | ||
|
dd35639174 | ||
|
43433c244e | ||
|
870a5afed7 | ||
|
b9ef5853d6 | ||
|
1a9c73d166 | ||
|
ec393d186a | ||
|
dfb773e9cb | ||
|
438b142558 | ||
|
26a63e85b7 | ||
|
ccbeaf16dc | ||
|
cc5de69e9f | ||
|
80adb85b36 | ||
|
f3f3d436ba | ||
be6453e048 | |||
|
8af32e8d2e | ||
|
5b6dacd29c | ||
|
ff44bc4d34 | ||
|
62824a94bd | ||
|
903bc9cba5 | ||
|
f274a8ef73 | ||
0317f2a649 | |||
b484a0be44 | |||
|
36a9411b14 | ||
64fefce18d | |||
|
3a6e41cabd | ||
|
632ba36f13 | ||
|
271b9b34d0 | ||
|
8d031f394b | ||
|
f2c6ae39c3 | ||
|
bb95270747 | ||
|
aa36e3ce10 | ||
|
da8a4dffdf | ||
a4692b80a4 | |||
de5cce8351 | |||
|
05da7450da | ||
|
2b8156e86c | ||
|
d59b5335e9 | ||
|
bc9e7b5d67 |
611 changed files with 35710 additions and 27664 deletions
5
.github/workflows/debug.yml
vendored
5
.github/workflows/debug.yml
vendored
|
@ -11,7 +11,7 @@ on:
|
|||
jobs:
|
||||
build:
|
||||
name: Build Universal Cog.app
|
||||
runs-on: macos-11
|
||||
runs-on: macos-12
|
||||
env:
|
||||
XCODE_DERIVEDDATA_PATH: build
|
||||
steps:
|
||||
|
@ -19,6 +19,9 @@ jobs:
|
|||
uses: actions/checkout@v2
|
||||
with:
|
||||
submodules: recursive
|
||||
- name: Unpack libraries
|
||||
run: >
|
||||
cd ThirdParty && tar xvf libraries.tar.xz
|
||||
- name: Run xcodebuild
|
||||
run: >
|
||||
xcodebuild
|
||||
|
|
40
.gitignore
vendored
40
.gitignore
vendored
|
@ -8,4 +8,42 @@ xcuserdata
|
|||
# User-specific xcconfig files
|
||||
Xcode-config/DEVELOPMENT_TEAM.xcconfig
|
||||
|
||||
Cog.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved
|
||||
# Plist derived from template at build time
|
||||
/Info.plist
|
||||
|
||||
# This indicates the libraries are up to date
|
||||
/ThirdParty/libraries.updated
|
||||
|
||||
# Temporary file to indicate libraries are being extracted by one process
|
||||
/ThirdParty/libraries.extracting
|
||||
|
||||
# The project will unpack these before building, if necessary
|
||||
/ThirdParty/BASS/libbass.dylib
|
||||
/ThirdParty/BASS/libbassflac.dylib
|
||||
/ThirdParty/BASS/libbassmidi.dylib
|
||||
/ThirdParty/BASS/libbassopus.dylib
|
||||
/ThirdParty/BASS/libbasswv.dylib
|
||||
/ThirdParty/avif/lib/libaom.a
|
||||
/ThirdParty/avif/lib/libavif.a
|
||||
/ThirdParty/fdk-aac/lib/libfdk-aac.2.dylib
|
||||
/ThirdParty/fdk-aac/lib/libfdk-aac.a
|
||||
/ThirdParty/fdk-aac/lib/libfdk-aac.dylib
|
||||
/ThirdParty/fdk-aac/lib/libfdk-aac.la
|
||||
/ThirdParty/fdk-aac/lib/pkgconfig/fdk-aac.pc
|
||||
/ThirdParty/ffmpeg/lib/libavcodec.59.dylib
|
||||
/ThirdParty/ffmpeg/lib/libavformat.59.dylib
|
||||
/ThirdParty/ffmpeg/lib/libavutil.57.dylib
|
||||
/ThirdParty/ffmpeg/lib/libswresample.4.dylib
|
||||
/ThirdParty/flac/lib/libFLAC.8.dylib
|
||||
/ThirdParty/libid3tag/lib/libid3tag.a
|
||||
/ThirdParty/libmad/lib/libmad.a
|
||||
/ThirdParty/libopenmpt/lib/libopenmpt.a
|
||||
/ThirdParty/libopenmpt_old/lib/libopenmpt.old.a
|
||||
/ThirdParty/libvgm/lib/libvgm-emu.a
|
||||
/ThirdParty/libvgm/lib/libvgm-player.a
|
||||
/ThirdParty/libvgm/lib/libvgm-utils.a
|
||||
/ThirdParty/mpg123/lib/libmpg123.0.dylib
|
||||
/ThirdParty/ogg/lib/libogg.0.dylib
|
||||
/ThirdParty/opus/lib/libopus.0.dylib
|
||||
/ThirdParty/opusfile/lib/libopusfile.0.dylib
|
||||
/ThirdParty/speex/libspeex.a
|
||||
|
|
|
@ -2,11 +2,12 @@
|
|||
|
||||
#import <Cocoa/Cocoa.h>
|
||||
|
||||
@class FileTreeViewController;
|
||||
@class PlaybackController;
|
||||
@class PlaylistController;
|
||||
@class PlaylistView;
|
||||
@class PlaylistLoader;
|
||||
@class SUUpdater;
|
||||
@class PreferencesController;
|
||||
|
||||
@interface AppController : NSObject {
|
||||
IBOutlet NSObjectController *currentEntryController;
|
||||
|
@ -18,7 +19,6 @@
|
|||
|
||||
IBOutlet NSWindow *mainWindow;
|
||||
IBOutlet NSWindow *miniWindow;
|
||||
IBOutlet NSSplitView *mainView;
|
||||
|
||||
IBOutlet NSSegmentedControl *playbackButtons;
|
||||
IBOutlet NSButton *fileButton;
|
||||
|
@ -45,7 +45,9 @@
|
|||
|
||||
IBOutlet NSWindowController *spotlightWindowController;
|
||||
|
||||
IBOutlet FileTreeViewController *fileTreeViewController;
|
||||
IBOutlet SUUpdater *updater;
|
||||
|
||||
IBOutlet PreferencesController *preferencesController;
|
||||
|
||||
NSOperationQueue *queue; // Since we are the app delegate, we take care of the op queue
|
||||
|
||||
|
@ -68,6 +70,8 @@
|
|||
- (IBAction)openKofiPage:(id)sender;
|
||||
- (IBAction)openPatreonPage:(id)sender;
|
||||
|
||||
- (IBAction)privacyPolicy:(id)sender;
|
||||
|
||||
- (IBAction)feedback:(id)sender;
|
||||
|
||||
- (void)initDefaults;
|
||||
|
@ -97,6 +101,11 @@
|
|||
- (IBAction)toggleMiniMode:(id)sender;
|
||||
- (IBAction)toggleToolbarStyle:(id)sender;
|
||||
|
||||
- (BOOL)pathSuggesterEmpty;
|
||||
+ (BOOL)globalPathSuggesterEmpty;
|
||||
- (void)showPathSuggester;
|
||||
+ (void)globalShowPathSuggester;
|
||||
|
||||
@property NSWindow *mainWindow;
|
||||
@property NSWindow *miniWindow;
|
||||
|
||||
|
|
|
@ -1,11 +1,7 @@
|
|||
#import "AppController.h"
|
||||
#import "Cog-Swift.h"
|
||||
#import "FileTreeController.h"
|
||||
#import "FileTreeOutlineView.h"
|
||||
#import "FileTreeViewController.h"
|
||||
#import "FontSizetoLineHeightTransformer.h"
|
||||
#import "OpenURLPanel.h"
|
||||
#import "PathNode.h"
|
||||
#import "PlaybackController.h"
|
||||
#import "PlaylistController.h"
|
||||
#import "PlaylistEntry.h"
|
||||
|
@ -28,12 +24,18 @@
|
|||
#import "Shortcuts.h"
|
||||
#import <MASShortcut/Shortcut.h>
|
||||
|
||||
#import <Sparkle/Sparkle.h>
|
||||
|
||||
#import "PreferencesController.h"
|
||||
|
||||
@import Firebase;
|
||||
|
||||
void *kAppControllerContext = &kAppControllerContext;
|
||||
|
||||
BOOL kAppControllerShuttingDown = NO;
|
||||
|
||||
static AppController *kAppController = nil;
|
||||
|
||||
@implementation AppController {
|
||||
BOOL _isFullToolbarStyle;
|
||||
}
|
||||
|
@ -63,6 +65,10 @@ BOOL kAppControllerShuttingDown = NO;
|
|||
NSValueTransformer *totalTimeTransformer = [[TotalTimeTransformer alloc] init];
|
||||
[NSValueTransformer setValueTransformer:totalTimeTransformer
|
||||
forName:@"TotalTimeTransformer"];
|
||||
|
||||
NSValueTransformer *numberHertzToStringTransformer = [[NumberHertzToStringTransformer alloc] init];
|
||||
[NSValueTransformer setValueTransformer:numberHertzToStringTransformer
|
||||
forName:@"NumberHertzToStringTransformer"];
|
||||
}
|
||||
- (id)init {
|
||||
self = [super init];
|
||||
|
@ -70,6 +76,8 @@ BOOL kAppControllerShuttingDown = NO;
|
|||
[self initDefaults];
|
||||
|
||||
queue = [[NSOperationQueue alloc] init];
|
||||
|
||||
kAppController = self;
|
||||
}
|
||||
|
||||
return self;
|
||||
|
@ -144,10 +152,20 @@ BOOL kAppControllerShuttingDown = NO;
|
|||
}
|
||||
|
||||
- (void)awakeFromNib {
|
||||
#if DEBUG
|
||||
[[NSUserDefaults standardUserDefaults] registerDefaults:@{ @"NSApplicationCrashOnExceptions": @(NO) }];
|
||||
#else
|
||||
[[NSUserDefaults standardUserDefaults] registerDefaults:@{ @"NSApplicationCrashOnExceptions": @(YES) }];
|
||||
#endif
|
||||
|
||||
[FIRApp configure];
|
||||
[FIRAnalytics setAnalyticsCollectionEnabled:YES];
|
||||
|
||||
[[NSUserDefaultsController sharedUserDefaultsController] addObserver:self forKeyPath:@"values.crashlyticsConsented" options:(NSKeyValueObservingOptionInitial | NSKeyValueObservingOptionNew) context:kAppControllerContext];
|
||||
|
||||
#ifdef DEBUG
|
||||
// Prevent updates automatically in debug builds
|
||||
[updater setAutomaticallyChecksForUpdates:NO];
|
||||
#endif
|
||||
|
||||
[[totalTimeField cell] setBackgroundStyle:NSBackgroundStyleRaised];
|
||||
|
||||
|
@ -227,50 +245,11 @@ BOOL kAppControllerShuttingDown = NO;
|
|||
[self setFloatingMiniWindow:[[NSUserDefaults standardUserDefaults]
|
||||
boolForKey:@"floatingMiniWindow"]];
|
||||
|
||||
// We need file tree view to restore its state here
|
||||
// so attempt to access file tree view controller's root view
|
||||
// to force it to read nib and create file tree view for us
|
||||
//
|
||||
// TODO: there probably is a more elegant way to do all this
|
||||
// but i'm too stupid/tired to figure it out now
|
||||
[fileTreeViewController view];
|
||||
|
||||
FileTreeOutlineView *outlineView = [fileTreeViewController outlineView];
|
||||
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(nodeExpanded:) name:NSOutlineViewItemDidExpandNotification object:outlineView];
|
||||
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(nodeCollapsed:) name:NSOutlineViewItemDidCollapseNotification object:outlineView];
|
||||
|
||||
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(updateDockMenu:) name:CogPlaybackDidBeginNotficiation object:nil];
|
||||
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(updateDockMenu:) name:CogPlaybackDidStopNotficiation object:nil];
|
||||
|
||||
[self updateDockMenu:nil];
|
||||
|
||||
NSArray *expandedNodesArray = [[NSUserDefaults standardUserDefaults] valueForKey:@"fileTreeViewExpandedNodes"];
|
||||
|
||||
if(expandedNodesArray) {
|
||||
expandedNodes = [[NSMutableSet alloc] initWithArray:expandedNodesArray];
|
||||
} else {
|
||||
expandedNodes = [[NSMutableSet alloc] init];
|
||||
}
|
||||
|
||||
DLog(@"Nodes to expand: %@", [expandedNodes description]);
|
||||
|
||||
DLog(@"Num of rows: %ld", [outlineView numberOfRows]);
|
||||
|
||||
if(!outlineView) {
|
||||
DLog(@"outlineView is NULL!");
|
||||
}
|
||||
|
||||
[outlineView reloadData];
|
||||
|
||||
for(NSInteger i = 0; i < [outlineView numberOfRows]; i++) {
|
||||
PathNode *pn = [outlineView itemAtRow:i];
|
||||
NSString *str = [[pn URL] absoluteString];
|
||||
|
||||
if([expandedNodes containsObject:str]) {
|
||||
[outlineView expandItem:pn];
|
||||
}
|
||||
}
|
||||
|
||||
[self addObserver:self
|
||||
forKeyPath:@"playlistController.currentEntry"
|
||||
options:NSKeyValueObservingOptionInitial | NSKeyValueObservingOptionNew
|
||||
|
@ -285,7 +264,11 @@ BOOL kAppControllerShuttingDown = NO;
|
|||
return;
|
||||
}
|
||||
|
||||
if([keyPath isEqualToString:@"playlistController.currentEntry"]) {
|
||||
if([keyPath isEqualToString:@"values.crashlyticsConsented"]) {
|
||||
BOOL enabled = [[NSUserDefaults standardUserDefaults] boolForKey:@"crashlyticsConsented"];
|
||||
[[FIRCrashlytics crashlytics] setCrashlyticsCollectionEnabled:enabled];
|
||||
[FIRAnalytics setAnalyticsCollectionEnabled:enabled];
|
||||
} else if([keyPath isEqualToString:@"playlistController.currentEntry"]) {
|
||||
PlaylistEntry *entry = playlistController.currentEntry;
|
||||
NSString *appTitle = NSLocalizedString(@"CogTitle", @"");
|
||||
if(!entry) {
|
||||
|
@ -354,20 +337,6 @@ BOOL kAppControllerShuttingDown = NO;
|
|||
}
|
||||
}
|
||||
|
||||
- (void)nodeExpanded:(NSNotification *)notification {
|
||||
PathNode *node = [[notification userInfo] objectForKey:@"NSObject"];
|
||||
NSString *url = [[node URL] absoluteString];
|
||||
|
||||
[expandedNodes addObject:url];
|
||||
}
|
||||
|
||||
- (void)nodeCollapsed:(NSNotification *)notification {
|
||||
PathNode *node = [[notification userInfo] objectForKey:@"NSObject"];
|
||||
NSString *url = [[node URL] absoluteString];
|
||||
|
||||
[expandedNodes removeObject:url];
|
||||
}
|
||||
|
||||
- (NSApplicationTerminateReply)applicationShouldTerminate:(NSApplication *)sender {
|
||||
if(playbackController.progressOverall) {
|
||||
[playbackController.progressOverall addObserver:self forKeyPath:@"finished" options:0 context:kAppControllerContext];
|
||||
|
@ -441,7 +410,6 @@ BOOL kAppControllerShuttingDown = NO;
|
|||
|
||||
DLog(@"Saving expanded nodes: %@", [expandedNodes description]);
|
||||
|
||||
[[NSUserDefaults standardUserDefaults] setValue:[expandedNodes allObjects] forKey:@"fileTreeViewExpandedNodes"];
|
||||
// Workaround window not restoring it's size and position.
|
||||
[miniWindow setContentSize:NSMakeSize(miniWindow.frame.size.width, 1)];
|
||||
[miniWindow saveFrameUsingName:@"Mini Window"];
|
||||
|
@ -493,6 +461,10 @@ BOOL kAppControllerShuttingDown = NO;
|
|||
[[NSWorkspace sharedWorkspace] openURL:[NSURL URLWithString:@"https://www.patreon.com/kode54"]];
|
||||
}
|
||||
|
||||
- (IBAction)privacyPolicy:(id)sender {
|
||||
[[NSWorkspace sharedWorkspace] openURL:[NSURL URLWithString:@"https://www.iubenda.com/privacy-policy/59859310"]];
|
||||
}
|
||||
|
||||
- (IBAction)feedback:(id)sender {
|
||||
NSString *version = [[NSBundle mainBundle] objectForInfoDictionaryKey:@"CFBundleVersion"];
|
||||
|
||||
|
@ -712,4 +684,20 @@ BOOL kAppControllerShuttingDown = NO;
|
|||
}
|
||||
}
|
||||
|
||||
- (BOOL)pathSuggesterEmpty {
|
||||
return [playlistController pathSuggesterEmpty];
|
||||
}
|
||||
|
||||
+ (BOOL)globalPathSuggesterEmpty {
|
||||
return [kAppController pathSuggesterEmpty];
|
||||
}
|
||||
|
||||
- (void)showPathSuggester {
|
||||
[preferencesController showPathSuggester:self];
|
||||
}
|
||||
|
||||
+ (void)globalShowPathSuggester {
|
||||
[kAppController showPathSuggester];
|
||||
}
|
||||
|
||||
@end
|
||||
|
|
|
@ -617,12 +617,15 @@ NSDictionary *makeRGInfo(PlaylistEntry *pe) {
|
|||
|
||||
// Delay the action until this function has returned to the audio thread
|
||||
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, 5 * NSEC_PER_MSEC), dispatch_get_main_queue(), ^{
|
||||
if(pe) {
|
||||
[[FIRCrashlytics crashlytics] logWithFormat:@"Updating UI with track: %@", pe.url];
|
||||
}
|
||||
|
||||
[self->playlistController setCurrentEntry:pe];
|
||||
|
||||
if(self->_eq)
|
||||
if(pe && self->_eq) {
|
||||
equalizerApplyGenre(self->_eq, [pe genre]);
|
||||
}
|
||||
|
||||
self->lastPosition = -10;
|
||||
|
||||
|
@ -631,7 +634,9 @@ NSDictionary *makeRGInfo(PlaylistEntry *pe) {
|
|||
[self removeHDCD:nil];
|
||||
});
|
||||
|
||||
if(pe) {
|
||||
[[NSNotificationCenter defaultCenter] postNotificationName:CogPlaybackDidBeginNotficiation object:pe];
|
||||
}
|
||||
}
|
||||
|
||||
- (void)audioPlayer:(AudioPlayer *)player didChangeStatus:(NSNumber *)s userInfo:(id)userInfo {
|
||||
|
|
|
@ -13,5 +13,6 @@
|
|||
}
|
||||
|
||||
+ (NSArray *)urlsForContainerURL:(NSURL *)url;
|
||||
+ (NSArray *)dependencyUrlsForContainerURL:(NSURL *)url;
|
||||
|
||||
@end
|
||||
|
|
|
@ -18,4 +18,10 @@
|
|||
}
|
||||
}
|
||||
|
||||
+ (NSArray *)dependencyUrlsForContainerURL:(NSURL *)url {
|
||||
@autoreleasepool {
|
||||
return [[PluginController sharedPluginController] dependencyUrlsForContainerURL:url];
|
||||
}
|
||||
}
|
||||
|
||||
@end
|
||||
|
|
|
@ -16,13 +16,7 @@
|
|||
#import <CoreAudio/CoreAudio.h>
|
||||
#import <CoreAudio/CoreAudioTypes.h>
|
||||
|
||||
#ifdef __cplusplus
|
||||
#import <atomic>
|
||||
using std::atomic_int;
|
||||
using std::atomic_bool;
|
||||
#else
|
||||
#import <stdatomic.h>
|
||||
#endif
|
||||
|
||||
@class BufferChain;
|
||||
@class OutputNode;
|
||||
|
@ -39,6 +33,8 @@ using std::atomic_bool;
|
|||
id nextStreamUserInfo;
|
||||
NSDictionary *nextStreamRGInfo;
|
||||
|
||||
id previousUserInfo; // Track currently last heard track for play counts
|
||||
|
||||
id delegate;
|
||||
|
||||
BOOL outputLaunched;
|
||||
|
@ -116,6 +112,7 @@ using std::atomic_bool;
|
|||
- (void)setShouldContinue:(BOOL)s;
|
||||
//- (BufferChain *)bufferChain;
|
||||
- (void)launchOutputThread;
|
||||
- (BOOL)selectNextBuffer;
|
||||
- (void)endOfInputPlayed;
|
||||
- (void)reportPlayCount;
|
||||
- (void)sendDelegateMethod:(SEL)selector withVoid:(void *)obj waitUntilDone:(BOOL)wait;
|
||||
|
|
|
@ -62,9 +62,11 @@
|
|||
[self waitUntilCallbacksExit];
|
||||
if(output) {
|
||||
[output setShouldContinue:NO];
|
||||
output = nil;
|
||||
[output close];
|
||||
}
|
||||
if(!output) {
|
||||
output = [[OutputNode alloc] initWithController:self previous:nil];
|
||||
}
|
||||
[output setup];
|
||||
[output setVolume:volume];
|
||||
@synchronized(chainQueue) {
|
||||
|
@ -83,7 +85,7 @@
|
|||
bufferChain = [[BufferChain alloc] initWithController:self];
|
||||
[self notifyStreamChanged:userInfo];
|
||||
|
||||
while(![bufferChain open:url withOutputFormat:[output format] withOutputConfig:[output config] withUserInfo:userInfo withRGInfo:rgi]) {
|
||||
while(![bufferChain open:url withUserInfo:userInfo withRGInfo:rgi]) {
|
||||
bufferChain = nil;
|
||||
|
||||
[self requestNextStream:userInfo];
|
||||
|
@ -111,6 +113,7 @@
|
|||
outputLaunched = NO;
|
||||
startedPaused = paused;
|
||||
initialBufferFilled = NO;
|
||||
previousUserInfo = userInfo;
|
||||
|
||||
[bufferChain launchThreads];
|
||||
|
||||
|
@ -133,6 +136,10 @@
|
|||
bufferChain = nil;
|
||||
}
|
||||
}
|
||||
if(output) {
|
||||
[output setShouldContinue:NO];
|
||||
[output close];
|
||||
}
|
||||
output = nil;
|
||||
}
|
||||
|
||||
|
@ -219,7 +226,7 @@
|
|||
}
|
||||
|
||||
- (void)restartPlaybackAtCurrentPosition {
|
||||
[self sendDelegateMethod:@selector(audioPlayer:restartPlaybackAtCurrentPosition:) withObject:[bufferChain userInfo] waitUntilDone:NO];
|
||||
[self sendDelegateMethod:@selector(audioPlayer:restartPlaybackAtCurrentPosition:) withObject:previousUserInfo waitUntilDone:NO];
|
||||
}
|
||||
|
||||
- (void)pushInfo:(NSDictionary *)info toTrack:(id)userInfo {
|
||||
|
@ -290,6 +297,8 @@
|
|||
|
||||
- (BOOL)endOfInputReached:(BufferChain *)sender // Sender is a BufferChain
|
||||
{
|
||||
previousUserInfo = [sender userInfo];
|
||||
|
||||
BufferChain *newChain = nil;
|
||||
|
||||
if(atomic_load_explicit(&resettingNow, memory_order_relaxed))
|
||||
|
@ -369,7 +378,7 @@
|
|||
}
|
||||
|
||||
if(pathsEqual || ([[nextStream scheme] isEqualToString:[[lastChain streamURL] scheme]] && (([nextStream host] == nil && [[lastChain streamURL] host] == nil) || [[nextStream host] isEqualToString:[[lastChain streamURL] host]]) && [[nextStream path] isEqualToString:[[lastChain streamURL] path]])) {
|
||||
if([lastChain setTrack:nextStream] && [newChain openWithInput:[lastChain inputNode] withOutputFormat:[output format] withOutputConfig:[output config] withUserInfo:nextStreamUserInfo withRGInfo:nextStreamRGInfo]) {
|
||||
if([lastChain setTrack:nextStream] && [newChain openWithInput:[lastChain inputNode] withUserInfo:nextStreamUserInfo withRGInfo:nextStreamRGInfo]) {
|
||||
[newChain setStreamURL:nextStream];
|
||||
|
||||
[self addChainToQueue:newChain];
|
||||
|
@ -384,7 +393,7 @@
|
|||
|
||||
lastChain = nil;
|
||||
|
||||
while(shouldContinue && ![newChain open:nextStream withOutputFormat:[output format] withOutputConfig:[output config] withUserInfo:nextStreamUserInfo withRGInfo:nextStreamRGInfo]) {
|
||||
while(shouldContinue && ![newChain open:nextStream withUserInfo:nextStreamUserInfo withRGInfo:nextStreamRGInfo]) {
|
||||
if(nextStream == nil) {
|
||||
newChain = nil;
|
||||
atomic_fetch_sub(&refCount, 1);
|
||||
|
@ -418,29 +427,19 @@
|
|||
}
|
||||
|
||||
- (void)reportPlayCount {
|
||||
if(bufferChain) {
|
||||
[self reportPlayCountForTrack:[bufferChain userInfo]];
|
||||
}
|
||||
[self reportPlayCountForTrack:previousUserInfo];
|
||||
}
|
||||
|
||||
- (void)endOfInputPlayed {
|
||||
// Once we get here:
|
||||
// - the buffer chain for the next playlist entry (started in endOfInputReached) have been working for some time
|
||||
// already, so that there is some decoded and converted data to play
|
||||
// - the buffer chain for the next entry is the first item in chainQueue
|
||||
|
||||
- (BOOL)selectNextBuffer {
|
||||
BOOL signalStopped = NO;
|
||||
do {
|
||||
@synchronized(chainQueue) {
|
||||
endOfInputReached = NO;
|
||||
|
||||
if([chainQueue count] <= 0) {
|
||||
// End of playlist
|
||||
[self stop];
|
||||
|
||||
bufferChain = nil;
|
||||
|
||||
[self notifyPlaybackStopped:nil];
|
||||
|
||||
return;
|
||||
signalStopped = YES;
|
||||
break;
|
||||
}
|
||||
|
||||
bufferChain = nil;
|
||||
|
@ -451,9 +450,35 @@
|
|||
|
||||
[semaphore signal];
|
||||
}
|
||||
} while(0);
|
||||
|
||||
if(signalStopped) {
|
||||
double latency = 0;
|
||||
if(output) latency = [output latency];
|
||||
|
||||
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, latency * NSEC_PER_SEC), dispatch_get_main_queue(), ^{
|
||||
[self stop];
|
||||
|
||||
self->bufferChain = nil;
|
||||
|
||||
[self notifyPlaybackStopped:nil];
|
||||
});
|
||||
|
||||
return YES;
|
||||
}
|
||||
|
||||
[self notifyStreamChanged:[bufferChain userInfo]];
|
||||
[output setEndOfStream:NO];
|
||||
|
||||
return NO;
|
||||
}
|
||||
|
||||
- (void)endOfInputPlayed {
|
||||
// Once we get here:
|
||||
// - the buffer chain for the next playlist entry (started in endOfInputReached) have been working for some time
|
||||
// already, so that there is some decoded and converted data to play
|
||||
// - the buffer chain for the next entry is the first item in chainQueue
|
||||
previousUserInfo = [bufferChain userInfo];
|
||||
[self notifyStreamChanged:previousUserInfo];
|
||||
}
|
||||
|
||||
- (BOOL)chainQueueHasTracks {
|
||||
|
|
|
@ -28,15 +28,13 @@
|
|||
- (id)initWithController:(id)c;
|
||||
- (void)buildChain;
|
||||
|
||||
- (BOOL)open:(NSURL *)url withOutputFormat:(AudioStreamBasicDescription)outputFormat withOutputConfig:(uint32_t)outputConfig withUserInfo:(id)userInfo withRGInfo:(NSDictionary *)rgi;
|
||||
- (BOOL)open:(NSURL *)url withUserInfo:(id)userInfo withRGInfo:(NSDictionary *)rgi;
|
||||
|
||||
// Used when changing tracks to reuse the same decoder
|
||||
- (BOOL)openWithInput:(InputNode *)i withOutputFormat:(AudioStreamBasicDescription)outputFormat withOutputConfig:(uint32_t)outputConfig withUserInfo:(id)userInfo withRGInfo:(NSDictionary *)rgi;
|
||||
- (BOOL)openWithInput:(InputNode *)i withUserInfo:(id)userInfo withRGInfo:(NSDictionary *)rgi;
|
||||
|
||||
// Used when resetting the decoder on seek
|
||||
- (BOOL)openWithDecoder:(id<CogDecoder>)decoder
|
||||
withOutputFormat:(AudioStreamBasicDescription)outputFormat
|
||||
withOutputConfig:(uint32_t)outputConfig
|
||||
withUserInfo:(id)userInfo
|
||||
withRGInfo:(NSDictionary *)rgi;
|
||||
|
||||
|
|
|
@ -40,7 +40,7 @@
|
|||
finalNode = converterNode;
|
||||
}
|
||||
|
||||
- (BOOL)open:(NSURL *)url withOutputFormat:(AudioStreamBasicDescription)outputFormat withOutputConfig:(uint32_t)outputConfig withUserInfo:(id)userInfo withRGInfo:(NSDictionary *)rgi {
|
||||
- (BOOL)open:(NSURL *)url withUserInfo:(id)userInfo withRGInfo:(NSDictionary *)rgi {
|
||||
[self setStreamURL:url];
|
||||
[self setUserInfo:userInfo];
|
||||
|
||||
|
@ -66,13 +66,7 @@
|
|||
if([properties valueForKey:@"channelConfig"])
|
||||
inputChannelConfig = [[properties valueForKey:@"channelConfig"] unsignedIntValue];
|
||||
|
||||
outputFormat.mChannelsPerFrame = inputFormat.mChannelsPerFrame;
|
||||
outputFormat.mBytesPerFrame = ((outputFormat.mBitsPerChannel + 7) / 8) * outputFormat.mChannelsPerFrame;
|
||||
outputFormat.mBytesPerPacket = outputFormat.mBytesPerFrame * outputFormat.mFramesPerPacket;
|
||||
|
||||
outputConfig = inputChannelConfig;
|
||||
|
||||
if(![converterNode setupWithInputFormat:inputFormat withInputConfig:inputChannelConfig outputFormat:outputFormat outputConfig:outputConfig isLossless:[[properties valueForKey:@"encoding"] isEqualToString:@"lossless"]])
|
||||
if(![converterNode setupWithInputFormat:inputFormat withInputConfig:inputChannelConfig isLossless:[[properties valueForKey:@"encoding"] isEqualToString:@"lossless"]])
|
||||
return NO;
|
||||
|
||||
[self setRGInfo:rgi];
|
||||
|
@ -82,7 +76,7 @@
|
|||
return YES;
|
||||
}
|
||||
|
||||
- (BOOL)openWithInput:(InputNode *)i withOutputFormat:(AudioStreamBasicDescription)outputFormat withOutputConfig:(uint32_t)outputConfig withUserInfo:(id)userInfo withRGInfo:(NSDictionary *)rgi {
|
||||
- (BOOL)openWithInput:(InputNode *)i withUserInfo:(id)userInfo withRGInfo:(NSDictionary *)rgi {
|
||||
DLog(@"New buffer chain!");
|
||||
[self setUserInfo:userInfo];
|
||||
[self buildChain];
|
||||
|
@ -97,14 +91,8 @@
|
|||
if([properties valueForKey:@"channelConfig"])
|
||||
inputChannelConfig = [[properties valueForKey:@"channelConfig"] unsignedIntValue];
|
||||
|
||||
outputFormat.mChannelsPerFrame = inputFormat.mChannelsPerFrame;
|
||||
outputFormat.mBytesPerFrame = ((outputFormat.mBitsPerChannel + 7) / 8) * outputFormat.mChannelsPerFrame;
|
||||
outputFormat.mBytesPerPacket = outputFormat.mBytesPerFrame * outputFormat.mFramesPerPacket;
|
||||
|
||||
outputConfig = inputChannelConfig;
|
||||
|
||||
DLog(@"Input Properties: %@", properties);
|
||||
if(![converterNode setupWithInputFormat:inputFormat withInputConfig:inputChannelConfig outputFormat:outputFormat outputConfig:outputConfig isLossless:[[properties objectForKey:@"encoding"] isEqualToString:@"lossless"]])
|
||||
if(![converterNode setupWithInputFormat:inputFormat withInputConfig:inputChannelConfig isLossless:[[properties objectForKey:@"encoding"] isEqualToString:@"lossless"]])
|
||||
return NO;
|
||||
|
||||
[self setRGInfo:rgi];
|
||||
|
@ -113,8 +101,6 @@
|
|||
}
|
||||
|
||||
- (BOOL)openWithDecoder:(id<CogDecoder>)decoder
|
||||
withOutputFormat:(AudioStreamBasicDescription)outputFormat
|
||||
withOutputConfig:(uint32_t)outputConfig
|
||||
withUserInfo:(id)userInfo
|
||||
withRGInfo:(NSDictionary *)rgi;
|
||||
{
|
||||
|
@ -134,13 +120,7 @@
|
|||
if([properties valueForKey:@"channelConfig"])
|
||||
inputChannelConfig = [[properties valueForKey:@"channelConfig"] unsignedIntValue];
|
||||
|
||||
outputFormat.mChannelsPerFrame = inputFormat.mChannelsPerFrame;
|
||||
outputFormat.mBytesPerFrame = ((outputFormat.mBitsPerChannel + 7) / 8) * outputFormat.mChannelsPerFrame;
|
||||
outputFormat.mBytesPerPacket = outputFormat.mBytesPerFrame * outputFormat.mFramesPerPacket;
|
||||
|
||||
outputConfig = inputChannelConfig;
|
||||
|
||||
if(![converterNode setupWithInputFormat:inputFormat withInputConfig:inputChannelConfig outputFormat:outputFormat outputConfig:outputConfig isLossless:[[properties objectForKey:@"encoding"] isEqualToString:@"lossless"]])
|
||||
if(![converterNode setupWithInputFormat:inputFormat withInputConfig:inputChannelConfig isLossless:[[properties objectForKey:@"encoding"] isEqualToString:@"lossless"]])
|
||||
return NO;
|
||||
|
||||
[self setRGInfo:rgi];
|
||||
|
|
|
@ -14,15 +14,11 @@
|
|||
|
||||
#import "Node.h"
|
||||
|
||||
#import "HeadphoneFilter.h"
|
||||
|
||||
#define DSD_DECIMATE 1
|
||||
|
||||
@interface ConverterNode : Node {
|
||||
NSDictionary *rgInfo;
|
||||
|
||||
void *_r8bstate;
|
||||
|
||||
void *inputBuffer;
|
||||
size_t inputBufferSize;
|
||||
size_t inpSize, inpOffset;
|
||||
|
@ -31,29 +27,12 @@
|
|||
BOOL convertEntered;
|
||||
BOOL paused;
|
||||
|
||||
BOOL skipResampler;
|
||||
|
||||
unsigned int PRIME_LEN_;
|
||||
unsigned int N_samples_to_add_;
|
||||
unsigned int N_samples_to_drop_;
|
||||
|
||||
unsigned int is_preextrapolated_;
|
||||
unsigned int is_postextrapolated_;
|
||||
|
||||
int latencyEaten;
|
||||
int latencyEatenPost;
|
||||
|
||||
double sampleRatio;
|
||||
|
||||
float volumeScale;
|
||||
|
||||
void *floatBuffer;
|
||||
size_t floatBufferSize;
|
||||
size_t floatSize, floatOffset;
|
||||
|
||||
void *extrapolateBuffer;
|
||||
size_t extrapolateBufferSize;
|
||||
|
||||
#if DSD_DECIMATE
|
||||
void **dsd2pcm;
|
||||
size_t dsd2pcmCount;
|
||||
|
@ -65,10 +44,8 @@
|
|||
AudioStreamBasicDescription inputFormat;
|
||||
AudioStreamBasicDescription floatFormat;
|
||||
AudioStreamBasicDescription dmFloatFormat; // downmixed/upmixed float format
|
||||
AudioStreamBasicDescription outputFormat;
|
||||
|
||||
uint32_t inputChannelConfig;
|
||||
uint32_t outputChannelConfig;
|
||||
|
||||
BOOL streamFormatChanged;
|
||||
AudioStreamBasicDescription newInputFormat;
|
||||
|
@ -77,15 +54,13 @@
|
|||
AudioChunk *lastChunkIn;
|
||||
|
||||
void *hdcd_decoder;
|
||||
|
||||
HeadphoneFilter *hFilter;
|
||||
}
|
||||
|
||||
@property AudioStreamBasicDescription inputFormat;
|
||||
|
||||
- (id)initWithController:(id)c previous:(id)p;
|
||||
|
||||
- (BOOL)setupWithInputFormat:(AudioStreamBasicDescription)inputFormat withInputConfig:(uint32_t)inputConfig outputFormat:(AudioStreamBasicDescription)outputFormat outputConfig:(uint32_t)outputConfig isLossless:(BOOL)lossless;
|
||||
- (BOOL)setupWithInputFormat:(AudioStreamBasicDescription)inputFormat withInputConfig:(uint32_t)inputConfig isLossless:(BOOL)lossless;
|
||||
- (void)cleanUp;
|
||||
|
||||
- (void)process;
|
||||
|
@ -93,8 +68,6 @@
|
|||
|
||||
- (void)setRGInfo:(NSDictionary *)rgi;
|
||||
|
||||
- (void)setOutputFormat:(AudioStreamBasicDescription)format outputConfig:(uint32_t)outputConfig;
|
||||
|
||||
- (void)inputFormatDidChange:(AudioStreamBasicDescription)format inputConfig:(uint32_t)inputConfig;
|
||||
|
||||
- (void)refreshVolumeScaling;
|
||||
|
|
|
@ -6,6 +6,9 @@
|
|||
// Copyright 2005 __MyCompanyName__. All rights reserved.
|
||||
//
|
||||
|
||||
#import <Accelerate/Accelerate.h>
|
||||
#import <Foundation/Foundation.h>
|
||||
|
||||
#import "ConverterNode.h"
|
||||
|
||||
#import "BufferChain.h"
|
||||
|
@ -13,17 +16,12 @@
|
|||
|
||||
#import "Logging.h"
|
||||
|
||||
#import "lpc.h"
|
||||
#import "util.h"
|
||||
|
||||
#import "hdcd_decode2.h"
|
||||
|
||||
#ifdef _DEBUG
|
||||
#import "BadSampleCleaner.h"
|
||||
#endif
|
||||
|
||||
#import "r8bstate.h"
|
||||
|
||||
#if !DSD_DECIMATE
|
||||
#include "dsd2float.h"
|
||||
#endif
|
||||
|
@ -56,7 +54,6 @@ static void *kConverterNodeContext = &kConverterNodeContext;
|
|||
if(self) {
|
||||
rgInfo = nil;
|
||||
|
||||
_r8bstate = 0;
|
||||
inputBuffer = NULL;
|
||||
inputBufferSize = 0;
|
||||
floatBuffer = NULL;
|
||||
|
@ -66,11 +63,6 @@ static void *kConverterNodeContext = &kConverterNodeContext;
|
|||
convertEntered = NO;
|
||||
paused = NO;
|
||||
|
||||
skipResampler = YES;
|
||||
|
||||
extrapolateBuffer = NULL;
|
||||
extrapolateBufferSize = 0;
|
||||
|
||||
#if DSD_DECIMATE
|
||||
dsd2pcm = NULL;
|
||||
dsd2pcmCount = 0;
|
||||
|
@ -86,7 +78,7 @@ static void *kConverterNodeContext = &kConverterNodeContext;
|
|||
return self;
|
||||
}
|
||||
|
||||
extern "C" void scale_by_volume(float *buffer, size_t count, float volume) {
|
||||
void scale_by_volume(float *buffer, size_t count, float volume) {
|
||||
if(volume != 1.0) {
|
||||
size_t unaligned = (uintptr_t)buffer & 15;
|
||||
if(unaligned) {
|
||||
|
@ -458,7 +450,7 @@ static void convert_be_to_le(uint8_t *buffer, size_t bitsPerSample, size_t bytes
|
|||
continue;
|
||||
} else if(streamFormatChanged) {
|
||||
[self cleanUp];
|
||||
[self setupWithInputFormat:newInputFormat withInputConfig:newInputChannelConfig outputFormat:outputFormat outputConfig:outputChannelConfig isLossless:rememberedLossless];
|
||||
[self setupWithInputFormat:newInputFormat withInputConfig:newInputChannelConfig isLossless:rememberedLossless];
|
||||
continue;
|
||||
} else
|
||||
break;
|
||||
|
@ -471,7 +463,6 @@ static void convert_be_to_le(uint8_t *buffer, size_t bitsPerSample, size_t bytes
|
|||
UInt32 ioNumberPackets;
|
||||
int amountReadFromFC;
|
||||
int amountRead = 0;
|
||||
int amountToIgnorePostExtrapolated = 0;
|
||||
|
||||
if(stopping)
|
||||
return 0;
|
||||
|
@ -496,13 +487,6 @@ tryagain:
|
|||
|
||||
// Approximately the most we want on input
|
||||
ioNumberPackets = CHUNK_SIZE;
|
||||
if(!skipResampler && ioNumberPackets < PRIME_LEN_)
|
||||
ioNumberPackets = PRIME_LEN_;
|
||||
|
||||
// We want to upscale this count if the ratio is below zero
|
||||
if(sampleRatio < 1.0) {
|
||||
ioNumberPackets = ((uint32_t)(ioNumberPackets / sampleRatio) + 15) & ~15;
|
||||
}
|
||||
|
||||
#if DSD_DECIMATE
|
||||
const size_t sizeScale = 3;
|
||||
|
@ -555,41 +539,8 @@ tryagain:
|
|||
}
|
||||
}
|
||||
|
||||
// Pad end of track with input format silence
|
||||
|
||||
if(stopping || paused || streamFormatChanged || [self shouldContinue] == NO || [self endOfStream] == YES) {
|
||||
if(!skipResampler && !is_postextrapolated_) {
|
||||
#if DSD_DECIMATE
|
||||
if(dsd2pcm) {
|
||||
uint32_t amountToSkip = dsd2pcmLatency * inputFormat.mBytesPerPacket;
|
||||
memset(((uint8_t *)inputBuffer) + bytesReadFromInput, 0x55, amountToSkip);
|
||||
bytesReadFromInput += amountToSkip;
|
||||
}
|
||||
#endif
|
||||
is_postextrapolated_ = 1;
|
||||
#if DSD_DECIMATE
|
||||
} else if(!is_postextrapolated_ && dsd2pcm) {
|
||||
is_postextrapolated_ = 3;
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
||||
BOOL isBigEndian = !!(inputFormat.mFormatFlags & kAudioFormatFlagIsBigEndian);
|
||||
|
||||
if(!bytesReadFromInput && streamFormatChanged && !skipResampler && is_postextrapolated_ < 2) {
|
||||
AudioChunk *chunk = lastChunkIn;
|
||||
lastChunkIn = nil;
|
||||
AudioStreamBasicDescription inf = [chunk format];
|
||||
size_t frameCount = [chunk frameCount];
|
||||
size_t bytesRead = frameCount * inf.mBytesPerPacket;
|
||||
if(frameCount) {
|
||||
amountToIgnorePostExtrapolated = (int)frameCount;
|
||||
NSData *samples = [chunk removeSamples:frameCount];
|
||||
memcpy(inputBuffer, [samples bytes], bytesRead);
|
||||
}
|
||||
bytesReadFromInput += bytesRead;
|
||||
}
|
||||
|
||||
if(!bytesReadFromInput) {
|
||||
convertEntered = NO;
|
||||
return amountRead;
|
||||
|
@ -701,82 +652,9 @@ tryagain:
|
|||
#endif
|
||||
}
|
||||
|
||||
// Extrapolate start
|
||||
if(!skipResampler && !is_preextrapolated_) {
|
||||
size_t samples_in_buffer = bytesReadFromInput / floatFormat.mBytesPerPacket;
|
||||
size_t prime = min(samples_in_buffer, PRIME_LEN_);
|
||||
size_t _N_samples_to_add_ = N_samples_to_add_;
|
||||
#if DSD_DECIMATE
|
||||
if(dsd2pcm) _N_samples_to_add_ += dsd2pcmLatency;
|
||||
#endif
|
||||
size_t newSize = _N_samples_to_add_ * floatFormat.mBytesPerPacket;
|
||||
newSize += bytesReadFromInput;
|
||||
|
||||
if(newSize > inputBufferSize) {
|
||||
inputBuffer = realloc(inputBuffer, inputBufferSize = newSize * 3);
|
||||
}
|
||||
|
||||
size_t bytesToSkip = 0;
|
||||
#if DSD_DECIMATE
|
||||
if(dsd2pcm) {
|
||||
bytesToSkip = dsd2pcmLatency * floatFormat.mBytesPerPacket;
|
||||
if(bytesReadFromInput >= bytesToSkip) {
|
||||
bytesReadFromInput -= bytesToSkip;
|
||||
} else {
|
||||
bytesToSkip = 0;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
memmove(((uint8_t *)inputBuffer) + N_samples_to_add_ * floatFormat.mBytesPerPacket, ((uint8_t *)inputBuffer) + bytesToSkip, bytesReadFromInput);
|
||||
|
||||
lpc_extrapolate_bkwd((float *)(((uint8_t *)inputBuffer) + _N_samples_to_add_ * floatFormat.mBytesPerPacket), samples_in_buffer, prime, floatFormat.mChannelsPerFrame, LPC_ORDER, _N_samples_to_add_, &extrapolateBuffer, &extrapolateBufferSize);
|
||||
#ifdef _DEBUG
|
||||
[BadSampleCleaner cleanSamples:(float *)inputBuffer
|
||||
amount:_N_samples_to_add_ * floatFormat.mChannelsPerFrame
|
||||
location:@"pre-extrapolated data"];
|
||||
#endif
|
||||
|
||||
bytesReadFromInput += _N_samples_to_add_ * floatFormat.mBytesPerPacket;
|
||||
latencyEaten = N_samples_to_drop_;
|
||||
#if DSD_DECIMATE
|
||||
if(dsd2pcm) latencyEaten += (int)ceil(dsd2pcmLatency * sampleRatio);
|
||||
#endif
|
||||
is_preextrapolated_ = 2;
|
||||
#if DSD_DECIMATE
|
||||
} else if(dsd2pcm && !is_preextrapolated_) {
|
||||
latencyEaten = dsd2pcmLatency;
|
||||
is_preextrapolated_ = 3;
|
||||
#endif
|
||||
}
|
||||
|
||||
if(is_postextrapolated_ == 1) {
|
||||
size_t samples_in_buffer = bytesReadFromInput / floatFormat.mBytesPerPacket;
|
||||
|
||||
size_t prime = min(samples_in_buffer, PRIME_LEN_);
|
||||
|
||||
size_t newSize = bytesReadFromInput;
|
||||
newSize += N_samples_to_add_ * floatFormat.mBytesPerPacket;
|
||||
if(newSize > inputBufferSize) {
|
||||
inputBuffer = realloc(inputBuffer, inputBufferSize = newSize * 3);
|
||||
}
|
||||
|
||||
lpc_extrapolate_fwd((float *)inputBuffer, samples_in_buffer, prime, floatFormat.mChannelsPerFrame, LPC_ORDER, N_samples_to_add_, &extrapolateBuffer, &extrapolateBufferSize);
|
||||
#ifdef _DEBUG
|
||||
[BadSampleCleaner cleanSamples:(float *)(inputBuffer) + samples_in_buffer * floatFormat.mChannelsPerFrame
|
||||
amount:N_samples_to_add_ * floatFormat.mChannelsPerFrame
|
||||
location:@"post-extrapolated data"];
|
||||
#endif
|
||||
bytesReadFromInput += N_samples_to_add_ * floatFormat.mBytesPerPacket;
|
||||
latencyEatenPost = N_samples_to_drop_;
|
||||
is_postextrapolated_ = 2;
|
||||
} else if(is_postextrapolated_ == 3) { // No need to skip the end
|
||||
latencyEatenPost = 0;
|
||||
}
|
||||
|
||||
// Input now contains bytesReadFromInput worth of floats, in the input sample rate
|
||||
inpSize = bytesReadFromInput;
|
||||
inpOffset = amountToIgnorePostExtrapolated * floatFormat.mBytesPerPacket;
|
||||
inpOffset = 0;
|
||||
}
|
||||
|
||||
if(inpOffset != inpSize && floatOffset == floatSize) {
|
||||
|
@ -788,7 +666,6 @@ tryagain:
|
|||
|
||||
ioNumberPackets = (UInt32)inputSamples;
|
||||
|
||||
ioNumberPackets = (UInt32)ceil((float)ioNumberPackets * sampleRatio);
|
||||
ioNumberPackets = (ioNumberPackets + 255) & ~255;
|
||||
|
||||
size_t newSize = ioNumberPackets * floatFormat.mBytesPerPacket;
|
||||
|
@ -805,64 +682,12 @@ tryagain:
|
|||
size_t inputDone = 0;
|
||||
size_t outputDone = 0;
|
||||
|
||||
if(!skipResampler) {
|
||||
// This is needed at least for the flush, or else there won't be room for it
|
||||
ioNumberPackets += ((r8bstate *)_r8bstate)->latency();
|
||||
|
||||
#ifdef _DEBUG
|
||||
[BadSampleCleaner cleanSamples:(float *)(((uint8_t *)inputBuffer) + inpOffset)
|
||||
amount:inputSamples * floatFormat.mChannelsPerFrame
|
||||
location:@"resampler input"];
|
||||
#endif
|
||||
outputDone = ((r8bstate *)_r8bstate)->resample((float *)(((uint8_t *)inputBuffer) + inpOffset), inputSamples, &inputDone, (float *)floatBuffer, ioNumberPackets);
|
||||
#ifdef _DEBUG
|
||||
[BadSampleCleaner cleanSamples:(float *)floatBuffer
|
||||
amount:outputDone * floatFormat.mChannelsPerFrame
|
||||
location:@"resampler output"];
|
||||
#endif
|
||||
|
||||
if(latencyEatenPost) {
|
||||
// Post file flush
|
||||
size_t odone = 0;
|
||||
|
||||
do {
|
||||
odone = ((r8bstate *)_r8bstate)->flush((float *)(((uint8_t *)floatBuffer) + outputDone * floatFormat.mBytesPerPacket), ioNumberPackets - outputDone);
|
||||
#ifdef _DEBUG
|
||||
[BadSampleCleaner cleanSamples:(float *)(floatBuffer + outputDone * floatFormat.mBytesPerPacket)
|
||||
amount:odone * floatFormat.mChannelsPerFrame
|
||||
location:@"resampler flushed output"];
|
||||
#endif
|
||||
outputDone += odone;
|
||||
} while(odone > 0);
|
||||
}
|
||||
} else {
|
||||
memcpy(floatBuffer, (((uint8_t *)inputBuffer) + inpOffset), inputSamples * floatFormat.mBytesPerPacket);
|
||||
inputDone = inputSamples;
|
||||
outputDone = inputSamples;
|
||||
}
|
||||
|
||||
inpOffset += inputDone * floatFormat.mBytesPerPacket;
|
||||
|
||||
if(latencyEaten) {
|
||||
if(outputDone > latencyEaten) {
|
||||
outputDone -= latencyEaten;
|
||||
memmove(floatBuffer, ((uint8_t *)floatBuffer) + latencyEaten * floatFormat.mBytesPerPacket, outputDone * floatFormat.mBytesPerPacket);
|
||||
latencyEaten = 0;
|
||||
} else {
|
||||
latencyEaten -= outputDone;
|
||||
outputDone = 0;
|
||||
}
|
||||
}
|
||||
|
||||
if(latencyEatenPost) {
|
||||
if(outputDone > latencyEatenPost) {
|
||||
outputDone -= latencyEatenPost;
|
||||
} else {
|
||||
outputDone = 0;
|
||||
}
|
||||
latencyEatenPost = 0;
|
||||
}
|
||||
|
||||
amountReadFromFC = (int)(outputDone * floatFormat.mBytesPerPacket);
|
||||
|
||||
scale_by_volume((float *)floatBuffer, amountReadFromFC / sizeof(float), volumeScale
|
||||
|
@ -882,7 +707,7 @@ tryagain:
|
|||
if(ioNumberPackets > (floatSize - floatOffset))
|
||||
ioNumberPackets = (UInt32)(floatSize - floatOffset);
|
||||
|
||||
ioNumberPackets -= ioNumberPackets % outputFormat.mBytesPerPacket;
|
||||
ioNumberPackets -= ioNumberPackets % dmFloatFormat.mBytesPerPacket;
|
||||
|
||||
memcpy(((uint8_t *)dest) + amountRead, ((uint8_t *)floatBuffer) + floatOffset, ioNumberPackets);
|
||||
|
||||
|
@ -953,16 +778,11 @@ static float db_to_scale(float db) {
|
|||
volumeScale = scale;
|
||||
}
|
||||
|
||||
- (BOOL)setupWithInputFormat:(AudioStreamBasicDescription)inf withInputConfig:(uint32_t)inputConfig outputFormat:(AudioStreamBasicDescription)outf outputConfig:(uint32_t)outputConfig isLossless:(BOOL)lossless {
|
||||
- (BOOL)setupWithInputFormat:(AudioStreamBasicDescription)inf withInputConfig:(uint32_t)inputConfig isLossless:(BOOL)lossless {
|
||||
// Make the converter
|
||||
inputFormat = inf;
|
||||
outputFormat = outf;
|
||||
|
||||
inputChannelConfig = inputConfig;
|
||||
outputChannelConfig = outputConfig;
|
||||
|
||||
nodeFormat = outputFormat;
|
||||
nodeChannelConfig = outputChannelConfig;
|
||||
|
||||
rememberedLossless = lossless;
|
||||
|
||||
|
@ -1010,38 +830,12 @@ static float db_to_scale(float db) {
|
|||
// This is a post resampler, post-down/upmix format
|
||||
|
||||
dmFloatFormat = floatFormat;
|
||||
dmFloatFormat.mSampleRate = outputFormat.mSampleRate;
|
||||
dmFloatFormat.mChannelsPerFrame = outputFormat.mChannelsPerFrame;
|
||||
dmFloatFormat.mBytesPerFrame = (32 / 8) * dmFloatFormat.mChannelsPerFrame;
|
||||
dmFloatFormat.mBytesPerPacket = dmFloatFormat.mBytesPerFrame * floatFormat.mFramesPerPacket;
|
||||
|
||||
skipResampler = outputFormat.mSampleRate == floatFormat.mSampleRate;
|
||||
|
||||
sampleRatio = (double)outputFormat.mSampleRate / (double)floatFormat.mSampleRate;
|
||||
|
||||
if(!skipResampler) {
|
||||
const int channelCount = floatFormat.mChannelsPerFrame;
|
||||
|
||||
_r8bstate = (void *)(new r8bstate(channelCount, 1024, floatFormat.mSampleRate, outputFormat.mSampleRate));
|
||||
|
||||
PRIME_LEN_ = max(floatFormat.mSampleRate / 20, 1024u);
|
||||
PRIME_LEN_ = min(PRIME_LEN_, 16384u);
|
||||
PRIME_LEN_ = max(PRIME_LEN_, 2 * LPC_ORDER + 1);
|
||||
|
||||
N_samples_to_add_ = floatFormat.mSampleRate;
|
||||
N_samples_to_drop_ = outputFormat.mSampleRate;
|
||||
|
||||
samples_len(&N_samples_to_add_, &N_samples_to_drop_, 20, 8192u);
|
||||
|
||||
is_preextrapolated_ = 0;
|
||||
is_postextrapolated_ = 0;
|
||||
}
|
||||
|
||||
latencyEaten = 0;
|
||||
latencyEatenPost = 0;
|
||||
nodeFormat = dmFloatFormat;
|
||||
nodeChannelConfig = inputChannelConfig;
|
||||
|
||||
PrintStreamDesc(&inf);
|
||||
PrintStreamDesc(&outf);
|
||||
PrintStreamDesc(&nodeFormat);
|
||||
|
||||
[self refreshVolumeScaling];
|
||||
|
||||
|
@ -1063,12 +857,6 @@ static float db_to_scale(float db) {
|
|||
[self cleanUp];
|
||||
}
|
||||
|
||||
- (void)setOutputFormat:(AudioStreamBasicDescription)format outputConfig:(uint32_t)outputConfig {
|
||||
DLog(@"SETTING OUTPUT FORMAT!");
|
||||
outputFormat = format;
|
||||
outputChannelConfig = outputConfig;
|
||||
}
|
||||
|
||||
- (void)inputFormatDidChange:(AudioStreamBasicDescription)format inputConfig:(uint32_t)inputConfig {
|
||||
DLog(@"FORMAT CHANGED");
|
||||
paused = YES;
|
||||
|
@ -1076,7 +864,7 @@ static float db_to_scale(float db) {
|
|||
usleep(500);
|
||||
}
|
||||
[self cleanUp];
|
||||
[self setupWithInputFormat:format withInputConfig:inputConfig outputFormat:outputFormat outputConfig:outputChannelConfig isLossless:rememberedLossless];
|
||||
[self setupWithInputFormat:format withInputConfig:inputConfig isLossless:rememberedLossless];
|
||||
}
|
||||
|
||||
- (void)setRGInfo:(NSDictionary *)rgi {
|
||||
|
@ -1090,17 +878,10 @@ static float db_to_scale(float db) {
|
|||
while(convertEntered) {
|
||||
usleep(500);
|
||||
}
|
||||
if(hFilter) {
|
||||
hFilter = nil;
|
||||
}
|
||||
if(hdcd_decoder) {
|
||||
free(hdcd_decoder);
|
||||
hdcd_decoder = NULL;
|
||||
}
|
||||
if(_r8bstate) {
|
||||
delete(r8bstate *)_r8bstate;
|
||||
_r8bstate = NULL;
|
||||
}
|
||||
#if DSD_DECIMATE
|
||||
if(dsd2pcm && dsd2pcmCount) {
|
||||
for(size_t i = 0; i < dsd2pcmCount; ++i) {
|
||||
|
@ -1111,11 +892,6 @@ static float db_to_scale(float db) {
|
|||
dsd2pcm = NULL;
|
||||
}
|
||||
#endif
|
||||
if(extrapolateBuffer) {
|
||||
free(extrapolateBuffer);
|
||||
extrapolateBuffer = NULL;
|
||||
extrapolateBufferSize = 0;
|
||||
}
|
||||
if(floatBuffer) {
|
||||
free(floatBuffer);
|
||||
floatBuffer = NULL;
|
|
@ -9,11 +9,7 @@
|
|||
#import <CoreAudio/CoreAudio.h>
|
||||
#import <Foundation/Foundation.h>
|
||||
|
||||
#import "HeadphoneFilter.h"
|
||||
|
||||
@interface DownmixProcessor : NSObject {
|
||||
HeadphoneFilter *hFilter;
|
||||
|
||||
AudioStreamBasicDescription inputFormat;
|
||||
AudioStreamBasicDescription outputFormat;
|
||||
|
||||
|
|
|
@ -275,92 +275,12 @@ static void *kDownmixProcessorContext = &kDownmixProcessorContext;
|
|||
|
||||
inConfig = iConfig;
|
||||
outConfig = oConfig;
|
||||
|
||||
[self setupVirt];
|
||||
|
||||
[[NSUserDefaultsController sharedUserDefaultsController] addObserver:self forKeyPath:@"values.headphoneVirtualization" options:0 context:kDownmixProcessorContext];
|
||||
[[NSUserDefaultsController sharedUserDefaultsController] addObserver:self forKeyPath:@"values.hrirPath" options:0 context:kDownmixProcessorContext];
|
||||
}
|
||||
|
||||
return self;
|
||||
}
|
||||
|
||||
- (void)dealloc {
|
||||
[[NSUserDefaultsController sharedUserDefaultsController] removeObserver:self forKeyPath:@"values.headphoneVirtualization" context:kDownmixProcessorContext];
|
||||
[[NSUserDefaultsController sharedUserDefaultsController] removeObserver:self forKeyPath:@"values.hrirPath" context:kDownmixProcessorContext];
|
||||
}
|
||||
|
||||
- (void)setupVirt {
|
||||
@synchronized(hFilter) {
|
||||
hFilter = nil;
|
||||
}
|
||||
|
||||
BOOL hVirt = [[[NSUserDefaultsController sharedUserDefaultsController] defaults] boolForKey:@"headphoneVirtualization"];
|
||||
|
||||
if(hVirt &&
|
||||
outputFormat.mChannelsPerFrame >= 2 &&
|
||||
(outConfig & AudioConfigStereo) == AudioConfigStereo &&
|
||||
inputFormat.mChannelsPerFrame >= 1 &&
|
||||
(inConfig & (AudioConfig7Point1 | AudioChannelBackCenter)) != 0) {
|
||||
NSString *userPreset = [[[NSUserDefaultsController sharedUserDefaultsController] defaults] stringForKey:@"hrirPath"];
|
||||
|
||||
NSURL *presetUrl = nil;
|
||||
|
||||
if(userPreset && ![userPreset isEqualToString:@""]) {
|
||||
presetUrl = [NSURL fileURLWithPath:userPreset];
|
||||
if(![HeadphoneFilter validateImpulseFile:presetUrl])
|
||||
presetUrl = nil;
|
||||
}
|
||||
|
||||
if(!presetUrl) {
|
||||
presetUrl = [[NSBundle mainBundle] URLForResource:@"gsx" withExtension:@"wv"];
|
||||
if(![HeadphoneFilter validateImpulseFile:presetUrl])
|
||||
presetUrl = nil;
|
||||
}
|
||||
|
||||
if(presetUrl) {
|
||||
@synchronized(hFilter) {
|
||||
hFilter = [[HeadphoneFilter alloc] initWithImpulseFile:presetUrl forSampleRate:outputFormat.mSampleRate withInputChannels:inputFormat.mChannelsPerFrame withConfig:inConfig];
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
- (void)observeValueForKeyPath:(NSString *)keyPath
|
||||
ofObject:(id)object
|
||||
change:(NSDictionary *)change
|
||||
context:(void *)context {
|
||||
if(context == kDownmixProcessorContext) {
|
||||
DLog(@"SOMETHING CHANGED!");
|
||||
if([keyPath isEqualToString:@"values.headphoneVirtualization"] ||
|
||||
[keyPath isEqualToString:@"values.hrirPath"]) {
|
||||
// Reset the converter, without rebuffering
|
||||
[self setupVirt];
|
||||
}
|
||||
} else {
|
||||
[super observeValueForKeyPath:keyPath ofObject:object change:change context:context];
|
||||
}
|
||||
}
|
||||
|
||||
- (void)process:(const void *)inBuffer frameCount:(size_t)frames output:(void *)outBuffer {
|
||||
@synchronized(hFilter) {
|
||||
if(hFilter) {
|
||||
uint32_t outChannels = outputFormat.mChannelsPerFrame;
|
||||
if(outChannels > 2) {
|
||||
float tempBuffer[frames * 2];
|
||||
[hFilter process:(const float *)inBuffer sampleCount:frames toBuffer:&tempBuffer[0]];
|
||||
cblas_scopy((int)frames, tempBuffer, 2, (float *)outBuffer, outChannels);
|
||||
cblas_scopy((int)frames, tempBuffer + 1, 2, ((float *)outBuffer) + 1, outChannels);
|
||||
for(size_t i = 2; i < outChannels; ++i) {
|
||||
vDSP_vclr(((float *)outBuffer) + i, outChannels, (int)frames);
|
||||
}
|
||||
} else {
|
||||
[hFilter process:(const float *)inBuffer sampleCount:frames toBuffer:(float *)outBuffer];
|
||||
}
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
if(inputFormat.mChannelsPerFrame > 2 && outConfig == AudioConfigStereo) {
|
||||
downmix_to_stereo((const float *)inBuffer, inputFormat.mChannelsPerFrame, inConfig, (float *)outBuffer, frames);
|
||||
} else if(inputFormat.mChannelsPerFrame > 1 && outConfig == AudioConfigMono) {
|
||||
|
|
|
@ -1,47 +0,0 @@
|
|||
//
|
||||
// HeadphoneFilter.h
|
||||
// CogAudio Framework
|
||||
//
|
||||
// Created by Christopher Snowhill on 1/24/22.
|
||||
//
|
||||
|
||||
#ifndef HeadphoneFilter_h
|
||||
#define HeadphoneFilter_h
|
||||
|
||||
#import <Accelerate/Accelerate.h>
|
||||
#import <Cocoa/Cocoa.h>
|
||||
|
||||
@interface HeadphoneFilter : NSObject {
|
||||
vDSP_DFT_Setup dftSetupF;
|
||||
vDSP_DFT_Setup dftSetupB;
|
||||
|
||||
size_t fftSize;
|
||||
size_t fftSizeOver2;
|
||||
size_t bufferSize;
|
||||
size_t paddedBufferSize;
|
||||
size_t channelCount;
|
||||
|
||||
DSPSplitComplex signal_fft;
|
||||
DSPSplitComplex input_filtered_signal_per_channel[2];
|
||||
DSPSplitComplex input_filtered_signal_totals[2];
|
||||
DSPSplitComplex *impulse_responses;
|
||||
|
||||
float **prevInputs;
|
||||
|
||||
float *left_result;
|
||||
float *right_result;
|
||||
|
||||
float *paddedSignal;
|
||||
}
|
||||
|
||||
+ (BOOL)validateImpulseFile:(NSURL *)url;
|
||||
|
||||
- (id)initWithImpulseFile:(NSURL *)url forSampleRate:(double)sampleRate withInputChannels:(size_t)channels withConfig:(uint32_t)config;
|
||||
|
||||
- (void)process:(const float *)inBuffer sampleCount:(size_t)count toBuffer:(float *)outBuffer;
|
||||
|
||||
- (void)reset;
|
||||
|
||||
@end
|
||||
|
||||
#endif /* HeadphoneFilter_h */
|
|
@ -1,678 +0,0 @@
|
|||
//
|
||||
// HeadphoneFilter.m
|
||||
// CogAudio Framework
|
||||
//
|
||||
// Created by Christopher Snowhill on 1/24/22.
|
||||
//
|
||||
|
||||
#import "HeadphoneFilter.h"
|
||||
#import "AudioChunk.h"
|
||||
#import "AudioDecoder.h"
|
||||
#import "AudioSource.h"
|
||||
|
||||
#import <stdlib.h>
|
||||
|
||||
#import "r8bstate.h"
|
||||
|
||||
#import "lpc.h"
|
||||
#import "util.h"
|
||||
|
||||
@interface impulseCacheObject : NSObject {
|
||||
}
|
||||
@property NSURL *URL;
|
||||
@property int sampleCount;
|
||||
@property int channelCount;
|
||||
@property double sampleRate;
|
||||
@property double targetSampleRate;
|
||||
@property NSData *data;
|
||||
@end
|
||||
|
||||
@implementation impulseCacheObject
|
||||
@synthesize URL;
|
||||
@synthesize sampleCount;
|
||||
@synthesize channelCount;
|
||||
@synthesize sampleRate;
|
||||
@synthesize targetSampleRate;
|
||||
@synthesize data;
|
||||
@end
|
||||
|
||||
@interface impulseCache : NSObject {
|
||||
}
|
||||
@property NSMutableArray<impulseCacheObject *> *cacheObjects;
|
||||
+ (impulseCache *)sharedController;
|
||||
- (const float *)getImpulse:(NSURL *)url sampleCount:(int *)sampleCount channelCount:(int *)channelCount sampleRate:(double)sampleRate;
|
||||
@end
|
||||
|
||||
// Apparently _mm_malloc is Intel-only on newer macOS targets, so use supported posix_memalign
|
||||
static void *_memalign_malloc(size_t size, size_t align) {
|
||||
void *ret = NULL;
|
||||
if(posix_memalign(&ret, align, size) != 0) {
|
||||
return NULL;
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
@implementation impulseCache
|
||||
|
||||
static impulseCache *_sharedController = nil;
|
||||
|
||||
+ (impulseCache *)sharedController {
|
||||
@synchronized(self) {
|
||||
if(!_sharedController) {
|
||||
_sharedController = [[impulseCache alloc] init];
|
||||
}
|
||||
}
|
||||
return _sharedController;
|
||||
}
|
||||
|
||||
- (id)init {
|
||||
self = [super init];
|
||||
if(self) {
|
||||
self.cacheObjects = [[NSMutableArray alloc] init];
|
||||
}
|
||||
return self;
|
||||
}
|
||||
|
||||
- (impulseCacheObject *)addImpulse:(NSURL *)url sampleCount:(int)sampleCount channelCount:(int)channelCount originalSampleRate:(double)originalSampleRate targetSampleRate:(double)targetSampleRate impulseBuffer:(const float *)impulseBuffer {
|
||||
impulseCacheObject *obj = [[impulseCacheObject alloc] init];
|
||||
|
||||
obj.URL = url;
|
||||
obj.sampleCount = sampleCount;
|
||||
obj.channelCount = channelCount;
|
||||
obj.sampleRate = originalSampleRate;
|
||||
obj.targetSampleRate = targetSampleRate;
|
||||
obj.data = [NSData dataWithBytes:impulseBuffer length:(sampleCount * channelCount * sizeof(float))];
|
||||
|
||||
@synchronized(self.cacheObjects) {
|
||||
[self.cacheObjects addObject:obj];
|
||||
}
|
||||
|
||||
return obj;
|
||||
}
|
||||
|
||||
- (const float *)getImpulse:(NSURL *)url sampleCount:(int *)retSampleCount channelCount:(int *)retImpulseChannels sampleRate:(double)sampleRate {
|
||||
BOOL impulseFound = NO;
|
||||
const float *impulseData = NULL;
|
||||
double sampleRateOfSource = 0;
|
||||
int sampleCount = 0;
|
||||
int impulseChannels = 0;
|
||||
impulseCacheObject *cacheObject = nil;
|
||||
|
||||
@synchronized(self.cacheObjects) {
|
||||
for(impulseCacheObject *obj in self.cacheObjects) {
|
||||
if([obj.URL isEqualTo:url] &&
|
||||
obj.targetSampleRate == sampleRate) {
|
||||
*retSampleCount = obj.sampleCount;
|
||||
*retImpulseChannels = obj.channelCount;
|
||||
return (const float *)[obj.data bytes];
|
||||
}
|
||||
}
|
||||
for(impulseCacheObject *obj in self.cacheObjects) {
|
||||
if([obj.URL isEqualTo:url] &&
|
||||
obj.sampleRate == obj.targetSampleRate) {
|
||||
impulseData = (const float *)[obj.data bytes];
|
||||
sampleCount = obj.sampleCount;
|
||||
impulseChannels = obj.channelCount;
|
||||
sampleRateOfSource = obj.sampleRate;
|
||||
impulseFound = YES;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if(!impulseFound) {
|
||||
id<CogSource> source = [AudioSource audioSourceForURL:url];
|
||||
if(!source)
|
||||
return NULL;
|
||||
|
||||
if(![source open:url])
|
||||
return NULL;
|
||||
|
||||
id<CogDecoder> decoder = [AudioDecoder audioDecoderForSource:source];
|
||||
|
||||
if(decoder == nil) {
|
||||
[source close];
|
||||
source = nil;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if(![decoder open:source]) {
|
||||
decoder = nil;
|
||||
[source close];
|
||||
source = nil;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
NSDictionary *properties = [decoder properties];
|
||||
|
||||
sampleRateOfSource = [[properties objectForKey:@"sampleRate"] floatValue];
|
||||
|
||||
sampleCount = [[properties objectForKey:@"totalFrames"] intValue];
|
||||
impulseChannels = [[properties objectForKey:@"channels"] intValue];
|
||||
|
||||
if([[properties objectForKey:@"floatingPoint"] boolValue] != YES ||
|
||||
[[properties objectForKey:@"bitsPerSample"] intValue] != 32 ||
|
||||
!([[properties objectForKey:@"endian"] isEqualToString:@"host"] ||
|
||||
[[properties objectForKey:@"endian"] isEqualToString:@"little"]) ||
|
||||
(impulseChannels != 14 && impulseChannels != 7)) {
|
||||
[decoder close];
|
||||
decoder = nil;
|
||||
[source close];
|
||||
source = nil;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
float *impulseBuffer = (float *)_memalign_malloc(sampleCount * sizeof(float) * impulseChannels, 16);
|
||||
if(!impulseBuffer) {
|
||||
[decoder close];
|
||||
decoder = nil;
|
||||
[source close];
|
||||
source = nil;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if([decoder readAudio:impulseBuffer frames:sampleCount] != sampleCount) {
|
||||
free(impulseBuffer);
|
||||
[decoder close];
|
||||
decoder = nil;
|
||||
[source close];
|
||||
source = nil;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
[decoder close];
|
||||
decoder = nil;
|
||||
[source close];
|
||||
source = nil;
|
||||
|
||||
cacheObject = [self addImpulse:url sampleCount:sampleCount channelCount:impulseChannels originalSampleRate:sampleRateOfSource targetSampleRate:sampleRateOfSource impulseBuffer:impulseBuffer];
|
||||
|
||||
free(impulseBuffer);
|
||||
|
||||
impulseData = (const float *)[cacheObject.data bytes];
|
||||
}
|
||||
|
||||
if(sampleRateOfSource != sampleRate) {
|
||||
double sampleRatio = sampleRate / sampleRateOfSource;
|
||||
int resampledCount = (int)ceil((double)sampleCount * sampleRatio);
|
||||
|
||||
r8bstate *_r8bstate = new r8bstate(impulseChannels, 1024, sampleRateOfSource, sampleRate);
|
||||
|
||||
unsigned long PRIME_LEN_ = MAX(sampleRateOfSource / 20, 1024u);
|
||||
PRIME_LEN_ = MIN(PRIME_LEN_, 16384u);
|
||||
PRIME_LEN_ = MAX(PRIME_LEN_, 2 * LPC_ORDER + 1);
|
||||
|
||||
unsigned int N_samples_to_add_ = sampleRateOfSource;
|
||||
unsigned int N_samples_to_drop_ = sampleRate;
|
||||
|
||||
samples_len(&N_samples_to_add_, &N_samples_to_drop_, 20, 8192u);
|
||||
|
||||
int resamplerLatencyIn = (int)N_samples_to_add_;
|
||||
int resamplerLatencyOut = (int)N_samples_to_drop_;
|
||||
|
||||
float *tempImpulse = (float *)_memalign_malloc((sampleCount + resamplerLatencyIn * 2 + 1024) * sizeof(float) * impulseChannels, 16);
|
||||
if(!tempImpulse) {
|
||||
return nil;
|
||||
}
|
||||
|
||||
resampledCount += resamplerLatencyOut * 2 + 1024;
|
||||
|
||||
float *resampledImpulse = (float *)_memalign_malloc(resampledCount * sizeof(float) * impulseChannels, 16);
|
||||
if(!resampledImpulse) {
|
||||
free(tempImpulse);
|
||||
return nil;
|
||||
}
|
||||
|
||||
size_t prime = MIN(sampleCount, PRIME_LEN_);
|
||||
|
||||
void *extrapolate_buffer = NULL;
|
||||
size_t extrapolate_buffer_size = 0;
|
||||
|
||||
memcpy(tempImpulse + resamplerLatencyIn * impulseChannels, impulseData, sampleCount * sizeof(float) * impulseChannels);
|
||||
lpc_extrapolate_bkwd(tempImpulse + N_samples_to_add_ * impulseChannels, sampleCount, prime, impulseChannels, LPC_ORDER, N_samples_to_add_, &extrapolate_buffer, &extrapolate_buffer_size);
|
||||
lpc_extrapolate_fwd(tempImpulse + N_samples_to_add_ * impulseChannels, sampleCount, prime, impulseChannels, LPC_ORDER, N_samples_to_add_, &extrapolate_buffer, &extrapolate_buffer_size);
|
||||
free(extrapolate_buffer);
|
||||
|
||||
size_t inputDone = 0;
|
||||
size_t outputDone = 0;
|
||||
|
||||
outputDone = _r8bstate->resample(tempImpulse, sampleCount + N_samples_to_add_ * 2, &inputDone, resampledImpulse, resampledCount);
|
||||
|
||||
free(tempImpulse);
|
||||
|
||||
if(outputDone < resampledCount) {
|
||||
outputDone += _r8bstate->flush(resampledImpulse + outputDone * impulseChannels, resampledCount - outputDone);
|
||||
}
|
||||
|
||||
delete _r8bstate;
|
||||
|
||||
outputDone -= N_samples_to_drop_ * 2;
|
||||
|
||||
// Do this instead of the memmove
|
||||
float *resampledImpulseData = resampledImpulse + N_samples_to_drop_ * impulseChannels;
|
||||
|
||||
/*memmove(resampledImpulse, resampledImpulse + N_samples_to_drop_ * impulseChannels, outputDone * sizeof(float) * impulseChannels);*/
|
||||
|
||||
sampleCount = (int)outputDone;
|
||||
|
||||
// Normalize resampled impulse by sample ratio
|
||||
float fSampleRatio = (float)sampleRatio;
|
||||
vDSP_vsdiv(resampledImpulseData, 1, &fSampleRatio, resampledImpulseData, 1, sampleCount * impulseChannels);
|
||||
|
||||
cacheObject = [self addImpulse:url sampleCount:sampleCount channelCount:impulseChannels originalSampleRate:sampleRateOfSource targetSampleRate:sampleRate impulseBuffer:resampledImpulseData];
|
||||
|
||||
free(resampledImpulse);
|
||||
|
||||
impulseData = (const float *)[cacheObject.data bytes];
|
||||
}
|
||||
|
||||
*retSampleCount = sampleCount;
|
||||
*retImpulseChannels = impulseChannels;
|
||||
return impulseData;
|
||||
}
|
||||
|
||||
@end
|
||||
|
||||
@implementation HeadphoneFilter
|
||||
|
||||
enum {
|
||||
speaker_is_back_center = -1,
|
||||
speaker_not_present = -2,
|
||||
};
|
||||
|
||||
static const uint32_t max_speaker_index = 10;
|
||||
|
||||
static const int8_t speakers_to_hesuvi_7[11][2] = {
|
||||
// front left
|
||||
{ 0, 1 },
|
||||
// front right
|
||||
{ 1, 0 },
|
||||
// front center
|
||||
{ 6, 6 },
|
||||
// lfe
|
||||
{ 6, 6 },
|
||||
// back left
|
||||
{ 4, 5 },
|
||||
// back right
|
||||
{ 5, 4 },
|
||||
// front center left
|
||||
{ speaker_not_present, speaker_not_present },
|
||||
// front center right
|
||||
{ speaker_not_present, speaker_not_present },
|
||||
// back center
|
||||
{ speaker_is_back_center, speaker_is_back_center },
|
||||
// side left
|
||||
{ 2, 3 },
|
||||
// side right
|
||||
{ 3, 2 }
|
||||
};
|
||||
|
||||
static const int8_t speakers_to_hesuvi_14[11][2] = {
|
||||
// front left
|
||||
{ 0, 1 },
|
||||
// front right
|
||||
{ 8, 7 },
|
||||
// front center
|
||||
{ 6, 13 },
|
||||
// lfe
|
||||
{ 6, 13 },
|
||||
// back left
|
||||
{ 4, 5 },
|
||||
// back right
|
||||
{ 12, 11 },
|
||||
// front center left
|
||||
{ speaker_not_present, speaker_not_present },
|
||||
// front center right
|
||||
{ speaker_not_present, speaker_not_present },
|
||||
// back center
|
||||
{ speaker_is_back_center, speaker_is_back_center },
|
||||
// side left
|
||||
{ 2, 3 },
|
||||
// side right
|
||||
{ 10, 9 }
|
||||
};
|
||||
|
||||
+ (BOOL)validateImpulseFile:(NSURL *)url {
|
||||
id<CogSource> source = [AudioSource audioSourceForURL:url];
|
||||
if(!source)
|
||||
return NO;
|
||||
|
||||
if(![source open:url])
|
||||
return NO;
|
||||
|
||||
id<CogDecoder> decoder = [AudioDecoder audioDecoderForSource:source];
|
||||
|
||||
if(decoder == nil) {
|
||||
[source close];
|
||||
source = nil;
|
||||
return NO;
|
||||
}
|
||||
|
||||
if(![decoder open:source]) {
|
||||
decoder = nil;
|
||||
[source close];
|
||||
source = nil;
|
||||
return NO;
|
||||
}
|
||||
|
||||
NSDictionary *properties = [decoder properties];
|
||||
|
||||
[decoder close];
|
||||
decoder = nil;
|
||||
[source close];
|
||||
source = nil;
|
||||
|
||||
int impulseChannels = [[properties objectForKey:@"channels"] intValue];
|
||||
|
||||
if([[properties objectForKey:@"floatingPoint"] boolValue] != YES ||
|
||||
[[properties objectForKey:@"bitsPerSample"] intValue] != 32 ||
|
||||
!([[properties objectForKey:@"endian"] isEqualToString:@"host"] ||
|
||||
[[properties objectForKey:@"endian"] isEqualToString:@"little"]) ||
|
||||
(impulseChannels != 14 && impulseChannels != 7))
|
||||
return NO;
|
||||
|
||||
return YES;
|
||||
}
|
||||
|
||||
- (id)initWithImpulseFile:(NSURL *)url forSampleRate:(double)sampleRate withInputChannels:(size_t)channels withConfig:(uint32_t)config {
|
||||
self = [super init];
|
||||
|
||||
if(self) {
|
||||
int sampleCount = 0;
|
||||
int impulseChannels = 0;
|
||||
const float *impulseBuffer = [[impulseCache sharedController] getImpulse:url sampleCount:&sampleCount channelCount:&impulseChannels sampleRate:sampleRate];
|
||||
if(!impulseBuffer) {
|
||||
return nil;
|
||||
}
|
||||
|
||||
channelCount = channels;
|
||||
|
||||
bufferSize = 512;
|
||||
fftSize = sampleCount + bufferSize;
|
||||
|
||||
int pow = 1;
|
||||
while(fftSize > 2) {
|
||||
pow++;
|
||||
fftSize /= 2;
|
||||
}
|
||||
fftSize = 2 << pow;
|
||||
|
||||
float *deinterleavedImpulseBuffer = (float *)_memalign_malloc(fftSize * sizeof(float) * impulseChannels, 16);
|
||||
if(!deinterleavedImpulseBuffer) {
|
||||
return nil;
|
||||
}
|
||||
|
||||
for(size_t i = 0; i < impulseChannels; ++i) {
|
||||
cblas_scopy(sampleCount, impulseBuffer + i, impulseChannels, deinterleavedImpulseBuffer + i * fftSize, 1);
|
||||
vDSP_vclr(deinterleavedImpulseBuffer + i * fftSize + sampleCount, 1, fftSize - sampleCount);
|
||||
}
|
||||
|
||||
paddedBufferSize = fftSize;
|
||||
fftSizeOver2 = (fftSize + 1) / 2;
|
||||
const size_t fftSizeOver2Plus1 = fftSizeOver2 + 1; // DFT float overwrites plus one, double doesn't
|
||||
|
||||
dftSetupF = vDSP_DFT_zrop_CreateSetup(nil, fftSize, vDSP_DFT_FORWARD);
|
||||
dftSetupB = vDSP_DFT_zrop_CreateSetup(nil, fftSize, vDSP_DFT_INVERSE);
|
||||
if(!dftSetupF || !dftSetupB) {
|
||||
free(deinterleavedImpulseBuffer);
|
||||
return nil;
|
||||
}
|
||||
|
||||
paddedSignal = (float *)_memalign_malloc(sizeof(float) * paddedBufferSize, 16);
|
||||
if(!paddedSignal) {
|
||||
free(deinterleavedImpulseBuffer);
|
||||
return nil;
|
||||
}
|
||||
|
||||
signal_fft.realp = (float *)_memalign_malloc(sizeof(float) * fftSizeOver2Plus1, 16);
|
||||
signal_fft.imagp = (float *)_memalign_malloc(sizeof(float) * fftSizeOver2Plus1, 16);
|
||||
if(!signal_fft.realp || !signal_fft.imagp) {
|
||||
free(deinterleavedImpulseBuffer);
|
||||
return nil;
|
||||
}
|
||||
|
||||
input_filtered_signal_per_channel[0].realp = (float *)_memalign_malloc(sizeof(float) * fftSizeOver2Plus1, 16);
|
||||
input_filtered_signal_per_channel[0].imagp = (float *)_memalign_malloc(sizeof(float) * fftSizeOver2Plus1, 16);
|
||||
if(!input_filtered_signal_per_channel[0].realp ||
|
||||
!input_filtered_signal_per_channel[0].imagp) {
|
||||
free(deinterleavedImpulseBuffer);
|
||||
return nil;
|
||||
}
|
||||
|
||||
input_filtered_signal_per_channel[1].realp = (float *)_memalign_malloc(sizeof(float) * fftSizeOver2Plus1, 16);
|
||||
input_filtered_signal_per_channel[1].imagp = (float *)_memalign_malloc(sizeof(float) * fftSizeOver2Plus1, 16);
|
||||
if(!input_filtered_signal_per_channel[1].realp ||
|
||||
!input_filtered_signal_per_channel[1].imagp) {
|
||||
free(deinterleavedImpulseBuffer);
|
||||
return nil;
|
||||
}
|
||||
|
||||
input_filtered_signal_totals[0].realp = (float *)_memalign_malloc(sizeof(float) * fftSizeOver2Plus1, 16);
|
||||
input_filtered_signal_totals[0].imagp = (float *)_memalign_malloc(sizeof(float) * fftSizeOver2Plus1, 16);
|
||||
if(!input_filtered_signal_totals[0].realp ||
|
||||
!input_filtered_signal_totals[0].imagp) {
|
||||
free(deinterleavedImpulseBuffer);
|
||||
return nil;
|
||||
}
|
||||
|
||||
input_filtered_signal_totals[1].realp = (float *)_memalign_malloc(sizeof(float) * fftSizeOver2Plus1, 16);
|
||||
input_filtered_signal_totals[1].imagp = (float *)_memalign_malloc(sizeof(float) * fftSizeOver2Plus1, 16);
|
||||
if(!input_filtered_signal_totals[1].realp ||
|
||||
!input_filtered_signal_totals[1].imagp) {
|
||||
free(deinterleavedImpulseBuffer);
|
||||
return nil;
|
||||
}
|
||||
|
||||
impulse_responses = (DSPSplitComplex *)calloc(sizeof(DSPSplitComplex), channels * 2);
|
||||
if(!impulse_responses) {
|
||||
free(deinterleavedImpulseBuffer);
|
||||
return nil;
|
||||
}
|
||||
|
||||
for(size_t i = 0; i < channels; ++i) {
|
||||
impulse_responses[i * 2 + 0].realp = (float *)_memalign_malloc(sizeof(float) * fftSizeOver2Plus1, 16);
|
||||
impulse_responses[i * 2 + 0].imagp = (float *)_memalign_malloc(sizeof(float) * fftSizeOver2Plus1, 16);
|
||||
impulse_responses[i * 2 + 1].realp = (float *)_memalign_malloc(sizeof(float) * fftSizeOver2Plus1, 16);
|
||||
impulse_responses[i * 2 + 1].imagp = (float *)_memalign_malloc(sizeof(float) * fftSizeOver2Plus1, 16);
|
||||
|
||||
if(!impulse_responses[i * 2 + 0].realp || !impulse_responses[i * 2 + 0].imagp ||
|
||||
!impulse_responses[i * 2 + 1].realp || !impulse_responses[i * 2 + 1].imagp) {
|
||||
free(deinterleavedImpulseBuffer);
|
||||
return nil;
|
||||
}
|
||||
|
||||
uint32_t channelFlag = [AudioChunk extractChannelFlag:(uint32_t)i fromConfig:config];
|
||||
uint32_t channelIndex = [AudioChunk findChannelIndex:channelFlag];
|
||||
|
||||
int leftInChannel = speaker_not_present;
|
||||
int rightInChannel = speaker_not_present;
|
||||
|
||||
if(impulseChannels == 7) {
|
||||
if(channelIndex <= max_speaker_index) {
|
||||
leftInChannel = speakers_to_hesuvi_7[channelIndex][0];
|
||||
rightInChannel = speakers_to_hesuvi_7[channelIndex][1];
|
||||
}
|
||||
} else {
|
||||
if(channelIndex <= max_speaker_index) {
|
||||
leftInChannel = speakers_to_hesuvi_14[channelIndex][0];
|
||||
rightInChannel = speakers_to_hesuvi_14[channelIndex][1];
|
||||
}
|
||||
}
|
||||
|
||||
if(leftInChannel == speaker_is_back_center || rightInChannel == speaker_is_back_center) {
|
||||
float *temp;
|
||||
if(impulseChannels == 7) {
|
||||
temp = (float *)malloc(sizeof(float) * fftSize);
|
||||
if(!temp) {
|
||||
free(deinterleavedImpulseBuffer);
|
||||
return nil;
|
||||
}
|
||||
|
||||
cblas_scopy((int)fftSize, deinterleavedImpulseBuffer + 4 * fftSize, 1, temp, 1);
|
||||
vDSP_vadd(temp, 1, deinterleavedImpulseBuffer + 5 * fftSize, 1, temp, 1, fftSize);
|
||||
|
||||
vDSP_ctoz((DSPComplex *)temp, 2, &impulse_responses[i * 2 + 0], 1, fftSizeOver2);
|
||||
vDSP_ctoz((DSPComplex *)temp, 2, &impulse_responses[i * 2 + 1], 1, fftSizeOver2);
|
||||
} else {
|
||||
temp = (float *)malloc(sizeof(float) * fftSize * 2);
|
||||
if(!temp) {
|
||||
free(deinterleavedImpulseBuffer);
|
||||
return nil;
|
||||
}
|
||||
|
||||
cblas_scopy((int)fftSize, deinterleavedImpulseBuffer + 4 * fftSize, 1, temp, 1);
|
||||
vDSP_vadd(temp, 1, deinterleavedImpulseBuffer + 12 * fftSize, 1, temp, 1, fftSize);
|
||||
|
||||
cblas_scopy((int)fftSize, deinterleavedImpulseBuffer + 5 * fftSize, 1, temp + fftSize, 1);
|
||||
vDSP_vadd(temp + fftSize, 1, deinterleavedImpulseBuffer + 11 * fftSize, 1, temp + fftSize, 1, fftSize);
|
||||
|
||||
vDSP_ctoz((DSPComplex *)temp, 2, &impulse_responses[i * 2 + 0], 1, fftSizeOver2);
|
||||
vDSP_ctoz((DSPComplex *)(temp + fftSize), 2, &impulse_responses[i * 2 + 1], 1, fftSizeOver2);
|
||||
}
|
||||
|
||||
free(temp);
|
||||
} else if(leftInChannel == speaker_not_present || rightInChannel == speaker_not_present) {
|
||||
vDSP_ctoz((DSPComplex *)(deinterleavedImpulseBuffer + impulseChannels * fftSize), 2, &impulse_responses[i * 2 + 0], 1, fftSizeOver2);
|
||||
vDSP_ctoz((DSPComplex *)(deinterleavedImpulseBuffer + impulseChannels * fftSize), 2, &impulse_responses[i * 2 + 1], 1, fftSizeOver2);
|
||||
} else {
|
||||
vDSP_ctoz((DSPComplex *)(deinterleavedImpulseBuffer + leftInChannel * fftSize), 2, &impulse_responses[i * 2 + 0], 1, fftSizeOver2);
|
||||
vDSP_ctoz((DSPComplex *)(deinterleavedImpulseBuffer + rightInChannel * fftSize), 2, &impulse_responses[i * 2 + 1], 1, fftSizeOver2);
|
||||
}
|
||||
|
||||
vDSP_DFT_Execute(dftSetupF, impulse_responses[i * 2 + 0].realp, impulse_responses[i * 2 + 0].imagp, impulse_responses[i * 2 + 0].realp, impulse_responses[i * 2 + 0].imagp);
|
||||
vDSP_DFT_Execute(dftSetupF, impulse_responses[i * 2 + 1].realp, impulse_responses[i * 2 + 1].imagp, impulse_responses[i * 2 + 1].realp, impulse_responses[i * 2 + 1].imagp);
|
||||
}
|
||||
|
||||
free(deinterleavedImpulseBuffer);
|
||||
|
||||
left_result = (float *)_memalign_malloc(sizeof(float) * fftSize, 16);
|
||||
right_result = (float *)_memalign_malloc(sizeof(float) * fftSize, 16);
|
||||
if(!left_result || !right_result)
|
||||
return nil;
|
||||
|
||||
prevInputs = (float **)calloc(channels, sizeof(float *));
|
||||
if(!prevInputs)
|
||||
return nil;
|
||||
for(size_t i = 0; i < channels; ++i) {
|
||||
prevInputs[i] = (float *)_memalign_malloc(sizeof(float) * fftSize, 16);
|
||||
if(!prevInputs[i])
|
||||
return nil;
|
||||
vDSP_vclr(prevInputs[i], 1, fftSize);
|
||||
}
|
||||
}
|
||||
|
||||
return self;
|
||||
}
|
||||
|
||||
- (void)dealloc {
|
||||
if(dftSetupF) vDSP_DFT_DestroySetup(dftSetupF);
|
||||
if(dftSetupB) vDSP_DFT_DestroySetup(dftSetupB);
|
||||
|
||||
free(paddedSignal);
|
||||
|
||||
free(signal_fft.realp);
|
||||
free(signal_fft.imagp);
|
||||
|
||||
free(input_filtered_signal_per_channel[0].realp);
|
||||
free(input_filtered_signal_per_channel[0].imagp);
|
||||
free(input_filtered_signal_per_channel[1].realp);
|
||||
free(input_filtered_signal_per_channel[1].imagp);
|
||||
|
||||
free(input_filtered_signal_totals[0].realp);
|
||||
free(input_filtered_signal_totals[0].imagp);
|
||||
free(input_filtered_signal_totals[1].realp);
|
||||
free(input_filtered_signal_totals[1].imagp);
|
||||
|
||||
if(impulse_responses) {
|
||||
for(size_t i = 0; i < channelCount * 2; ++i) {
|
||||
free(impulse_responses[i].realp);
|
||||
free(impulse_responses[i].imagp);
|
||||
}
|
||||
free(impulse_responses);
|
||||
}
|
||||
|
||||
free(left_result);
|
||||
free(right_result);
|
||||
|
||||
if(prevInputs) {
|
||||
for(size_t i = 0; i < channelCount; ++i) {
|
||||
free(prevInputs[i]);
|
||||
}
|
||||
free(prevInputs);
|
||||
}
|
||||
}
|
||||
|
||||
- (void)process:(const float *)inBuffer sampleCount:(size_t)count toBuffer:(float *)outBuffer {
|
||||
const float scale = 1.0 / (4.0 * (float)fftSize);
|
||||
|
||||
while(count > 0) {
|
||||
const size_t countToDo = (count > bufferSize) ? bufferSize : count;
|
||||
const size_t prevToDo = fftSize - countToDo;
|
||||
|
||||
vDSP_vclr(input_filtered_signal_totals[0].realp, 1, fftSizeOver2);
|
||||
vDSP_vclr(input_filtered_signal_totals[0].imagp, 1, fftSizeOver2);
|
||||
vDSP_vclr(input_filtered_signal_totals[1].realp, 1, fftSizeOver2);
|
||||
vDSP_vclr(input_filtered_signal_totals[1].imagp, 1, fftSizeOver2);
|
||||
|
||||
for(size_t i = 0; i < channelCount; ++i) {
|
||||
cblas_scopy((int)prevToDo, prevInputs[i] + countToDo, 1, paddedSignal, 1);
|
||||
cblas_scopy((int)countToDo, inBuffer + i, (int)channelCount, paddedSignal + prevToDo, 1);
|
||||
cblas_scopy((int)fftSize, paddedSignal, 1, prevInputs[i], 1);
|
||||
|
||||
vDSP_ctoz((DSPComplex *)paddedSignal, 2, &signal_fft, 1, fftSizeOver2);
|
||||
|
||||
vDSP_DFT_Execute(dftSetupF, signal_fft.realp, signal_fft.imagp, signal_fft.realp, signal_fft.imagp);
|
||||
|
||||
// One channel forward, then multiply and back twice
|
||||
|
||||
float preserveIRNyq = impulse_responses[i * 2 + 0].imagp[0];
|
||||
float preserveSigNyq = signal_fft.imagp[0];
|
||||
impulse_responses[i * 2 + 0].imagp[0] = 0;
|
||||
signal_fft.imagp[0] = 0;
|
||||
|
||||
vDSP_zvmul(&signal_fft, 1, &impulse_responses[i * 2 + 0], 1, &input_filtered_signal_per_channel[0], 1, fftSizeOver2, 1);
|
||||
|
||||
input_filtered_signal_per_channel[0].imagp[0] = preserveIRNyq * preserveSigNyq;
|
||||
impulse_responses[i * 2 + 0].imagp[0] = preserveIRNyq;
|
||||
|
||||
preserveIRNyq = impulse_responses[i * 2 + 1].imagp[0];
|
||||
impulse_responses[i * 2 + 1].imagp[0] = 0;
|
||||
|
||||
vDSP_zvmul(&signal_fft, 1, &impulse_responses[i * 2 + 1], 1, &input_filtered_signal_per_channel[1], 1, fftSizeOver2, 1);
|
||||
|
||||
input_filtered_signal_per_channel[1].imagp[0] = preserveIRNyq * preserveSigNyq;
|
||||
impulse_responses[i * 2 + 1].imagp[0] = preserveIRNyq;
|
||||
|
||||
vDSP_zvadd(&input_filtered_signal_totals[0], 1, &input_filtered_signal_per_channel[0], 1, &input_filtered_signal_totals[0], 1, fftSizeOver2);
|
||||
vDSP_zvadd(&input_filtered_signal_totals[1], 1, &input_filtered_signal_per_channel[1], 1, &input_filtered_signal_totals[1], 1, fftSizeOver2);
|
||||
}
|
||||
|
||||
vDSP_DFT_Execute(dftSetupB, input_filtered_signal_totals[0].realp, input_filtered_signal_totals[0].imagp, input_filtered_signal_totals[0].realp, input_filtered_signal_totals[0].imagp);
|
||||
vDSP_DFT_Execute(dftSetupB, input_filtered_signal_totals[1].realp, input_filtered_signal_totals[1].imagp, input_filtered_signal_totals[1].realp, input_filtered_signal_totals[1].imagp);
|
||||
|
||||
vDSP_ztoc(&input_filtered_signal_totals[0], 1, (DSPComplex *)left_result, 2, fftSizeOver2);
|
||||
vDSP_ztoc(&input_filtered_signal_totals[1], 1, (DSPComplex *)right_result, 2, fftSizeOver2);
|
||||
|
||||
float *left_ptr = left_result + prevToDo;
|
||||
float *right_ptr = right_result + prevToDo;
|
||||
|
||||
vDSP_vsmul(left_ptr, 1, &scale, left_ptr, 1, countToDo);
|
||||
vDSP_vsmul(right_ptr, 1, &scale, right_ptr, 1, countToDo);
|
||||
|
||||
cblas_scopy((int)countToDo, left_ptr, 1, outBuffer + 0, 2);
|
||||
cblas_scopy((int)countToDo, right_ptr, 1, outBuffer + 1, 2);
|
||||
|
||||
inBuffer += countToDo * channelCount;
|
||||
outBuffer += countToDo * 2;
|
||||
|
||||
count -= countToDo;
|
||||
}
|
||||
}
|
||||
|
||||
- (void)reset {
|
||||
for(size_t i = 0; i < channelCount; ++i) {
|
||||
vDSP_vclr(prevInputs[i], 1, fftSize);
|
||||
}
|
||||
}
|
||||
|
||||
@end
|
|
@ -1,45 +0,0 @@
|
|||
//
|
||||
// HeadphoneFilter.h
|
||||
// CogAudio Framework
|
||||
//
|
||||
// Created by Christopher Snowhill on 1/24/22.
|
||||
//
|
||||
|
||||
#ifndef HeadphoneFilter_h
|
||||
#define HeadphoneFilter_h
|
||||
|
||||
#import <Cocoa/Cocoa.h>
|
||||
|
||||
#import "pffft.h"
|
||||
|
||||
@interface HeadphoneFilter : NSObject {
|
||||
PFFFT_Setup *fftSetup;
|
||||
|
||||
size_t fftSize;
|
||||
size_t bufferSize;
|
||||
size_t paddedBufferSize;
|
||||
size_t channelCount;
|
||||
|
||||
float *workBuffer;
|
||||
|
||||
float **impulse_responses;
|
||||
|
||||
float **prevInputs;
|
||||
|
||||
float *left_result;
|
||||
float *right_result;
|
||||
|
||||
float *paddedSignal;
|
||||
}
|
||||
|
||||
+ (BOOL)validateImpulseFile:(NSURL *)url;
|
||||
|
||||
- (id)initWithImpulseFile:(NSURL *)url forSampleRate:(double)sampleRate withInputChannels:(size_t)channels withConfig:(uint32_t)config;
|
||||
|
||||
- (void)process:(const float *)inBuffer sampleCount:(size_t)count toBuffer:(float *)outBuffer;
|
||||
|
||||
- (void)reset;
|
||||
|
||||
@end
|
||||
|
||||
#endif /* HeadphoneFilter_h */
|
|
@ -1,447 +0,0 @@
|
|||
//
|
||||
// HeadphoneFilter.m
|
||||
// CogAudio Framework
|
||||
//
|
||||
// Created by Christopher Snowhill on 1/24/22.
|
||||
//
|
||||
|
||||
#import "AudioChunk.h"
|
||||
#import "AudioDecoder.h"
|
||||
#import "AudioSource.h"
|
||||
#import "HeadphoneFilter.h"
|
||||
|
||||
#import <stdlib.h>
|
||||
|
||||
#import "r8bstate.h"
|
||||
|
||||
#import "lpc.h"
|
||||
#import "util.h"
|
||||
|
||||
#import "pffft_double.h"
|
||||
|
||||
@implementation HeadphoneFilter
|
||||
|
||||
enum {
|
||||
speaker_is_back_center = -1,
|
||||
speaker_not_present = -2,
|
||||
};
|
||||
|
||||
static const uint32_t max_speaker_index = 10;
|
||||
|
||||
static const int8_t speakers_to_hesuvi_7[11][2] = {
|
||||
// front left
|
||||
{ 0, 1 },
|
||||
// front right
|
||||
{ 1, 0 },
|
||||
// front center
|
||||
{ 6, 6 },
|
||||
// lfe
|
||||
{ 6, 6 },
|
||||
// back left
|
||||
{ 4, 5 },
|
||||
// back right
|
||||
{ 5, 4 },
|
||||
// front center left
|
||||
{ speaker_not_present, speaker_not_present },
|
||||
// front center right
|
||||
{ speaker_not_present, speaker_not_present },
|
||||
// back center
|
||||
{ speaker_is_back_center, speaker_is_back_center },
|
||||
// side left
|
||||
{ 2, 3 },
|
||||
// side right
|
||||
{ 3, 2 }
|
||||
};
|
||||
|
||||
static const int8_t speakers_to_hesuvi_14[11][2] = {
|
||||
// front left
|
||||
{ 0, 1 },
|
||||
// front right
|
||||
{ 8, 7 },
|
||||
// front center
|
||||
{ 6, 13 },
|
||||
// lfe
|
||||
{ 6, 13 },
|
||||
// back left
|
||||
{ 4, 5 },
|
||||
// back right
|
||||
{ 12, 11 },
|
||||
// front center left
|
||||
{ speaker_not_present, speaker_not_present },
|
||||
// front center right
|
||||
{ speaker_not_present, speaker_not_present },
|
||||
// back center
|
||||
{ speaker_is_back_center, speaker_is_back_center },
|
||||
// side left
|
||||
{ 2, 3 },
|
||||
// side right
|
||||
{ 10, 9 }
|
||||
};
|
||||
|
||||
+ (BOOL)validateImpulseFile:(NSURL *)url {
|
||||
id<CogSource> source = [AudioSource audioSourceForURL:url];
|
||||
if(!source)
|
||||
return NO;
|
||||
|
||||
if(![source open:url])
|
||||
return NO;
|
||||
|
||||
id<CogDecoder> decoder = [AudioDecoder audioDecoderForSource:source];
|
||||
|
||||
if(decoder == nil) {
|
||||
[source close];
|
||||
source = nil;
|
||||
return NO;
|
||||
}
|
||||
|
||||
if(![decoder open:source]) {
|
||||
decoder = nil;
|
||||
[source close];
|
||||
source = nil;
|
||||
return NO;
|
||||
}
|
||||
|
||||
NSDictionary *properties = [decoder properties];
|
||||
|
||||
[decoder close];
|
||||
decoder = nil;
|
||||
[source close];
|
||||
source = nil;
|
||||
|
||||
int impulseChannels = [[properties objectForKey:@"channels"] intValue];
|
||||
|
||||
if([[properties objectForKey:@"floatingPoint"] boolValue] != YES ||
|
||||
[[properties objectForKey:@"bitsPerSample"] intValue] != 32 ||
|
||||
!([[properties objectForKey:@"endian"] isEqualToString:@"host"] ||
|
||||
[[properties objectForKey:@"endian"] isEqualToString:@"little"]) ||
|
||||
(impulseChannels != 14 && impulseChannels != 7))
|
||||
return NO;
|
||||
|
||||
return YES;
|
||||
}
|
||||
|
||||
- (id)initWithImpulseFile:(NSURL *)url forSampleRate:(double)sampleRate withInputChannels:(size_t)channels withConfig:(uint32_t)config {
|
||||
self = [super init];
|
||||
|
||||
if(self) {
|
||||
id<CogSource> source = [AudioSource audioSourceForURL:url];
|
||||
if(!source)
|
||||
return nil;
|
||||
|
||||
if(![source open:url])
|
||||
return nil;
|
||||
|
||||
id<CogDecoder> decoder = [AudioDecoder audioDecoderForSource:source];
|
||||
|
||||
if(decoder == nil) {
|
||||
[source close];
|
||||
source = nil;
|
||||
return nil;
|
||||
}
|
||||
|
||||
if(![decoder open:source]) {
|
||||
decoder = nil;
|
||||
[source close];
|
||||
source = nil;
|
||||
return nil;
|
||||
}
|
||||
|
||||
NSDictionary *properties = [decoder properties];
|
||||
|
||||
double sampleRateOfSource = [[properties objectForKey:@"sampleRate"] doubleValue];
|
||||
|
||||
int sampleCount = [[properties objectForKey:@"totalFrames"] intValue];
|
||||
int impulseChannels = [[properties objectForKey:@"channels"] intValue];
|
||||
|
||||
if([[properties objectForKey:@"floatingPoint"] boolValue] != YES ||
|
||||
[[properties objectForKey:@"bitsPerSample"] intValue] != 32 ||
|
||||
!([[properties objectForKey:@"endian"] isEqualToString:@"host"] ||
|
||||
[[properties objectForKey:@"endian"] isEqualToString:@"little"]) ||
|
||||
(impulseChannels != 14 && impulseChannels != 7)) {
|
||||
[decoder close];
|
||||
decoder = nil;
|
||||
[source close];
|
||||
source = nil;
|
||||
return nil;
|
||||
}
|
||||
|
||||
float *impulseBuffer = (float *)pffft_aligned_malloc(sampleCount * sizeof(float) * impulseChannels);
|
||||
if(!impulseBuffer) {
|
||||
[decoder close];
|
||||
decoder = nil;
|
||||
[source close];
|
||||
source = nil;
|
||||
return nil;
|
||||
}
|
||||
|
||||
if([decoder readAudio:impulseBuffer frames:sampleCount] != sampleCount) {
|
||||
pffft_aligned_free(impulseBuffer);
|
||||
[decoder close];
|
||||
decoder = nil;
|
||||
[source close];
|
||||
source = nil;
|
||||
return nil;
|
||||
}
|
||||
|
||||
[decoder close];
|
||||
decoder = nil;
|
||||
[source close];
|
||||
source = nil;
|
||||
|
||||
if(sampleRateOfSource != sampleRate) {
|
||||
double sampleRatio = sampleRate / sampleRateOfSource;
|
||||
int resampledCount = (int)ceil((double)sampleCount * sampleRatio);
|
||||
|
||||
r8bstate *_r8bstate = new r8bstate(impulseChannels, 1024, sampleRateOfSource, sampleRate);
|
||||
|
||||
unsigned long PRIME_LEN_ = MAX(sampleRateOfSource / 20, 1024u);
|
||||
PRIME_LEN_ = MIN(PRIME_LEN_, 16384u);
|
||||
PRIME_LEN_ = MAX(PRIME_LEN_, 2 * LPC_ORDER + 1);
|
||||
|
||||
unsigned int N_samples_to_add_ = sampleRateOfSource;
|
||||
unsigned int N_samples_to_drop_ = sampleRate;
|
||||
|
||||
samples_len(&N_samples_to_add_, &N_samples_to_drop_, 20, 8192u);
|
||||
|
||||
int resamplerLatencyIn = (int)N_samples_to_add_;
|
||||
int resamplerLatencyOut = (int)N_samples_to_drop_;
|
||||
|
||||
float *tempImpulse = (float *)pffft_aligned_malloc((sampleCount + resamplerLatencyIn * 2 + 1024) * sizeof(float) * impulseChannels);
|
||||
if(!tempImpulse) {
|
||||
pffft_aligned_free(impulseBuffer);
|
||||
return nil;
|
||||
}
|
||||
|
||||
resampledCount += resamplerLatencyOut * 2 + 1024;
|
||||
|
||||
float *resampledImpulse = (float *)pffft_aligned_malloc(resampledCount * sizeof(float) * impulseChannels);
|
||||
if(!resampledImpulse) {
|
||||
pffft_aligned_free(impulseBuffer);
|
||||
pffft_aligned_free(tempImpulse);
|
||||
return nil;
|
||||
}
|
||||
|
||||
size_t prime = MIN(sampleCount, PRIME_LEN_);
|
||||
|
||||
void *extrapolate_buffer = NULL;
|
||||
size_t extrapolate_buffer_size = 0;
|
||||
|
||||
memcpy(tempImpulse + resamplerLatencyIn * impulseChannels, impulseBuffer, sampleCount * sizeof(float) * impulseChannels);
|
||||
lpc_extrapolate_bkwd(tempImpulse + N_samples_to_add_ * impulseChannels, sampleCount, prime, impulseChannels, LPC_ORDER, N_samples_to_add_, &extrapolate_buffer, &extrapolate_buffer_size);
|
||||
lpc_extrapolate_fwd(tempImpulse + N_samples_to_add_ * impulseChannels, sampleCount, prime, impulseChannels, LPC_ORDER, N_samples_to_add_, &extrapolate_buffer, &extrapolate_buffer_size);
|
||||
free(extrapolate_buffer);
|
||||
|
||||
size_t inputDone = 0;
|
||||
size_t outputDone = 0;
|
||||
|
||||
outputDone = _r8bstate->resample(tempImpulse, sampleCount + N_samples_to_add_ * 2, &inputDone, resampledImpulse, resampledCount);
|
||||
|
||||
if(outputDone < resampledCount) {
|
||||
outputDone += _r8bstate->flush(resampledImpulse + outputDone * impulseChannels, resampledCount - outputDone);
|
||||
}
|
||||
|
||||
delete _r8bstate;
|
||||
|
||||
outputDone -= N_samples_to_drop_ * 2;
|
||||
|
||||
memmove(resampledImpulse, resampledImpulse + N_samples_to_drop_ * impulseChannels, outputDone * sizeof(float) * impulseChannels);
|
||||
|
||||
pffft_aligned_free(tempImpulse);
|
||||
pffft_aligned_free(impulseBuffer);
|
||||
impulseBuffer = resampledImpulse;
|
||||
sampleCount = (int)outputDone;
|
||||
|
||||
// Normalize resampled impulse by sample ratio
|
||||
float fSampleRatio = (float)sampleRatio;
|
||||
vDSP_vsdiv(impulseBuffer, 1, &fSampleRatio, impulseBuffer, 1, sampleCount * impulseChannels);
|
||||
}
|
||||
|
||||
channelCount = channels;
|
||||
|
||||
bufferSize = 512;
|
||||
fftSize = sampleCount + bufferSize;
|
||||
|
||||
fftSize = (size_t)pffftd_next_power_of_two((int)fftSize);
|
||||
|
||||
float *deinterleavedImpulseBuffer = (float *)pffft_aligned_malloc(fftSize * sizeof(float) * impulseChannels);
|
||||
if(!deinterleavedImpulseBuffer) {
|
||||
pffft_aligned_free(impulseBuffer);
|
||||
return nil;
|
||||
}
|
||||
|
||||
for(size_t i = 0; i < impulseChannels; ++i) {
|
||||
cblas_scopy(sampleCount, impulseBuffer + i, impulseChannels, deinterleavedImpulseBuffer + i * fftSize, 1);
|
||||
vDSP_vclr(deinterleavedImpulseBuffer + i * fftSize + sampleCount, 1, fftSize - sampleCount);
|
||||
}
|
||||
|
||||
pffft_aligned_free(impulseBuffer);
|
||||
|
||||
paddedBufferSize = fftSize;
|
||||
|
||||
fftSetup = pffft_new_setup((int)fftSize, PFFFT_REAL);
|
||||
if(!fftSetup) {
|
||||
pffft_aligned_free(deinterleavedImpulseBuffer);
|
||||
return nil;
|
||||
}
|
||||
|
||||
workBuffer = (float *)pffft_aligned_malloc(sizeof(float) * fftSize);
|
||||
if(!workBuffer) {
|
||||
pffft_aligned_free(deinterleavedImpulseBuffer);
|
||||
return nil;
|
||||
}
|
||||
|
||||
paddedSignal = (float *)pffft_aligned_malloc(sizeof(float) * paddedBufferSize);
|
||||
if(!paddedSignal) {
|
||||
pffft_aligned_free(deinterleavedImpulseBuffer);
|
||||
return nil;
|
||||
}
|
||||
|
||||
impulse_responses = (float **)calloc(sizeof(float *), channels * 2);
|
||||
if(!impulse_responses) {
|
||||
pffft_aligned_free(deinterleavedImpulseBuffer);
|
||||
return nil;
|
||||
}
|
||||
|
||||
for(size_t i = 0; i < channels; ++i) {
|
||||
impulse_responses[i * 2 + 0] = (float *)pffft_aligned_malloc(sizeof(float) * fftSize * 2);
|
||||
impulse_responses[i * 2 + 1] = (float *)pffft_aligned_malloc(sizeof(float) * fftSize * 2);
|
||||
|
||||
if(!impulse_responses[i * 2 + 0] || !impulse_responses[i * 2 + 1]) {
|
||||
pffft_aligned_free(deinterleavedImpulseBuffer);
|
||||
return nil;
|
||||
}
|
||||
|
||||
uint32_t channelFlag = [AudioChunk extractChannelFlag:(uint32_t)i fromConfig:config];
|
||||
uint32_t channelIndex = [AudioChunk findChannelIndex:channelFlag];
|
||||
|
||||
int leftInChannel = speaker_not_present;
|
||||
int rightInChannel = speaker_not_present;
|
||||
|
||||
if(impulseChannels == 7) {
|
||||
if(channelIndex <= max_speaker_index) {
|
||||
leftInChannel = speakers_to_hesuvi_7[channelIndex][0];
|
||||
rightInChannel = speakers_to_hesuvi_7[channelIndex][1];
|
||||
}
|
||||
} else {
|
||||
if(channelIndex <= max_speaker_index) {
|
||||
leftInChannel = speakers_to_hesuvi_14[channelIndex][0];
|
||||
rightInChannel = speakers_to_hesuvi_14[channelIndex][1];
|
||||
}
|
||||
}
|
||||
|
||||
if(leftInChannel == speaker_is_back_center || rightInChannel == speaker_is_back_center) {
|
||||
if(impulseChannels == 7) {
|
||||
cblas_scopy((int)fftSize, deinterleavedImpulseBuffer + 4 * fftSize, 1, impulse_responses[i * 2 + 0], 1);
|
||||
vDSP_vadd(impulse_responses[i * 2 + 0], 1, deinterleavedImpulseBuffer + 5 * fftSize, 1, impulse_responses[i * 2 + 0], 1, fftSize);
|
||||
cblas_scopy((int)fftSize, impulse_responses[i * 2 + 0], 1, impulse_responses[i * 2 + 1], 1);
|
||||
} else {
|
||||
cblas_scopy((int)fftSize, deinterleavedImpulseBuffer + 4 * fftSize, 1, impulse_responses[i * 2 + 0], 1);
|
||||
vDSP_vadd(impulse_responses[i * 2 + 0], 1, deinterleavedImpulseBuffer + 12 * fftSize, 1, impulse_responses[i * 2 + 0], 1, fftSize);
|
||||
|
||||
cblas_scopy((int)fftSize, deinterleavedImpulseBuffer + 5 * fftSize, 1, impulse_responses[i * 2 + 1], 1);
|
||||
vDSP_vadd(impulse_responses[i * 2 + 1], 1, deinterleavedImpulseBuffer + 11 * fftSize, 1, impulse_responses[i * 2 + 1], 1, fftSize);
|
||||
}
|
||||
} else if(leftInChannel == speaker_not_present || rightInChannel == speaker_not_present) {
|
||||
vDSP_vclr(impulse_responses[i * 2 + 0], 1, fftSize);
|
||||
vDSP_vclr(impulse_responses[i * 2 + 1], 1, fftSize);
|
||||
} else {
|
||||
cblas_scopy((int)fftSize, deinterleavedImpulseBuffer + leftInChannel * fftSize, 1, impulse_responses[i * 2 + 0], 1);
|
||||
cblas_scopy((int)fftSize, deinterleavedImpulseBuffer + rightInChannel * fftSize, 1, impulse_responses[i * 2 + 1], 1);
|
||||
}
|
||||
|
||||
pffft_transform(fftSetup, impulse_responses[i * 2 + 0], impulse_responses[i * 2 + 0], workBuffer, PFFFT_FORWARD);
|
||||
pffft_transform(fftSetup, impulse_responses[i * 2 + 1], impulse_responses[i * 2 + 1], workBuffer, PFFFT_FORWARD);
|
||||
}
|
||||
|
||||
pffft_aligned_free(deinterleavedImpulseBuffer);
|
||||
|
||||
left_result = (float *)pffft_aligned_malloc(sizeof(float) * fftSize);
|
||||
right_result = (float *)pffft_aligned_malloc(sizeof(float) * fftSize);
|
||||
if(!left_result || !right_result)
|
||||
return nil;
|
||||
|
||||
prevInputs = (float **)calloc(sizeof(float *), channels);
|
||||
if(!prevInputs) {
|
||||
return nil;
|
||||
}
|
||||
for(size_t i = 0; i < channels; ++i) {
|
||||
prevInputs[i] = (float *)pffft_aligned_malloc(sizeof(float) * fftSize);
|
||||
if(!prevInputs[i]) {
|
||||
return nil;
|
||||
}
|
||||
vDSP_vclr(prevInputs[i], 1, fftSize);
|
||||
}
|
||||
}
|
||||
|
||||
return self;
|
||||
}
|
||||
|
||||
- (void)dealloc {
|
||||
if(fftSetup) pffft_destroy_setup(fftSetup);
|
||||
|
||||
pffft_aligned_free(workBuffer);
|
||||
|
||||
pffft_aligned_free(paddedSignal);
|
||||
|
||||
if(impulse_responses) {
|
||||
for(size_t i = 0; i < channelCount * 2; ++i) {
|
||||
pffft_aligned_free(impulse_responses[i]);
|
||||
}
|
||||
free(impulse_responses);
|
||||
}
|
||||
|
||||
if(prevInputs) {
|
||||
for(size_t i = 0; i < channelCount; ++i) {
|
||||
pffft_aligned_free(prevInputs[i]);
|
||||
}
|
||||
free(prevInputs);
|
||||
}
|
||||
|
||||
pffft_aligned_free(left_result);
|
||||
pffft_aligned_free(right_result);
|
||||
}
|
||||
|
||||
- (void)process:(const float *)inBuffer sampleCount:(size_t)count toBuffer:(float *)outBuffer {
|
||||
const float scale = 1.0 / ((float)fftSize);
|
||||
|
||||
while(count > 0) {
|
||||
const size_t countToDo = (count > bufferSize) ? bufferSize : count;
|
||||
const size_t outOffset = fftSize - countToDo;
|
||||
|
||||
vDSP_vclr(left_result, 1, fftSize);
|
||||
vDSP_vclr(right_result, 1, fftSize);
|
||||
|
||||
for(size_t i = 0; i < channelCount; ++i) {
|
||||
cblas_scopy((int)outOffset, prevInputs[i] + countToDo, 1, paddedSignal, 1);
|
||||
cblas_scopy((int)countToDo, inBuffer + i, (int)channelCount, paddedSignal + outOffset, 1);
|
||||
cblas_scopy((int)fftSize, paddedSignal, 1, prevInputs[i], 1);
|
||||
|
||||
pffft_transform(fftSetup, paddedSignal, paddedSignal, workBuffer, PFFFT_FORWARD);
|
||||
|
||||
pffft_zconvolve_accumulate(fftSetup, paddedSignal, impulse_responses[i * 2 + 0], left_result, 1.0);
|
||||
pffft_zconvolve_accumulate(fftSetup, paddedSignal, impulse_responses[i * 2 + 1], right_result, 1.0);
|
||||
}
|
||||
|
||||
pffft_transform(fftSetup, left_result, left_result, workBuffer, PFFFT_BACKWARD);
|
||||
pffft_transform(fftSetup, right_result, right_result, workBuffer, PFFFT_BACKWARD);
|
||||
|
||||
vDSP_vsmul(left_result + outOffset, 1, &scale, left_result + outOffset, 1, countToDo);
|
||||
vDSP_vsmul(right_result + outOffset, 1, &scale, right_result + outOffset, 1, countToDo);
|
||||
|
||||
cblas_scopy((int)countToDo, left_result + outOffset, 1, outBuffer + 0, 2);
|
||||
cblas_scopy((int)countToDo, right_result + outOffset, 1, outBuffer + 1, 2);
|
||||
|
||||
inBuffer += countToDo * channelCount;
|
||||
outBuffer += countToDo * 2;
|
||||
|
||||
count -= countToDo;
|
||||
}
|
||||
}
|
||||
|
||||
- (void)reset {
|
||||
for(size_t i = 0; i < channelCount; ++i) {
|
||||
vDSP_vclr(prevInputs[i], 1, fftSize);
|
||||
}
|
||||
}
|
||||
|
||||
@end
|
|
@ -214,7 +214,8 @@ static void *kInputNodeContext = &kInputNodeContext;
|
|||
// wait before exiting, as we might still get seeking request
|
||||
DLog("InputNode: Before wait")
|
||||
[exitAtTheEndOfTheStream waitIndefinitely];
|
||||
DLog("InputNode: After wait, should seek = %d", shouldSeek) if(shouldSeek) {
|
||||
DLog("InputNode: After wait, should seek = %d", shouldSeek);
|
||||
if(shouldSeek) {
|
||||
endOfStream = NO;
|
||||
shouldClose = NO;
|
||||
continue;
|
||||
|
|
|
@ -11,7 +11,7 @@
|
|||
#import "BufferChain.h"
|
||||
#import "Logging.h"
|
||||
|
||||
#import "OutputCoreAudio.h"
|
||||
#import "OutputAVFoundation.h"
|
||||
|
||||
#import <pthread.h>
|
||||
|
||||
|
|
|
@ -13,7 +13,7 @@
|
|||
#import <CoreAudio/AudioHardware.h>
|
||||
|
||||
#import "Node.h"
|
||||
#import "OutputCoreAudio.h"
|
||||
#import "OutputAVFoundation.h"
|
||||
|
||||
@interface OutputNode : Node {
|
||||
AudioStreamBasicDescription format;
|
||||
|
@ -21,7 +21,7 @@
|
|||
|
||||
double amountPlayed;
|
||||
double amountPlayedInterval;
|
||||
OutputCoreAudio *output;
|
||||
OutputAVFoundation *output;
|
||||
|
||||
BOOL paused;
|
||||
BOOL started;
|
||||
|
@ -39,6 +39,7 @@
|
|||
- (void)resetAmountPlayed;
|
||||
- (void)resetAmountPlayedInterval;
|
||||
|
||||
- (BOOL)selectNextBuffer;
|
||||
- (void)endOfInputPlayed;
|
||||
|
||||
- (BOOL)chainQueueHasTracks;
|
||||
|
@ -50,6 +51,8 @@
|
|||
- (void)close;
|
||||
- (void)seek:(double)time;
|
||||
|
||||
- (double)latency;
|
||||
|
||||
- (AudioChunk *)readChunk:(size_t)amount;
|
||||
|
||||
- (void)setFormat:(AudioStreamBasicDescription *)f channelConfig:(uint32_t)channelConfig;
|
||||
|
|
|
@ -9,7 +9,7 @@
|
|||
#import "OutputNode.h"
|
||||
#import "AudioPlayer.h"
|
||||
#import "BufferChain.h"
|
||||
#import "OutputCoreAudio.h"
|
||||
#import "OutputAVFoundation.h"
|
||||
|
||||
#import "Logging.h"
|
||||
|
||||
|
@ -23,7 +23,7 @@
|
|||
started = NO;
|
||||
intervalReported = NO;
|
||||
|
||||
output = [[OutputCoreAudio alloc] initWithController:self];
|
||||
output = [[OutputAVFoundation alloc] initWithController:self];
|
||||
|
||||
[output setup];
|
||||
}
|
||||
|
@ -68,6 +68,10 @@
|
|||
intervalReported = NO;
|
||||
}
|
||||
|
||||
- (BOOL)selectNextBuffer {
|
||||
return [controller selectNextBuffer];
|
||||
}
|
||||
|
||||
- (void)endOfInputPlayed {
|
||||
if(!intervalReported) {
|
||||
intervalReported = YES;
|
||||
|
@ -137,8 +141,6 @@
|
|||
format.mBytesPerPacket = format.mBytesPerFrame * format.mFramesPerPacket;
|
||||
channelConfig = config;
|
||||
|
||||
[converter setOutputFormat:format
|
||||
outputConfig:channelConfig];
|
||||
[converter inputFormatDidChange:[bufferChain inputFormat] inputConfig:[bufferChain inputConfig]];
|
||||
}
|
||||
}
|
||||
|
@ -184,4 +186,8 @@
|
|||
[controller restartPlaybackAtCurrentPosition];
|
||||
}
|
||||
|
||||
- (double)latency {
|
||||
return [output latency];
|
||||
}
|
||||
|
||||
@end
|
||||
|
|
|
@ -25,8 +25,8 @@
|
|||
17D21CA80B8BE4BA00D1EBDE /* Node.m in Sources */ = {isa = PBXBuildFile; fileRef = 17D21C7D0B8BE4BA00D1EBDE /* Node.m */; };
|
||||
17D21CA90B8BE4BA00D1EBDE /* OutputNode.h in Headers */ = {isa = PBXBuildFile; fileRef = 17D21C7E0B8BE4BA00D1EBDE /* OutputNode.h */; settings = {ATTRIBUTES = (Public, ); }; };
|
||||
17D21CAA0B8BE4BA00D1EBDE /* OutputNode.m in Sources */ = {isa = PBXBuildFile; fileRef = 17D21C7F0B8BE4BA00D1EBDE /* OutputNode.m */; };
|
||||
17D21CC50B8BE4BA00D1EBDE /* OutputCoreAudio.h in Headers */ = {isa = PBXBuildFile; fileRef = 17D21C9C0B8BE4BA00D1EBDE /* OutputCoreAudio.h */; settings = {ATTRIBUTES = (Public, ); }; };
|
||||
17D21CC60B8BE4BA00D1EBDE /* OutputCoreAudio.m in Sources */ = {isa = PBXBuildFile; fileRef = 17D21C9D0B8BE4BA00D1EBDE /* OutputCoreAudio.m */; };
|
||||
17D21CC50B8BE4BA00D1EBDE /* OutputAVFoundation.h in Headers */ = {isa = PBXBuildFile; fileRef = 17D21C9C0B8BE4BA00D1EBDE /* OutputAVFoundation.h */; settings = {ATTRIBUTES = (Public, ); }; };
|
||||
17D21CC60B8BE4BA00D1EBDE /* OutputAVFoundation.m in Sources */ = {isa = PBXBuildFile; fileRef = 17D21C9D0B8BE4BA00D1EBDE /* OutputAVFoundation.m */; };
|
||||
17D21CC70B8BE4BA00D1EBDE /* Status.h in Headers */ = {isa = PBXBuildFile; fileRef = 17D21C9E0B8BE4BA00D1EBDE /* Status.h */; settings = {ATTRIBUTES = (Public, ); }; };
|
||||
17D21CF30B8BE5EF00D1EBDE /* Semaphore.h in Headers */ = {isa = PBXBuildFile; fileRef = 17D21CF10B8BE5EF00D1EBDE /* Semaphore.h */; settings = {ATTRIBUTES = (Public, ); }; };
|
||||
17D21CF40B8BE5EF00D1EBDE /* Semaphore.m in Sources */ = {isa = PBXBuildFile; fileRef = 17D21CF20B8BE5EF00D1EBDE /* Semaphore.m */; };
|
||||
|
@ -41,6 +41,35 @@
|
|||
17F94DD50B8D0F7000A34E87 /* PluginController.h in Headers */ = {isa = PBXBuildFile; fileRef = 17F94DD30B8D0F7000A34E87 /* PluginController.h */; settings = {ATTRIBUTES = (Public, ); }; };
|
||||
17F94DD60B8D0F7000A34E87 /* PluginController.mm in Sources */ = {isa = PBXBuildFile; fileRef = 17F94DD40B8D0F7000A34E87 /* PluginController.mm */; };
|
||||
17F94DDD0B8D101100A34E87 /* Plugin.h in Headers */ = {isa = PBXBuildFile; fileRef = 17F94DDC0B8D101100A34E87 /* Plugin.h */; settings = {ATTRIBUTES = (Public, ); }; };
|
||||
831A4FDC2865A7DC0049CFE4 /* CDSPProcessor.h in Headers */ = {isa = PBXBuildFile; fileRef = 831A4F9D2865A7DC0049CFE4 /* CDSPProcessor.h */; };
|
||||
831A4FDD2865A7DC0049CFE4 /* CDSPRealFFT.h in Headers */ = {isa = PBXBuildFile; fileRef = 831A4F9E2865A7DC0049CFE4 /* CDSPRealFFT.h */; };
|
||||
831A4FDE2865A7DC0049CFE4 /* pffft_double.h in Headers */ = {isa = PBXBuildFile; fileRef = 831A4FA02865A7DC0049CFE4 /* pffft_double.h */; };
|
||||
831A4FDF2865A7DC0049CFE4 /* pf_neon_double_from_avx.h in Headers */ = {isa = PBXBuildFile; fileRef = 831A4FA22865A7DC0049CFE4 /* pf_neon_double_from_avx.h */; };
|
||||
831A4FE02865A7DC0049CFE4 /* pf_double.h in Headers */ = {isa = PBXBuildFile; fileRef = 831A4FA32865A7DC0049CFE4 /* pf_double.h */; };
|
||||
831A4FE12865A7DC0049CFE4 /* pf_neon_double.h in Headers */ = {isa = PBXBuildFile; fileRef = 831A4FA42865A7DC0049CFE4 /* pf_neon_double.h */; };
|
||||
831A4FE22865A7DC0049CFE4 /* pf_sse2_double.h in Headers */ = {isa = PBXBuildFile; fileRef = 831A4FA52865A7DC0049CFE4 /* pf_sse2_double.h */; };
|
||||
831A4FE32865A7DC0049CFE4 /* pf_avx_double.h in Headers */ = {isa = PBXBuildFile; fileRef = 831A4FA62865A7DC0049CFE4 /* pf_avx_double.h */; };
|
||||
831A4FE42865A7DC0049CFE4 /* pf_scalar_double.h in Headers */ = {isa = PBXBuildFile; fileRef = 831A4FA72865A7DC0049CFE4 /* pf_scalar_double.h */; };
|
||||
831A4FE52865A7DC0049CFE4 /* pffft_priv_impl.h in Headers */ = {isa = PBXBuildFile; fileRef = 831A4FA82865A7DC0049CFE4 /* pffft_priv_impl.h */; };
|
||||
831A4FE62865A7DC0049CFE4 /* pffft_double.c in Sources */ = {isa = PBXBuildFile; fileRef = 831A4FA92865A7DC0049CFE4 /* pffft_double.c */; };
|
||||
831A4FF22865A7DC0049CFE4 /* CDSPHBUpsampler.inc in Sources */ = {isa = PBXBuildFile; fileRef = 831A4FB72865A7DC0049CFE4 /* CDSPHBUpsampler.inc */; };
|
||||
831A4FF32865A7DC0049CFE4 /* r8butil.h in Headers */ = {isa = PBXBuildFile; fileRef = 831A4FB82865A7DC0049CFE4 /* r8butil.h */; };
|
||||
831A4FF52865A7DC0049CFE4 /* r8bbase.h in Headers */ = {isa = PBXBuildFile; fileRef = 831A4FBA2865A7DC0049CFE4 /* r8bbase.h */; };
|
||||
831A4FFE2865A7DC0049CFE4 /* CDSPSincFilterGen.h in Headers */ = {isa = PBXBuildFile; fileRef = 831A4FC42865A7DC0049CFE4 /* CDSPSincFilterGen.h */; };
|
||||
831A50072865A7DC0049CFE4 /* LICENSE in Resources */ = {isa = PBXBuildFile; fileRef = 831A4FD02865A7DC0049CFE4 /* LICENSE */; };
|
||||
831A50082865A7DC0049CFE4 /* CDSPResampler.h in Headers */ = {isa = PBXBuildFile; fileRef = 831A4FD12865A7DC0049CFE4 /* CDSPResampler.h */; };
|
||||
831A50092865A7DC0049CFE4 /* CDSPHBUpsampler.h in Headers */ = {isa = PBXBuildFile; fileRef = 831A4FD22865A7DC0049CFE4 /* CDSPHBUpsampler.h */; };
|
||||
831A500B2865A7DC0049CFE4 /* CDSPBlockConvolver.h in Headers */ = {isa = PBXBuildFile; fileRef = 831A4FD42865A7DC0049CFE4 /* CDSPBlockConvolver.h */; };
|
||||
831A500C2865A7DC0049CFE4 /* fft4g.h in Headers */ = {isa = PBXBuildFile; fileRef = 831A4FD52865A7DC0049CFE4 /* fft4g.h */; };
|
||||
831A500D2865A7DC0049CFE4 /* CDSPHBDownsampler.h in Headers */ = {isa = PBXBuildFile; fileRef = 831A4FD62865A7DC0049CFE4 /* CDSPHBDownsampler.h */; };
|
||||
831A500E2865A7DC0049CFE4 /* r8bconf.h in Headers */ = {isa = PBXBuildFile; fileRef = 831A4FD72865A7DC0049CFE4 /* r8bconf.h */; };
|
||||
831A500F2865A7DC0049CFE4 /* CDSPFracInterpolator.h in Headers */ = {isa = PBXBuildFile; fileRef = 831A4FD82865A7DC0049CFE4 /* CDSPFracInterpolator.h */; };
|
||||
831A50102865A7DC0049CFE4 /* CDSPFIRFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = 831A4FD92865A7DC0049CFE4 /* CDSPFIRFilter.h */; };
|
||||
831A50112865A7DC0049CFE4 /* r8bbase.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 831A4FDA2865A7DC0049CFE4 /* r8bbase.cpp */; };
|
||||
831A50122865A7DC0049CFE4 /* pffft.h in Headers */ = {isa = PBXBuildFile; fileRef = 831A4FDB2865A7DC0049CFE4 /* pffft.h */; };
|
||||
831A50142865A7FD0049CFE4 /* r8bstate.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 831A50132865A7FD0049CFE4 /* r8bstate.hpp */; };
|
||||
831A50162865A8800049CFE4 /* r8bstate.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 831A50152865A8800049CFE4 /* r8bstate.cpp */; };
|
||||
831A50182865A8B30049CFE4 /* r8bstate.h in Headers */ = {isa = PBXBuildFile; fileRef = 831A50172865A8B30049CFE4 /* r8bstate.h */; };
|
||||
8328995327CB511000D7F028 /* RedundantPlaylistDataStore.m in Sources */ = {isa = PBXBuildFile; fileRef = 8328995127CB510F00D7F028 /* RedundantPlaylistDataStore.m */; };
|
||||
8328995427CB511000D7F028 /* RedundantPlaylistDataStore.h in Headers */ = {isa = PBXBuildFile; fileRef = 8328995227CB511000D7F028 /* RedundantPlaylistDataStore.h */; };
|
||||
8328995727CB51B700D7F028 /* SHA256Digest.h in Headers */ = {isa = PBXBuildFile; fileRef = 8328995527CB51B700D7F028 /* SHA256Digest.h */; };
|
||||
|
@ -52,64 +81,29 @@
|
|||
834FD4ED27AF91220063BC83 /* AudioChunk.m in Sources */ = {isa = PBXBuildFile; fileRef = 834FD4EC27AF91220063BC83 /* AudioChunk.m */; };
|
||||
834FD4F027AF93680063BC83 /* ChunkList.h in Headers */ = {isa = PBXBuildFile; fileRef = 834FD4EE27AF93680063BC83 /* ChunkList.h */; };
|
||||
834FD4F127AF93680063BC83 /* ChunkList.m in Sources */ = {isa = PBXBuildFile; fileRef = 834FD4EF27AF93680063BC83 /* ChunkList.m */; };
|
||||
834FD4F427AFA2150063BC83 /* Downmix.h in Headers */ = {isa = PBXBuildFile; fileRef = 834FD4F227AFA2150063BC83 /* Downmix.h */; };
|
||||
834FD4F527AFA2150063BC83 /* Downmix.m in Sources */ = {isa = PBXBuildFile; fileRef = 834FD4F327AFA2150063BC83 /* Downmix.m */; };
|
||||
835C88A82797D4D400E28EAE /* LICENSE.LGPL in Resources */ = {isa = PBXBuildFile; fileRef = 835C88A42797D4D400E28EAE /* LICENSE.LGPL */; };
|
||||
835C88A92797D4D400E28EAE /* License.txt in Resources */ = {isa = PBXBuildFile; fileRef = 835C88A52797D4D400E28EAE /* License.txt */; };
|
||||
835C88AA2797D4D400E28EAE /* lpc.c in Sources */ = {isa = PBXBuildFile; fileRef = 835C88A62797D4D400E28EAE /* lpc.c */; };
|
||||
835C88AB2797D4D400E28EAE /* lpc.h in Headers */ = {isa = PBXBuildFile; fileRef = 835C88A72797D4D400E28EAE /* lpc.h */; };
|
||||
835C88AD2797DA5800E28EAE /* util.h in Headers */ = {isa = PBXBuildFile; fileRef = 835C88AC2797DA5800E28EAE /* util.h */; };
|
||||
83504165286447DA006B32CC /* Downmix.h in Headers */ = {isa = PBXBuildFile; fileRef = 83504163286447DA006B32CC /* Downmix.h */; };
|
||||
83504166286447DA006B32CC /* Downmix.m in Sources */ = {isa = PBXBuildFile; fileRef = 83504164286447DA006B32CC /* Downmix.m */; };
|
||||
8350416D28646149006B32CC /* CoreMedia.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8350416C28646149006B32CC /* CoreMedia.framework */; };
|
||||
835C88B1279811A500E28EAE /* hdcd_decode2.h in Headers */ = {isa = PBXBuildFile; fileRef = 835C88AF279811A500E28EAE /* hdcd_decode2.h */; };
|
||||
835C88B2279811A500E28EAE /* hdcd_decode2.c in Sources */ = {isa = PBXBuildFile; fileRef = 835C88B0279811A500E28EAE /* hdcd_decode2.c */; };
|
||||
835EDD7B279FE23A001EDCCE /* HeadphoneFilter.mm in Sources */ = {isa = PBXBuildFile; fileRef = 835EDD7A279FE23A001EDCCE /* HeadphoneFilter.mm */; };
|
||||
835EDD7D279FE307001EDCCE /* HeadphoneFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = 835EDD7C279FE307001EDCCE /* HeadphoneFilter.h */; };
|
||||
835FAC5E27BCA14D00BA8562 /* BadSampleCleaner.h in Headers */ = {isa = PBXBuildFile; fileRef = 835FAC5C27BCA14D00BA8562 /* BadSampleCleaner.h */; };
|
||||
835FAC5F27BCA14D00BA8562 /* BadSampleCleaner.m in Sources */ = {isa = PBXBuildFile; fileRef = 835FAC5D27BCA14D00BA8562 /* BadSampleCleaner.m */; };
|
||||
8363BABE284E428F00E5C9DD /* pffft.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8363BABD284E428F00E5C9DD /* pffft.cpp */; };
|
||||
83725A9027AA16C90003F694 /* Accelerate.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 83725A7B27AA0D8A0003F694 /* Accelerate.framework */; };
|
||||
83725A9127AA16D50003F694 /* AVFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 83725A7C27AA0D8E0003F694 /* AVFoundation.framework */; };
|
||||
8377C64C27B8C51500E8BC0F /* fft_accelerate.c in Sources */ = {isa = PBXBuildFile; fileRef = 8377C64B27B8C51500E8BC0F /* fft_accelerate.c */; };
|
||||
8377C64E27B8C54400E8BC0F /* fft.h in Headers */ = {isa = PBXBuildFile; fileRef = 8377C64D27B8C54400E8BC0F /* fft.h */; };
|
||||
8377C65227B8CAD100E8BC0F /* VisualizationController.h in Headers */ = {isa = PBXBuildFile; fileRef = 8377C65027B8CAD100E8BC0F /* VisualizationController.h */; };
|
||||
8377C65327B8CAD100E8BC0F /* VisualizationController.m in Sources */ = {isa = PBXBuildFile; fileRef = 8377C65127B8CAD100E8BC0F /* VisualizationController.m */; };
|
||||
8384912718080FF100E7332D /* Logging.h in Headers */ = {isa = PBXBuildFile; fileRef = 8384912618080FF100E7332D /* Logging.h */; };
|
||||
839065F32853338700636FBB /* dsd2float.h in Headers */ = {isa = PBXBuildFile; fileRef = 839065F22853338700636FBB /* dsd2float.h */; };
|
||||
839366671815923C006DD712 /* CogPluginMulti.h in Headers */ = {isa = PBXBuildFile; fileRef = 839366651815923C006DD712 /* CogPluginMulti.h */; };
|
||||
839366681815923C006DD712 /* CogPluginMulti.m in Sources */ = {isa = PBXBuildFile; fileRef = 839366661815923C006DD712 /* CogPluginMulti.m */; };
|
||||
8399CF2C27B5D1D5008751F1 /* NSDictionary+Merge.h in Headers */ = {isa = PBXBuildFile; fileRef = 8399CF2A27B5D1D4008751F1 /* NSDictionary+Merge.h */; };
|
||||
8399CF2D27B5D1D5008751F1 /* NSDictionary+Merge.m in Sources */ = {isa = PBXBuildFile; fileRef = 8399CF2B27B5D1D4008751F1 /* NSDictionary+Merge.m */; };
|
||||
83B69B752845DF6500D2435A /* pffft_double.h in Headers */ = {isa = PBXBuildFile; fileRef = 83B69B6B2845DF6500D2435A /* pffft_double.h */; };
|
||||
83B69B762845DF6500D2435A /* pf_neon_double_from_avx.h in Headers */ = {isa = PBXBuildFile; fileRef = 83B69B6D2845DF6500D2435A /* pf_neon_double_from_avx.h */; };
|
||||
83B69B772845DF6500D2435A /* pf_double.h in Headers */ = {isa = PBXBuildFile; fileRef = 83B69B6E2845DF6500D2435A /* pf_double.h */; };
|
||||
83B69B782845DF6500D2435A /* pf_neon_double.h in Headers */ = {isa = PBXBuildFile; fileRef = 83B69B6F2845DF6500D2435A /* pf_neon_double.h */; };
|
||||
83B69B792845DF6500D2435A /* pf_sse2_double.h in Headers */ = {isa = PBXBuildFile; fileRef = 83B69B702845DF6500D2435A /* pf_sse2_double.h */; };
|
||||
83B69B7A2845DF6500D2435A /* pf_avx_double.h in Headers */ = {isa = PBXBuildFile; fileRef = 83B69B712845DF6500D2435A /* pf_avx_double.h */; };
|
||||
83B69B7B2845DF6500D2435A /* pf_scalar_double.h in Headers */ = {isa = PBXBuildFile; fileRef = 83B69B722845DF6500D2435A /* pf_scalar_double.h */; };
|
||||
83B69B7C2845DF6500D2435A /* pffft_priv_impl.h in Headers */ = {isa = PBXBuildFile; fileRef = 83B69B732845DF6500D2435A /* pffft_priv_impl.h */; };
|
||||
83D40B572852CB3B003BB85C /* pffft_double.c in Sources */ = {isa = PBXBuildFile; fileRef = 83B69B742845DF6500D2435A /* pffft_double.c */; };
|
||||
83F18B1E27D1E8EF00385946 /* CDSPHBDownsampler.h in Headers */ = {isa = PBXBuildFile; fileRef = 83F18ADF27D1E8EF00385946 /* CDSPHBDownsampler.h */; };
|
||||
83F18B3327D1E8EF00385946 /* CDSPSincFilterGen.h in Headers */ = {isa = PBXBuildFile; fileRef = 83F18AF827D1E8EF00385946 /* CDSPSincFilterGen.h */; };
|
||||
83F18B3427D1E8EF00385946 /* r8butil.h in Headers */ = {isa = PBXBuildFile; fileRef = 83F18AF927D1E8EF00385946 /* r8butil.h */; };
|
||||
83F18B3627D1E8EF00385946 /* LICENSE in Resources */ = {isa = PBXBuildFile; fileRef = 83F18AFB27D1E8EF00385946 /* LICENSE */; };
|
||||
83F18B3727D1E8EF00385946 /* r8bbase.h in Headers */ = {isa = PBXBuildFile; fileRef = 83F18AFC27D1E8EF00385946 /* r8bbase.h */; };
|
||||
83F18B3827D1E8EF00385946 /* CDSPFIRFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = 83F18AFD27D1E8EF00385946 /* CDSPFIRFilter.h */; };
|
||||
83F18B4227D1E8EF00385946 /* CDSPProcessor.h in Headers */ = {isa = PBXBuildFile; fileRef = 83F18B0827D1E8EF00385946 /* CDSPProcessor.h */; };
|
||||
83F18B4327D1E8EF00385946 /* README.md in Resources */ = {isa = PBXBuildFile; fileRef = 83F18B0927D1E8EF00385946 /* README.md */; };
|
||||
83F18B4427D1E8EF00385946 /* fft4g.h in Headers */ = {isa = PBXBuildFile; fileRef = 83F18B0A27D1E8EF00385946 /* fft4g.h */; };
|
||||
83F18B4527D1E8EF00385946 /* CDSPRealFFT.h in Headers */ = {isa = PBXBuildFile; fileRef = 83F18B0B27D1E8EF00385946 /* CDSPRealFFT.h */; };
|
||||
83F18B4627D1E8EF00385946 /* CDSPFracInterpolator.h in Headers */ = {isa = PBXBuildFile; fileRef = 83F18B0C27D1E8EF00385946 /* CDSPFracInterpolator.h */; };
|
||||
83F18B4E27D1E8F000385946 /* CDSPBlockConvolver.h in Headers */ = {isa = PBXBuildFile; fileRef = 83F18B1727D1E8EF00385946 /* CDSPBlockConvolver.h */; };
|
||||
83F18B5027D1E8F000385946 /* r8bconf.h in Headers */ = {isa = PBXBuildFile; fileRef = 83F18B1927D1E8EF00385946 /* r8bconf.h */; };
|
||||
83F18B5127D1E8F000385946 /* r8bbase.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 83F18B1A27D1E8EF00385946 /* r8bbase.cpp */; };
|
||||
83F18B5227D1E8F000385946 /* pffft.h in Headers */ = {isa = PBXBuildFile; fileRef = 83F18B1B27D1E8EF00385946 /* pffft.h */; };
|
||||
83F18B5327D1E8F000385946 /* CDSPResampler.h in Headers */ = {isa = PBXBuildFile; fileRef = 83F18B1C27D1E8EF00385946 /* CDSPResampler.h */; };
|
||||
83F18B5427D1E8F000385946 /* CDSPHBUpsampler.h in Headers */ = {isa = PBXBuildFile; fileRef = 83F18B1D27D1E8EF00385946 /* CDSPHBUpsampler.h */; };
|
||||
83F18B5627D1F5E900385946 /* r8bstate.h in Headers */ = {isa = PBXBuildFile; fileRef = 83F18B5527D1F5E900385946 /* r8bstate.h */; };
|
||||
839B83FA286D91ED00F529EE /* VisualizationController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 839B83F9286D91ED00F529EE /* VisualizationController.swift */; };
|
||||
8DC2EF570486A6940098B216 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7B1FEA5585E11CA2CBB /* Cocoa.framework */; };
|
||||
8E8D3D2F0CBAEE6E00135C1B /* AudioContainer.h in Headers */ = {isa = PBXBuildFile; fileRef = 8E8D3D2D0CBAEE6E00135C1B /* AudioContainer.h */; settings = {ATTRIBUTES = (Public, ); }; };
|
||||
8E8D3D300CBAEE6E00135C1B /* AudioContainer.m in Sources */ = {isa = PBXBuildFile; fileRef = 8E8D3D2E0CBAEE6E00135C1B /* AudioContainer.m */; };
|
||||
8EC1225F0B993BD500C5B3AD /* ConverterNode.h in Headers */ = {isa = PBXBuildFile; fileRef = 8EC1225D0B993BD500C5B3AD /* ConverterNode.h */; };
|
||||
8EC122600B993BD500C5B3AD /* ConverterNode.mm in Sources */ = {isa = PBXBuildFile; fileRef = 8EC1225E0B993BD500C5B3AD /* ConverterNode.mm */; };
|
||||
8EC122600B993BD500C5B3AD /* ConverterNode.m in Sources */ = {isa = PBXBuildFile; fileRef = 8EC1225E0B993BD500C5B3AD /* ConverterNode.m */; };
|
||||
B0575F2D0D687A0800411D77 /* Helper.h in Headers */ = {isa = PBXBuildFile; fileRef = B0575F2C0D687A0800411D77 /* Helper.h */; settings = {ATTRIBUTES = (Public, ); }; };
|
||||
B0575F300D687A4000411D77 /* Helper.m in Sources */ = {isa = PBXBuildFile; fileRef = B0575F2F0D687A4000411D77 /* Helper.m */; };
|
||||
/* End PBXBuildFile section */
|
||||
|
@ -157,8 +151,8 @@
|
|||
17D21C7D0B8BE4BA00D1EBDE /* Node.m */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.objc; path = Node.m; sourceTree = "<group>"; };
|
||||
17D21C7E0B8BE4BA00D1EBDE /* OutputNode.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = OutputNode.h; sourceTree = "<group>"; };
|
||||
17D21C7F0B8BE4BA00D1EBDE /* OutputNode.m */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.objc; path = OutputNode.m; sourceTree = "<group>"; };
|
||||
17D21C9C0B8BE4BA00D1EBDE /* OutputCoreAudio.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = OutputCoreAudio.h; sourceTree = "<group>"; };
|
||||
17D21C9D0B8BE4BA00D1EBDE /* OutputCoreAudio.m */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.objc; path = OutputCoreAudio.m; sourceTree = "<group>"; };
|
||||
17D21C9C0B8BE4BA00D1EBDE /* OutputAVFoundation.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = OutputAVFoundation.h; sourceTree = "<group>"; };
|
||||
17D21C9D0B8BE4BA00D1EBDE /* OutputAVFoundation.m */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.objc; path = OutputAVFoundation.m; sourceTree = "<group>"; };
|
||||
17D21C9E0B8BE4BA00D1EBDE /* Status.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = Status.h; sourceTree = "<group>"; };
|
||||
17D21CF10B8BE5EF00D1EBDE /* Semaphore.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = Semaphore.h; sourceTree = "<group>"; };
|
||||
17D21CF20B8BE5EF00D1EBDE /* Semaphore.m */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.objc; path = Semaphore.m; sourceTree = "<group>"; };
|
||||
|
@ -174,6 +168,35 @@
|
|||
17F94DD40B8D0F7000A34E87 /* PluginController.mm */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.objcpp; path = PluginController.mm; sourceTree = "<group>"; };
|
||||
17F94DDC0B8D101100A34E87 /* Plugin.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = Plugin.h; sourceTree = "<group>"; };
|
||||
32DBCF5E0370ADEE00C91783 /* CogAudio_Prefix.pch */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CogAudio_Prefix.pch; sourceTree = "<group>"; };
|
||||
831A4F9D2865A7DC0049CFE4 /* CDSPProcessor.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CDSPProcessor.h; sourceTree = "<group>"; };
|
||||
831A4F9E2865A7DC0049CFE4 /* CDSPRealFFT.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CDSPRealFFT.h; sourceTree = "<group>"; };
|
||||
831A4FA02865A7DC0049CFE4 /* pffft_double.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = pffft_double.h; sourceTree = "<group>"; };
|
||||
831A4FA22865A7DC0049CFE4 /* pf_neon_double_from_avx.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = pf_neon_double_from_avx.h; sourceTree = "<group>"; };
|
||||
831A4FA32865A7DC0049CFE4 /* pf_double.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = pf_double.h; sourceTree = "<group>"; };
|
||||
831A4FA42865A7DC0049CFE4 /* pf_neon_double.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = pf_neon_double.h; sourceTree = "<group>"; };
|
||||
831A4FA52865A7DC0049CFE4 /* pf_sse2_double.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = pf_sse2_double.h; sourceTree = "<group>"; };
|
||||
831A4FA62865A7DC0049CFE4 /* pf_avx_double.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = pf_avx_double.h; sourceTree = "<group>"; };
|
||||
831A4FA72865A7DC0049CFE4 /* pf_scalar_double.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = pf_scalar_double.h; sourceTree = "<group>"; };
|
||||
831A4FA82865A7DC0049CFE4 /* pffft_priv_impl.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = pffft_priv_impl.h; sourceTree = "<group>"; };
|
||||
831A4FA92865A7DC0049CFE4 /* pffft_double.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = pffft_double.c; sourceTree = "<group>"; };
|
||||
831A4FB72865A7DC0049CFE4 /* CDSPHBUpsampler.inc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.pascal; path = CDSPHBUpsampler.inc; sourceTree = "<group>"; };
|
||||
831A4FB82865A7DC0049CFE4 /* r8butil.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = r8butil.h; sourceTree = "<group>"; };
|
||||
831A4FBA2865A7DC0049CFE4 /* r8bbase.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = r8bbase.h; sourceTree = "<group>"; };
|
||||
831A4FC42865A7DC0049CFE4 /* CDSPSincFilterGen.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CDSPSincFilterGen.h; sourceTree = "<group>"; };
|
||||
831A4FD02865A7DC0049CFE4 /* LICENSE */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = LICENSE; sourceTree = "<group>"; };
|
||||
831A4FD12865A7DC0049CFE4 /* CDSPResampler.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CDSPResampler.h; sourceTree = "<group>"; };
|
||||
831A4FD22865A7DC0049CFE4 /* CDSPHBUpsampler.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CDSPHBUpsampler.h; sourceTree = "<group>"; };
|
||||
831A4FD42865A7DC0049CFE4 /* CDSPBlockConvolver.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CDSPBlockConvolver.h; sourceTree = "<group>"; };
|
||||
831A4FD52865A7DC0049CFE4 /* fft4g.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = fft4g.h; sourceTree = "<group>"; };
|
||||
831A4FD62865A7DC0049CFE4 /* CDSPHBDownsampler.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CDSPHBDownsampler.h; sourceTree = "<group>"; };
|
||||
831A4FD72865A7DC0049CFE4 /* r8bconf.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = r8bconf.h; sourceTree = "<group>"; };
|
||||
831A4FD82865A7DC0049CFE4 /* CDSPFracInterpolator.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CDSPFracInterpolator.h; sourceTree = "<group>"; };
|
||||
831A4FD92865A7DC0049CFE4 /* CDSPFIRFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CDSPFIRFilter.h; sourceTree = "<group>"; };
|
||||
831A4FDA2865A7DC0049CFE4 /* r8bbase.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = r8bbase.cpp; sourceTree = "<group>"; };
|
||||
831A4FDB2865A7DC0049CFE4 /* pffft.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = pffft.h; sourceTree = "<group>"; };
|
||||
831A50132865A7FD0049CFE4 /* r8bstate.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = r8bstate.hpp; sourceTree = "<group>"; };
|
||||
831A50152865A8800049CFE4 /* r8bstate.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = r8bstate.cpp; sourceTree = "<group>"; };
|
||||
831A50172865A8B30049CFE4 /* r8bstate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = r8bstate.h; sourceTree = "<group>"; };
|
||||
8328995127CB510F00D7F028 /* RedundantPlaylistDataStore.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = RedundantPlaylistDataStore.m; path = ../../Utils/RedundantPlaylistDataStore.m; sourceTree = "<group>"; };
|
||||
8328995227CB511000D7F028 /* RedundantPlaylistDataStore.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = RedundantPlaylistDataStore.h; path = ../../Utils/RedundantPlaylistDataStore.h; sourceTree = "<group>"; };
|
||||
8328995527CB51B700D7F028 /* SHA256Digest.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = SHA256Digest.h; path = ../../Utils/SHA256Digest.h; sourceTree = "<group>"; };
|
||||
|
@ -185,66 +208,30 @@
|
|||
834FD4EC27AF91220063BC83 /* AudioChunk.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = AudioChunk.m; sourceTree = "<group>"; };
|
||||
834FD4EE27AF93680063BC83 /* ChunkList.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ChunkList.h; sourceTree = "<group>"; };
|
||||
834FD4EF27AF93680063BC83 /* ChunkList.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = ChunkList.m; sourceTree = "<group>"; };
|
||||
834FD4F227AFA2150063BC83 /* Downmix.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Downmix.h; sourceTree = "<group>"; };
|
||||
834FD4F327AFA2150063BC83 /* Downmix.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = Downmix.m; sourceTree = "<group>"; };
|
||||
835C88A42797D4D400E28EAE /* LICENSE.LGPL */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = LICENSE.LGPL; sourceTree = "<group>"; };
|
||||
835C88A52797D4D400E28EAE /* License.txt */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = License.txt; sourceTree = "<group>"; };
|
||||
835C88A62797D4D400E28EAE /* lpc.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = lpc.c; sourceTree = "<group>"; };
|
||||
835C88A72797D4D400E28EAE /* lpc.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = lpc.h; sourceTree = "<group>"; };
|
||||
835C88AC2797DA5800E28EAE /* util.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = util.h; path = ThirdParty/lvqcl/util.h; sourceTree = SOURCE_ROOT; };
|
||||
83504163286447DA006B32CC /* Downmix.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Downmix.h; sourceTree = "<group>"; };
|
||||
83504164286447DA006B32CC /* Downmix.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = Downmix.m; sourceTree = "<group>"; };
|
||||
8350416C28646149006B32CC /* CoreMedia.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreMedia.framework; path = System/Library/Frameworks/CoreMedia.framework; sourceTree = SDKROOT; };
|
||||
835C88AF279811A500E28EAE /* hdcd_decode2.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = hdcd_decode2.h; sourceTree = "<group>"; };
|
||||
835C88B0279811A500E28EAE /* hdcd_decode2.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = hdcd_decode2.c; sourceTree = "<group>"; };
|
||||
835EDD7A279FE23A001EDCCE /* HeadphoneFilter.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; path = HeadphoneFilter.mm; sourceTree = "<group>"; };
|
||||
835EDD7C279FE307001EDCCE /* HeadphoneFilter.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = HeadphoneFilter.h; sourceTree = "<group>"; };
|
||||
835FAC5C27BCA14D00BA8562 /* BadSampleCleaner.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = BadSampleCleaner.h; path = Utils/BadSampleCleaner.h; sourceTree = SOURCE_ROOT; };
|
||||
835FAC5D27BCA14D00BA8562 /* BadSampleCleaner.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = BadSampleCleaner.m; path = Utils/BadSampleCleaner.m; sourceTree = SOURCE_ROOT; };
|
||||
8363BABD284E428F00E5C9DD /* pffft.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = pffft.cpp; sourceTree = "<group>"; };
|
||||
83725A7B27AA0D8A0003F694 /* Accelerate.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Accelerate.framework; path = System/Library/Frameworks/Accelerate.framework; sourceTree = SDKROOT; };
|
||||
83725A7C27AA0D8E0003F694 /* AVFoundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AVFoundation.framework; path = System/Library/Frameworks/AVFoundation.framework; sourceTree = SDKROOT; };
|
||||
8377C64B27B8C51500E8BC0F /* fft_accelerate.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = fft_accelerate.c; sourceTree = "<group>"; };
|
||||
8377C64D27B8C54400E8BC0F /* fft.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = fft.h; sourceTree = "<group>"; };
|
||||
8377C65027B8CAD100E8BC0F /* VisualizationController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = VisualizationController.h; sourceTree = "<group>"; };
|
||||
8377C65127B8CAD100E8BC0F /* VisualizationController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = VisualizationController.m; sourceTree = "<group>"; };
|
||||
8384912618080FF100E7332D /* Logging.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = Logging.h; path = ../../Utils/Logging.h; sourceTree = "<group>"; };
|
||||
839065F22853338700636FBB /* dsd2float.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = dsd2float.h; sourceTree = "<group>"; };
|
||||
839366651815923C006DD712 /* CogPluginMulti.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CogPluginMulti.h; sourceTree = "<group>"; };
|
||||
839366661815923C006DD712 /* CogPluginMulti.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CogPluginMulti.m; sourceTree = "<group>"; };
|
||||
8399CF2A27B5D1D4008751F1 /* NSDictionary+Merge.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "NSDictionary+Merge.h"; path = "../../Utils/NSDictionary+Merge.h"; sourceTree = "<group>"; };
|
||||
8399CF2B27B5D1D4008751F1 /* NSDictionary+Merge.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = "NSDictionary+Merge.m"; path = "../../Utils/NSDictionary+Merge.m"; sourceTree = "<group>"; };
|
||||
83B69B6B2845DF6500D2435A /* pffft_double.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = pffft_double.h; sourceTree = "<group>"; };
|
||||
83B69B6D2845DF6500D2435A /* pf_neon_double_from_avx.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = pf_neon_double_from_avx.h; sourceTree = "<group>"; };
|
||||
83B69B6E2845DF6500D2435A /* pf_double.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = pf_double.h; sourceTree = "<group>"; };
|
||||
83B69B6F2845DF6500D2435A /* pf_neon_double.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = pf_neon_double.h; sourceTree = "<group>"; };
|
||||
83B69B702845DF6500D2435A /* pf_sse2_double.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = pf_sse2_double.h; sourceTree = "<group>"; };
|
||||
83B69B712845DF6500D2435A /* pf_avx_double.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = pf_avx_double.h; sourceTree = "<group>"; };
|
||||
83B69B722845DF6500D2435A /* pf_scalar_double.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = pf_scalar_double.h; sourceTree = "<group>"; };
|
||||
83B69B732845DF6500D2435A /* pffft_priv_impl.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = pffft_priv_impl.h; sourceTree = "<group>"; };
|
||||
83B69B742845DF6500D2435A /* pffft_double.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = pffft_double.c; sourceTree = "<group>"; };
|
||||
83F18ADF27D1E8EF00385946 /* CDSPHBDownsampler.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CDSPHBDownsampler.h; sourceTree = "<group>"; };
|
||||
83F18AF827D1E8EF00385946 /* CDSPSincFilterGen.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CDSPSincFilterGen.h; sourceTree = "<group>"; };
|
||||
83F18AF927D1E8EF00385946 /* r8butil.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = r8butil.h; sourceTree = "<group>"; };
|
||||
83F18AFB27D1E8EF00385946 /* LICENSE */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = LICENSE; sourceTree = "<group>"; };
|
||||
83F18AFC27D1E8EF00385946 /* r8bbase.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = r8bbase.h; sourceTree = "<group>"; };
|
||||
83F18AFD27D1E8EF00385946 /* CDSPFIRFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CDSPFIRFilter.h; sourceTree = "<group>"; };
|
||||
83F18B0827D1E8EF00385946 /* CDSPProcessor.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CDSPProcessor.h; sourceTree = "<group>"; };
|
||||
83F18B0927D1E8EF00385946 /* README.md */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = net.daringfireball.markdown; path = README.md; sourceTree = "<group>"; };
|
||||
83F18B0A27D1E8EF00385946 /* fft4g.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = fft4g.h; sourceTree = "<group>"; };
|
||||
83F18B0B27D1E8EF00385946 /* CDSPRealFFT.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CDSPRealFFT.h; sourceTree = "<group>"; };
|
||||
83F18B0C27D1E8EF00385946 /* CDSPFracInterpolator.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CDSPFracInterpolator.h; sourceTree = "<group>"; };
|
||||
83F18B1727D1E8EF00385946 /* CDSPBlockConvolver.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CDSPBlockConvolver.h; sourceTree = "<group>"; };
|
||||
83F18B1827D1E8EF00385946 /* CDSPHBUpsampler.inc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.pascal; path = CDSPHBUpsampler.inc; sourceTree = "<group>"; };
|
||||
83F18B1927D1E8EF00385946 /* r8bconf.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = r8bconf.h; sourceTree = "<group>"; };
|
||||
83F18B1A27D1E8EF00385946 /* r8bbase.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = r8bbase.cpp; sourceTree = "<group>"; };
|
||||
83F18B1B27D1E8EF00385946 /* pffft.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = pffft.h; sourceTree = "<group>"; };
|
||||
83F18B1C27D1E8EF00385946 /* CDSPResampler.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CDSPResampler.h; sourceTree = "<group>"; };
|
||||
83F18B1D27D1E8EF00385946 /* CDSPHBUpsampler.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CDSPHBUpsampler.h; sourceTree = "<group>"; };
|
||||
83F18B5527D1F5E900385946 /* r8bstate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = r8bstate.h; path = ThirdParty/r8bstate.h; sourceTree = SOURCE_ROOT; };
|
||||
839B83F9286D91ED00F529EE /* VisualizationController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = VisualizationController.swift; sourceTree = "<group>"; };
|
||||
8DC2EF5A0486A6940098B216 /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist; path = Info.plist; sourceTree = "<group>"; };
|
||||
8DC2EF5B0486A6940098B216 /* CogAudio.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = CogAudio.framework; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||
8E8D3D2D0CBAEE6E00135C1B /* AudioContainer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AudioContainer.h; sourceTree = "<group>"; };
|
||||
8E8D3D2E0CBAEE6E00135C1B /* AudioContainer.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AudioContainer.m; sourceTree = "<group>"; };
|
||||
8EC1225D0B993BD500C5B3AD /* ConverterNode.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = ConverterNode.h; sourceTree = "<group>"; };
|
||||
8EC1225E0B993BD500C5B3AD /* ConverterNode.mm */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.objcpp; path = ConverterNode.mm; sourceTree = "<group>"; };
|
||||
8EC1225E0B993BD500C5B3AD /* ConverterNode.m */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.objc; path = ConverterNode.m; sourceTree = "<group>"; };
|
||||
B0575F2C0D687A0800411D77 /* Helper.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Helper.h; sourceTree = "<group>"; };
|
||||
B0575F2F0D687A4000411D77 /* Helper.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = Helper.m; sourceTree = "<group>"; };
|
||||
D2F7E79907B2D74100F64583 /* CoreData.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreData.framework; path = /System/Library/Frameworks/CoreData.framework; sourceTree = "<absolute>"; };
|
||||
|
@ -258,6 +245,7 @@
|
|||
8328995A27CB51C900D7F028 /* Security.framework in Frameworks */,
|
||||
83725A9127AA16D50003F694 /* AVFoundation.framework in Frameworks */,
|
||||
8DC2EF570486A6940098B216 /* Cocoa.framework in Frameworks */,
|
||||
8350416D28646149006B32CC /* CoreMedia.framework in Frameworks */,
|
||||
83725A9027AA16C90003F694 /* Accelerate.framework in Frameworks */,
|
||||
17D21DAD0B8BE76800D1EBDE /* AudioToolbox.framework in Frameworks */,
|
||||
17D21DAE0B8BE76800D1EBDE /* AudioUnit.framework in Frameworks */,
|
||||
|
@ -370,22 +358,20 @@
|
|||
children = (
|
||||
834FD4EA27AF8F380063BC83 /* AudioChunk.h */,
|
||||
834FD4EC27AF91220063BC83 /* AudioChunk.m */,
|
||||
834FD4EE27AF93680063BC83 /* ChunkList.h */,
|
||||
834FD4EF27AF93680063BC83 /* ChunkList.m */,
|
||||
834FD4F227AFA2150063BC83 /* Downmix.h */,
|
||||
834FD4F327AFA2150063BC83 /* Downmix.m */,
|
||||
17D21C760B8BE4BA00D1EBDE /* BufferChain.h */,
|
||||
17D21C770B8BE4BA00D1EBDE /* BufferChain.m */,
|
||||
834FD4EE27AF93680063BC83 /* ChunkList.h */,
|
||||
834FD4EF27AF93680063BC83 /* ChunkList.m */,
|
||||
8EC1225D0B993BD500C5B3AD /* ConverterNode.h */,
|
||||
8EC1225E0B993BD500C5B3AD /* ConverterNode.mm */,
|
||||
8EC1225E0B993BD500C5B3AD /* ConverterNode.m */,
|
||||
83504163286447DA006B32CC /* Downmix.h */,
|
||||
83504164286447DA006B32CC /* Downmix.m */,
|
||||
17D21C7A0B8BE4BA00D1EBDE /* InputNode.h */,
|
||||
17D21C7B0B8BE4BA00D1EBDE /* InputNode.m */,
|
||||
17D21C7C0B8BE4BA00D1EBDE /* Node.h */,
|
||||
17D21C7D0B8BE4BA00D1EBDE /* Node.m */,
|
||||
17D21C7E0B8BE4BA00D1EBDE /* OutputNode.h */,
|
||||
17D21C7F0B8BE4BA00D1EBDE /* OutputNode.m */,
|
||||
835EDD7C279FE307001EDCCE /* HeadphoneFilter.h */,
|
||||
835EDD7A279FE23A001EDCCE /* HeadphoneFilter.mm */,
|
||||
);
|
||||
path = Chain;
|
||||
sourceTree = "<group>";
|
||||
|
@ -393,8 +379,8 @@
|
|||
17D21C9B0B8BE4BA00D1EBDE /* Output */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
17D21C9C0B8BE4BA00D1EBDE /* OutputCoreAudio.h */,
|
||||
17D21C9D0B8BE4BA00D1EBDE /* OutputCoreAudio.m */,
|
||||
17D21C9C0B8BE4BA00D1EBDE /* OutputAVFoundation.h */,
|
||||
17D21C9D0B8BE4BA00D1EBDE /* OutputAVFoundation.m */,
|
||||
);
|
||||
path = Output;
|
||||
sourceTree = "<group>";
|
||||
|
@ -402,10 +388,12 @@
|
|||
17D21CD80B8BE5B400D1EBDE /* ThirdParty */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
83F18ADE27D1E8EF00385946 /* r8brain-free-src */,
|
||||
831A50152865A8800049CFE4 /* r8bstate.cpp */,
|
||||
831A50172865A8B30049CFE4 /* r8bstate.h */,
|
||||
831A50132865A7FD0049CFE4 /* r8bstate.hpp */,
|
||||
831A4F9C2865A7DC0049CFE4 /* r8brain-free-src */,
|
||||
8377C64A27B8C51500E8BC0F /* deadbeef */,
|
||||
835C88AE279811A500E28EAE /* hdcd */,
|
||||
835C88A22797D4D400E28EAE /* lvqcl */,
|
||||
17D21DC40B8BE79700D1EBDE /* CoreAudioUtils */,
|
||||
);
|
||||
path = ThirdParty;
|
||||
|
@ -449,24 +437,53 @@
|
|||
name = "Other Sources";
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
835C88A22797D4D400E28EAE /* lvqcl */ = {
|
||||
831A4F9C2865A7DC0049CFE4 /* r8brain-free-src */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
835C88A32797D4D400E28EAE /* License */,
|
||||
835C88A62797D4D400E28EAE /* lpc.c */,
|
||||
835C88A72797D4D400E28EAE /* lpc.h */,
|
||||
835C88AC2797DA5800E28EAE /* util.h */,
|
||||
831A4F9D2865A7DC0049CFE4 /* CDSPProcessor.h */,
|
||||
831A4F9E2865A7DC0049CFE4 /* CDSPRealFFT.h */,
|
||||
831A4F9F2865A7DC0049CFE4 /* pffft_double */,
|
||||
831A4FB72865A7DC0049CFE4 /* CDSPHBUpsampler.inc */,
|
||||
831A4FB82865A7DC0049CFE4 /* r8butil.h */,
|
||||
831A4FBA2865A7DC0049CFE4 /* r8bbase.h */,
|
||||
831A4FC42865A7DC0049CFE4 /* CDSPSincFilterGen.h */,
|
||||
831A4FD02865A7DC0049CFE4 /* LICENSE */,
|
||||
831A4FD12865A7DC0049CFE4 /* CDSPResampler.h */,
|
||||
831A4FD22865A7DC0049CFE4 /* CDSPHBUpsampler.h */,
|
||||
831A4FD42865A7DC0049CFE4 /* CDSPBlockConvolver.h */,
|
||||
831A4FD52865A7DC0049CFE4 /* fft4g.h */,
|
||||
831A4FD62865A7DC0049CFE4 /* CDSPHBDownsampler.h */,
|
||||
831A4FD72865A7DC0049CFE4 /* r8bconf.h */,
|
||||
831A4FD82865A7DC0049CFE4 /* CDSPFracInterpolator.h */,
|
||||
831A4FD92865A7DC0049CFE4 /* CDSPFIRFilter.h */,
|
||||
831A4FDA2865A7DC0049CFE4 /* r8bbase.cpp */,
|
||||
831A4FDB2865A7DC0049CFE4 /* pffft.h */,
|
||||
);
|
||||
path = lvqcl;
|
||||
path = "r8brain-free-src";
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
835C88A32797D4D400E28EAE /* License */ = {
|
||||
831A4F9F2865A7DC0049CFE4 /* pffft_double */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
835C88A42797D4D400E28EAE /* LICENSE.LGPL */,
|
||||
835C88A52797D4D400E28EAE /* License.txt */,
|
||||
831A4FA02865A7DC0049CFE4 /* pffft_double.h */,
|
||||
831A4FA12865A7DC0049CFE4 /* simd */,
|
||||
831A4FA82865A7DC0049CFE4 /* pffft_priv_impl.h */,
|
||||
831A4FA92865A7DC0049CFE4 /* pffft_double.c */,
|
||||
);
|
||||
path = License;
|
||||
path = pffft_double;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
831A4FA12865A7DC0049CFE4 /* simd */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
831A4FA22865A7DC0049CFE4 /* pf_neon_double_from_avx.h */,
|
||||
831A4FA32865A7DC0049CFE4 /* pf_double.h */,
|
||||
831A4FA42865A7DC0049CFE4 /* pf_neon_double.h */,
|
||||
831A4FA52865A7DC0049CFE4 /* pf_sse2_double.h */,
|
||||
831A4FA62865A7DC0049CFE4 /* pf_avx_double.h */,
|
||||
831A4FA72865A7DC0049CFE4 /* pf_scalar_double.h */,
|
||||
);
|
||||
path = simd;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
835C88AE279811A500E28EAE /* hdcd */ = {
|
||||
|
@ -481,6 +498,7 @@
|
|||
83725A8F27AA16C90003F694 /* Frameworks */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
8350416C28646149006B32CC /* CoreMedia.framework */,
|
||||
8328995927CB51C900D7F028 /* Security.framework */,
|
||||
);
|
||||
name = Frameworks;
|
||||
|
@ -498,64 +516,11 @@
|
|||
8377C64F27B8CAAB00E8BC0F /* Visualization */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
8377C65027B8CAD100E8BC0F /* VisualizationController.h */,
|
||||
8377C65127B8CAD100E8BC0F /* VisualizationController.m */,
|
||||
839B83F9286D91ED00F529EE /* VisualizationController.swift */,
|
||||
);
|
||||
path = Visualization;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
83B69B6A2845DF6500D2435A /* pffft_double */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
83B69B6B2845DF6500D2435A /* pffft_double.h */,
|
||||
83B69B6C2845DF6500D2435A /* simd */,
|
||||
83B69B732845DF6500D2435A /* pffft_priv_impl.h */,
|
||||
83B69B742845DF6500D2435A /* pffft_double.c */,
|
||||
);
|
||||
path = pffft_double;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
83B69B6C2845DF6500D2435A /* simd */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
83B69B6D2845DF6500D2435A /* pf_neon_double_from_avx.h */,
|
||||
83B69B6E2845DF6500D2435A /* pf_double.h */,
|
||||
83B69B6F2845DF6500D2435A /* pf_neon_double.h */,
|
||||
83B69B702845DF6500D2435A /* pf_sse2_double.h */,
|
||||
83B69B712845DF6500D2435A /* pf_avx_double.h */,
|
||||
83B69B722845DF6500D2435A /* pf_scalar_double.h */,
|
||||
);
|
||||
path = simd;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
83F18ADE27D1E8EF00385946 /* r8brain-free-src */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
8363BABD284E428F00E5C9DD /* pffft.cpp */,
|
||||
83B69B6A2845DF6500D2435A /* pffft_double */,
|
||||
83F18ADF27D1E8EF00385946 /* CDSPHBDownsampler.h */,
|
||||
83F18AF827D1E8EF00385946 /* CDSPSincFilterGen.h */,
|
||||
83F18AF927D1E8EF00385946 /* r8butil.h */,
|
||||
83F18AFB27D1E8EF00385946 /* LICENSE */,
|
||||
83F18AFC27D1E8EF00385946 /* r8bbase.h */,
|
||||
83F18AFD27D1E8EF00385946 /* CDSPFIRFilter.h */,
|
||||
83F18B0827D1E8EF00385946 /* CDSPProcessor.h */,
|
||||
83F18B0927D1E8EF00385946 /* README.md */,
|
||||
83F18B0A27D1E8EF00385946 /* fft4g.h */,
|
||||
83F18B0B27D1E8EF00385946 /* CDSPRealFFT.h */,
|
||||
83F18B0C27D1E8EF00385946 /* CDSPFracInterpolator.h */,
|
||||
83F18B1727D1E8EF00385946 /* CDSPBlockConvolver.h */,
|
||||
83F18B1827D1E8EF00385946 /* CDSPHBUpsampler.inc */,
|
||||
83F18B1927D1E8EF00385946 /* r8bconf.h */,
|
||||
83F18B1A27D1E8EF00385946 /* r8bbase.cpp */,
|
||||
83F18B1B27D1E8EF00385946 /* pffft.h */,
|
||||
83F18B1C27D1E8EF00385946 /* CDSPResampler.h */,
|
||||
83F18B1D27D1E8EF00385946 /* CDSPHBUpsampler.h */,
|
||||
83F18B5527D1F5E900385946 /* r8bstate.h */,
|
||||
);
|
||||
path = "r8brain-free-src";
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
/* End PBXGroup section */
|
||||
|
||||
/* Begin PBXHeadersBuildPhase section */
|
||||
|
@ -563,64 +528,61 @@
|
|||
isa = PBXHeadersBuildPhase;
|
||||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
83B69B7C2845DF6500D2435A /* pffft_priv_impl.h in Headers */,
|
||||
17D21CA10B8BE4BA00D1EBDE /* BufferChain.h in Headers */,
|
||||
831A4FE02865A7DC0049CFE4 /* pf_double.h in Headers */,
|
||||
831A50142865A7FD0049CFE4 /* r8bstate.hpp in Headers */,
|
||||
17D21CA50B8BE4BA00D1EBDE /* InputNode.h in Headers */,
|
||||
17D21CA70B8BE4BA00D1EBDE /* Node.h in Headers */,
|
||||
83B69B7B2845DF6500D2435A /* pf_scalar_double.h in Headers */,
|
||||
83F18B3427D1E8EF00385946 /* r8butil.h in Headers */,
|
||||
8399CF2C27B5D1D5008751F1 /* NSDictionary+Merge.h in Headers */,
|
||||
831A4FF32865A7DC0049CFE4 /* r8butil.h in Headers */,
|
||||
17D21CA90B8BE4BA00D1EBDE /* OutputNode.h in Headers */,
|
||||
83B69B792845DF6500D2435A /* pf_sse2_double.h in Headers */,
|
||||
83F18B4527D1E8EF00385946 /* CDSPRealFFT.h in Headers */,
|
||||
83F18B3827D1E8EF00385946 /* CDSPFIRFilter.h in Headers */,
|
||||
8328995427CB511000D7F028 /* RedundantPlaylistDataStore.h in Headers */,
|
||||
17D21CC50B8BE4BA00D1EBDE /* OutputCoreAudio.h in Headers */,
|
||||
834FD4F427AFA2150063BC83 /* Downmix.h in Headers */,
|
||||
831A50102865A7DC0049CFE4 /* CDSPFIRFilter.h in Headers */,
|
||||
831A4FFE2865A7DC0049CFE4 /* CDSPSincFilterGen.h in Headers */,
|
||||
831A4FF52865A7DC0049CFE4 /* r8bbase.h in Headers */,
|
||||
831A50082865A7DC0049CFE4 /* CDSPResampler.h in Headers */,
|
||||
17D21CC50B8BE4BA00D1EBDE /* OutputAVFoundation.h in Headers */,
|
||||
83504165286447DA006B32CC /* Downmix.h in Headers */,
|
||||
831A4FDE2865A7DC0049CFE4 /* pffft_double.h in Headers */,
|
||||
831A4FE12865A7DC0049CFE4 /* pf_neon_double.h in Headers */,
|
||||
17D21CC70B8BE4BA00D1EBDE /* Status.h in Headers */,
|
||||
835C88AB2797D4D400E28EAE /* lpc.h in Headers */,
|
||||
17D21CF30B8BE5EF00D1EBDE /* Semaphore.h in Headers */,
|
||||
17D21DC70B8BE79700D1EBDE /* CoreAudioUtils.h in Headers */,
|
||||
83F18B3327D1E8EF00385946 /* CDSPSincFilterGen.h in Headers */,
|
||||
17D21EBD0B8BF44000D1EBDE /* AudioPlayer.h in Headers */,
|
||||
83F18B4427D1E8EF00385946 /* fft4g.h in Headers */,
|
||||
83F18B1E27D1E8EF00385946 /* CDSPHBDownsampler.h in Headers */,
|
||||
83B69B762845DF6500D2435A /* pf_neon_double_from_avx.h in Headers */,
|
||||
83F18B5627D1F5E900385946 /* r8bstate.h in Headers */,
|
||||
8377C65227B8CAD100E8BC0F /* VisualizationController.h in Headers */,
|
||||
83B69B772845DF6500D2435A /* pf_double.h in Headers */,
|
||||
831A50182865A8B30049CFE4 /* r8bstate.h in Headers */,
|
||||
831A4FE52865A7DC0049CFE4 /* pffft_priv_impl.h in Headers */,
|
||||
831A4FE42865A7DC0049CFE4 /* pf_scalar_double.h in Headers */,
|
||||
831A500D2865A7DC0049CFE4 /* CDSPHBDownsampler.h in Headers */,
|
||||
831A500C2865A7DC0049CFE4 /* fft4g.h in Headers */,
|
||||
834FD4F027AF93680063BC83 /* ChunkList.h in Headers */,
|
||||
17F94DD50B8D0F7000A34E87 /* PluginController.h in Headers */,
|
||||
83B69B782845DF6500D2435A /* pf_neon_double.h in Headers */,
|
||||
831A50122865A7DC0049CFE4 /* pffft.h in Headers */,
|
||||
831A4FDC2865A7DC0049CFE4 /* CDSPProcessor.h in Headers */,
|
||||
831A4FDD2865A7DC0049CFE4 /* CDSPRealFFT.h in Headers */,
|
||||
17F94DDD0B8D101100A34E87 /* Plugin.h in Headers */,
|
||||
83F18B5227D1E8F000385946 /* pffft.h in Headers */,
|
||||
8328995727CB51B700D7F028 /* SHA256Digest.h in Headers */,
|
||||
83B69B752845DF6500D2435A /* pffft_double.h in Headers */,
|
||||
83F18B4627D1E8EF00385946 /* CDSPFracInterpolator.h in Headers */,
|
||||
834FD4EB27AF8F380063BC83 /* AudioChunk.h in Headers */,
|
||||
83F18B4E27D1E8F000385946 /* CDSPBlockConvolver.h in Headers */,
|
||||
83F18B4227D1E8EF00385946 /* CDSPProcessor.h in Headers */,
|
||||
83B69B7A2845DF6500D2435A /* pf_avx_double.h in Headers */,
|
||||
17A2D3C50B8D1D37000778C4 /* AudioDecoder.h in Headers */,
|
||||
831A50092865A7DC0049CFE4 /* CDSPHBUpsampler.h in Headers */,
|
||||
831A500E2865A7DC0049CFE4 /* r8bconf.h in Headers */,
|
||||
8347C7412796C58800FA8A7D /* NSFileHandle+CreateFile.h in Headers */,
|
||||
17C940230B900909008627D6 /* AudioMetadataReader.h in Headers */,
|
||||
831A500F2865A7DC0049CFE4 /* CDSPFracInterpolator.h in Headers */,
|
||||
831A4FE22865A7DC0049CFE4 /* pf_sse2_double.h in Headers */,
|
||||
839065F32853338700636FBB /* dsd2float.h in Headers */,
|
||||
17B619300B909BC300BC003F /* AudioPropertiesReader.h in Headers */,
|
||||
83F18B5427D1E8F000385946 /* CDSPHBUpsampler.h in Headers */,
|
||||
835EDD7D279FE307001EDCCE /* HeadphoneFilter.h in Headers */,
|
||||
831A4FDF2865A7DC0049CFE4 /* pf_neon_double_from_avx.h in Headers */,
|
||||
831A4FE32865A7DC0049CFE4 /* pf_avx_double.h in Headers */,
|
||||
839366671815923C006DD712 /* CogPluginMulti.h in Headers */,
|
||||
83F18B5327D1E8F000385946 /* CDSPResampler.h in Headers */,
|
||||
17ADB13C0B97926D00257CA2 /* AudioSource.h in Headers */,
|
||||
831A500B2865A7DC0049CFE4 /* CDSPBlockConvolver.h in Headers */,
|
||||
835C88B1279811A500E28EAE /* hdcd_decode2.h in Headers */,
|
||||
8EC1225F0B993BD500C5B3AD /* ConverterNode.h in Headers */,
|
||||
8384912718080FF100E7332D /* Logging.h in Headers */,
|
||||
8377C64E27B8C54400E8BC0F /* fft.h in Headers */,
|
||||
83F18B5027D1E8F000385946 /* r8bconf.h in Headers */,
|
||||
835FAC5E27BCA14D00BA8562 /* BadSampleCleaner.h in Headers */,
|
||||
8E8D3D2F0CBAEE6E00135C1B /* AudioContainer.h in Headers */,
|
||||
83F18B3727D1E8EF00385946 /* r8bbase.h in Headers */,
|
||||
B0575F2D0D687A0800411D77 /* Helper.h in Headers */,
|
||||
835C88AD2797DA5800E28EAE /* util.h in Headers */,
|
||||
07DB5F3E0ED353A900C2E3EF /* AudioMetadataWriter.h in Headers */,
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
|
@ -658,8 +620,8 @@
|
|||
LastUpgradeCheck = 1400;
|
||||
TargetAttributes = {
|
||||
8DC2EF4F0486A6940098B216 = {
|
||||
DevelopmentTeam = "";
|
||||
ProvisioningStyle = Automatic;
|
||||
LastSwiftMigration = 1330;
|
||||
ProvisioningStyle = Manual;
|
||||
};
|
||||
};
|
||||
};
|
||||
|
@ -686,10 +648,7 @@
|
|||
isa = PBXResourcesBuildPhase;
|
||||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
83F18B3627D1E8EF00385946 /* LICENSE in Resources */,
|
||||
835C88A92797D4D400E28EAE /* License.txt in Resources */,
|
||||
835C88A82797D4D400E28EAE /* LICENSE.LGPL in Resources */,
|
||||
83F18B4327D1E8EF00385946 /* README.md in Resources */,
|
||||
831A50072865A7DC0049CFE4 /* LICENSE in Resources */,
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
};
|
||||
|
@ -700,37 +659,36 @@
|
|||
isa = PBXSourcesBuildPhase;
|
||||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
83D40B572852CB3B003BB85C /* pffft_double.c in Sources */,
|
||||
835EDD7B279FE23A001EDCCE /* HeadphoneFilter.mm in Sources */,
|
||||
17D21CA20B8BE4BA00D1EBDE /* BufferChain.m in Sources */,
|
||||
17D21CA60B8BE4BA00D1EBDE /* InputNode.m in Sources */,
|
||||
831A50112865A7DC0049CFE4 /* r8bbase.cpp in Sources */,
|
||||
83504166286447DA006B32CC /* Downmix.m in Sources */,
|
||||
8399CF2D27B5D1D5008751F1 /* NSDictionary+Merge.m in Sources */,
|
||||
831A50162865A8800049CFE4 /* r8bstate.cpp in Sources */,
|
||||
17D21CA80B8BE4BA00D1EBDE /* Node.m in Sources */,
|
||||
17D21CAA0B8BE4BA00D1EBDE /* OutputNode.m in Sources */,
|
||||
8377C65327B8CAD100E8BC0F /* VisualizationController.m in Sources */,
|
||||
834FD4F527AFA2150063BC83 /* Downmix.m in Sources */,
|
||||
17D21CC60B8BE4BA00D1EBDE /* OutputCoreAudio.m in Sources */,
|
||||
17D21CC60B8BE4BA00D1EBDE /* OutputAVFoundation.m in Sources */,
|
||||
835C88B2279811A500E28EAE /* hdcd_decode2.c in Sources */,
|
||||
835FAC5F27BCA14D00BA8562 /* BadSampleCleaner.m in Sources */,
|
||||
834FD4ED27AF91220063BC83 /* AudioChunk.m in Sources */,
|
||||
83F18B5127D1E8F000385946 /* r8bbase.cpp in Sources */,
|
||||
17D21CF40B8BE5EF00D1EBDE /* Semaphore.m in Sources */,
|
||||
839B83FA286D91ED00F529EE /* VisualizationController.swift in Sources */,
|
||||
8347C7422796C58800FA8A7D /* NSFileHandle+CreateFile.m in Sources */,
|
||||
17D21DC80B8BE79700D1EBDE /* CoreAudioUtils.m in Sources */,
|
||||
8328995327CB511000D7F028 /* RedundantPlaylistDataStore.m in Sources */,
|
||||
8377C64C27B8C51500E8BC0F /* fft_accelerate.c in Sources */,
|
||||
8363BABE284E428F00E5C9DD /* pffft.cpp in Sources */,
|
||||
839366681815923C006DD712 /* CogPluginMulti.m in Sources */,
|
||||
835C88AA2797D4D400E28EAE /* lpc.c in Sources */,
|
||||
17D21EBE0B8BF44000D1EBDE /* AudioPlayer.m in Sources */,
|
||||
17F94DD60B8D0F7000A34E87 /* PluginController.mm in Sources */,
|
||||
831A4FE62865A7DC0049CFE4 /* pffft_double.c in Sources */,
|
||||
831A4FF22865A7DC0049CFE4 /* CDSPHBUpsampler.inc in Sources */,
|
||||
17A2D3C60B8D1D37000778C4 /* AudioDecoder.m in Sources */,
|
||||
8328995827CB51B700D7F028 /* SHA256Digest.m in Sources */,
|
||||
17C940240B900909008627D6 /* AudioMetadataReader.m in Sources */,
|
||||
17B619310B909BC300BC003F /* AudioPropertiesReader.m in Sources */,
|
||||
17ADB13D0B97926D00257CA2 /* AudioSource.m in Sources */,
|
||||
834FD4F127AF93680063BC83 /* ChunkList.m in Sources */,
|
||||
8EC122600B993BD500C5B3AD /* ConverterNode.mm in Sources */,
|
||||
8EC122600B993BD500C5B3AD /* ConverterNode.m in Sources */,
|
||||
8E8D3D300CBAEE6E00135C1B /* AudioContainer.m in Sources */,
|
||||
B0575F300D687A4000411D77 /* Helper.m in Sources */,
|
||||
07DB5F3F0ED353A900C2E3EF /* AudioMetadataWriter.m in Sources */,
|
||||
|
@ -743,18 +701,16 @@
|
|||
1DEB91AE08733DA50010E9CD /* Debug */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
buildSettings = {
|
||||
CODE_SIGN_IDENTITY = "";
|
||||
CODE_SIGN_STYLE = Automatic;
|
||||
CLANG_ENABLE_MODULES = YES;
|
||||
COMBINE_HIDPI_IMAGES = YES;
|
||||
COPY_PHASE_STRIP = NO;
|
||||
DEAD_CODE_STRIPPING = YES;
|
||||
DEVELOPMENT_TEAM = "";
|
||||
DEFINES_MODULE = YES;
|
||||
DYLIB_COMPATIBILITY_VERSION = 1;
|
||||
DYLIB_CURRENT_VERSION = 1;
|
||||
FRAMEWORK_VERSION = A;
|
||||
GCC_DYNAMIC_NO_PIC = NO;
|
||||
GCC_ENABLE_OBJC_EXCEPTIONS = YES;
|
||||
GCC_MODEL_TUNING = G5;
|
||||
GCC_OPTIMIZATION_LEVEL = 0;
|
||||
GCC_PRECOMPILE_PREFIX_HEADER = YES;
|
||||
GCC_PREFIX_HEADER = CogAudio_Prefix.pch;
|
||||
|
@ -766,31 +722,29 @@
|
|||
INFOPLIST_FILE = Info.plist;
|
||||
INSTALL_PATH = "@executable_path/../Frameworks";
|
||||
LD_RUNPATH_SEARCH_PATHS = "@loader_path/Frameworks";
|
||||
LIBRARY_SEARCH_PATHS = "$(inherited)";
|
||||
OTHER_LDFLAGS = "";
|
||||
PRODUCT_BUNDLE_IDENTIFIER = org.cogx.cogaudio;
|
||||
PRODUCT_NAME = CogAudio;
|
||||
PROVISIONING_PROFILE_SPECIFIER = "";
|
||||
SDKROOT = macosx;
|
||||
SKIP_INSTALL = YES;
|
||||
SWIFT_OPTIMIZATION_LEVEL = "-Onone";
|
||||
SWIFT_VERSION = 5.0;
|
||||
WARNING_LDFLAGS = "";
|
||||
WRAPPER_EXTENSION = framework;
|
||||
ZERO_LINK = YES;
|
||||
};
|
||||
name = Debug;
|
||||
};
|
||||
1DEB91AF08733DA50010E9CD /* Release */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
buildSettings = {
|
||||
CODE_SIGN_IDENTITY = "";
|
||||
CODE_SIGN_STYLE = Automatic;
|
||||
CLANG_ENABLE_MODULES = YES;
|
||||
COMBINE_HIDPI_IMAGES = YES;
|
||||
DEAD_CODE_STRIPPING = YES;
|
||||
DEVELOPMENT_TEAM = "";
|
||||
DEFINES_MODULE = YES;
|
||||
DYLIB_COMPATIBILITY_VERSION = 1;
|
||||
DYLIB_CURRENT_VERSION = 1;
|
||||
FRAMEWORK_VERSION = A;
|
||||
GCC_ENABLE_OBJC_EXCEPTIONS = YES;
|
||||
GCC_MODEL_TUNING = G5;
|
||||
GCC_PRECOMPILE_PREFIX_HEADER = YES;
|
||||
GCC_PREFIX_HEADER = CogAudio_Prefix.pch;
|
||||
GCC_PREPROCESSOR_DEFINITIONS = (
|
||||
|
@ -800,12 +754,12 @@
|
|||
INFOPLIST_FILE = Info.plist;
|
||||
INSTALL_PATH = "@executable_path/../Frameworks";
|
||||
LD_RUNPATH_SEARCH_PATHS = "@loader_path/Frameworks";
|
||||
LIBRARY_SEARCH_PATHS = "$(inherited)";
|
||||
OTHER_LDFLAGS = "";
|
||||
PRODUCT_BUNDLE_IDENTIFIER = org.cogx.cogaudio;
|
||||
PRODUCT_NAME = CogAudio;
|
||||
PROVISIONING_PROFILE_SPECIFIER = "";
|
||||
SDKROOT = macosx;
|
||||
SKIP_INSTALL = YES;
|
||||
SWIFT_VERSION = 5.0;
|
||||
WARNING_LDFLAGS = "";
|
||||
WRAPPER_EXTENSION = framework;
|
||||
};
|
||||
|
@ -850,7 +804,7 @@
|
|||
GCC_WARN_UNINITIALIZED_AUTOS = YES;
|
||||
GCC_WARN_UNUSED_FUNCTION = YES;
|
||||
GCC_WARN_UNUSED_VARIABLE = YES;
|
||||
MACOSX_DEPLOYMENT_TARGET = 10.12;
|
||||
MACOSX_DEPLOYMENT_TARGET = 10.13;
|
||||
ONLY_ACTIVE_ARCH = YES;
|
||||
SDKROOT = macosx;
|
||||
SYMROOT = ../build;
|
||||
|
@ -892,7 +846,7 @@
|
|||
GCC_WARN_UNINITIALIZED_AUTOS = YES;
|
||||
GCC_WARN_UNUSED_FUNCTION = YES;
|
||||
GCC_WARN_UNUSED_VARIABLE = YES;
|
||||
MACOSX_DEPLOYMENT_TARGET = 10.12;
|
||||
MACOSX_DEPLOYMENT_TARGET = 10.13;
|
||||
SDKROOT = macosx;
|
||||
SYMROOT = ../build;
|
||||
};
|
||||
|
|
|
@ -23,6 +23,7 @@
|
|||
}
|
||||
|
||||
+ (NSArray *)urlsForContainerURL:(NSURL *)url containers:(NSArray *)containers;
|
||||
+ (NSArray *)dependencyUrlsForContainerURL:(NSURL *)url containers:(NSArray *)containers;
|
||||
|
||||
@end
|
||||
|
||||
|
|
|
@ -171,6 +171,19 @@ static void *kCogDecoderMultiContext = &kCogDecoderMultiContext;
|
|||
return nil;
|
||||
}
|
||||
|
||||
+ (NSArray *)dependencyUrlsForContainerURL:(NSURL *)url containers:(NSArray *)containers {
|
||||
NSArray *sortedContainers = sortClassesByPriority(containers);
|
||||
for(NSString *classString in sortedContainers) {
|
||||
Class container = NSClassFromString(classString);
|
||||
if([container respondsToSelector:@selector(dependencyUrlsForContainerURL:)]) {
|
||||
NSArray *urls = [container dependencyUrlsForContainerURL:url];
|
||||
if([urls count])
|
||||
return urls;
|
||||
}
|
||||
}
|
||||
return nil;
|
||||
}
|
||||
|
||||
@end
|
||||
|
||||
@implementation CogMetadataReaderMulti
|
||||
|
|
|
@ -1,9 +1,9 @@
|
|||
//
|
||||
// OutputCoreAudio.h
|
||||
// OutputAVFoundation.h
|
||||
// Cog
|
||||
//
|
||||
// Created by Vincent Spader on 8/2/05.
|
||||
// Copyright 2005 Vincent Spader. All rights reserved.
|
||||
// Created by Christopher Snowhill on 6/23/22.
|
||||
// Copyright 2022 Christopher Snowhill. All rights reserved.
|
||||
//
|
||||
|
||||
#import <AssertMacros.h>
|
||||
|
@ -26,8 +26,6 @@ using std::atomic_long;
|
|||
|
||||
#import "VisualizationController.h"
|
||||
|
||||
#import "Semaphore.h"
|
||||
|
||||
//#define OUTPUT_LOG
|
||||
#ifdef OUTPUT_LOG
|
||||
#import <stdio.h>
|
||||
|
@ -35,28 +33,33 @@ using std::atomic_long;
|
|||
|
||||
@class OutputNode;
|
||||
|
||||
@interface OutputCoreAudio : NSObject {
|
||||
@interface OutputAVFoundation : NSObject {
|
||||
OutputNode *outputController;
|
||||
|
||||
Semaphore *writeSemaphore;
|
||||
Semaphore *readSemaphore;
|
||||
BOOL r8bDone;
|
||||
void *r8bstate, *r8bold;
|
||||
|
||||
void *r8bvis;
|
||||
double lastVisRate;
|
||||
|
||||
BOOL stopInvoked;
|
||||
BOOL stopCompleted;
|
||||
BOOL running;
|
||||
BOOL stopping;
|
||||
BOOL stopped;
|
||||
BOOL started;
|
||||
BOOL paused;
|
||||
BOOL stopNext;
|
||||
BOOL restarted;
|
||||
BOOL commandStop;
|
||||
|
||||
BOOL eqEnabled;
|
||||
BOOL eqInitialized;
|
||||
|
||||
BOOL dontRemix;
|
||||
|
||||
BOOL streamFormatStarted;
|
||||
|
||||
atomic_long bytesRendered;
|
||||
atomic_long bytesHdcdSustained;
|
||||
double secondsHdcdSustained;
|
||||
|
||||
BOOL defaultdevicelistenerapplied;
|
||||
BOOL currentdevicelistenerapplied;
|
||||
|
@ -67,29 +70,41 @@ using std::atomic_long;
|
|||
float volume;
|
||||
float eqPreamp;
|
||||
|
||||
AVAudioFormat *_deviceFormat;
|
||||
|
||||
AudioDeviceID outputDeviceID;
|
||||
AudioStreamBasicDescription deviceFormat; // info about the default device
|
||||
AudioStreamBasicDescription streamFormat; // stream format last seen in render callback
|
||||
AudioStreamBasicDescription newFormat; // in case of resampler flush
|
||||
|
||||
AudioStreamBasicDescription visFormat; // Mono format for vis
|
||||
|
||||
uint32_t deviceChannelConfig;
|
||||
uint32_t streamChannelConfig;
|
||||
uint32_t newChannelConfig;
|
||||
|
||||
AVSampleBufferAudioRenderer *audioRenderer;
|
||||
AVSampleBufferRenderSynchronizer *renderSynchronizer;
|
||||
|
||||
CMAudioFormatDescriptionRef audioFormatDescription;
|
||||
|
||||
AudioChannelLayoutTag streamTag;
|
||||
|
||||
id currentPtsObserver;
|
||||
NSLock *currentPtsLock;
|
||||
CMTime currentPts, lastPts;
|
||||
double secondsLatency;
|
||||
|
||||
CMTime outputPts, trackPts, lastCheckpointPts;
|
||||
AudioTimeStamp timeStamp;
|
||||
|
||||
AUAudioUnit *_au;
|
||||
size_t _bufferSize;
|
||||
|
||||
AudioUnit _eq;
|
||||
|
||||
DownmixProcessor *downmixer;
|
||||
DownmixProcessor *downmixerForVis;
|
||||
|
||||
VisualizationController *visController;
|
||||
|
||||
os_workgroup_t wg;
|
||||
os_workgroup_join_token_s wgToken;
|
||||
float inputBuffer[2048 * 32]; // 2048 samples times maximum supported channel count
|
||||
float eqBuffer[2048 * 32];
|
||||
|
||||
#ifdef OUTPUT_LOG
|
||||
FILE *_logFile;
|
||||
|
@ -106,6 +121,8 @@ using std::atomic_long;
|
|||
- (void)resume;
|
||||
- (void)stop;
|
||||
|
||||
- (double)latency;
|
||||
|
||||
- (void)setVolume:(double)v;
|
||||
|
||||
- (void)setEqualizerEnabled:(BOOL)enabled;
|
1175
Audio/Output/OutputAVFoundation.m
Normal file
1175
Audio/Output/OutputAVFoundation.m
Normal file
File diff suppressed because it is too large
Load diff
|
@ -1,986 +0,0 @@
|
|||
//
|
||||
// OutputCoreAudio.m
|
||||
// Cog
|
||||
//
|
||||
// Created by Vincent Spader on 8/2/05.
|
||||
// Copyright 2005 Vincent Spader. All rights reserved.
|
||||
//
|
||||
|
||||
#import "OutputCoreAudio.h"
|
||||
#import "OutputNode.h"
|
||||
|
||||
#ifdef _DEBUG
|
||||
#import "BadSampleCleaner.h"
|
||||
#endif
|
||||
|
||||
#import "Logging.h"
|
||||
|
||||
#import <Accelerate/Accelerate.h>
|
||||
|
||||
extern void scale_by_volume(float *buffer, size_t count, float volume);
|
||||
|
||||
static NSString *CogPlaybackDidBeginNotficiation = @"CogPlaybackDidBeginNotficiation";
|
||||
|
||||
@implementation OutputCoreAudio
|
||||
|
||||
static void *kOutputCoreAudioContext = &kOutputCoreAudioContext;
|
||||
|
||||
static void fillBuffers(AudioBufferList *ioData, float *inbuffer, size_t count, size_t offset) {
|
||||
const size_t channels = ioData->mNumberBuffers;
|
||||
for(int i = 0; i < channels; ++i) {
|
||||
const size_t maxCount = (ioData->mBuffers[i].mDataByteSize / sizeof(float)) - offset;
|
||||
float *output = ((float *)ioData->mBuffers[i].mData) + offset;
|
||||
const float *input = inbuffer + i;
|
||||
cblas_scopy((int)((count > maxCount) ? maxCount : count), input, (int)channels, output, 1);
|
||||
ioData->mBuffers[i].mNumberChannels = 1;
|
||||
}
|
||||
}
|
||||
|
||||
static void clearBuffers(AudioBufferList *ioData, size_t count, size_t offset) {
|
||||
for(int i = 0; i < ioData->mNumberBuffers; ++i) {
|
||||
memset(ioData->mBuffers[i].mData + offset * sizeof(float), 0, count * sizeof(float));
|
||||
ioData->mBuffers[i].mNumberChannels = 1;
|
||||
}
|
||||
}
|
||||
|
||||
static void scaleBuffersByVolume(AudioBufferList *ioData, float volume) {
|
||||
if(volume != 1.0) {
|
||||
for(int i = 0; i < ioData->mNumberBuffers; ++i) {
|
||||
scale_by_volume((float *)ioData->mBuffers[i].mData, ioData->mBuffers[i].mDataByteSize / sizeof(float), volume);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static OSStatus renderCallback(void *inRefCon, AudioUnitRenderActionFlags *ioActionFlags, const AudioTimeStamp *inTimeStamp, UInt32 inBusNumber, UInt32 inNumberFrames, AudioBufferList *ioData) {
|
||||
@autoreleasepool {
|
||||
if(!inRefCon) return 0;
|
||||
|
||||
OutputCoreAudio *_self = (__bridge OutputCoreAudio *)inRefCon;
|
||||
|
||||
const int channels = _self->deviceFormat.mChannelsPerFrame;
|
||||
const int bytesPerPacket = channels * sizeof(float);
|
||||
|
||||
size_t amountToRead, amountRead = 0;
|
||||
|
||||
amountToRead = inNumberFrames * bytesPerPacket;
|
||||
|
||||
int visTabulated = 0;
|
||||
float visAudio[inNumberFrames]; // Chunk size
|
||||
|
||||
if(_self->stopping == YES || [_self->outputController shouldContinue] == NO) {
|
||||
// Chain is dead, fill out the serial number pointer forever with silence
|
||||
clearBuffers(ioData, amountToRead / bytesPerPacket, 0);
|
||||
atomic_fetch_add(&_self->bytesRendered, amountToRead);
|
||||
_self->stopping = YES;
|
||||
return 0;
|
||||
}
|
||||
|
||||
if([[_self->outputController buffer] isEmpty] && ![_self->outputController chainQueueHasTracks]) {
|
||||
// Hit end of last track, pad with silence until queue event stops us
|
||||
clearBuffers(ioData, amountToRead / bytesPerPacket, 0);
|
||||
atomic_fetch_add(&_self->bytesRendered, amountToRead);
|
||||
return 0;
|
||||
}
|
||||
|
||||
AudioChunk *chunk = [[_self->outputController buffer] removeSamples:(amountToRead / bytesPerPacket)];
|
||||
|
||||
size_t frameCount = [chunk frameCount];
|
||||
AudioStreamBasicDescription format = [chunk format];
|
||||
uint32_t config = [chunk channelConfig];
|
||||
|
||||
if(frameCount) {
|
||||
if(!_self->streamFormatStarted || config != _self->streamChannelConfig || memcmp(&_self->streamFormat, &format, sizeof(format)) != 0) {
|
||||
_self->streamFormat = format;
|
||||
_self->streamChannelConfig = config;
|
||||
_self->streamFormatStarted = YES;
|
||||
_self->downmixer = [[DownmixProcessor alloc] initWithInputFormat:format inputConfig:config andOutputFormat:_self->deviceFormat outputConfig:_self->deviceChannelConfig];
|
||||
_self->downmixerForVis = [[DownmixProcessor alloc] initWithInputFormat:format inputConfig:config andOutputFormat:_self->visFormat outputConfig:AudioConfigMono];
|
||||
}
|
||||
|
||||
double chunkDuration = [chunk duration];
|
||||
|
||||
NSData *samples = [chunk removeSamples:frameCount];
|
||||
#ifdef _DEBUG
|
||||
[BadSampleCleaner cleanSamples:(float *)[samples bytes]
|
||||
amount:frameCount * format.mChannelsPerFrame
|
||||
location:@"pre downmix"];
|
||||
#endif
|
||||
|
||||
float downmixedData[frameCount * channels];
|
||||
[_self->downmixer process:[samples bytes] frameCount:frameCount output:downmixedData];
|
||||
#ifdef _DEBUG
|
||||
[BadSampleCleaner cleanSamples:downmixedData
|
||||
amount:frameCount * channels
|
||||
location:@"post downmix"];
|
||||
#endif
|
||||
|
||||
[_self->downmixerForVis process:[samples bytes] frameCount:frameCount output:visAudio];
|
||||
visTabulated += frameCount;
|
||||
|
||||
fillBuffers(ioData, downmixedData, frameCount, 0);
|
||||
amountRead = frameCount * bytesPerPacket;
|
||||
[_self->outputController incrementAmountPlayed:chunkDuration];
|
||||
atomic_fetch_add(&_self->bytesRendered, amountRead);
|
||||
[_self->writeSemaphore signal];
|
||||
}
|
||||
|
||||
// Try repeatedly! Buffer wraps can cause a slight data shortage, as can
|
||||
// unexpected track changes.
|
||||
while((amountRead < amountToRead) && [_self->outputController shouldContinue] == YES) {
|
||||
chunk = [[_self->outputController buffer] removeSamples:((amountToRead - amountRead) / bytesPerPacket)];
|
||||
frameCount = [chunk frameCount];
|
||||
format = [chunk format];
|
||||
config = [chunk channelConfig];
|
||||
if(frameCount) {
|
||||
if(!_self->streamFormatStarted || config != _self->streamChannelConfig || memcmp(&_self->streamFormat, &format, sizeof(format)) != 0) {
|
||||
_self->streamFormat = format;
|
||||
_self->streamFormatStarted = YES;
|
||||
_self->downmixer = [[DownmixProcessor alloc] initWithInputFormat:format inputConfig:config andOutputFormat:_self->deviceFormat outputConfig:_self->deviceChannelConfig];
|
||||
_self->downmixerForVis = [[DownmixProcessor alloc] initWithInputFormat:format inputConfig:config andOutputFormat:_self->visFormat outputConfig:AudioConfigMono];
|
||||
}
|
||||
atomic_fetch_add(&_self->bytesRendered, frameCount * bytesPerPacket);
|
||||
double chunkDuration = [chunk duration];
|
||||
NSData *samples = [chunk removeSamples:frameCount];
|
||||
#ifdef _DEBUG
|
||||
[BadSampleCleaner cleanSamples:(float *)[samples bytes]
|
||||
amount:frameCount * format.mChannelsPerFrame
|
||||
location:@"pre downmix"];
|
||||
#endif
|
||||
|
||||
float downmixedData[frameCount * channels];
|
||||
[_self->downmixer process:[samples bytes] frameCount:frameCount output:downmixedData];
|
||||
fillBuffers(ioData, downmixedData, frameCount, amountRead / bytesPerPacket);
|
||||
#ifdef _DEBUG
|
||||
[BadSampleCleaner cleanSamples:downmixedData
|
||||
amount:frameCount * channels
|
||||
location:@"post downmix"];
|
||||
#endif
|
||||
|
||||
[_self->downmixerForVis process:[samples bytes] frameCount:frameCount output:visAudio + visTabulated];
|
||||
visTabulated += frameCount;
|
||||
|
||||
[_self->outputController incrementAmountPlayed:chunkDuration];
|
||||
|
||||
amountRead += frameCount * bytesPerPacket;
|
||||
[_self->writeSemaphore signal];
|
||||
} else {
|
||||
[_self->readSemaphore timedWait:500];
|
||||
}
|
||||
}
|
||||
|
||||
float volumeScale = 1.0;
|
||||
long sustained = atomic_load_explicit(&_self->bytesHdcdSustained, memory_order_relaxed);
|
||||
if(sustained) {
|
||||
if(sustained < amountRead) {
|
||||
atomic_store(&_self->bytesHdcdSustained, 0);
|
||||
} else {
|
||||
atomic_fetch_sub(&_self->bytesHdcdSustained, amountRead);
|
||||
}
|
||||
volumeScale = 0.5;
|
||||
}
|
||||
|
||||
if(_self->eqEnabled) {
|
||||
volumeScale *= _self->eqPreamp;
|
||||
}
|
||||
|
||||
scaleBuffersByVolume(ioData, _self->volume * volumeScale);
|
||||
|
||||
if(amountRead < amountToRead) {
|
||||
// Either underrun, or no data at all. Caller output tends to just
|
||||
// buffer loop if it doesn't get anything, so always produce a full
|
||||
// buffer, and silence anything we couldn't supply.
|
||||
clearBuffers(ioData, (amountToRead - amountRead) / bytesPerPacket, amountRead / bytesPerPacket);
|
||||
}
|
||||
|
||||
[_self->visController postSampleRate:_self->deviceFormat.mSampleRate];
|
||||
[_self->visController postVisPCM:visAudio amount:visTabulated];
|
||||
|
||||
return 0;
|
||||
}
|
||||
};
|
||||
|
||||
- (id)initWithController:(OutputNode *)c {
|
||||
self = [super init];
|
||||
if(self) {
|
||||
outputController = c;
|
||||
volume = 1.0;
|
||||
outputDeviceID = -1;
|
||||
|
||||
atomic_init(&bytesRendered, 0);
|
||||
atomic_init(&bytesHdcdSustained, 0);
|
||||
|
||||
writeSemaphore = [[Semaphore alloc] init];
|
||||
readSemaphore = [[Semaphore alloc] init];
|
||||
|
||||
#ifdef OUTPUT_LOG
|
||||
_logFile = fopen("/tmp/CogAudioLog.raw", "wb");
|
||||
#endif
|
||||
}
|
||||
|
||||
return self;
|
||||
}
|
||||
|
||||
static OSStatus
|
||||
default_device_changed(AudioObjectID inObjectID, UInt32 inNumberAddresses, const AudioObjectPropertyAddress *inAddresses, void *inUserData) {
|
||||
OutputCoreAudio *this = (__bridge OutputCoreAudio *)inUserData;
|
||||
return [this setOutputDeviceByID:-1];
|
||||
}
|
||||
|
||||
static OSStatus
|
||||
current_device_listener(AudioObjectID inObjectID, UInt32 inNumberAddresses, const AudioObjectPropertyAddress *inAddresses, void *inUserData) {
|
||||
OutputCoreAudio *this = (__bridge OutputCoreAudio *)inUserData;
|
||||
for(UInt32 i = 0; i < inNumberAddresses; ++i) {
|
||||
switch(inAddresses[i].mSelector) {
|
||||
case kAudioDevicePropertyDeviceIsAlive:
|
||||
return [this setOutputDeviceByID:-1];
|
||||
|
||||
case kAudioDevicePropertyNominalSampleRate:
|
||||
case kAudioDevicePropertyStreamFormat:
|
||||
this->outputdevicechanged = YES;
|
||||
return noErr;
|
||||
}
|
||||
}
|
||||
return noErr;
|
||||
}
|
||||
|
||||
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context {
|
||||
if(context != kOutputCoreAudioContext) {
|
||||
[super observeValueForKeyPath:keyPath ofObject:object change:change context:context];
|
||||
return;
|
||||
}
|
||||
|
||||
if([keyPath isEqualToString:@"values.outputDevice"]) {
|
||||
NSDictionary *device = [[[NSUserDefaultsController sharedUserDefaultsController] defaults] objectForKey:@"outputDevice"];
|
||||
|
||||
[self setOutputDeviceWithDeviceDict:device];
|
||||
} else if([keyPath isEqualToString:@"values.GraphicEQenable"]) {
|
||||
BOOL enabled = [[[[NSUserDefaultsController sharedUserDefaultsController] defaults] objectForKey:@"GraphicEQenable"] boolValue];
|
||||
|
||||
[self setEqualizerEnabled:enabled];
|
||||
} else if([keyPath isEqualToString:@"values.eqPreamp"]) {
|
||||
float preamp = [[[NSUserDefaultsController sharedUserDefaultsController] defaults] floatForKey:@"eqPreamp"];
|
||||
eqPreamp = pow(10.0, preamp / 20.0);
|
||||
}
|
||||
}
|
||||
|
||||
- (void)signalEndOfStream {
|
||||
[outputController resetAmountPlayed];
|
||||
[outputController endOfInputPlayed];
|
||||
}
|
||||
|
||||
- (void)threadEntry:(id)arg {
|
||||
running = YES;
|
||||
started = NO;
|
||||
stopNext = NO;
|
||||
atomic_store(&bytesRendered, 0);
|
||||
NSMutableArray *delayedEvents = [[NSMutableArray alloc] init];
|
||||
BOOL delayedEventsPopped = YES;
|
||||
|
||||
while(!stopping) {
|
||||
if(outputdevicechanged) {
|
||||
[self resetIfOutputChanged];
|
||||
outputdevicechanged = NO;
|
||||
}
|
||||
if(restarted) break;
|
||||
if([outputController shouldReset]) {
|
||||
@autoreleasepool {
|
||||
[[outputController buffer] reset];
|
||||
}
|
||||
[outputController setShouldReset:NO];
|
||||
[delayedEvents removeAllObjects];
|
||||
delayedEventsPopped = YES;
|
||||
}
|
||||
|
||||
while([delayedEvents count]) {
|
||||
size_t localBytesRendered = atomic_load_explicit(&bytesRendered, memory_order_relaxed);
|
||||
double secondsRendered = (double)localBytesRendered / (double)(deviceFormat.mBytesPerPacket * deviceFormat.mSampleRate);
|
||||
if(secondsRendered >= [[delayedEvents objectAtIndex:0] doubleValue]) {
|
||||
if([outputController chainQueueHasTracks])
|
||||
delayedEventsPopped = YES;
|
||||
[self signalEndOfStream];
|
||||
[delayedEvents removeObjectAtIndex:0];
|
||||
} else
|
||||
break;
|
||||
}
|
||||
|
||||
if(stopping)
|
||||
break;
|
||||
|
||||
size_t frameCount = 0;
|
||||
|
||||
if(![[outputController buffer] isFull]) {
|
||||
@autoreleasepool {
|
||||
AudioChunk *chunk = [outputController readChunk:512];
|
||||
frameCount = [chunk frameCount];
|
||||
if(frameCount) {
|
||||
[[outputController buffer] addChunk:chunk];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if(frameCount) {
|
||||
[readSemaphore signal];
|
||||
continue;
|
||||
} else if([outputController shouldContinue] == NO)
|
||||
break;
|
||||
else if([[outputController buffer] isFull]) {
|
||||
if(!started) {
|
||||
started = YES;
|
||||
if(!paused) {
|
||||
NSError *err;
|
||||
[_au startHardwareAndReturnError:&err];
|
||||
}
|
||||
}
|
||||
} else {
|
||||
// End of input possibly reached
|
||||
if(delayedEventsPopped && [outputController endOfStream] == YES) {
|
||||
double secondsBuffered = [[outputController buffer] listDuration];
|
||||
size_t _bytesRendered = atomic_load_explicit(&bytesRendered, memory_order_relaxed);
|
||||
secondsBuffered += (double)_bytesRendered / (double)(deviceFormat.mBytesPerPacket * deviceFormat.mSampleRate);
|
||||
if([outputController chainQueueHasTracks]) {
|
||||
if(secondsBuffered <= 0.005)
|
||||
secondsBuffered = 0.0;
|
||||
else
|
||||
secondsBuffered -= 0.005;
|
||||
} else {
|
||||
stopNext = YES;
|
||||
break;
|
||||
}
|
||||
[delayedEvents addObject:@(secondsBuffered)];
|
||||
delayedEventsPopped = NO;
|
||||
if(!started) {
|
||||
started = YES;
|
||||
if(!paused) {
|
||||
NSError *err;
|
||||
[_au startHardwareAndReturnError:&err];
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
[readSemaphore signal];
|
||||
[writeSemaphore timedWait:5000];
|
||||
}
|
||||
|
||||
stopped = YES;
|
||||
[self stop];
|
||||
}
|
||||
|
||||
- (OSStatus)setOutputDeviceByID:(AudioDeviceID)deviceID {
|
||||
OSStatus err;
|
||||
BOOL defaultDevice = NO;
|
||||
AudioObjectPropertyAddress theAddress = {
|
||||
.mSelector = kAudioHardwarePropertyDefaultOutputDevice,
|
||||
.mScope = kAudioObjectPropertyScopeGlobal,
|
||||
.mElement = kAudioObjectPropertyElementMaster
|
||||
};
|
||||
|
||||
if(deviceID == -1) {
|
||||
defaultDevice = YES;
|
||||
UInt32 size = sizeof(AudioDeviceID);
|
||||
err = AudioObjectGetPropertyData(kAudioObjectSystemObject, &theAddress, 0, NULL, &size, &deviceID);
|
||||
|
||||
if(err != noErr) {
|
||||
DLog(@"THERE'S NO DEFAULT OUTPUT DEVICE");
|
||||
|
||||
return err;
|
||||
}
|
||||
}
|
||||
|
||||
if(_au) {
|
||||
if(defaultdevicelistenerapplied && !defaultDevice) {
|
||||
/* Already set above
|
||||
* theAddress.mSelector = kAudioHardwarePropertyDefaultOutputDevice; */
|
||||
AudioObjectRemovePropertyListener(kAudioObjectSystemObject, &theAddress, default_device_changed, (__bridge void *_Nullable)(self));
|
||||
defaultdevicelistenerapplied = NO;
|
||||
}
|
||||
|
||||
outputdevicechanged = NO;
|
||||
|
||||
if(outputDeviceID != deviceID) {
|
||||
if(currentdevicelistenerapplied) {
|
||||
if(devicealivelistenerapplied) {
|
||||
theAddress.mSelector = kAudioDevicePropertyDeviceIsAlive;
|
||||
AudioObjectRemovePropertyListener(outputDeviceID, &theAddress, current_device_listener, (__bridge void *_Nullable)(self));
|
||||
devicealivelistenerapplied = NO;
|
||||
}
|
||||
theAddress.mSelector = kAudioDevicePropertyStreamFormat;
|
||||
AudioObjectRemovePropertyListener(outputDeviceID, &theAddress, current_device_listener, (__bridge void *_Nullable)(self));
|
||||
theAddress.mSelector = kAudioDevicePropertyNominalSampleRate;
|
||||
AudioObjectRemovePropertyListener(outputDeviceID, &theAddress, current_device_listener, (__bridge void *_Nullable)(self));
|
||||
currentdevicelistenerapplied = NO;
|
||||
}
|
||||
|
||||
DLog(@"Device: %i\n", deviceID);
|
||||
outputDeviceID = deviceID;
|
||||
|
||||
NSError *nserr;
|
||||
[_au setDeviceID:outputDeviceID error:&nserr];
|
||||
if(nserr != nil) {
|
||||
return (OSErr)[nserr code];
|
||||
}
|
||||
|
||||
outputdevicechanged = YES;
|
||||
}
|
||||
|
||||
if(!currentdevicelistenerapplied) {
|
||||
if(!devicealivelistenerapplied && !defaultDevice) {
|
||||
theAddress.mSelector = kAudioDevicePropertyDeviceIsAlive;
|
||||
AudioObjectAddPropertyListener(outputDeviceID, &theAddress, current_device_listener, (__bridge void *_Nullable)(self));
|
||||
devicealivelistenerapplied = YES;
|
||||
}
|
||||
theAddress.mSelector = kAudioDevicePropertyStreamFormat;
|
||||
AudioObjectAddPropertyListener(outputDeviceID, &theAddress, current_device_listener, (__bridge void *_Nullable)(self));
|
||||
theAddress.mSelector = kAudioDevicePropertyNominalSampleRate;
|
||||
AudioObjectAddPropertyListener(outputDeviceID, &theAddress, current_device_listener, (__bridge void *_Nullable)(self));
|
||||
currentdevicelistenerapplied = YES;
|
||||
}
|
||||
|
||||
if(!defaultdevicelistenerapplied && defaultDevice) {
|
||||
theAddress.mSelector = kAudioHardwarePropertyDefaultOutputDevice;
|
||||
AudioObjectAddPropertyListener(kAudioObjectSystemObject, &theAddress, default_device_changed, (__bridge void *_Nullable)(self));
|
||||
defaultdevicelistenerapplied = YES;
|
||||
}
|
||||
} else {
|
||||
err = noErr;
|
||||
}
|
||||
|
||||
if(err != noErr) {
|
||||
DLog(@"No output device with ID %d could be found.", deviceID);
|
||||
|
||||
return err;
|
||||
}
|
||||
|
||||
return err;
|
||||
}
|
||||
|
||||
- (BOOL)setOutputDeviceWithDeviceDict:(NSDictionary *)deviceDict {
|
||||
NSNumber *deviceIDNum = [deviceDict objectForKey:@"deviceID"];
|
||||
AudioDeviceID outputDeviceID = [deviceIDNum unsignedIntValue] ?: -1;
|
||||
|
||||
__block OSStatus err = [self setOutputDeviceByID:outputDeviceID];
|
||||
|
||||
if(err != noErr) {
|
||||
// Try matching by name.
|
||||
NSString *userDeviceName = deviceDict[@"name"];
|
||||
|
||||
[self enumerateAudioOutputsUsingBlock:
|
||||
^(NSString *deviceName, AudioDeviceID deviceID, AudioDeviceID systemDefaultID, BOOL *stop) {
|
||||
if([deviceName isEqualToString:userDeviceName]) {
|
||||
err = [self setOutputDeviceByID:deviceID];
|
||||
|
||||
#if 0
|
||||
// Disable. Would cause loop by triggering `-observeValueForKeyPath:ofObject:change:context:` above.
|
||||
// Update `outputDevice`, in case the ID has changed.
|
||||
NSDictionary *deviceInfo = @{
|
||||
@"name": deviceName,
|
||||
@"deviceID": @(deviceID),
|
||||
};
|
||||
[[NSUserDefaults standardUserDefaults] setObject:deviceInfo forKey:@"outputDevice"];
|
||||
#endif
|
||||
|
||||
DLog(@"Found output device: \"%@\" (%d).", deviceName, deviceID);
|
||||
|
||||
*stop = YES;
|
||||
}
|
||||
}];
|
||||
}
|
||||
|
||||
if(err != noErr) {
|
||||
ALog(@"No output device could be found, your random error code is %d. Have a nice day!", err);
|
||||
|
||||
return NO;
|
||||
}
|
||||
|
||||
return YES;
|
||||
}
|
||||
|
||||
// The following is largely a copy pasta of -awakeFromNib from "OutputsArrayController.m".
|
||||
// TODO: Share the code. (How to do this across xcodeproj?)
|
||||
- (void)enumerateAudioOutputsUsingBlock:(void(NS_NOESCAPE ^ _Nonnull)(NSString *deviceName, AudioDeviceID deviceID, AudioDeviceID systemDefaultID, BOOL *stop))block {
|
||||
UInt32 propsize;
|
||||
AudioObjectPropertyAddress theAddress = {
|
||||
.mSelector = kAudioHardwarePropertyDevices,
|
||||
.mScope = kAudioObjectPropertyScopeGlobal,
|
||||
.mElement = kAudioObjectPropertyElementMaster
|
||||
};
|
||||
|
||||
__Verify_noErr(AudioObjectGetPropertyDataSize(kAudioObjectSystemObject, &theAddress, 0, NULL, &propsize));
|
||||
UInt32 nDevices = propsize / (UInt32)sizeof(AudioDeviceID);
|
||||
AudioDeviceID *devids = malloc(propsize);
|
||||
__Verify_noErr(AudioObjectGetPropertyData(kAudioObjectSystemObject, &theAddress, 0, NULL, &propsize, devids));
|
||||
|
||||
theAddress.mSelector = kAudioHardwarePropertyDefaultOutputDevice;
|
||||
AudioDeviceID systemDefault;
|
||||
propsize = sizeof(systemDefault);
|
||||
__Verify_noErr(AudioObjectGetPropertyData(kAudioObjectSystemObject, &theAddress, 0, NULL, &propsize, &systemDefault));
|
||||
|
||||
theAddress.mScope = kAudioDevicePropertyScopeOutput;
|
||||
|
||||
for(UInt32 i = 0; i < nDevices; ++i) {
|
||||
UInt32 isAlive = 0;
|
||||
propsize = sizeof(isAlive);
|
||||
theAddress.mSelector = kAudioDevicePropertyDeviceIsAlive;
|
||||
__Verify_noErr(AudioObjectGetPropertyData(devids[i], &theAddress, 0, NULL, &propsize, &isAlive));
|
||||
if(!isAlive) continue;
|
||||
|
||||
CFStringRef name = NULL;
|
||||
propsize = sizeof(name);
|
||||
theAddress.mSelector = kAudioDevicePropertyDeviceNameCFString;
|
||||
__Verify_noErr(AudioObjectGetPropertyData(devids[i], &theAddress, 0, NULL, &propsize, &name));
|
||||
|
||||
propsize = 0;
|
||||
theAddress.mSelector = kAudioDevicePropertyStreamConfiguration;
|
||||
__Verify_noErr(AudioObjectGetPropertyDataSize(devids[i], &theAddress, 0, NULL, &propsize));
|
||||
|
||||
if(propsize < sizeof(UInt32)) {
|
||||
if(name) CFRelease(name);
|
||||
continue;
|
||||
}
|
||||
|
||||
AudioBufferList *bufferList = (AudioBufferList *)malloc(propsize);
|
||||
__Verify_noErr(AudioObjectGetPropertyData(devids[i], &theAddress, 0, NULL, &propsize, bufferList));
|
||||
UInt32 bufferCount = bufferList->mNumberBuffers;
|
||||
free(bufferList);
|
||||
|
||||
if(!bufferCount) {
|
||||
if(name) CFRelease(name);
|
||||
continue;
|
||||
}
|
||||
|
||||
BOOL stop = NO;
|
||||
NSString *deviceName = name ? [NSString stringWithString:(__bridge NSString *)name] : [NSString stringWithFormat:@"Unknown device %u", (unsigned int)devids[i]];
|
||||
|
||||
block(deviceName,
|
||||
devids[i],
|
||||
systemDefault,
|
||||
&stop);
|
||||
|
||||
CFRelease(name);
|
||||
|
||||
if(stop) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
free(devids);
|
||||
}
|
||||
|
||||
- (void)resetIfOutputChanged {
|
||||
AVAudioFormat *format = _au.outputBusses[0].format;
|
||||
|
||||
if(!restarted && (!_deviceFormat || ![_deviceFormat isEqual:format])) {
|
||||
[outputController restartPlaybackAtCurrentPosition];
|
||||
restarted = YES;
|
||||
}
|
||||
}
|
||||
|
||||
- (BOOL)updateDeviceFormat {
|
||||
AVAudioFormat *format = _au.outputBusses[0].format;
|
||||
|
||||
if(!_deviceFormat || ![_deviceFormat isEqual:format]) {
|
||||
NSError *err;
|
||||
AVAudioFormat *renderFormat;
|
||||
|
||||
[outputController incrementAmountPlayed:[[outputController buffer] listDuration]];
|
||||
@autoreleasepool {
|
||||
[[outputController buffer] reset];
|
||||
}
|
||||
|
||||
_deviceFormat = format;
|
||||
deviceFormat = *(format.streamDescription);
|
||||
|
||||
/// Seems some 3rd party devices return incorrect stuff...or I just don't like noninterleaved data.
|
||||
deviceFormat.mFormatFlags &= ~kLinearPCMFormatFlagIsNonInterleaved;
|
||||
// deviceFormat.mFormatFlags &= ~kLinearPCMFormatFlagIsFloat;
|
||||
// deviceFormat.mFormatFlags = kLinearPCMFormatFlagIsSignedInteger;
|
||||
// We don't want more than 8 channels
|
||||
if(deviceFormat.mChannelsPerFrame > 8) {
|
||||
deviceFormat.mChannelsPerFrame = 8;
|
||||
}
|
||||
deviceFormat.mBytesPerFrame = deviceFormat.mChannelsPerFrame * (deviceFormat.mBitsPerChannel / 8);
|
||||
deviceFormat.mBytesPerPacket = deviceFormat.mBytesPerFrame * deviceFormat.mFramesPerPacket;
|
||||
|
||||
visFormat = deviceFormat;
|
||||
visFormat.mChannelsPerFrame = 1;
|
||||
visFormat.mBytesPerFrame = visFormat.mChannelsPerFrame * (visFormat.mBitsPerChannel / 8);
|
||||
visFormat.mBytesPerPacket = visFormat.mBytesPerFrame * visFormat.mFramesPerPacket;
|
||||
|
||||
/* Set the channel layout for the audio queue */
|
||||
AudioChannelLayoutTag tag = 0;
|
||||
switch(deviceFormat.mChannelsPerFrame) {
|
||||
case 1:
|
||||
tag = kAudioChannelLayoutTag_Mono;
|
||||
deviceChannelConfig = AudioConfigMono;
|
||||
break;
|
||||
case 2:
|
||||
tag = kAudioChannelLayoutTag_Stereo;
|
||||
deviceChannelConfig = AudioConfigStereo;
|
||||
break;
|
||||
case 3:
|
||||
tag = kAudioChannelLayoutTag_DVD_4;
|
||||
deviceChannelConfig = AudioConfig3Point0;
|
||||
break;
|
||||
case 4:
|
||||
tag = kAudioChannelLayoutTag_Quadraphonic;
|
||||
deviceChannelConfig = AudioConfig4Point0;
|
||||
break;
|
||||
case 5:
|
||||
tag = kAudioChannelLayoutTag_MPEG_5_0_A;
|
||||
deviceChannelConfig = AudioConfig5Point0;
|
||||
break;
|
||||
case 6:
|
||||
tag = kAudioChannelLayoutTag_MPEG_5_1_A;
|
||||
deviceChannelConfig = AudioConfig5Point1;
|
||||
break;
|
||||
case 7:
|
||||
tag = kAudioChannelLayoutTag_MPEG_6_1_A;
|
||||
deviceChannelConfig = AudioConfig6Point1;
|
||||
break;
|
||||
case 8:
|
||||
tag = kAudioChannelLayoutTag_MPEG_7_1_A;
|
||||
deviceChannelConfig = AudioConfig7Point1;
|
||||
break;
|
||||
}
|
||||
|
||||
renderFormat = [[AVAudioFormat alloc] initWithStreamDescription:&deviceFormat channelLayout:[[AVAudioChannelLayout alloc] initWithLayoutTag:tag]];
|
||||
[_au.inputBusses[0] setFormat:renderFormat error:&err];
|
||||
if(err != nil)
|
||||
return NO;
|
||||
|
||||
[outputController setFormat:&deviceFormat channelConfig:deviceChannelConfig];
|
||||
|
||||
AudioStreamBasicDescription asbd = deviceFormat;
|
||||
|
||||
asbd.mFormatFlags &= ~kAudioFormatFlagIsPacked;
|
||||
|
||||
AudioUnitSetProperty(_eq, kAudioUnitProperty_StreamFormat,
|
||||
kAudioUnitScope_Input, 0, &asbd, sizeof(asbd));
|
||||
|
||||
AudioUnitSetProperty(_eq, kAudioUnitProperty_StreamFormat,
|
||||
kAudioUnitScope_Output, 0, &asbd, sizeof(asbd));
|
||||
AudioUnitReset(_eq, kAudioUnitScope_Input, 0);
|
||||
AudioUnitReset(_eq, kAudioUnitScope_Output, 0);
|
||||
|
||||
AudioUnitReset(_eq, kAudioUnitScope_Global, 0);
|
||||
|
||||
eqEnabled = [[[[NSUserDefaultsController sharedUserDefaultsController] defaults] objectForKey:@"GraphicEQenable"] boolValue];
|
||||
}
|
||||
|
||||
return YES;
|
||||
}
|
||||
|
||||
- (void)audioOutputBlock {
|
||||
__block AudioUnit eq = _eq;
|
||||
__block AudioStreamBasicDescription *format = &deviceFormat;
|
||||
__block BOOL *eqEnabled = &self->eqEnabled;
|
||||
__block void *refCon = (__bridge void *)self;
|
||||
|
||||
#ifdef OUTPUT_LOG
|
||||
__block FILE *logFile = _logFile;
|
||||
#endif
|
||||
|
||||
_au.outputProvider = ^AUAudioUnitStatus(AudioUnitRenderActionFlags *_Nonnull actionFlags, const AudioTimeStamp *_Nonnull timestamp, AUAudioFrameCount frameCount, NSInteger inputBusNumber, AudioBufferList *_Nonnull inputData) {
|
||||
// This expects multiple buffers, so:
|
||||
if(!frameCount) return 0;
|
||||
|
||||
int i;
|
||||
const int channels = format->mChannelsPerFrame;
|
||||
if(!channels) return 0;
|
||||
|
||||
const int channelsminusone = channels - 1;
|
||||
float buffers[frameCount * channels];
|
||||
uint8_t bufferlistbuffer[sizeof(AudioBufferList) + sizeof(AudioBuffer) * channelsminusone];
|
||||
AudioBufferList *ioData = (AudioBufferList *)(&bufferlistbuffer[0]);
|
||||
|
||||
ioData->mNumberBuffers = channels;
|
||||
|
||||
memset(buffers, 0, sizeof(buffers));
|
||||
|
||||
for(i = 0; i < channels; ++i) {
|
||||
ioData->mBuffers[i].mNumberChannels = 1;
|
||||
ioData->mBuffers[i].mData = buffers + frameCount * i;
|
||||
ioData->mBuffers[i].mDataByteSize = frameCount * sizeof(float);
|
||||
}
|
||||
|
||||
OSStatus ret;
|
||||
|
||||
if(*eqEnabled)
|
||||
ret = AudioUnitRender(eq, actionFlags, timestamp, (UInt32)inputBusNumber, frameCount, ioData);
|
||||
else
|
||||
ret = renderCallback(refCon, actionFlags, timestamp, (UInt32)inputBusNumber, frameCount, ioData);
|
||||
|
||||
if(ret)
|
||||
return ret;
|
||||
|
||||
for(i = 0; i < channels; ++i) {
|
||||
float *outBuffer = ((float *)inputData->mBuffers[0].mData) + i;
|
||||
const float *inBuffer = ((float *)ioData->mBuffers[i].mData);
|
||||
const int frameCount = ioData->mBuffers[i].mDataByteSize / sizeof(float);
|
||||
cblas_scopy(frameCount, inBuffer, 1, outBuffer, channels);
|
||||
}
|
||||
|
||||
#ifdef OUTPUT_LOG
|
||||
if(logFile) {
|
||||
fwrite(inputData->mBuffers[0].mData, 1, inputData->mBuffers[0].mDataByteSize, logFile);
|
||||
}
|
||||
|
||||
// memset(inputData->mBuffers[0].mData, 0, inputData->mBuffers[0].mDataByteSize);
|
||||
#endif
|
||||
|
||||
inputData->mBuffers[0].mNumberChannels = channels;
|
||||
|
||||
#ifdef _DEBUG
|
||||
[BadSampleCleaner cleanSamples:(float *)inputData->mBuffers[0].mData
|
||||
amount:inputData->mBuffers[0].mDataByteSize / sizeof(float)
|
||||
location:@"final output"];
|
||||
#endif
|
||||
|
||||
return 0;
|
||||
};
|
||||
}
|
||||
|
||||
- (BOOL)setup {
|
||||
if(_au)
|
||||
[self stop];
|
||||
|
||||
@synchronized(self) {
|
||||
stopInvoked = NO;
|
||||
|
||||
running = NO;
|
||||
stopping = NO;
|
||||
stopped = NO;
|
||||
paused = NO;
|
||||
stopNext = NO;
|
||||
outputDeviceID = -1;
|
||||
restarted = NO;
|
||||
|
||||
downmixer = nil;
|
||||
downmixerForVis = nil;
|
||||
|
||||
AudioComponentDescription desc;
|
||||
NSError *err;
|
||||
|
||||
desc.componentType = kAudioUnitType_Output;
|
||||
desc.componentSubType = kAudioUnitSubType_HALOutput;
|
||||
desc.componentManufacturer = kAudioUnitManufacturer_Apple;
|
||||
desc.componentFlags = 0;
|
||||
desc.componentFlagsMask = 0;
|
||||
|
||||
_au = [[AUAudioUnit alloc] initWithComponentDescription:desc error:&err];
|
||||
if(err != nil)
|
||||
return NO;
|
||||
|
||||
// Setup the output device before mucking with settings
|
||||
NSDictionary *device = [[[NSUserDefaultsController sharedUserDefaultsController] defaults] objectForKey:@"outputDevice"];
|
||||
if(device) {
|
||||
BOOL ok = [self setOutputDeviceWithDeviceDict:device];
|
||||
if(!ok) {
|
||||
// Ruh roh.
|
||||
[self setOutputDeviceWithDeviceDict:nil];
|
||||
|
||||
[[[NSUserDefaultsController sharedUserDefaultsController] defaults] removeObjectForKey:@"outputDevice"];
|
||||
}
|
||||
} else {
|
||||
[self setOutputDeviceWithDeviceDict:nil];
|
||||
}
|
||||
|
||||
_deviceFormat = nil;
|
||||
|
||||
AudioComponent comp = NULL;
|
||||
|
||||
desc.componentType = kAudioUnitType_Effect;
|
||||
desc.componentSubType = kAudioUnitSubType_GraphicEQ;
|
||||
|
||||
comp = AudioComponentFindNext(comp, &desc);
|
||||
if(!comp)
|
||||
return NO;
|
||||
|
||||
OSStatus _err = AudioComponentInstanceNew(comp, &_eq);
|
||||
if(err)
|
||||
return NO;
|
||||
|
||||
[self updateDeviceFormat];
|
||||
|
||||
[self audioOutputBlock];
|
||||
|
||||
[_au setMaximumFramesToRender:512];
|
||||
|
||||
UInt32 value;
|
||||
UInt32 size = sizeof(value);
|
||||
|
||||
value = CHUNK_SIZE;
|
||||
AudioUnitSetProperty(_eq, kAudioUnitProperty_MaximumFramesPerSlice,
|
||||
kAudioUnitScope_Global, 0, &value, size);
|
||||
|
||||
value = 127;
|
||||
AudioUnitSetProperty(_eq, kAudioUnitProperty_RenderQuality,
|
||||
kAudioUnitScope_Global, 0, &value, size);
|
||||
|
||||
AURenderCallbackStruct callbackStruct;
|
||||
callbackStruct.inputProcRefCon = (__bridge void *)self;
|
||||
callbackStruct.inputProc = renderCallback;
|
||||
AudioUnitSetProperty(_eq, kAudioUnitProperty_SetRenderCallback,
|
||||
kAudioUnitScope_Input, 0, &callbackStruct, sizeof(callbackStruct));
|
||||
|
||||
AudioUnitReset(_eq, kAudioUnitScope_Input, 0);
|
||||
AudioUnitReset(_eq, kAudioUnitScope_Output, 0);
|
||||
|
||||
AudioUnitReset(_eq, kAudioUnitScope_Global, 0);
|
||||
|
||||
_err = AudioUnitInitialize(_eq);
|
||||
if(_err)
|
||||
return NO;
|
||||
|
||||
eqInitialized = YES;
|
||||
|
||||
[self setEqualizerEnabled:[[[[NSUserDefaultsController sharedUserDefaultsController] defaults] objectForKey:@"GraphicEQenable"] boolValue]];
|
||||
|
||||
[outputController beginEqualizer:_eq];
|
||||
|
||||
[_au allocateRenderResourcesAndReturnError:&err];
|
||||
|
||||
visController = [VisualizationController sharedController];
|
||||
|
||||
[[NSUserDefaultsController sharedUserDefaultsController] addObserver:self forKeyPath:@"values.outputDevice" options:0 context:kOutputCoreAudioContext];
|
||||
[[NSUserDefaultsController sharedUserDefaultsController] addObserver:self forKeyPath:@"values.GraphicEQenable" options:0 context:kOutputCoreAudioContext];
|
||||
[[NSUserDefaultsController sharedUserDefaultsController] addObserver:self forKeyPath:@"values.eqPreamp" options:(NSKeyValueObservingOptionInitial | NSKeyValueObservingOptionNew) context:kOutputCoreAudioContext];
|
||||
observersapplied = YES;
|
||||
|
||||
return (err == nil);
|
||||
}
|
||||
}
|
||||
|
||||
- (void)setVolume:(double)v {
|
||||
volume = v * 0.01f;
|
||||
}
|
||||
|
||||
- (void)setEqualizerEnabled:(BOOL)enabled {
|
||||
if(enabled && !eqEnabled) {
|
||||
if(_eq) {
|
||||
AudioUnitReset(_eq, kAudioUnitScope_Input, 0);
|
||||
AudioUnitReset(_eq, kAudioUnitScope_Output, 0);
|
||||
AudioUnitReset(_eq, kAudioUnitScope_Global, 0);
|
||||
}
|
||||
}
|
||||
|
||||
eqEnabled = enabled;
|
||||
}
|
||||
|
||||
- (void)start {
|
||||
[self threadEntry:nil];
|
||||
}
|
||||
|
||||
- (void)stop {
|
||||
@synchronized(self) {
|
||||
if(stopInvoked) return;
|
||||
stopInvoked = YES;
|
||||
if(observersapplied) {
|
||||
[[NSUserDefaultsController sharedUserDefaultsController] removeObserver:self forKeyPath:@"values.outputDevice" context:kOutputCoreAudioContext];
|
||||
[[NSUserDefaultsController sharedUserDefaultsController] removeObserver:self forKeyPath:@"values.GraphicEQenable" context:kOutputCoreAudioContext];
|
||||
[[NSUserDefaultsController sharedUserDefaultsController] removeObserver:self forKeyPath:@"values.eqPreamp" context:kOutputCoreAudioContext];
|
||||
observersapplied = NO;
|
||||
}
|
||||
if(stopNext && !paused) {
|
||||
if(!started) {
|
||||
// This happens if playback is started on a very short file, and the queue is empty or at the end of the playlist
|
||||
started = YES;
|
||||
NSError *err;
|
||||
[_au startHardwareAndReturnError:&err];
|
||||
}
|
||||
while(![[outputController buffer] isEmpty]) {
|
||||
[writeSemaphore signal];
|
||||
[readSemaphore signal];
|
||||
usleep(500);
|
||||
}
|
||||
}
|
||||
if(stopNext) {
|
||||
stopNext = NO;
|
||||
[self signalEndOfStream];
|
||||
}
|
||||
stopping = YES;
|
||||
paused = NO;
|
||||
[writeSemaphore signal];
|
||||
[readSemaphore signal];
|
||||
if(defaultdevicelistenerapplied || currentdevicelistenerapplied || devicealivelistenerapplied) {
|
||||
AudioObjectPropertyAddress theAddress = {
|
||||
.mScope = kAudioObjectPropertyScopeGlobal,
|
||||
.mElement = kAudioObjectPropertyElementMaster
|
||||
};
|
||||
if(defaultdevicelistenerapplied) {
|
||||
theAddress.mSelector = kAudioHardwarePropertyDefaultOutputDevice;
|
||||
AudioObjectRemovePropertyListener(kAudioObjectSystemObject, &theAddress, default_device_changed, (__bridge void *_Nullable)(self));
|
||||
defaultdevicelistenerapplied = NO;
|
||||
}
|
||||
if(devicealivelistenerapplied) {
|
||||
theAddress.mSelector = kAudioDevicePropertyDeviceIsAlive;
|
||||
AudioObjectRemovePropertyListener(outputDeviceID, &theAddress, current_device_listener, (__bridge void *_Nullable)(self));
|
||||
devicealivelistenerapplied = NO;
|
||||
}
|
||||
if(currentdevicelistenerapplied) {
|
||||
theAddress.mSelector = kAudioDevicePropertyStreamFormat;
|
||||
AudioObjectRemovePropertyListener(outputDeviceID, &theAddress, current_device_listener, (__bridge void *_Nullable)(self));
|
||||
theAddress.mSelector = kAudioDevicePropertyNominalSampleRate;
|
||||
AudioObjectRemovePropertyListener(outputDeviceID, &theAddress, current_device_listener, (__bridge void *_Nullable)(self));
|
||||
currentdevicelistenerapplied = NO;
|
||||
}
|
||||
}
|
||||
if(_au) {
|
||||
if(started)
|
||||
[_au stopHardware];
|
||||
_au = nil;
|
||||
}
|
||||
if(running) {
|
||||
while(!stopped) {
|
||||
stopping = YES;
|
||||
[readSemaphore signal];
|
||||
[writeSemaphore timedWait:5000];
|
||||
}
|
||||
}
|
||||
if(_eq) {
|
||||
[outputController endEqualizer:_eq];
|
||||
if(eqInitialized) {
|
||||
AudioUnitUninitialize(_eq);
|
||||
eqInitialized = NO;
|
||||
}
|
||||
AudioComponentInstanceDispose(_eq);
|
||||
_eq = NULL;
|
||||
}
|
||||
if(downmixer) {
|
||||
downmixer = nil;
|
||||
}
|
||||
if(downmixerForVis) {
|
||||
downmixerForVis = nil;
|
||||
}
|
||||
#ifdef OUTPUT_LOG
|
||||
if(_logFile) {
|
||||
fclose(_logFile);
|
||||
_logFile = NULL;
|
||||
}
|
||||
#endif
|
||||
outputController = nil;
|
||||
visController = nil;
|
||||
}
|
||||
}
|
||||
|
||||
- (void)dealloc {
|
||||
[self stop];
|
||||
}
|
||||
|
||||
- (void)pause {
|
||||
paused = YES;
|
||||
if(started)
|
||||
[_au stopHardware];
|
||||
}
|
||||
|
||||
- (void)resume {
|
||||
NSError *err;
|
||||
[_au startHardwareAndReturnError:&err];
|
||||
paused = NO;
|
||||
started = YES;
|
||||
}
|
||||
|
||||
- (void)sustainHDCD {
|
||||
atomic_store(&bytesHdcdSustained, deviceFormat.mSampleRate * 10 * sizeof(float) * 2);
|
||||
}
|
||||
|
||||
@end
|
|
@ -25,6 +25,9 @@
|
|||
+ (float)priority;
|
||||
|
||||
+ (NSArray *)urlsForContainerURL:(NSURL *)url;
|
||||
|
||||
@optional
|
||||
+ (NSArray *)dependencyUrlsForContainerURL:(NSURL *)url;
|
||||
@end
|
||||
|
||||
@protocol CogDecoder <NSObject>
|
||||
|
@ -93,6 +96,7 @@
|
|||
|
||||
- (id<CogSource>)audioSourceForURL:(NSURL *)url;
|
||||
- (NSArray *)urlsForContainerURL:(NSURL *)url;
|
||||
- (NSArray *)dependencyUrlsForContainerURL:(NSURL *)url;
|
||||
- (NSDictionary *)metadataForURL:(NSURL *)url skipCue:(BOOL)skip;
|
||||
- (NSDictionary *)propertiesForURL:(NSURL *)url skipCue:(BOOL)skip;
|
||||
- (id<CogDecoder>)audioDecoderForSource:(id<CogSource>)source skipCue:(BOOL)skip;
|
||||
|
|
|
@ -109,11 +109,16 @@ static NSDictionary *cache_access_metadata(NSURL *url) {
|
|||
static void cache_run() {
|
||||
std::chrono::milliseconds dura(250);
|
||||
|
||||
Cache_Running = true;
|
||||
|
||||
while(Cache_Running) {
|
||||
std::chrono::steady_clock::time_point now = std::chrono::steady_clock::now();
|
||||
|
||||
@autoreleasepool {
|
||||
std::lock_guard<std::mutex> lock(Cache_Lock);
|
||||
|
||||
size_t cacheListOriginalSize = Cache_List.size();
|
||||
|
||||
for(auto it = Cache_List.begin(); it != Cache_List.end();) {
|
||||
auto elapsed = std::chrono::duration_cast<std::chrono::seconds>(now - it->second.time_accessed);
|
||||
if(elapsed.count() >= 10) {
|
||||
|
@ -123,9 +128,10 @@ static void cache_run() {
|
|||
++it;
|
||||
}
|
||||
|
||||
if(Cache_List.size() == 0)
|
||||
if(cacheListOriginalSize && Cache_List.size() == 0) {
|
||||
[Cache_Data_Store reset];
|
||||
}
|
||||
}
|
||||
|
||||
std::this_thread::sleep_for(dura);
|
||||
}
|
||||
|
@ -348,6 +354,16 @@ static PluginController *sharedPluginController = nil;
|
|||
}
|
||||
}
|
||||
|
||||
static NSString *xmlEscapeString(NSString * string) {
|
||||
CFStringRef textXML = CFXMLCreateStringByEscapingEntities(kCFAllocatorDefault, (CFStringRef)string, nil);
|
||||
if(textXML) {
|
||||
NSString *textString = (__bridge NSString *)textXML;
|
||||
CFRelease(textXML);
|
||||
return textString;
|
||||
}
|
||||
return @"";
|
||||
}
|
||||
|
||||
- (void)printPluginInfo {
|
||||
ALog(@"Sources: %@", self.sources);
|
||||
ALog(@"Containers: %@", self.containers);
|
||||
|
@ -365,6 +381,8 @@ static PluginController *sharedPluginController = nil;
|
|||
<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n\
|
||||
<plist version=\"1.0\">\n\
|
||||
<dict>\n\
|
||||
\t<key>FirebaseCrashlyticsCollectionEnabled</key>\n\
|
||||
\t<false/>\n\
|
||||
\t<key>SUEnableInstallerLauncherService</key>\n\
|
||||
\t<true/>\n\
|
||||
\t<key>CFBundleDevelopmentRegion</key>\n\
|
||||
|
@ -504,7 +522,7 @@ static PluginController *sharedPluginController = nil;
|
|||
\t\t\t<integer>1</integer>\n\
|
||||
\t\t\t<key>CFBundleTypeName</key>\n\
|
||||
\t\t\t<string>"];
|
||||
[stringList addObject:[type objectAtIndex:0]];
|
||||
[stringList addObject:xmlEscapeString([type objectAtIndex:0])];
|
||||
[stringList addObject:@"</string>\n\
|
||||
\t\t\t<key>CFBundleTypeRole</key>\n\
|
||||
\t\t\t<string>Viewer</string>\n\
|
||||
|
@ -555,6 +573,29 @@ static PluginController *sharedPluginController = nil;
|
|||
return [container urlsForContainerURL:url];
|
||||
}
|
||||
|
||||
- (NSArray *)dependencyUrlsForContainerURL:(NSURL *)url {
|
||||
NSString *ext = [url pathExtension];
|
||||
NSArray *containerSet = [containers objectForKey:[ext lowercaseString]];
|
||||
NSString *classString;
|
||||
if(containerSet) {
|
||||
if([containerSet count] > 1) {
|
||||
return [CogContainerMulti dependencyUrlsForContainerURL:url containers:containerSet];
|
||||
} else {
|
||||
classString = [containerSet objectAtIndex:0];
|
||||
}
|
||||
} else {
|
||||
return nil;
|
||||
}
|
||||
|
||||
Class container = NSClassFromString(classString);
|
||||
|
||||
if([container respondsToSelector:@selector(dependencyUrlsForContainerURL:)]) {
|
||||
return [container dependencyUrlsForContainerURL:url];
|
||||
} else {
|
||||
return nil;
|
||||
}
|
||||
}
|
||||
|
||||
// Note: Source is assumed to already be opened.
|
||||
- (id<CogDecoder>)audioDecoderForSource:(id<CogSource>)source skipCue:(BOOL)skip {
|
||||
NSString *ext = [[source url] pathExtension];
|
||||
|
|
504
Audio/ThirdParty/lvqcl/License/LICENSE.LGPL
vendored
504
Audio/ThirdParty/lvqcl/License/LICENSE.LGPL
vendored
|
@ -1,504 +0,0 @@
|
|||
GNU LESSER GENERAL PUBLIC LICENSE
|
||||
Version 2.1, February 1999
|
||||
|
||||
Copyright (C) 1991, 1999 Free Software Foundation, Inc.
|
||||
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
Everyone is permitted to copy and distribute verbatim copies
|
||||
of this license document, but changing it is not allowed.
|
||||
|
||||
[This is the first released version of the Lesser GPL. It also counts
|
||||
as the successor of the GNU Library Public License, version 2, hence
|
||||
the version number 2.1.]
|
||||
|
||||
Preamble
|
||||
|
||||
The licenses for most software are designed to take away your
|
||||
freedom to share and change it. By contrast, the GNU General Public
|
||||
Licenses are intended to guarantee your freedom to share and change
|
||||
free software--to make sure the software is free for all its users.
|
||||
|
||||
This license, the Lesser General Public License, applies to some
|
||||
specially designated software packages--typically libraries--of the
|
||||
Free Software Foundation and other authors who decide to use it. You
|
||||
can use it too, but we suggest you first think carefully about whether
|
||||
this license or the ordinary General Public License is the better
|
||||
strategy to use in any particular case, based on the explanations below.
|
||||
|
||||
When we speak of free software, we are referring to freedom of use,
|
||||
not price. Our General Public Licenses are designed to make sure that
|
||||
you have the freedom to distribute copies of free software (and charge
|
||||
for this service if you wish); that you receive source code or can get
|
||||
it if you want it; that you can change the software and use pieces of
|
||||
it in new free programs; and that you are informed that you can do
|
||||
these things.
|
||||
|
||||
To protect your rights, we need to make restrictions that forbid
|
||||
distributors to deny you these rights or to ask you to surrender these
|
||||
rights. These restrictions translate to certain responsibilities for
|
||||
you if you distribute copies of the library or if you modify it.
|
||||
|
||||
For example, if you distribute copies of the library, whether gratis
|
||||
or for a fee, you must give the recipients all the rights that we gave
|
||||
you. You must make sure that they, too, receive or can get the source
|
||||
code. If you link other code with the library, you must provide
|
||||
complete object files to the recipients, so that they can relink them
|
||||
with the library after making changes to the library and recompiling
|
||||
it. And you must show them these terms so they know their rights.
|
||||
|
||||
We protect your rights with a two-step method: (1) we copyright the
|
||||
library, and (2) we offer you this license, which gives you legal
|
||||
permission to copy, distribute and/or modify the library.
|
||||
|
||||
To protect each distributor, we want to make it very clear that
|
||||
there is no warranty for the free library. Also, if the library is
|
||||
modified by someone else and passed on, the recipients should know
|
||||
that what they have is not the original version, so that the original
|
||||
author's reputation will not be affected by problems that might be
|
||||
introduced by others.
|
||||
|
||||
Finally, software patents pose a constant threat to the existence of
|
||||
any free program. We wish to make sure that a company cannot
|
||||
effectively restrict the users of a free program by obtaining a
|
||||
restrictive license from a patent holder. Therefore, we insist that
|
||||
any patent license obtained for a version of the library must be
|
||||
consistent with the full freedom of use specified in this license.
|
||||
|
||||
Most GNU software, including some libraries, is covered by the
|
||||
ordinary GNU General Public License. This license, the GNU Lesser
|
||||
General Public License, applies to certain designated libraries, and
|
||||
is quite different from the ordinary General Public License. We use
|
||||
this license for certain libraries in order to permit linking those
|
||||
libraries into non-free programs.
|
||||
|
||||
When a program is linked with a library, whether statically or using
|
||||
a shared library, the combination of the two is legally speaking a
|
||||
combined work, a derivative of the original library. The ordinary
|
||||
General Public License therefore permits such linking only if the
|
||||
entire combination fits its criteria of freedom. The Lesser General
|
||||
Public License permits more lax criteria for linking other code with
|
||||
the library.
|
||||
|
||||
We call this license the "Lesser" General Public License because it
|
||||
does Less to protect the user's freedom than the ordinary General
|
||||
Public License. It also provides other free software developers Less
|
||||
of an advantage over competing non-free programs. These disadvantages
|
||||
are the reason we use the ordinary General Public License for many
|
||||
libraries. However, the Lesser license provides advantages in certain
|
||||
special circumstances.
|
||||
|
||||
For example, on rare occasions, there may be a special need to
|
||||
encourage the widest possible use of a certain library, so that it becomes
|
||||
a de-facto standard. To achieve this, non-free programs must be
|
||||
allowed to use the library. A more frequent case is that a free
|
||||
library does the same job as widely used non-free libraries. In this
|
||||
case, there is little to gain by limiting the free library to free
|
||||
software only, so we use the Lesser General Public License.
|
||||
|
||||
In other cases, permission to use a particular library in non-free
|
||||
programs enables a greater number of people to use a large body of
|
||||
free software. For example, permission to use the GNU C Library in
|
||||
non-free programs enables many more people to use the whole GNU
|
||||
operating system, as well as its variant, the GNU/Linux operating
|
||||
system.
|
||||
|
||||
Although the Lesser General Public License is Less protective of the
|
||||
users' freedom, it does ensure that the user of a program that is
|
||||
linked with the Library has the freedom and the wherewithal to run
|
||||
that program using a modified version of the Library.
|
||||
|
||||
The precise terms and conditions for copying, distribution and
|
||||
modification follow. Pay close attention to the difference between a
|
||||
"work based on the library" and a "work that uses the library". The
|
||||
former contains code derived from the library, whereas the latter must
|
||||
be combined with the library in order to run.
|
||||
|
||||
GNU LESSER GENERAL PUBLIC LICENSE
|
||||
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
|
||||
|
||||
0. This License Agreement applies to any software library or other
|
||||
program which contains a notice placed by the copyright holder or
|
||||
other authorized party saying it may be distributed under the terms of
|
||||
this Lesser General Public License (also called "this License").
|
||||
Each licensee is addressed as "you".
|
||||
|
||||
A "library" means a collection of software functions and/or data
|
||||
prepared so as to be conveniently linked with application programs
|
||||
(which use some of those functions and data) to form executables.
|
||||
|
||||
The "Library", below, refers to any such software library or work
|
||||
which has been distributed under these terms. A "work based on the
|
||||
Library" means either the Library or any derivative work under
|
||||
copyright law: that is to say, a work containing the Library or a
|
||||
portion of it, either verbatim or with modifications and/or translated
|
||||
straightforwardly into another language. (Hereinafter, translation is
|
||||
included without limitation in the term "modification".)
|
||||
|
||||
"Source code" for a work means the preferred form of the work for
|
||||
making modifications to it. For a library, complete source code means
|
||||
all the source code for all modules it contains, plus any associated
|
||||
interface definition files, plus the scripts used to control compilation
|
||||
and installation of the library.
|
||||
|
||||
Activities other than copying, distribution and modification are not
|
||||
covered by this License; they are outside its scope. The act of
|
||||
running a program using the Library is not restricted, and output from
|
||||
such a program is covered only if its contents constitute a work based
|
||||
on the Library (independent of the use of the Library in a tool for
|
||||
writing it). Whether that is true depends on what the Library does
|
||||
and what the program that uses the Library does.
|
||||
|
||||
1. You may copy and distribute verbatim copies of the Library's
|
||||
complete source code as you receive it, in any medium, provided that
|
||||
you conspicuously and appropriately publish on each copy an
|
||||
appropriate copyright notice and disclaimer of warranty; keep intact
|
||||
all the notices that refer to this License and to the absence of any
|
||||
warranty; and distribute a copy of this License along with the
|
||||
Library.
|
||||
|
||||
You may charge a fee for the physical act of transferring a copy,
|
||||
and you may at your option offer warranty protection in exchange for a
|
||||
fee.
|
||||
|
||||
2. You may modify your copy or copies of the Library or any portion
|
||||
of it, thus forming a work based on the Library, and copy and
|
||||
distribute such modifications or work under the terms of Section 1
|
||||
above, provided that you also meet all of these conditions:
|
||||
|
||||
a) The modified work must itself be a software library.
|
||||
|
||||
b) You must cause the files modified to carry prominent notices
|
||||
stating that you changed the files and the date of any change.
|
||||
|
||||
c) You must cause the whole of the work to be licensed at no
|
||||
charge to all third parties under the terms of this License.
|
||||
|
||||
d) If a facility in the modified Library refers to a function or a
|
||||
table of data to be supplied by an application program that uses
|
||||
the facility, other than as an argument passed when the facility
|
||||
is invoked, then you must make a good faith effort to ensure that,
|
||||
in the event an application does not supply such function or
|
||||
table, the facility still operates, and performs whatever part of
|
||||
its purpose remains meaningful.
|
||||
|
||||
(For example, a function in a library to compute square roots has
|
||||
a purpose that is entirely well-defined independent of the
|
||||
application. Therefore, Subsection 2d requires that any
|
||||
application-supplied function or table used by this function must
|
||||
be optional: if the application does not supply it, the square
|
||||
root function must still compute square roots.)
|
||||
|
||||
These requirements apply to the modified work as a whole. If
|
||||
identifiable sections of that work are not derived from the Library,
|
||||
and can be reasonably considered independent and separate works in
|
||||
themselves, then this License, and its terms, do not apply to those
|
||||
sections when you distribute them as separate works. But when you
|
||||
distribute the same sections as part of a whole which is a work based
|
||||
on the Library, the distribution of the whole must be on the terms of
|
||||
this License, whose permissions for other licensees extend to the
|
||||
entire whole, and thus to each and every part regardless of who wrote
|
||||
it.
|
||||
|
||||
Thus, it is not the intent of this section to claim rights or contest
|
||||
your rights to work written entirely by you; rather, the intent is to
|
||||
exercise the right to control the distribution of derivative or
|
||||
collective works based on the Library.
|
||||
|
||||
In addition, mere aggregation of another work not based on the Library
|
||||
with the Library (or with a work based on the Library) on a volume of
|
||||
a storage or distribution medium does not bring the other work under
|
||||
the scope of this License.
|
||||
|
||||
3. You may opt to apply the terms of the ordinary GNU General Public
|
||||
License instead of this License to a given copy of the Library. To do
|
||||
this, you must alter all the notices that refer to this License, so
|
||||
that they refer to the ordinary GNU General Public License, version 2,
|
||||
instead of to this License. (If a newer version than version 2 of the
|
||||
ordinary GNU General Public License has appeared, then you can specify
|
||||
that version instead if you wish.) Do not make any other change in
|
||||
these notices.
|
||||
|
||||
Once this change is made in a given copy, it is irreversible for
|
||||
that copy, so the ordinary GNU General Public License applies to all
|
||||
subsequent copies and derivative works made from that copy.
|
||||
|
||||
This option is useful when you wish to copy part of the code of
|
||||
the Library into a program that is not a library.
|
||||
|
||||
4. You may copy and distribute the Library (or a portion or
|
||||
derivative of it, under Section 2) in object code or executable form
|
||||
under the terms of Sections 1 and 2 above provided that you accompany
|
||||
it with the complete corresponding machine-readable source code, which
|
||||
must be distributed under the terms of Sections 1 and 2 above on a
|
||||
medium customarily used for software interchange.
|
||||
|
||||
If distribution of object code is made by offering access to copy
|
||||
from a designated place, then offering equivalent access to copy the
|
||||
source code from the same place satisfies the requirement to
|
||||
distribute the source code, even though third parties are not
|
||||
compelled to copy the source along with the object code.
|
||||
|
||||
5. A program that contains no derivative of any portion of the
|
||||
Library, but is designed to work with the Library by being compiled or
|
||||
linked with it, is called a "work that uses the Library". Such a
|
||||
work, in isolation, is not a derivative work of the Library, and
|
||||
therefore falls outside the scope of this License.
|
||||
|
||||
However, linking a "work that uses the Library" with the Library
|
||||
creates an executable that is a derivative of the Library (because it
|
||||
contains portions of the Library), rather than a "work that uses the
|
||||
library". The executable is therefore covered by this License.
|
||||
Section 6 states terms for distribution of such executables.
|
||||
|
||||
When a "work that uses the Library" uses material from a header file
|
||||
that is part of the Library, the object code for the work may be a
|
||||
derivative work of the Library even though the source code is not.
|
||||
Whether this is true is especially significant if the work can be
|
||||
linked without the Library, or if the work is itself a library. The
|
||||
threshold for this to be true is not precisely defined by law.
|
||||
|
||||
If such an object file uses only numerical parameters, data
|
||||
structure layouts and accessors, and small macros and small inline
|
||||
functions (ten lines or less in length), then the use of the object
|
||||
file is unrestricted, regardless of whether it is legally a derivative
|
||||
work. (Executables containing this object code plus portions of the
|
||||
Library will still fall under Section 6.)
|
||||
|
||||
Otherwise, if the work is a derivative of the Library, you may
|
||||
distribute the object code for the work under the terms of Section 6.
|
||||
Any executables containing that work also fall under Section 6,
|
||||
whether or not they are linked directly with the Library itself.
|
||||
|
||||
6. As an exception to the Sections above, you may also combine or
|
||||
link a "work that uses the Library" with the Library to produce a
|
||||
work containing portions of the Library, and distribute that work
|
||||
under terms of your choice, provided that the terms permit
|
||||
modification of the work for the customer's own use and reverse
|
||||
engineering for debugging such modifications.
|
||||
|
||||
You must give prominent notice with each copy of the work that the
|
||||
Library is used in it and that the Library and its use are covered by
|
||||
this License. You must supply a copy of this License. If the work
|
||||
during execution displays copyright notices, you must include the
|
||||
copyright notice for the Library among them, as well as a reference
|
||||
directing the user to the copy of this License. Also, you must do one
|
||||
of these things:
|
||||
|
||||
a) Accompany the work with the complete corresponding
|
||||
machine-readable source code for the Library including whatever
|
||||
changes were used in the work (which must be distributed under
|
||||
Sections 1 and 2 above); and, if the work is an executable linked
|
||||
with the Library, with the complete machine-readable "work that
|
||||
uses the Library", as object code and/or source code, so that the
|
||||
user can modify the Library and then relink to produce a modified
|
||||
executable containing the modified Library. (It is understood
|
||||
that the user who changes the contents of definitions files in the
|
||||
Library will not necessarily be able to recompile the application
|
||||
to use the modified definitions.)
|
||||
|
||||
b) Use a suitable shared library mechanism for linking with the
|
||||
Library. A suitable mechanism is one that (1) uses at run time a
|
||||
copy of the library already present on the user's computer system,
|
||||
rather than copying library functions into the executable, and (2)
|
||||
will operate properly with a modified version of the library, if
|
||||
the user installs one, as long as the modified version is
|
||||
interface-compatible with the version that the work was made with.
|
||||
|
||||
c) Accompany the work with a written offer, valid for at
|
||||
least three years, to give the same user the materials
|
||||
specified in Subsection 6a, above, for a charge no more
|
||||
than the cost of performing this distribution.
|
||||
|
||||
d) If distribution of the work is made by offering access to copy
|
||||
from a designated place, offer equivalent access to copy the above
|
||||
specified materials from the same place.
|
||||
|
||||
e) Verify that the user has already received a copy of these
|
||||
materials or that you have already sent this user a copy.
|
||||
|
||||
For an executable, the required form of the "work that uses the
|
||||
Library" must include any data and utility programs needed for
|
||||
reproducing the executable from it. However, as a special exception,
|
||||
the materials to be distributed need not include anything that is
|
||||
normally distributed (in either source or binary form) with the major
|
||||
components (compiler, kernel, and so on) of the operating system on
|
||||
which the executable runs, unless that component itself accompanies
|
||||
the executable.
|
||||
|
||||
It may happen that this requirement contradicts the license
|
||||
restrictions of other proprietary libraries that do not normally
|
||||
accompany the operating system. Such a contradiction means you cannot
|
||||
use both them and the Library together in an executable that you
|
||||
distribute.
|
||||
|
||||
7. You may place library facilities that are a work based on the
|
||||
Library side-by-side in a single library together with other library
|
||||
facilities not covered by this License, and distribute such a combined
|
||||
library, provided that the separate distribution of the work based on
|
||||
the Library and of the other library facilities is otherwise
|
||||
permitted, and provided that you do these two things:
|
||||
|
||||
a) Accompany the combined library with a copy of the same work
|
||||
based on the Library, uncombined with any other library
|
||||
facilities. This must be distributed under the terms of the
|
||||
Sections above.
|
||||
|
||||
b) Give prominent notice with the combined library of the fact
|
||||
that part of it is a work based on the Library, and explaining
|
||||
where to find the accompanying uncombined form of the same work.
|
||||
|
||||
8. You may not copy, modify, sublicense, link with, or distribute
|
||||
the Library except as expressly provided under this License. Any
|
||||
attempt otherwise to copy, modify, sublicense, link with, or
|
||||
distribute the Library is void, and will automatically terminate your
|
||||
rights under this License. However, parties who have received copies,
|
||||
or rights, from you under this License will not have their licenses
|
||||
terminated so long as such parties remain in full compliance.
|
||||
|
||||
9. You are not required to accept this License, since you have not
|
||||
signed it. However, nothing else grants you permission to modify or
|
||||
distribute the Library or its derivative works. These actions are
|
||||
prohibited by law if you do not accept this License. Therefore, by
|
||||
modifying or distributing the Library (or any work based on the
|
||||
Library), you indicate your acceptance of this License to do so, and
|
||||
all its terms and conditions for copying, distributing or modifying
|
||||
the Library or works based on it.
|
||||
|
||||
10. Each time you redistribute the Library (or any work based on the
|
||||
Library), the recipient automatically receives a license from the
|
||||
original licensor to copy, distribute, link with or modify the Library
|
||||
subject to these terms and conditions. You may not impose any further
|
||||
restrictions on the recipients' exercise of the rights granted herein.
|
||||
You are not responsible for enforcing compliance by third parties with
|
||||
this License.
|
||||
|
||||
11. If, as a consequence of a court judgment or allegation of patent
|
||||
infringement or for any other reason (not limited to patent issues),
|
||||
conditions are imposed on you (whether by court order, agreement or
|
||||
otherwise) that contradict the conditions of this License, they do not
|
||||
excuse you from the conditions of this License. If you cannot
|
||||
distribute so as to satisfy simultaneously your obligations under this
|
||||
License and any other pertinent obligations, then as a consequence you
|
||||
may not distribute the Library at all. For example, if a patent
|
||||
license would not permit royalty-free redistribution of the Library by
|
||||
all those who receive copies directly or indirectly through you, then
|
||||
the only way you could satisfy both it and this License would be to
|
||||
refrain entirely from distribution of the Library.
|
||||
|
||||
If any portion of this section is held invalid or unenforceable under any
|
||||
particular circumstance, the balance of the section is intended to apply,
|
||||
and the section as a whole is intended to apply in other circumstances.
|
||||
|
||||
It is not the purpose of this section to induce you to infringe any
|
||||
patents or other property right claims or to contest validity of any
|
||||
such claims; this section has the sole purpose of protecting the
|
||||
integrity of the free software distribution system which is
|
||||
implemented by public license practices. Many people have made
|
||||
generous contributions to the wide range of software distributed
|
||||
through that system in reliance on consistent application of that
|
||||
system; it is up to the author/donor to decide if he or she is willing
|
||||
to distribute software through any other system and a licensee cannot
|
||||
impose that choice.
|
||||
|
||||
This section is intended to make thoroughly clear what is believed to
|
||||
be a consequence of the rest of this License.
|
||||
|
||||
12. If the distribution and/or use of the Library is restricted in
|
||||
certain countries either by patents or by copyrighted interfaces, the
|
||||
original copyright holder who places the Library under this License may add
|
||||
an explicit geographical distribution limitation excluding those countries,
|
||||
so that distribution is permitted only in or among countries not thus
|
||||
excluded. In such case, this License incorporates the limitation as if
|
||||
written in the body of this License.
|
||||
|
||||
13. The Free Software Foundation may publish revised and/or new
|
||||
versions of the Lesser General Public License from time to time.
|
||||
Such new versions will be similar in spirit to the present version,
|
||||
but may differ in detail to address new problems or concerns.
|
||||
|
||||
Each version is given a distinguishing version number. If the Library
|
||||
specifies a version number of this License which applies to it and
|
||||
"any later version", you have the option of following the terms and
|
||||
conditions either of that version or of any later version published by
|
||||
the Free Software Foundation. If the Library does not specify a
|
||||
license version number, you may choose any version ever published by
|
||||
the Free Software Foundation.
|
||||
|
||||
14. If you wish to incorporate parts of the Library into other free
|
||||
programs whose distribution conditions are incompatible with these,
|
||||
write to the author to ask for permission. For software which is
|
||||
copyrighted by the Free Software Foundation, write to the Free
|
||||
Software Foundation; we sometimes make exceptions for this. Our
|
||||
decision will be guided by the two goals of preserving the free status
|
||||
of all derivatives of our free software and of promoting the sharing
|
||||
and reuse of software generally.
|
||||
|
||||
NO WARRANTY
|
||||
|
||||
15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO
|
||||
WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.
|
||||
EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR
|
||||
OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY
|
||||
KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
||||
PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE
|
||||
LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME
|
||||
THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
|
||||
|
||||
16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN
|
||||
WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY
|
||||
AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU
|
||||
FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR
|
||||
CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE
|
||||
LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING
|
||||
RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A
|
||||
FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF
|
||||
SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
|
||||
DAMAGES.
|
||||
|
||||
END OF TERMS AND CONDITIONS
|
||||
|
||||
How to Apply These Terms to Your New Libraries
|
||||
|
||||
If you develop a new library, and you want it to be of the greatest
|
||||
possible use to the public, we recommend making it free software that
|
||||
everyone can redistribute and change. You can do so by permitting
|
||||
redistribution under these terms (or, alternatively, under the terms of the
|
||||
ordinary General Public License).
|
||||
|
||||
To apply these terms, attach the following notices to the library. It is
|
||||
safest to attach them to the start of each source file to most effectively
|
||||
convey the exclusion of warranty; and each file should have at least the
|
||||
"copyright" line and a pointer to where the full notice is found.
|
||||
|
||||
<one line to give the library's name and a brief idea of what it does.>
|
||||
Copyright (C) <year> <name of author>
|
||||
|
||||
This library is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU Lesser General Public
|
||||
License as published by the Free Software Foundation; either
|
||||
version 2.1 of the License, or (at your option) any later version.
|
||||
|
||||
This library is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
Lesser General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public
|
||||
License along with this library; if not, write to the Free Software
|
||||
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
|
||||
Also add information on how to contact you by electronic and paper mail.
|
||||
|
||||
You should also get your employer (if you work as a programmer) or your
|
||||
school, if any, to sign a "copyright disclaimer" for the library, if
|
||||
necessary. Here is a sample; alter the names:
|
||||
|
||||
Yoyodyne, Inc., hereby disclaims all copyright interest in the
|
||||
library `Frob' (a library for tweaking knobs) written by James Random Hacker.
|
||||
|
||||
<signature of Ty Coon>, 1 April 1990
|
||||
Ty Coon, President of Vice
|
||||
|
||||
That's all there is to it!
|
||||
|
||||
|
39
Audio/ThirdParty/lvqcl/License/License.txt
vendored
39
Audio/ThirdParty/lvqcl/License/License.txt
vendored
|
@ -1,39 +0,0 @@
|
|||
SoX resampler plugin for foobar2000 audio player
|
||||
Copyright (C) lvqcl
|
||||
|
||||
This library is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU Lesser General Public
|
||||
License as published by the Free Software Foundation; either
|
||||
version 2.1 of the License, or (at your option) any later version.
|
||||
|
||||
This library is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
Lesser General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public
|
||||
License along with this library; if not, write to the Free Software
|
||||
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
|
||||
|
||||
This software uses code of SoX licensed under the terms of LGPLv2.1
|
||||
Copyright (C) robs@users.sourceforge.net
|
||||
Copyright (C) Chris Bagwell and SoX contributors
|
||||
Copyright (C) Reuben Thomas
|
||||
|
||||
|
||||
This software uses code of FFmpeg licensed under the terms of LGPLv2.1
|
||||
Copyright (C) Fabrice Bellard
|
||||
Copyright (C) Michael Niedermayer <michaelni@gmx.at>
|
||||
Copyright (C) Alex Converse <alex dot converse at gmail dot com>
|
||||
Copyright (C) Loren Merritt
|
||||
Copyright (C) Vitor Sessak
|
||||
Copyright (C) x264 project
|
||||
|
||||
|
||||
This software uses code of General Purpose FFT Package
|
||||
Copyright (C) Takuya OOURA
|
||||
|
||||
|
||||
This software uses code of foobar2000 1.4 SDK
|
||||
Copyright (C) 2001-2018, Peter Pawlowski
|
193
Audio/ThirdParty/lvqcl/lpc.c
vendored
193
Audio/ThirdParty/lvqcl/lpc.c
vendored
|
@ -1,193 +0,0 @@
|
|||
/*
|
||||
* Copyright (c) 2013, 2018 lvqcl
|
||||
*
|
||||
* Permission to use, copy, modify, and distribute this software for any
|
||||
* purpose with or without fee is hereby granted, provided that the above
|
||||
* copyright notice and this permission notice appear in all copies.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
||||
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
||||
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
|
||||
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
||||
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
||||
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
||||
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||
*/
|
||||
|
||||
#include <memory.h>
|
||||
#include <stdlib.h>
|
||||
#include <stdbool.h>
|
||||
#include "lpc.h"
|
||||
|
||||
static void apply_window(float *const data, const size_t data_len) {
|
||||
#if 0
|
||||
if (0) // subtract the mean
|
||||
{
|
||||
double mean = 0;
|
||||
for(int i = 0; i < (int)data_len; i++)
|
||||
mean += data[i];
|
||||
mean /= data_len;
|
||||
|
||||
for(int i = 0; i < (int)data_len; i++)
|
||||
data[i] -= (float)mean;
|
||||
}
|
||||
#endif
|
||||
|
||||
if(1) // Welch window
|
||||
{
|
||||
const float n2 = (data_len + 1) / 2.0f;
|
||||
for(int i = 0; i < (int)data_len; i++) {
|
||||
float k = (i + 1 - n2) / n2;
|
||||
data[data_len - 1 - i] *= 1.0f - k * k;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static float vorbis_lpc_from_data(float *data, float *lpci, int n, int m, double *aut, double *lpc) {
|
||||
double error;
|
||||
double epsilon;
|
||||
int i, j;
|
||||
|
||||
/* autocorrelation, p+1 lag coefficients */
|
||||
j = m + 1;
|
||||
while(j--) {
|
||||
double d = 0; /* double needed for accumulator depth */
|
||||
for(i = j; i < n; i++) d += (double)data[i] * data[i - j];
|
||||
aut[j] = d;
|
||||
}
|
||||
|
||||
/* Generate lpc coefficients from autocorr values */
|
||||
|
||||
/* set our noise floor to about -100dB */
|
||||
error = aut[0] * (1. + 1e-10);
|
||||
epsilon = 1e-9 * aut[0] + 1e-10;
|
||||
|
||||
for(i = 0; i < m; i++) {
|
||||
double r = -aut[i + 1];
|
||||
|
||||
if(error < epsilon) {
|
||||
memset(lpc + i, 0, (m - i) * sizeof(*lpc));
|
||||
goto done;
|
||||
}
|
||||
|
||||
/* Sum up this iteration's reflection coefficient; note that in
|
||||
Vorbis we don't save it. If anyone wants to recycle this code
|
||||
and needs reflection coefficients, save the results of 'r' from
|
||||
each iteration. */
|
||||
|
||||
for(j = 0; j < i; j++) r -= lpc[j] * aut[i - j];
|
||||
r /= error;
|
||||
|
||||
/* Update LPC coefficients and total error */
|
||||
|
||||
lpc[i] = r;
|
||||
for(j = 0; j < i / 2; j++) {
|
||||
double tmp = lpc[j];
|
||||
|
||||
lpc[j] += r * lpc[i - 1 - j];
|
||||
lpc[i - 1 - j] += r * tmp;
|
||||
}
|
||||
if(i & 1) lpc[j] += lpc[j] * r;
|
||||
|
||||
error *= 1. - r * r;
|
||||
}
|
||||
|
||||
done:
|
||||
|
||||
/* slightly damp the filter */
|
||||
{
|
||||
double g = .99;
|
||||
double damp = g;
|
||||
for(j = 0; j < m; j++) {
|
||||
lpc[j] *= damp;
|
||||
damp *= g;
|
||||
}
|
||||
}
|
||||
|
||||
for(j = 0; j < m; j++) lpci[j] = (float)lpc[j];
|
||||
|
||||
/* we need the error value to know how big an impulse to hit the
|
||||
filter with later */
|
||||
|
||||
return error;
|
||||
}
|
||||
|
||||
static void vorbis_lpc_predict(float *coeff, float *prime, int m, float *data, long n, float *work) {
|
||||
/* in: coeff[0...m-1] LPC coefficients
|
||||
prime[0...m-1] initial values (allocated size of n+m-1)
|
||||
out: data[0...n-1] data samples */
|
||||
|
||||
long i, j, o, p;
|
||||
float y;
|
||||
|
||||
if(!prime)
|
||||
for(i = 0; i < m; i++)
|
||||
work[i] = 0.f;
|
||||
else
|
||||
for(i = 0; i < m; i++)
|
||||
work[i] = prime[i];
|
||||
|
||||
for(i = 0; i < n; i++) {
|
||||
y = 0;
|
||||
o = i;
|
||||
p = m;
|
||||
for(j = 0; j < m; j++)
|
||||
y -= work[o++] * coeff[--p];
|
||||
|
||||
data[i] = work[o] = y;
|
||||
}
|
||||
}
|
||||
|
||||
void lpc_extrapolate2(float *const data, const size_t data_len, const int nch, const int lpc_order, const size_t extra_bkwd, const size_t extra_fwd, void **extrapolate_buffer, size_t *extrapolate_buffer_size) {
|
||||
const size_t tdata_size = sizeof(float) * (extra_bkwd + data_len + extra_fwd);
|
||||
const size_t aut_size = sizeof(double) * (lpc_order + 1);
|
||||
const size_t lpc_size = sizeof(double) * lpc_order;
|
||||
const size_t lpci_size = sizeof(float) * lpc_order;
|
||||
const size_t work_size = sizeof(float) * (extra_bkwd + lpc_order + extra_fwd);
|
||||
|
||||
const size_t new_size = tdata_size + aut_size + lpc_size + lpci_size + work_size;
|
||||
|
||||
if(new_size > *extrapolate_buffer_size) {
|
||||
*extrapolate_buffer = realloc(*extrapolate_buffer, new_size);
|
||||
*extrapolate_buffer_size = new_size;
|
||||
}
|
||||
|
||||
float *tdata = (float *)(*extrapolate_buffer); // for 1 channel only
|
||||
|
||||
double *aut = (double *)(*extrapolate_buffer + tdata_size);
|
||||
double *lpc = (double *)(*extrapolate_buffer + tdata_size + aut_size);
|
||||
float *lpci = (float *)(*extrapolate_buffer + tdata_size + aut_size + lpc_size);
|
||||
float *work = (float *)(*extrapolate_buffer + tdata_size + aut_size + lpc_size + lpci_size);
|
||||
|
||||
for(int c = 0; c < nch; c++) {
|
||||
if(extra_bkwd) {
|
||||
for(int i = 0; i < (int)data_len; i++)
|
||||
tdata[data_len - 1 - i] = data[i * nch + c];
|
||||
} else {
|
||||
for(int i = 0; i < (int)data_len; i++)
|
||||
tdata[i] = data[i * nch + c];
|
||||
}
|
||||
|
||||
apply_window(tdata, data_len);
|
||||
vorbis_lpc_from_data(tdata, lpci, (int)data_len, lpc_order, aut, lpc);
|
||||
|
||||
// restore after apply_window
|
||||
if(extra_bkwd) {
|
||||
for(int i = 0; i < (int)data_len; i++)
|
||||
tdata[data_len - 1 - i] = data[i * nch + c];
|
||||
} else {
|
||||
for(int i = 0; i < (int)data_len; i++)
|
||||
tdata[i] = data[i * nch + c];
|
||||
}
|
||||
|
||||
vorbis_lpc_predict(lpci, tdata + data_len - lpc_order, lpc_order, tdata + data_len, extra_fwd + extra_bkwd, work);
|
||||
|
||||
if(extra_bkwd) {
|
||||
for(int i = 0; i < extra_bkwd; i++)
|
||||
data[(-i - 1) * nch + c] = tdata[data_len + i];
|
||||
} else {
|
||||
for(int i = 0; i < extra_fwd; i++)
|
||||
data[(i + data_len) * nch + c] = tdata[data_len + i];
|
||||
}
|
||||
}
|
||||
}
|
48
Audio/ThirdParty/lvqcl/lpc.h
vendored
48
Audio/ThirdParty/lvqcl/lpc.h
vendored
|
@ -1,48 +0,0 @@
|
|||
#ifndef MY_LPC_H
|
||||
#define MY_LPC_H
|
||||
|
||||
/* data - beginning of the data
|
||||
* data_len - length of data (in samples) that are base for extrapolation
|
||||
* nch - number of (interleaved) channels
|
||||
* lpc_order - LPC order
|
||||
* extra_bkwd - number of samples to pre-extrapolate
|
||||
* extra_fwd - number of samples to post-extrapolate
|
||||
*
|
||||
* D = data; N = num_channels; LEN = data_len*N; EX = extra*N
|
||||
*
|
||||
* memory layout when invdir == false:
|
||||
*
|
||||
* [||||||||||||||||||||||||||||||||][||||||||||||||||||||][
|
||||
* ^ D[0] ^ D[LEN] ^ D[LEN+EX]
|
||||
*
|
||||
* memory layout when invdir == true:
|
||||
* ][||||||||||||||||||||][||||||||||||||||||||||||||||||||][
|
||||
* ^ D[0] ^ D[LEN]
|
||||
* ^ D[-1*N-EX] ^ D[-1*N]
|
||||
*
|
||||
*/
|
||||
|
||||
static const size_t LPC_ORDER = 32;
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
void lpc_extrapolate2(float * const data, const size_t data_len, const int nch, const int lpc_order, const size_t extra_bkwd, const size_t extra_fwd, void ** extrapolate_buffer, size_t * extrapolate_buffer_size);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
static inline void lpc_extrapolate_bkwd(float * const data, const size_t data_len, const size_t prime_len, const int nch, const int lpc_order, const size_t extra_bkwd, void ** extrapolate_buffer, size_t * extrapolate_buffer_size)
|
||||
{
|
||||
(void)data_len;
|
||||
lpc_extrapolate2(data, prime_len, nch, lpc_order, extra_bkwd, 0, extrapolate_buffer, extrapolate_buffer_size);
|
||||
}
|
||||
|
||||
static inline void lpc_extrapolate_fwd(float * const data, const size_t data_len, const size_t prime_len, const int nch, const int lpc_order, const size_t extra_fwd, void ** extrapolate_buffer, size_t * extrapolate_buffer_size)
|
||||
{
|
||||
lpc_extrapolate2(data + (data_len - prime_len)*nch, prime_len, nch, lpc_order, 0, extra_fwd, extrapolate_buffer, extrapolate_buffer_size);
|
||||
}
|
||||
|
||||
#endif
|
55
Audio/ThirdParty/lvqcl/util.h
vendored
55
Audio/ThirdParty/lvqcl/util.h
vendored
|
@ -1,55 +0,0 @@
|
|||
/* Copyright (c) 2018 lvqcl. All rights reserved.
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU Lesser General Public License as published by
|
||||
* the Free Software Foundation; either version 2.1 of the License, or (at
|
||||
* your option) any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful, but
|
||||
* WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser
|
||||
* General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public License
|
||||
* along with this library; if not, write to the Free Software Foundation,
|
||||
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
*/
|
||||
|
||||
#ifndef UTIL_H_
|
||||
#define UTIL_H_
|
||||
|
||||
#ifndef min
|
||||
#define min(a,b) (((a)<(b))?(a):(b))
|
||||
#endif
|
||||
#ifndef max
|
||||
#define max(a,b) (((a)>(b))?(a):(b))
|
||||
#endif
|
||||
|
||||
static inline unsigned local_gcd(unsigned a, unsigned b)
|
||||
{
|
||||
if (a == 0 || b == 0) return 0;
|
||||
unsigned c = a % b;
|
||||
while (c != 0) { a = b; b = c; c = a % b; }
|
||||
return b;
|
||||
}
|
||||
|
||||
/*
|
||||
In: *r1 and *r2: samplerates;
|
||||
Out: *r1 and *r2: numbers of samples;
|
||||
|
||||
multiply r1 and r2 by n so that durations is 1/N th of second;
|
||||
limit n so that r1 and r2 aren't bigger than M
|
||||
*/
|
||||
static void samples_len(unsigned* r1, unsigned* r2, unsigned N, unsigned M) // example: r1 = 44100, r2 = 48000, N = 20, M = 8192
|
||||
{
|
||||
if (r1 == 0 || r2 == 0 || *r1 == 0 || *r2 == 0) return;
|
||||
unsigned v = local_gcd(*r1, *r2); // v = 300
|
||||
*r1 /= v; *r2 /= v; // r1 = 147; r2 = 160 == 1/300th of second
|
||||
unsigned n = (v + N-1) / N; // n = 300/20 = 15 times
|
||||
unsigned z = max(*r1, *r2); // z = 160
|
||||
if (z*n > M) n = M / z; // 160*15 = 2400 < 8192;; if M == 1024: n = 1024/160 = 6; 160*6 = 960
|
||||
if (n < 1) n = 1;
|
||||
*r1 *= n; *r2 *= n; // r1 = 147*15 = 2205 samples, r2 = 160*15 = 2400 samples
|
||||
}
|
||||
|
||||
#endif
|
31
Audio/ThirdParty/r8bstate.cpp
vendored
Normal file
31
Audio/ThirdParty/r8bstate.cpp
vendored
Normal file
|
@ -0,0 +1,31 @@
|
|||
//
|
||||
// r8bstate.cpp
|
||||
// CogAudio Framework
|
||||
//
|
||||
// Created by Christopher Snowhill on 6/24/22.
|
||||
//
|
||||
|
||||
#include "r8bstate.h"
|
||||
#include "r8bstate.hpp"
|
||||
|
||||
void *r8bstate_new(int channelCount, int bufferCapacity, double srcRate,
|
||||
double dstRate) {
|
||||
return (void *)new r8bstate(channelCount, bufferCapacity, srcRate, dstRate);
|
||||
}
|
||||
|
||||
void r8bstate_delete(void *state) {
|
||||
delete(r8bstate *)state;
|
||||
}
|
||||
|
||||
double r8bstate_latency(void *state) {
|
||||
return ((r8bstate *)state)->latency();
|
||||
}
|
||||
|
||||
int r8bstate_resample(void *state, const float *input, size_t inCount, size_t *inDone,
|
||||
float *output, size_t outMax) {
|
||||
return ((r8bstate *)state)->resample(input, inCount, inDone, output, outMax);
|
||||
}
|
||||
|
||||
int r8bstate_flush(void *state, float *output, size_t outMax) {
|
||||
return ((r8bstate *)state)->flush(output, outMax);
|
||||
}
|
165
Audio/ThirdParty/r8bstate.h
vendored
165
Audio/ThirdParty/r8bstate.h
vendored
|
@ -2,163 +2,32 @@
|
|||
// r8bstate.h
|
||||
// CogAudio Framework
|
||||
//
|
||||
// Created by Christopher Snowhill on 3/3/22.
|
||||
// Created by Christopher Snowhill on 6/24/22.
|
||||
//
|
||||
|
||||
#include <stdint.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
#ifndef r8bstate_h
|
||||
#define r8bstate_h
|
||||
|
||||
#include <Accelerate/Accelerate.h>
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
#include "r8bbase.h"
|
||||
void *r8bstate_new(int channelCount, int bufferCapacity, double srcRate,
|
||||
double dstRate);
|
||||
void r8bstate_delete(void *);
|
||||
|
||||
#include "CDSPResampler.h"
|
||||
double r8bstate_latency(void *);
|
||||
|
||||
struct r8bstate {
|
||||
int channelCount;
|
||||
int bufferCapacity;
|
||||
size_t remainder;
|
||||
uint64_t inProcessed;
|
||||
uint64_t outProcessed;
|
||||
double sampleRatio;
|
||||
r8b::CFixedBuffer<double> InBuf;
|
||||
r8b::CFixedBuffer<double> *OutBufs;
|
||||
r8b::CDSPResampler24 **Resamps;
|
||||
r8bstate(int _channelCount, int _bufferCapacity, double srcRate, double dstRate)
|
||||
: channelCount(_channelCount), bufferCapacity(_bufferCapacity), inProcessed(0), outProcessed(0), remainder(0) {
|
||||
InBuf.alloc(bufferCapacity);
|
||||
OutBufs = new r8b::CFixedBuffer<double>[channelCount];
|
||||
Resamps = new r8b::CDSPResampler24 *[channelCount];
|
||||
for(int i = 0; i < channelCount; ++i) {
|
||||
Resamps[i] = new r8b::CDSPResampler24(srcRate, dstRate, bufferCapacity);
|
||||
}
|
||||
sampleRatio = dstRate / srcRate;
|
||||
}
|
||||
int r8bstate_resample(void *, const float *input, size_t inCount, size_t *inDone,
|
||||
float *output, size_t outMax);
|
||||
|
||||
~r8bstate() {
|
||||
delete[] OutBufs;
|
||||
for(int i = 0; i < channelCount; ++i) {
|
||||
delete Resamps[i];
|
||||
}
|
||||
delete[] Resamps;
|
||||
}
|
||||
int r8bstate_flush(void *, float *output, size_t outMax);
|
||||
|
||||
double latency() {
|
||||
return ((double)inProcessed * sampleRatio) - (double)outProcessed;
|
||||
}
|
||||
|
||||
int resample(const float *input, size_t inCount, size_t *inDone, float *output, size_t outMax) {
|
||||
int ret = 0;
|
||||
int i;
|
||||
if(inDone) *inDone = 0;
|
||||
while(remainder > 0) {
|
||||
size_t blockCount = remainder;
|
||||
if(blockCount > outMax)
|
||||
blockCount = outMax;
|
||||
for(i = 0; i < channelCount; ++i) {
|
||||
vDSP_vdpsp(&OutBufs[i][0], 1, output + i, channelCount, blockCount);
|
||||
}
|
||||
remainder -= blockCount;
|
||||
if(remainder > 0) {
|
||||
for(i = 0; i < channelCount; ++i) {
|
||||
memmove(&OutBufs[i][0], &OutBufs[i][blockCount], remainder * sizeof(double));
|
||||
}
|
||||
}
|
||||
output += channelCount * blockCount;
|
||||
outProcessed += blockCount;
|
||||
outMax -= blockCount;
|
||||
ret += blockCount;
|
||||
if(!outMax)
|
||||
return ret;
|
||||
}
|
||||
while(inCount > 0) {
|
||||
size_t blockCount = inCount;
|
||||
if(blockCount > bufferCapacity)
|
||||
blockCount = bufferCapacity;
|
||||
int outputDone = 0;
|
||||
for(i = 0; i < channelCount; ++i) {
|
||||
double *outputPointer;
|
||||
vDSP_vspdp(input + i, channelCount, &InBuf[0], 1, blockCount);
|
||||
outputDone = Resamps[i]->process(InBuf, (int)blockCount, outputPointer);
|
||||
if(outputDone) {
|
||||
if(outputDone > outMax) {
|
||||
vDSP_vdpsp(outputPointer, 1, output + i, channelCount, outMax);
|
||||
remainder = outputDone - outMax;
|
||||
OutBufs[i].alloc((int)remainder);
|
||||
memcpy(&OutBufs[i][0], outputPointer + outMax, remainder);
|
||||
} else {
|
||||
vDSP_vdpsp(outputPointer, 1, output + i, channelCount, outputDone);
|
||||
}
|
||||
}
|
||||
}
|
||||
size_t outputActual = outputDone - remainder;
|
||||
input += channelCount * blockCount;
|
||||
output += channelCount * outputActual;
|
||||
inCount -= blockCount;
|
||||
if(inDone) *inDone += blockCount;
|
||||
inProcessed += blockCount;
|
||||
outProcessed += outputActual;
|
||||
outMax -= outputActual;
|
||||
ret += outputActual;
|
||||
if(remainder)
|
||||
break;
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
int flush(float *output, size_t outMax) {
|
||||
int ret = 0;
|
||||
int i;
|
||||
if(remainder > 0) {
|
||||
size_t blockCount = remainder;
|
||||
if(blockCount > outMax)
|
||||
blockCount = outMax;
|
||||
for(i = 0; i < channelCount; ++i) {
|
||||
vDSP_vdpsp(&OutBufs[i][0], 1, output + i, channelCount, blockCount);
|
||||
}
|
||||
remainder -= blockCount;
|
||||
if(remainder > 0) {
|
||||
for(i = 0; i < channelCount; ++i) {
|
||||
memmove(&OutBufs[i][0], &OutBufs[i][blockCount], remainder * sizeof(double));
|
||||
}
|
||||
}
|
||||
output += channelCount * blockCount;
|
||||
outProcessed += blockCount;
|
||||
outMax -= blockCount;
|
||||
ret += blockCount;
|
||||
if(!outMax)
|
||||
return ret;
|
||||
}
|
||||
uint64_t outputWanted = ceil(inProcessed * sampleRatio);
|
||||
memset(&InBuf[0], 0, sizeof(double) * bufferCapacity);
|
||||
while(outProcessed < outputWanted) {
|
||||
int outputDone = 0;
|
||||
for(int i = 0; i < channelCount; ++i) {
|
||||
double *outputPointer;
|
||||
outputDone = Resamps[i]->process(InBuf, bufferCapacity, outputPointer);
|
||||
if(outputDone) {
|
||||
if(outputDone > (outputWanted - outProcessed))
|
||||
outputDone = (int)(outputWanted - outProcessed);
|
||||
if(outputDone > outMax) {
|
||||
vDSP_vdpsp(outputPointer, 1, output + i, channelCount, outMax);
|
||||
remainder = outputDone - outMax;
|
||||
OutBufs[i].alloc((int)remainder);
|
||||
memcpy(&OutBufs[i][0], outputPointer + outMax, remainder);
|
||||
} else {
|
||||
vDSP_vdpsp(outputPointer, 1, output + i, channelCount, outputDone);
|
||||
}
|
||||
}
|
||||
}
|
||||
size_t outputActual = outputDone - remainder;
|
||||
outProcessed += outputActual;
|
||||
output += channelCount * outputActual;
|
||||
outMax -= outputActual;
|
||||
ret += outputActual;
|
||||
if(remainder)
|
||||
break;
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
};
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* r8bstate_h */
|
||||
|
|
165
Audio/ThirdParty/r8bstate.hpp
vendored
Normal file
165
Audio/ThirdParty/r8bstate.hpp
vendored
Normal file
|
@ -0,0 +1,165 @@
|
|||
//
|
||||
// r8bstate.hpp
|
||||
// CogAudio Framework
|
||||
//
|
||||
// Created by Christopher Snowhill on 3/3/22.
|
||||
//
|
||||
|
||||
#ifndef r8bstate_hpp
|
||||
#define r8bstate_hpp
|
||||
|
||||
#include <Accelerate/Accelerate.h>
|
||||
|
||||
#include "r8bbase.h"
|
||||
|
||||
#include "CDSPResampler.h"
|
||||
|
||||
struct r8bstate {
|
||||
int channelCount;
|
||||
int bufferCapacity;
|
||||
size_t remainder;
|
||||
uint64_t inProcessed;
|
||||
uint64_t outProcessed;
|
||||
double sampleRatio;
|
||||
double dstRate;
|
||||
r8b::CFixedBuffer<double> InBuf;
|
||||
r8b::CFixedBuffer<double> *OutBufs;
|
||||
r8b::CDSPResampler24 **Resamps;
|
||||
r8bstate(int _channelCount, int _bufferCapacity, double srcRate, double _dstRate)
|
||||
: channelCount(_channelCount), bufferCapacity(_bufferCapacity), inProcessed(0), outProcessed(0), remainder(0), dstRate(_dstRate) {
|
||||
InBuf.alloc(bufferCapacity);
|
||||
OutBufs = new r8b::CFixedBuffer<double>[channelCount];
|
||||
Resamps = new r8b::CDSPResampler24 *[channelCount];
|
||||
for(int i = 0; i < channelCount; ++i) {
|
||||
Resamps[i] = new r8b::CDSPResampler24(srcRate, dstRate, bufferCapacity);
|
||||
}
|
||||
sampleRatio = dstRate / srcRate;
|
||||
}
|
||||
|
||||
~r8bstate() {
|
||||
delete[] OutBufs;
|
||||
for(int i = 0; i < channelCount; ++i) {
|
||||
delete Resamps[i];
|
||||
}
|
||||
delete[] Resamps;
|
||||
}
|
||||
|
||||
double latency() {
|
||||
return (((double)inProcessed * sampleRatio) - (double)outProcessed) / dstRate;
|
||||
}
|
||||
|
||||
int resample(const float *input, size_t inCount, size_t *inDone, float *output, size_t outMax) {
|
||||
int ret = 0;
|
||||
int i;
|
||||
if(inDone) *inDone = 0;
|
||||
while(remainder > 0) {
|
||||
size_t blockCount = remainder;
|
||||
if(blockCount > outMax)
|
||||
blockCount = outMax;
|
||||
for(i = 0; i < channelCount; ++i) {
|
||||
vDSP_vdpsp(&OutBufs[i][0], 1, output + i, channelCount, blockCount);
|
||||
}
|
||||
remainder -= blockCount;
|
||||
if(remainder > 0) {
|
||||
for(i = 0; i < channelCount; ++i) {
|
||||
memmove(&OutBufs[i][0], &OutBufs[i][blockCount], remainder * sizeof(double));
|
||||
}
|
||||
}
|
||||
output += channelCount * blockCount;
|
||||
outProcessed += blockCount;
|
||||
outMax -= blockCount;
|
||||
ret += blockCount;
|
||||
if(!outMax)
|
||||
return ret;
|
||||
}
|
||||
while(inCount > 0) {
|
||||
size_t blockCount = inCount;
|
||||
if(blockCount > bufferCapacity)
|
||||
blockCount = bufferCapacity;
|
||||
int outputDone = 0;
|
||||
for(i = 0; i < channelCount; ++i) {
|
||||
double *outputPointer;
|
||||
vDSP_vspdp(input + i, channelCount, &InBuf[0], 1, blockCount);
|
||||
outputDone = Resamps[i]->process(InBuf, (int)blockCount, outputPointer);
|
||||
if(outputDone) {
|
||||
if(outputDone > outMax) {
|
||||
vDSP_vdpsp(outputPointer, 1, output + i, channelCount, outMax);
|
||||
remainder = outputDone - outMax;
|
||||
OutBufs[i].alloc((int)remainder);
|
||||
memcpy(&OutBufs[i][0], outputPointer + outMax, remainder);
|
||||
} else {
|
||||
vDSP_vdpsp(outputPointer, 1, output + i, channelCount, outputDone);
|
||||
}
|
||||
}
|
||||
}
|
||||
size_t outputActual = outputDone - remainder;
|
||||
input += channelCount * blockCount;
|
||||
output += channelCount * outputActual;
|
||||
inCount -= blockCount;
|
||||
if(inDone) *inDone += blockCount;
|
||||
inProcessed += blockCount;
|
||||
outProcessed += outputActual;
|
||||
outMax -= outputActual;
|
||||
ret += outputActual;
|
||||
if(remainder)
|
||||
break;
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
int flush(float *output, size_t outMax) {
|
||||
int ret = 0;
|
||||
int i;
|
||||
if(remainder > 0) {
|
||||
size_t blockCount = remainder;
|
||||
if(blockCount > outMax)
|
||||
blockCount = outMax;
|
||||
for(i = 0; i < channelCount; ++i) {
|
||||
vDSP_vdpsp(&OutBufs[i][0], 1, output + i, channelCount, blockCount);
|
||||
}
|
||||
remainder -= blockCount;
|
||||
if(remainder > 0) {
|
||||
for(i = 0; i < channelCount; ++i) {
|
||||
memmove(&OutBufs[i][0], &OutBufs[i][blockCount], remainder * sizeof(double));
|
||||
}
|
||||
}
|
||||
output += channelCount * blockCount;
|
||||
outProcessed += blockCount;
|
||||
outMax -= blockCount;
|
||||
ret += blockCount;
|
||||
if(!outMax)
|
||||
return ret;
|
||||
}
|
||||
uint64_t outputWanted = ceil(inProcessed * sampleRatio);
|
||||
memset(&InBuf[0], 0, sizeof(double) * bufferCapacity);
|
||||
while(outProcessed < outputWanted) {
|
||||
int outputDone = 0;
|
||||
for(int i = 0; i < channelCount; ++i) {
|
||||
double *outputPointer;
|
||||
outputDone = Resamps[i]->process(InBuf, bufferCapacity, outputPointer);
|
||||
if(outputDone) {
|
||||
if(outputDone > (outputWanted - outProcessed))
|
||||
outputDone = (int)(outputWanted - outProcessed);
|
||||
if(outputDone > outMax) {
|
||||
vDSP_vdpsp(outputPointer, 1, output + i, channelCount, outMax);
|
||||
remainder = outputDone - outMax;
|
||||
OutBufs[i].alloc((int)remainder);
|
||||
memcpy(&OutBufs[i][0], outputPointer + outMax, remainder);
|
||||
} else {
|
||||
vDSP_vdpsp(outputPointer, 1, output + i, channelCount, outputDone);
|
||||
}
|
||||
}
|
||||
}
|
||||
size_t outputActual = outputDone - remainder;
|
||||
outProcessed += outputActual;
|
||||
output += channelCount * outputActual;
|
||||
outMax -= outputActual;
|
||||
ret += outputActual;
|
||||
if(remainder)
|
||||
break;
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
};
|
||||
|
||||
#endif /* r8bstate_h */
|
|
@ -11,15 +11,19 @@ NS_ASSUME_NONNULL_BEGIN
|
|||
|
||||
@interface VisualizationController : NSObject {
|
||||
double sampleRate;
|
||||
float visAudio[4096];
|
||||
double latency;
|
||||
float *visAudio;
|
||||
int visAudioCursor, visAudioSize;
|
||||
}
|
||||
|
||||
+ (VisualizationController *)sharedController;
|
||||
|
||||
- (void)postLatency:(double)latency;
|
||||
|
||||
- (void)postSampleRate:(double)sampleRate;
|
||||
- (void)postVisPCM:(const float *)inPCM amount:(int)amount;
|
||||
- (double)readSampleRate;
|
||||
- (void)copyVisPCM:(float *)outPCM visFFT:(float *)outFFT;
|
||||
- (void)copyVisPCM:(float *)outPCM visFFT:(float *)outFFT latencyOffset:(double)latency;
|
||||
|
||||
@end
|
||||
|
||||
|
|
|
@ -26,7 +26,8 @@ static VisualizationController *_sharedController = nil;
|
|||
- (id)init {
|
||||
self = [super init];
|
||||
if(self) {
|
||||
vDSP_vclr(visAudio, 1, 4096);
|
||||
visAudio = NULL;
|
||||
latency = 0;
|
||||
}
|
||||
return self;
|
||||
}
|
||||
|
@ -37,20 +38,40 @@ static VisualizationController *_sharedController = nil;
|
|||
|
||||
- (void)postSampleRate:(double)sampleRate {
|
||||
@synchronized(self) {
|
||||
if(self->sampleRate != sampleRate) {
|
||||
self->sampleRate = sampleRate;
|
||||
int visAudioSize = (int)(sampleRate * 45.0);
|
||||
void *visAudio = realloc(self->visAudio, visAudioSize * sizeof(float));
|
||||
if(visAudio && visAudioSize) {
|
||||
if(visAudioSize > self->visAudioSize) {
|
||||
bzero(((float *)visAudio) + self->visAudioSize, sizeof(float) * (visAudioSize - self->visAudioSize));
|
||||
}
|
||||
self->visAudio = visAudio;
|
||||
self->visAudioSize = visAudioSize;
|
||||
visAudioCursor %= visAudioSize;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
- (void)postVisPCM:(const float *)inPCM amount:(int)amount {
|
||||
int skipAmount = 0;
|
||||
if(amount > 4096) {
|
||||
skipAmount = amount - 4096;
|
||||
amount = 4096;
|
||||
}
|
||||
@synchronized(self) {
|
||||
cblas_scopy(4096 - amount, visAudio + amount, 1, visAudio, 1);
|
||||
cblas_scopy(amount, inPCM + skipAmount, 1, visAudio + 4096 - amount, 1);
|
||||
int samplesRead = 0;
|
||||
while(amount > 0) {
|
||||
int amountToCopy = (int)(visAudioSize - visAudioCursor);
|
||||
if(amountToCopy > amount) amountToCopy = amount;
|
||||
cblas_scopy(amountToCopy, inPCM + samplesRead, 1, visAudio + visAudioCursor, 1);
|
||||
visAudioCursor = visAudioCursor + amountToCopy;
|
||||
if(visAudioCursor >= visAudioSize) visAudioCursor -= visAudioSize;
|
||||
amount -= amountToCopy;
|
||||
samplesRead += amountToCopy;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
- (void)postLatency:(double)latency {
|
||||
self->latency = latency;
|
||||
assert(latency < 45.0);
|
||||
}
|
||||
|
||||
- (double)readSampleRate {
|
||||
|
@ -59,10 +80,41 @@ static VisualizationController *_sharedController = nil;
|
|||
}
|
||||
}
|
||||
|
||||
- (void)copyVisPCM:(float *)outPCM visFFT:(float *)outFFT {
|
||||
- (void)copyVisPCM:(float *)outPCM visFFT:(float *)outFFT latencyOffset:(double)latency {
|
||||
if(!outPCM && !outFFT) return;
|
||||
|
||||
float tempPCM[4096];
|
||||
if(!outPCM) outPCM = &tempPCM[0];
|
||||
|
||||
@synchronized(self) {
|
||||
cblas_scopy(4096, visAudio, 1, outPCM, 1);
|
||||
fft_calculate(visAudio, outFFT, 2048);
|
||||
if(!sampleRate) {
|
||||
bzero(outPCM, 4096 * sizeof(float));
|
||||
if(outFFT) {
|
||||
bzero(outFFT, 2048 * sizeof(float));
|
||||
}
|
||||
return;
|
||||
}
|
||||
int latencySamples = (int)(sampleRate * (self->latency + latency));
|
||||
if(latencySamples < 4096) latencySamples = 4096;
|
||||
int readCursor = visAudioCursor - latencySamples;
|
||||
int samples = 4096;
|
||||
int samplesRead = 0;
|
||||
while(readCursor < 0)
|
||||
readCursor += visAudioSize;
|
||||
while(readCursor >= visAudioSize)
|
||||
readCursor -= visAudioSize;
|
||||
while(samples > 0) {
|
||||
int samplesToRead = (int)(visAudioSize - readCursor);
|
||||
if(samplesToRead > samples) samplesToRead = samples;
|
||||
cblas_scopy(samplesToRead, visAudio + readCursor, 1, outPCM + samplesRead, 1);
|
||||
samplesRead += samplesToRead;
|
||||
readCursor += samplesToRead;
|
||||
samples -= samplesToRead;
|
||||
if(readCursor >= visAudioSize) readCursor -= visAudioSize;
|
||||
}
|
||||
}
|
||||
if(outFFT) {
|
||||
fft_calculate(outPCM, outFFT, 2048);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
97
Audio/Visualization/VisualizationController.swift
Normal file
97
Audio/Visualization/VisualizationController.swift
Normal file
|
@ -0,0 +1,97 @@
|
|||
//
|
||||
// VisualizationController.swift
|
||||
// CogAudio Framework
|
||||
//
|
||||
// Created by Christopher Snowhill on 6/30/22.
|
||||
//
|
||||
|
||||
import Foundation
|
||||
|
||||
@objc(VisualizationController)
|
||||
class VisualizationController {
|
||||
var serialQueue = DispatchQueue(label: "Visualization Queue")
|
||||
var sampleRate = 44100.0
|
||||
var latency = 0.0
|
||||
var visAudio: [Float] = Array(repeating: 0.0, count: 44100 * 45)
|
||||
var visAudioCursor = 0
|
||||
var visAudioSize = 0
|
||||
|
||||
private static var sharedController: VisualizationController = {
|
||||
let visualizationController = VisualizationController()
|
||||
return visualizationController
|
||||
}()
|
||||
|
||||
class func sharedVisualizationController() -> VisualizationController {
|
||||
return sharedController
|
||||
}
|
||||
|
||||
func postLatency(_ latency: Double) {
|
||||
self.latency = latency
|
||||
}
|
||||
|
||||
func postSampleRate(_ sampleRate: Double) {
|
||||
serialQueue.sync {
|
||||
if(self.sampleRate != sampleRate) {
|
||||
self.sampleRate = sampleRate
|
||||
visAudioSize = (Int)(sampleRate * 45.0)
|
||||
visAudio = Array(repeating: 0.0, count: visAudioSize)
|
||||
visAudioCursor = 0
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func postVisPCM(_ inPCM: UnsafePointer<Float>?, amount: Int) {
|
||||
serialQueue.sync {
|
||||
let bufferPointer = UnsafeBufferPointer(start: inPCM, count: amount)
|
||||
if let bptr = bufferPointer {
|
||||
let dataArray = bptr.assumingMemoryBound(to: Float.self)
|
||||
var j = self.visAudioCursor
|
||||
var k = self.visAudioSize
|
||||
for i in 0..<amount {
|
||||
let x = Float(dataArray[i])
|
||||
self.visAudio[j] = x
|
||||
j++; if j >= k { j = 0 }
|
||||
}
|
||||
self.visAudioCursor = j
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func readSampleRate() -> Double {
|
||||
serialQueue.sync {
|
||||
return self.sampleRate
|
||||
}
|
||||
}
|
||||
|
||||
func copyVisPCM(_ outPCM: UnsafeMutablePointer<Float>?, visFFT: UnsafeMutablePointer<Float>?, latencyoffset: Double) {
|
||||
let outPCMCopy = Array<Float>(repeating: 0.0, count: 4096)
|
||||
|
||||
serialQueue.sync {
|
||||
var latencySamples = (Int)(self.latency * self.sampleRate)
|
||||
var j = self.visAudioCursor - latencySamples
|
||||
var k = self.visAudioSize
|
||||
if j < 0 { j += k }
|
||||
for i in 0..4095 {
|
||||
let x = self.visAudio[j]
|
||||
outPCMCopy[i] = x
|
||||
j++; if j >= k { j = 0 }
|
||||
}
|
||||
}
|
||||
|
||||
let pcmPointer = UnsafeMutableBufferPointer(start: outPCM, count: 4096)
|
||||
if let bptr = pcmPointer {
|
||||
let dataArray = bptr.assumingMemoryBound(to: Float.self)
|
||||
for i in 0..4095 {
|
||||
let x = outPCMCopy[i]
|
||||
dataArray[i] = x
|
||||
}
|
||||
}
|
||||
|
||||
let fftPointer = UnsafeMutablePointer(start: visFFT, count: 2048)
|
||||
if let bptr = fftPointer {
|
||||
serialQueue.sync {
|
||||
fft_calculate(outPCMCopy, bptr, 2048)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
|
@ -1,157 +0,0 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="14313.18" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none">
|
||||
<dependencies>
|
||||
<deployment identifier="macosx"/>
|
||||
<plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="14313.18"/>
|
||||
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
|
||||
</dependencies>
|
||||
<objects>
|
||||
<customObject id="-2" userLabel="File's Owner" customClass="FileTreeViewController">
|
||||
<connections>
|
||||
<outlet property="fileTreeOutlineView" destination="69" id="141"/>
|
||||
<outlet property="firstResponder" destination="69" id="140"/>
|
||||
<outlet property="view" destination="55" id="103"/>
|
||||
</connections>
|
||||
</customObject>
|
||||
<customObject id="-1" userLabel="First Responder" customClass="FirstResponder"/>
|
||||
<customObject id="-3" userLabel="Application" customClass="NSObject"/>
|
||||
<customObject id="9" userLabel="FileTreeDataSource" customClass="FileTreeDataSource">
|
||||
<connections>
|
||||
<outlet property="outlineView" destination="69" id="88"/>
|
||||
<outlet property="pathControl" destination="65" id="109"/>
|
||||
<outlet property="watcher" destination="31" id="34"/>
|
||||
</connections>
|
||||
</customObject>
|
||||
<userDefaultsController representsSharedInstance="YES" id="27"/>
|
||||
<customObject id="31" customClass="PathWatcher">
|
||||
<connections>
|
||||
<outlet property="delegate" destination="9" id="33"/>
|
||||
</connections>
|
||||
</customObject>
|
||||
<customView id="55" userLabel="File Tree View">
|
||||
<rect key="frame" x="0.0" y="0.0" width="300" height="400"/>
|
||||
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
|
||||
<subviews>
|
||||
<pathControl focusRingType="none" verticalHuggingPriority="750" allowsExpansionToolTips="YES" id="65">
|
||||
<rect key="frame" x="0.0" y="374" width="300" height="26"/>
|
||||
<autoresizingMask key="autoresizingMask" widthSizable="YES" flexibleMinY="YES"/>
|
||||
<pathCell key="cell" selectable="YES" editable="YES" focusRingType="none" alignment="left" pathStyle="popUp" id="66">
|
||||
<font key="font" metaFont="system"/>
|
||||
<color key="backgroundColor" name="windowBackgroundColor" catalog="System" colorSpace="catalog"/>
|
||||
</pathCell>
|
||||
<connections>
|
||||
<binding destination="27" name="value" keyPath="values.fileTreeRootURL" id="108">
|
||||
<dictionary key="options">
|
||||
<string key="NSValueTransformerName">StringToURLTransformer</string>
|
||||
</dictionary>
|
||||
</binding>
|
||||
</connections>
|
||||
</pathControl>
|
||||
<box boxType="custom" borderType="line" title="Box" titlePosition="noTitle" id="147">
|
||||
<rect key="frame" x="0.0" y="373" width="300" height="1"/>
|
||||
<autoresizingMask key="autoresizingMask" widthSizable="YES" flexibleMinY="YES"/>
|
||||
<view key="contentView" id="Dg2-ay-LZH">
|
||||
<rect key="frame" x="1" y="1" width="298" height="0.0"/>
|
||||
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
|
||||
</view>
|
||||
<color key="borderColor" name="scrollBarColor" catalog="System" colorSpace="catalog"/>
|
||||
<color key="fillColor" name="textColor" catalog="System" colorSpace="catalog"/>
|
||||
<font key="titleFont" metaFont="system"/>
|
||||
</box>
|
||||
<scrollView borderType="none" autohidesScrollers="YES" horizontalLineScroll="23" horizontalPageScroll="10" verticalLineScroll="23" verticalPageScroll="10" usesPredominantAxisScrolling="NO" id="64">
|
||||
<rect key="frame" x="0.0" y="0.0" width="300" height="373"/>
|
||||
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
|
||||
<clipView key="contentView" drawsBackground="NO" copiesOnScroll="NO" id="OYe-Aa-Spw">
|
||||
<rect key="frame" x="0.0" y="0.0" width="300" height="373"/>
|
||||
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
|
||||
<subviews>
|
||||
<outlineView focusRingType="none" verticalHuggingPriority="750" allowsExpansionToolTips="YES" columnAutoresizingStyle="lastColumnOnly" selectionHighlightStyle="sourceList" columnReordering="NO" autosaveColumns="NO" autosaveName="FileTree" rowHeight="18" indentationPerLevel="14" autoresizesOutlineColumn="YES" outlineTableColumn="70" id="69" customClass="FileTreeOutlineView">
|
||||
<rect key="frame" x="0.0" y="0.0" width="300" height="373"/>
|
||||
<autoresizingMask key="autoresizingMask" flexibleMaxY="YES"/>
|
||||
<size key="intercellSpacing" width="3" height="5"/>
|
||||
<color key="backgroundColor" name="_sourceListBackgroundColor" catalog="System" colorSpace="catalog"/>
|
||||
<color key="gridColor" name="gridColor" catalog="System" colorSpace="catalog"/>
|
||||
<tableColumns>
|
||||
<tableColumn editable="NO" width="297" minWidth="16" maxWidth="1000" id="70">
|
||||
<tableHeaderCell key="headerCell" lineBreakMode="truncatingTail" borderStyle="border" alignment="left">
|
||||
<font key="font" metaFont="smallSystem"/>
|
||||
<color key="textColor" name="headerTextColor" catalog="System" colorSpace="catalog"/>
|
||||
<color key="backgroundColor" white="0.33333299" alpha="1" colorSpace="calibratedWhite"/>
|
||||
</tableHeaderCell>
|
||||
<textFieldCell key="dataCell" lineBreakMode="truncatingTail" selectable="YES" editable="YES" alignment="left" title="Text Cell" id="71" customClass="FileIconCell">
|
||||
<font key="font" metaFont="system"/>
|
||||
<color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
|
||||
<color key="backgroundColor" name="controlBackgroundColor" catalog="System" colorSpace="catalog"/>
|
||||
<connections>
|
||||
<binding destination="27" name="fontSize" keyPath="values.fontSize" id="93"/>
|
||||
</connections>
|
||||
</textFieldCell>
|
||||
<tableColumnResizingMask key="resizingMask" resizeWithTable="YES" userResizable="YES"/>
|
||||
</tableColumn>
|
||||
</tableColumns>
|
||||
<connections>
|
||||
<binding destination="27" name="rowHeight" keyPath="values.fontSize" id="86">
|
||||
<dictionary key="options">
|
||||
<string key="NSValueTransformerName">FontSizetoLineHeightTransformer</string>
|
||||
</dictionary>
|
||||
</binding>
|
||||
<outlet property="dataSource" destination="9" id="87"/>
|
||||
<outlet property="delegate" destination="94" id="98"/>
|
||||
<outlet property="menu" destination="110" id="121"/>
|
||||
</connections>
|
||||
</outlineView>
|
||||
</subviews>
|
||||
<nil key="backgroundColor"/>
|
||||
</clipView>
|
||||
<scroller key="horizontalScroller" hidden="YES" verticalHuggingPriority="750" horizontal="YES" id="67">
|
||||
<rect key="frame" x="0.0" y="362" width="306" height="15"/>
|
||||
<autoresizingMask key="autoresizingMask"/>
|
||||
</scroller>
|
||||
<scroller key="verticalScroller" hidden="YES" verticalHuggingPriority="750" horizontal="NO" id="68">
|
||||
<rect key="frame" x="261" y="0.0" width="15" height="363"/>
|
||||
<autoresizingMask key="autoresizingMask"/>
|
||||
</scroller>
|
||||
<connections>
|
||||
<outlet property="nextKeyView" destination="69" id="104"/>
|
||||
</connections>
|
||||
</scrollView>
|
||||
</subviews>
|
||||
</customView>
|
||||
<customObject id="94" customClass="FileTreeController">
|
||||
<connections>
|
||||
<outlet property="controller" destination="-2" id="106"/>
|
||||
<outlet property="dataSource" destination="9" id="137"/>
|
||||
<outlet property="outlineView" destination="69" id="95"/>
|
||||
</connections>
|
||||
</customObject>
|
||||
<menu title="Menu" id="110" userLabel="ContextualMenu">
|
||||
<items>
|
||||
<menuItem title="Add to Playlist" tag="1" id="119">
|
||||
<connections>
|
||||
<action selector="addToPlaylist:" target="94" id="122"/>
|
||||
</connections>
|
||||
</menuItem>
|
||||
<menuItem title="Set as Playlist" tag="2" id="129">
|
||||
<connections>
|
||||
<action selector="setAsPlaylist:" target="94" id="130"/>
|
||||
</connections>
|
||||
</menuItem>
|
||||
<menuItem isSeparatorItem="YES" id="128"/>
|
||||
<menuItem title="Show in Finder" tag="3" id="112">
|
||||
<connections>
|
||||
<action selector="showEntryInFinder:" target="94" id="123"/>
|
||||
</connections>
|
||||
</menuItem>
|
||||
<menuItem isSeparatorItem="YES" id="126"/>
|
||||
<menuItem title="Set as Root" tag="4" id="124">
|
||||
<connections>
|
||||
<action selector="setAsRoot:" target="94" id="125"/>
|
||||
</connections>
|
||||
</menuItem>
|
||||
</items>
|
||||
<connections>
|
||||
<outlet property="delegate" destination="69" id="139"/>
|
||||
</connections>
|
||||
</menu>
|
||||
</objects>
|
||||
</document>
|
|
@ -13,7 +13,7 @@
|
|||
</customObject>
|
||||
<customObject id="-1" userLabel="First Responder" customClass="FirstResponder"/>
|
||||
<customObject id="-3" userLabel="Application" customClass="NSObject"/>
|
||||
<window title="Info Inspector" separatorStyle="none" allowsToolTipsWhenApplicationIsInactive="NO" autorecalculatesKeyViewLoop="NO" hidesOnDeactivate="YES" visibleAtLaunch="NO" frameAutosaveName="InfoInspector" animationBehavior="default" titlebarAppearsTransparent="YES" id="1" customClass="NSPanel">
|
||||
<window title="Info Inspector" separatorStyle="none" allowsToolTipsWhenApplicationIsInactive="NO" autorecalculatesKeyViewLoop="NO" hidesOnDeactivate="YES" visibleAtLaunch="NO" animationBehavior="utilityWindow" frameAutosaveName="InfoInspector" titlebarAppearsTransparent="YES" id="1" customClass="NSPanel">
|
||||
<windowStyleMask key="styleMask" titled="YES" closable="YES" resizable="YES" utility="YES" nonactivatingPanel="YES" HUD="YES"/>
|
||||
<rect key="contentRect" x="700" y="80" width="300" height="582"/>
|
||||
<rect key="screenRect" x="0.0" y="0.0" width="1920" height="1055"/>
|
||||
|
@ -125,7 +125,7 @@
|
|||
<textField verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="33" customClass="ToolTipTextField">
|
||||
<rect key="frame" x="113" y="526" width="170" height="14"/>
|
||||
<autoresizingMask key="autoresizingMask" widthSizable="YES" flexibleMinY="YES"/>
|
||||
<textFieldCell key="cell" controlSize="small" lineBreakMode="truncatingMiddle" sendsActionOnEndEditing="YES" title="N/A" id="34">
|
||||
<textFieldCell key="cell" controlSize="small" lineBreakMode="truncatingMiddle" selectable="YES" sendsActionOnEndEditing="YES" title="N/A" id="34">
|
||||
<font key="font" metaFont="smallSystem"/>
|
||||
<color key="textColor" name="textColor" catalog="System" colorSpace="catalog"/>
|
||||
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
|
||||
|
@ -137,7 +137,7 @@
|
|||
<textField verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="35" customClass="ToolTipTextField">
|
||||
<rect key="frame" x="113" y="504" width="170" height="14"/>
|
||||
<autoresizingMask key="autoresizingMask" widthSizable="YES" flexibleMinY="YES"/>
|
||||
<textFieldCell key="cell" controlSize="small" lineBreakMode="truncatingMiddle" sendsActionOnEndEditing="YES" title="N/A" id="36">
|
||||
<textFieldCell key="cell" controlSize="small" lineBreakMode="truncatingMiddle" selectable="YES" sendsActionOnEndEditing="YES" title="N/A" id="36">
|
||||
<font key="font" metaFont="smallSystem"/>
|
||||
<color key="textColor" name="textColor" catalog="System" colorSpace="catalog"/>
|
||||
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
|
||||
|
@ -149,7 +149,7 @@
|
|||
<textField verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="37" customClass="ToolTipTextField">
|
||||
<rect key="frame" x="113" y="482" width="170" height="14"/>
|
||||
<autoresizingMask key="autoresizingMask" widthSizable="YES" flexibleMinY="YES"/>
|
||||
<textFieldCell key="cell" controlSize="small" lineBreakMode="truncatingMiddle" sendsActionOnEndEditing="YES" title="N/A" id="38">
|
||||
<textFieldCell key="cell" controlSize="small" lineBreakMode="truncatingMiddle" selectable="YES" sendsActionOnEndEditing="YES" title="N/A" id="38">
|
||||
<font key="font" metaFont="smallSystem"/>
|
||||
<color key="textColor" name="textColor" catalog="System" colorSpace="catalog"/>
|
||||
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
|
||||
|
@ -161,7 +161,7 @@
|
|||
<textField verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="39" customClass="ToolTipTextField">
|
||||
<rect key="frame" x="113" y="460" width="170" height="14"/>
|
||||
<autoresizingMask key="autoresizingMask" widthSizable="YES" flexibleMinY="YES"/>
|
||||
<textFieldCell key="cell" controlSize="small" lineBreakMode="truncatingMiddle" sendsActionOnEndEditing="YES" title="N/A" id="40">
|
||||
<textFieldCell key="cell" controlSize="small" lineBreakMode="truncatingMiddle" selectable="YES" sendsActionOnEndEditing="YES" title="N/A" id="40">
|
||||
<font key="font" metaFont="smallSystem"/>
|
||||
<color key="textColor" name="textColor" catalog="System" colorSpace="catalog"/>
|
||||
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
|
||||
|
@ -173,7 +173,7 @@
|
|||
<textField verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="41" customClass="ToolTipTextField">
|
||||
<rect key="frame" x="113" y="438" width="170" height="14"/>
|
||||
<autoresizingMask key="autoresizingMask" widthSizable="YES" flexibleMinY="YES"/>
|
||||
<textFieldCell key="cell" controlSize="small" lineBreakMode="truncatingMiddle" sendsActionOnEndEditing="YES" title="N/A" id="42">
|
||||
<textFieldCell key="cell" controlSize="small" lineBreakMode="truncatingMiddle" selectable="YES" sendsActionOnEndEditing="YES" title="N/A" id="42">
|
||||
<font key="font" metaFont="smallSystem"/>
|
||||
<color key="textColor" name="textColor" catalog="System" colorSpace="catalog"/>
|
||||
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
|
||||
|
@ -185,7 +185,7 @@
|
|||
<textField verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="43" customClass="ToolTipTextField">
|
||||
<rect key="frame" x="113" y="416" width="170" height="14"/>
|
||||
<autoresizingMask key="autoresizingMask" widthSizable="YES" flexibleMinY="YES"/>
|
||||
<textFieldCell key="cell" controlSize="small" lineBreakMode="truncatingMiddle" sendsActionOnEndEditing="YES" title="N/A" id="44">
|
||||
<textFieldCell key="cell" controlSize="small" lineBreakMode="truncatingMiddle" selectable="YES" sendsActionOnEndEditing="YES" title="N/A" id="44">
|
||||
<font key="font" metaFont="smallSystem"/>
|
||||
<color key="textColor" name="textColor" catalog="System" colorSpace="catalog"/>
|
||||
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
|
||||
|
@ -197,7 +197,7 @@
|
|||
<textField verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="45" customClass="ToolTipTextField">
|
||||
<rect key="frame" x="113" y="394" width="170" height="14"/>
|
||||
<autoresizingMask key="autoresizingMask" widthSizable="YES" flexibleMinY="YES"/>
|
||||
<textFieldCell key="cell" controlSize="small" lineBreakMode="truncatingMiddle" sendsActionOnEndEditing="YES" title="N/A" id="46">
|
||||
<textFieldCell key="cell" controlSize="small" lineBreakMode="truncatingMiddle" selectable="YES" sendsActionOnEndEditing="YES" title="N/A" id="46">
|
||||
<font key="font" metaFont="smallSystem"/>
|
||||
<color key="textColor" name="textColor" catalog="System" colorSpace="catalog"/>
|
||||
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
|
||||
|
@ -209,19 +209,23 @@
|
|||
<textField verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="49" customClass="ToolTipTextField">
|
||||
<rect key="frame" x="113" y="350" width="170" height="14"/>
|
||||
<autoresizingMask key="autoresizingMask" widthSizable="YES" flexibleMinY="YES"/>
|
||||
<textFieldCell key="cell" controlSize="small" lineBreakMode="truncatingMiddle" sendsActionOnEndEditing="YES" title="N/A" id="50">
|
||||
<textFieldCell key="cell" controlSize="small" lineBreakMode="truncatingMiddle" selectable="YES" sendsActionOnEndEditing="YES" title="N/A" id="50">
|
||||
<font key="font" metaFont="smallSystem"/>
|
||||
<color key="textColor" name="textColor" catalog="System" colorSpace="catalog"/>
|
||||
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
|
||||
</textFieldCell>
|
||||
<connections>
|
||||
<binding destination="-2" name="value" keyPath="valueToDisplay.sampleRate" id="116"/>
|
||||
<binding destination="-2" name="value" keyPath="valueToDisplay.sampleRate" id="jhK-B4-LCu">
|
||||
<dictionary key="options">
|
||||
<string key="NSValueTransformerName">NumberHertzToStringTransformer</string>
|
||||
</dictionary>
|
||||
</binding>
|
||||
</connections>
|
||||
</textField>
|
||||
<textField verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="51" customClass="ToolTipTextField">
|
||||
<rect key="frame" x="113" y="328" width="170" height="14"/>
|
||||
<autoresizingMask key="autoresizingMask" widthSizable="YES" flexibleMinY="YES"/>
|
||||
<textFieldCell key="cell" controlSize="small" lineBreakMode="truncatingMiddle" sendsActionOnEndEditing="YES" title="N/A" id="52">
|
||||
<textFieldCell key="cell" controlSize="small" lineBreakMode="truncatingMiddle" selectable="YES" sendsActionOnEndEditing="YES" title="N/A" id="52">
|
||||
<font key="font" metaFont="smallSystem"/>
|
||||
<color key="textColor" name="textColor" catalog="System" colorSpace="catalog"/>
|
||||
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
|
||||
|
@ -233,7 +237,7 @@
|
|||
<textField verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="53" customClass="ToolTipTextField">
|
||||
<rect key="frame" x="113" y="306" width="170" height="14"/>
|
||||
<autoresizingMask key="autoresizingMask" widthSizable="YES" flexibleMinY="YES"/>
|
||||
<textFieldCell key="cell" controlSize="small" lineBreakMode="truncatingMiddle" sendsActionOnEndEditing="YES" title="N/A" id="54">
|
||||
<textFieldCell key="cell" controlSize="small" lineBreakMode="truncatingMiddle" selectable="YES" sendsActionOnEndEditing="YES" title="N/A" id="54">
|
||||
<font key="font" metaFont="smallSystem"/>
|
||||
<color key="textColor" name="textColor" catalog="System" colorSpace="catalog"/>
|
||||
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
|
||||
|
@ -245,7 +249,7 @@
|
|||
<textField verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="55" customClass="ToolTipTextField">
|
||||
<rect key="frame" x="113" y="284" width="170" height="14"/>
|
||||
<autoresizingMask key="autoresizingMask" widthSizable="YES" flexibleMinY="YES"/>
|
||||
<textFieldCell key="cell" controlSize="small" lineBreakMode="truncatingMiddle" sendsActionOnEndEditing="YES" title="N/A" id="56">
|
||||
<textFieldCell key="cell" controlSize="small" lineBreakMode="truncatingMiddle" selectable="YES" sendsActionOnEndEditing="YES" title="N/A" id="56">
|
||||
<font key="font" metaFont="smallSystem"/>
|
||||
<color key="textColor" name="textColor" catalog="System" colorSpace="catalog"/>
|
||||
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
|
||||
|
@ -266,7 +270,7 @@
|
|||
<textField verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="ijS-y2-eCZ" customClass="ToolTipTextField">
|
||||
<rect key="frame" x="113" y="262" width="170" height="14"/>
|
||||
<autoresizingMask key="autoresizingMask" widthSizable="YES" flexibleMinY="YES"/>
|
||||
<textFieldCell key="cell" controlSize="small" lineBreakMode="truncatingMiddle" sendsActionOnEndEditing="YES" title="N/A" id="Yby-OU-cqP">
|
||||
<textFieldCell key="cell" controlSize="small" lineBreakMode="truncatingMiddle" selectable="YES" sendsActionOnEndEditing="YES" title="N/A" id="Yby-OU-cqP">
|
||||
<font key="font" metaFont="smallSystem"/>
|
||||
<color key="textColor" name="textColor" catalog="System" colorSpace="catalog"/>
|
||||
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
|
||||
|
@ -287,7 +291,7 @@
|
|||
<textField verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="L4f-rE-CN3" customClass="ToolTipTextField">
|
||||
<rect key="frame" x="113" y="240" width="170" height="14"/>
|
||||
<autoresizingMask key="autoresizingMask" widthSizable="YES" flexibleMinY="YES"/>
|
||||
<textFieldCell key="cell" controlSize="small" lineBreakMode="truncatingMiddle" sendsActionOnEndEditing="YES" title="N/A" id="v14-AG-B9D">
|
||||
<textFieldCell key="cell" controlSize="small" lineBreakMode="truncatingMiddle" selectable="YES" sendsActionOnEndEditing="YES" title="N/A" id="v14-AG-B9D">
|
||||
<font key="font" metaFont="smallSystem"/>
|
||||
<color key="textColor" name="textColor" catalog="System" colorSpace="catalog"/>
|
||||
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
|
||||
|
@ -308,7 +312,7 @@
|
|||
<textField verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="WOl-SC-4tu" customClass="ToolTipTextField">
|
||||
<rect key="frame" x="113" y="218" width="170" height="14"/>
|
||||
<autoresizingMask key="autoresizingMask" widthSizable="YES" flexibleMinY="YES"/>
|
||||
<textFieldCell key="cell" controlSize="small" lineBreakMode="truncatingMiddle" sendsActionOnEndEditing="YES" title="N/A" id="UyE-Mc-e39">
|
||||
<textFieldCell key="cell" controlSize="small" lineBreakMode="truncatingMiddle" selectable="YES" sendsActionOnEndEditing="YES" title="N/A" id="UyE-Mc-e39">
|
||||
<font key="font" metaFont="smallSystem"/>
|
||||
<color key="textColor" name="textColor" catalog="System" colorSpace="catalog"/>
|
||||
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
|
||||
|
@ -329,7 +333,7 @@
|
|||
<textField verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="2xx-It-i6I" customClass="ToolTipTextField">
|
||||
<rect key="frame" x="113" y="196" width="170" height="14"/>
|
||||
<autoresizingMask key="autoresizingMask" widthSizable="YES" flexibleMinY="YES"/>
|
||||
<textFieldCell key="cell" controlSize="small" lineBreakMode="truncatingMiddle" sendsActionOnEndEditing="YES" title="N/A" id="rAo-AP-lVa">
|
||||
<textFieldCell key="cell" controlSize="small" lineBreakMode="truncatingMiddle" selectable="YES" sendsActionOnEndEditing="YES" title="N/A" id="rAo-AP-lVa">
|
||||
<font key="font" metaFont="smallSystem"/>
|
||||
<color key="textColor" name="textColor" catalog="System" colorSpace="catalog"/>
|
||||
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
|
||||
|
@ -351,7 +355,7 @@
|
|||
<textField verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="86" customClass="ToolTipTextField">
|
||||
<rect key="frame" x="113" y="372" width="170" height="14"/>
|
||||
<autoresizingMask key="autoresizingMask" widthSizable="YES" flexibleMinY="YES"/>
|
||||
<textFieldCell key="cell" controlSize="small" lineBreakMode="truncatingMiddle" sendsActionOnEndEditing="YES" title="N/A" id="87">
|
||||
<textFieldCell key="cell" controlSize="small" lineBreakMode="truncatingMiddle" selectable="YES" sendsActionOnEndEditing="YES" title="N/A" id="87">
|
||||
<font key="font" metaFont="smallSystem"/>
|
||||
<color key="textColor" name="textColor" catalog="System" colorSpace="catalog"/>
|
||||
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
|
||||
|
@ -360,20 +364,6 @@
|
|||
<binding destination="-2" name="value" keyPath="valueToDisplay.filename" id="115"/>
|
||||
</connections>
|
||||
</textField>
|
||||
<imageView fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="95">
|
||||
<rect key="frame" x="17" y="17" width="266" height="138"/>
|
||||
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
|
||||
<imageCell key="cell" enabled="NO" refusesFirstResponder="YES" alignment="left" imageScaling="proportionallyDown" id="96"/>
|
||||
<connections>
|
||||
<binding destination="-2" name="value" keyPath="valueToDisplay.albumArt" id="121">
|
||||
<dictionary key="options">
|
||||
<bool key="NSAllowsEditingMultipleValuesSelection" value="NO"/>
|
||||
<bool key="NSConditionallySetsEnabled" value="NO"/>
|
||||
<string key="NSValueTransformerName">MissingAlbumArtTransformer</string>
|
||||
</dictionary>
|
||||
</binding>
|
||||
</connections>
|
||||
</imageView>
|
||||
<textField verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="vB6-9J-5qg">
|
||||
<rect key="frame" x="18" y="548" width="87" height="14"/>
|
||||
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
|
||||
|
@ -386,7 +376,7 @@
|
|||
<textField verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="cj0-Tw-xpq" customClass="ToolTipTextField">
|
||||
<rect key="frame" x="113" y="548" width="170" height="14"/>
|
||||
<autoresizingMask key="autoresizingMask" widthSizable="YES" flexibleMinY="YES"/>
|
||||
<textFieldCell key="cell" controlSize="small" lineBreakMode="truncatingMiddle" sendsActionOnEndEditing="YES" title="N/A" id="B8w-o8-ZBw">
|
||||
<textFieldCell key="cell" controlSize="small" lineBreakMode="truncatingMiddle" selectable="YES" sendsActionOnEndEditing="YES" title="N/A" id="B8w-o8-ZBw">
|
||||
<font key="font" metaFont="smallSystem"/>
|
||||
<color key="textColor" name="textColor" catalog="System" colorSpace="catalog"/>
|
||||
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
|
||||
|
@ -407,7 +397,7 @@
|
|||
<textField verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="WSs-wC-mWc" customClass="ToolTipTextField">
|
||||
<rect key="frame" x="113" y="174" width="170" height="14"/>
|
||||
<autoresizingMask key="autoresizingMask" widthSizable="YES" flexibleMinY="YES"/>
|
||||
<textFieldCell key="cell" controlSize="small" lineBreakMode="truncatingMiddle" sendsActionOnEndEditing="YES" title="N/A" id="Ial-XI-91y">
|
||||
<textFieldCell key="cell" controlSize="small" lineBreakMode="truncatingMiddle" selectable="YES" sendsActionOnEndEditing="YES" title="N/A" id="Ial-XI-91y">
|
||||
<font key="font" metaFont="smallSystem"/>
|
||||
<color key="textColor" name="textColor" catalog="System" colorSpace="catalog"/>
|
||||
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
|
||||
|
@ -417,6 +407,20 @@
|
|||
<binding destination="-2" name="toolTip" keyPath="valueToDisplay.playCountInfo" id="ydF-ec-fBX"/>
|
||||
</connections>
|
||||
</textField>
|
||||
<imageView horizontalHuggingPriority="251" verticalHuggingPriority="251" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="RWn-fb-0wT">
|
||||
<rect key="frame" x="0.0" y="20" width="300" height="146"/>
|
||||
<autoresizingMask key="autoresizingMask" widthSizable="YES" flexibleMaxX="YES" flexibleMinY="YES" heightSizable="YES"/>
|
||||
<imageCell key="cell" refusesFirstResponder="YES" alignment="left" imageScaling="proportionallyDown" id="vwy-pi-T4L"/>
|
||||
<connections>
|
||||
<binding destination="-2" name="value" keyPath="valueToDisplay.albumArt" id="bmd-73-heg">
|
||||
<dictionary key="options">
|
||||
<bool key="NSAllowsEditingMultipleValuesSelection" value="NO"/>
|
||||
<bool key="NSConditionallySetsEnabled" value="NO"/>
|
||||
<string key="NSValueTransformerName">MissingAlbumArtTransformer</string>
|
||||
</dictionary>
|
||||
</binding>
|
||||
</connections>
|
||||
</imageView>
|
||||
</subviews>
|
||||
</view>
|
||||
<point key="canvasLocation" x="136" y="131"/>
|
||||
|
|
|
@ -24,18 +24,15 @@
|
|||
<rect key="frame" x="0.0" y="0.0" width="1000" height="400"/>
|
||||
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
|
||||
<subviews>
|
||||
<splitView dividerStyle="thin" vertical="YES" translatesAutoresizingMaskIntoConstraints="NO" id="2123">
|
||||
<rect key="frame" x="0.0" y="354" width="1015" height="46"/>
|
||||
<subviews>
|
||||
<scrollView fixedFrame="YES" borderType="none" autohidesScrollers="YES" horizontalLineScroll="24" horizontalPageScroll="0.0" verticalLineScroll="24" verticalPageScroll="0.0" hasHorizontalScroller="NO" usesPredominantAxisScrolling="NO" id="206" userLabel="Scroll View - Playlist View">
|
||||
<rect key="frame" x="0.0" y="0.0" width="1015" height="46"/>
|
||||
<scrollView borderType="none" autohidesScrollers="YES" horizontalLineScroll="24" horizontalPageScroll="0.0" verticalLineScroll="24" verticalPageScroll="0.0" hasHorizontalScroller="NO" usesPredominantAxisScrolling="NO" id="206" userLabel="Scroll View - Playlist View">
|
||||
<rect key="frame" x="-30" y="197" width="1060" height="28"/>
|
||||
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
|
||||
<clipView key="contentView" drawsBackground="NO" copiesOnScroll="NO" id="KWC-Ti-8KY">
|
||||
<rect key="frame" x="0.0" y="0.0" width="1015" height="46"/>
|
||||
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
|
||||
<rect key="frame" x="0.0" y="0.0" width="1060" height="28"/>
|
||||
<autoresizingMask key="autoresizingMask"/>
|
||||
<subviews>
|
||||
<tableView focusRingType="none" verticalHuggingPriority="750" allowsExpansionToolTips="YES" alternatingRowBackgroundColors="YES" autosaveName="Playlist" rowHeight="18" headerView="1517" viewBased="YES" id="207" customClass="PlaylistView">
|
||||
<rect key="frame" x="0.0" y="0.0" width="1015" height="29"/>
|
||||
<rect key="frame" x="0.0" y="0.0" width="1060" height="11"/>
|
||||
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
|
||||
<size key="intercellSpacing" width="3" height="6"/>
|
||||
<color key="backgroundColor" name="controlBackgroundColor" catalog="System" colorSpace="catalog"/>
|
||||
|
@ -54,11 +51,11 @@
|
|||
<tableColumnResizingMask key="resizingMask" resizeWithTable="YES" userResizable="YES"/>
|
||||
<prototypeCellViews>
|
||||
<tableCellView id="5N3-SP-Y8z">
|
||||
<rect key="frame" x="11" y="3" width="69" height="18"/>
|
||||
<rect key="frame" x="11" y="3" width="69" height="5"/>
|
||||
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
|
||||
<subviews>
|
||||
<textField verticalHuggingPriority="750" horizontalCompressionResistancePriority="250" translatesAutoresizingMaskIntoConstraints="NO" id="w5u-JQ-3Hf">
|
||||
<rect key="frame" x="0.0" y="1" width="69" height="16"/>
|
||||
<rect key="frame" x="0.0" y="-5" width="69" height="16"/>
|
||||
<textFieldCell key="cell" lineBreakMode="truncatingTail" sendsActionOnEndEditing="YES" alignment="right" title="Table View Cell" id="FMU-QZ-NdQ">
|
||||
<font key="font" usesAppearanceFont="YES"/>
|
||||
<color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
|
||||
|
@ -95,15 +92,15 @@
|
|||
<tableColumnResizingMask key="resizingMask" resizeWithTable="YES" userResizable="YES"/>
|
||||
<prototypeCellViews>
|
||||
<tableCellView id="Vw5-xt-0vG">
|
||||
<rect key="frame" x="83" y="3" width="20" height="17"/>
|
||||
<rect key="frame" x="83" y="3" width="20" height="4"/>
|
||||
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
|
||||
<subviews>
|
||||
<imageView horizontalHuggingPriority="251" verticalHuggingPriority="251" misplaced="YES" translatesAutoresizingMaskIntoConstraints="NO" id="ERj-i9-caa">
|
||||
<rect key="frame" x="0.0" y="3" width="17" height="11"/>
|
||||
<rect key="frame" x="0.0" y="-10" width="17" height="11"/>
|
||||
<imageCell key="cell" refusesFirstResponder="YES" alignment="left" imageScaling="proportionallyDown" id="8rO-fU-Njw"/>
|
||||
</imageView>
|
||||
<textField verticalHuggingPriority="750" horizontalCompressionResistancePriority="250" allowsExpansionToolTips="YES" translatesAutoresizingMaskIntoConstraints="NO" id="5cp-JI-ogI">
|
||||
<rect key="frame" x="23" y="1" width="4" height="16"/>
|
||||
<rect key="frame" x="23" y="-12" width="4" height="16"/>
|
||||
<textFieldCell key="cell" lineBreakMode="truncatingTail" sendsActionOnEndEditing="YES" title="Table View Cell" id="wky-z8-Cj5">
|
||||
<font key="font" metaFont="system"/>
|
||||
<color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
|
||||
|
@ -127,8 +124,8 @@
|
|||
</tableCellView>
|
||||
</prototypeCellViews>
|
||||
</tableColumn>
|
||||
<tableColumn identifier="title" editable="NO" width="125.5" minWidth="96" maxWidth="1024" id="208">
|
||||
<tableHeaderCell key="headerCell" lineBreakMode="truncatingTail" borderStyle="border" alignment="left" title="Title">
|
||||
<tableColumn identifier="rating" editable="NO" width="64" minWidth="48" maxWidth="128" id="208" userLabel="Rating">
|
||||
<tableHeaderCell key="headerCell" lineBreakMode="truncatingTail" borderStyle="border" alignment="left" title="Rating">
|
||||
<color key="textColor" name="headerTextColor" catalog="System" colorSpace="catalog"/>
|
||||
<color key="backgroundColor" white="0.33333299" alpha="1" colorSpace="calibratedWhite"/>
|
||||
</tableHeaderCell>
|
||||
|
@ -141,11 +138,11 @@
|
|||
<tableColumnResizingMask key="resizingMask" resizeWithTable="YES" userResizable="YES"/>
|
||||
<prototypeCellViews>
|
||||
<tableCellView id="ZCP-Dx-UBV">
|
||||
<rect key="frame" x="106" y="3" width="126" height="18"/>
|
||||
<rect key="frame" x="106" y="3" width="64" height="5"/>
|
||||
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
|
||||
<subviews>
|
||||
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" horizontalCompressionResistancePriority="250" translatesAutoresizingMaskIntoConstraints="NO" id="exY-Bg-Mjm">
|
||||
<rect key="frame" x="0.0" y="1" width="126" height="16"/>
|
||||
<rect key="frame" x="0.0" y="-5" width="64" height="16"/>
|
||||
<textFieldCell key="cell" lineBreakMode="truncatingTail" sendsActionOnEndEditing="YES" title="Table View Cell" id="sdo-Sm-KPH">
|
||||
<font key="font" usesAppearanceFont="YES"/>
|
||||
<color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
|
||||
|
@ -171,6 +168,50 @@
|
|||
</binding>
|
||||
</connections>
|
||||
</tableColumn>
|
||||
<tableColumn identifier="title" editable="NO" width="125.5" minWidth="96" maxWidth="1024" id="XBr-ec-D81">
|
||||
<tableHeaderCell key="headerCell" lineBreakMode="truncatingTail" borderStyle="border" alignment="left" title="Title">
|
||||
<color key="textColor" name="headerTextColor" catalog="System" colorSpace="catalog"/>
|
||||
<color key="backgroundColor" white="0.33333299" alpha="1" colorSpace="calibratedWhite"/>
|
||||
</tableHeaderCell>
|
||||
<textFieldCell key="dataCell" lineBreakMode="truncatingTail" selectable="YES" editable="YES" alignment="left" title="Text Cell" id="20m-a6-e24">
|
||||
<font key="font" metaFont="system"/>
|
||||
<color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
|
||||
<color key="backgroundColor" name="controlBackgroundColor" catalog="System" colorSpace="catalog"/>
|
||||
</textFieldCell>
|
||||
<sortDescriptor key="sortDescriptorPrototype" selector="caseInsensitiveCompare:" sortKey="title"/>
|
||||
<tableColumnResizingMask key="resizingMask" resizeWithTable="YES" userResizable="YES"/>
|
||||
<prototypeCellViews>
|
||||
<tableCellView id="ZHl-H1-IIC">
|
||||
<rect key="frame" x="173" y="3" width="125.5" height="5"/>
|
||||
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
|
||||
<subviews>
|
||||
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" horizontalCompressionResistancePriority="250" translatesAutoresizingMaskIntoConstraints="NO" id="dQP-wC-mba">
|
||||
<rect key="frame" x="0.0" y="-5" width="126" height="16"/>
|
||||
<textFieldCell key="cell" lineBreakMode="truncatingTail" sendsActionOnEndEditing="YES" title="Table View Cell" id="VVx-99-roJ">
|
||||
<font key="font" usesAppearanceFont="YES"/>
|
||||
<color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
|
||||
<color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
|
||||
</textFieldCell>
|
||||
</textField>
|
||||
</subviews>
|
||||
<constraints>
|
||||
<constraint firstItem="dQP-wC-mba" firstAttribute="leading" secondItem="ZHl-H1-IIC" secondAttribute="leading" constant="2" id="RRE-MM-Fc6"/>
|
||||
<constraint firstItem="dQP-wC-mba" firstAttribute="centerX" secondItem="ZHl-H1-IIC" secondAttribute="centerX" id="T3S-gq-Mcb"/>
|
||||
<constraint firstItem="dQP-wC-mba" firstAttribute="centerY" secondItem="ZHl-H1-IIC" secondAttribute="centerY" id="auz-Po-AgT"/>
|
||||
</constraints>
|
||||
<connections>
|
||||
<outlet property="textField" destination="dQP-wC-mba" id="slW-Fj-66g"/>
|
||||
</connections>
|
||||
</tableCellView>
|
||||
</prototypeCellViews>
|
||||
<connections>
|
||||
<binding destination="218" name="value" keyPath="arrangedObjects.title" id="Qr8-tD-lGt">
|
||||
<dictionary key="options">
|
||||
<bool key="NSConditionallySetsEditable" value="YES"/>
|
||||
</dictionary>
|
||||
</binding>
|
||||
</connections>
|
||||
</tableColumn>
|
||||
<tableColumn identifier="albumartist" editable="NO" width="150" minWidth="96" maxWidth="1024" hidden="YES" id="yGV-gP-Wl6">
|
||||
<tableHeaderCell key="headerCell" lineBreakMode="truncatingTail" borderStyle="border" alignment="left" title="Album Artist">
|
||||
<color key="textColor" name="headerTextColor" catalog="System" colorSpace="catalog"/>
|
||||
|
@ -184,11 +225,11 @@
|
|||
<tableColumnResizingMask key="resizingMask" resizeWithTable="YES" userResizable="YES"/>
|
||||
<prototypeCellViews>
|
||||
<tableCellView id="x12-5b-Mmv">
|
||||
<rect key="frame" x="1" y="3" width="0.0" height="18"/>
|
||||
<rect key="frame" x="1" y="3" width="-3" height="5"/>
|
||||
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
|
||||
<subviews>
|
||||
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" horizontalCompressionResistancePriority="250" translatesAutoresizingMaskIntoConstraints="NO" id="ZWb-jm-i9i">
|
||||
<rect key="frame" x="1" y="1" width="4" height="16"/>
|
||||
<rect key="frame" x="0.0" y="-5" width="4" height="16"/>
|
||||
<textFieldCell key="cell" lineBreakMode="truncatingTail" sendsActionOnEndEditing="YES" title="Table View Cell" id="3QN-Ok-QPu">
|
||||
<font key="font" usesAppearanceFont="YES"/>
|
||||
<color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
|
||||
|
@ -229,11 +270,11 @@
|
|||
<tableColumnResizingMask key="resizingMask" resizeWithTable="YES" userResizable="YES"/>
|
||||
<prototypeCellViews>
|
||||
<tableCellView id="gpC-Oe-Rog">
|
||||
<rect key="frame" x="235" y="3" width="149" height="18"/>
|
||||
<rect key="frame" x="301.5" y="3" width="149.5" height="5"/>
|
||||
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
|
||||
<subviews>
|
||||
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" horizontalCompressionResistancePriority="250" translatesAutoresizingMaskIntoConstraints="NO" id="1WK-qN-Mgj">
|
||||
<rect key="frame" x="0.0" y="1" width="150" height="16"/>
|
||||
<rect key="frame" x="0.0" y="-5" width="150" height="16"/>
|
||||
<textFieldCell key="cell" lineBreakMode="truncatingTail" sendsActionOnEndEditing="YES" title="Table View Cell" id="71l-3L-S3g">
|
||||
<font key="font" usesAppearanceFont="YES"/>
|
||||
<color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
|
||||
|
@ -273,11 +314,11 @@
|
|||
<tableColumnResizingMask key="resizingMask" resizeWithTable="YES" userResizable="YES"/>
|
||||
<prototypeCellViews>
|
||||
<tableCellView id="1ed-gX-bct">
|
||||
<rect key="frame" x="387" y="3" width="151" height="18"/>
|
||||
<rect key="frame" x="454" y="3" width="150.5" height="5"/>
|
||||
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
|
||||
<subviews>
|
||||
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" horizontalCompressionResistancePriority="250" translatesAutoresizingMaskIntoConstraints="NO" id="nEt-s5-vRX">
|
||||
<rect key="frame" x="0.0" y="1" width="151" height="16"/>
|
||||
<rect key="frame" x="0.0" y="-5" width="151" height="16"/>
|
||||
<textFieldCell key="cell" lineBreakMode="truncatingTail" sendsActionOnEndEditing="YES" title="Table View Cell" id="moV-3G-GpB">
|
||||
<font key="font" usesAppearanceFont="YES"/>
|
||||
<color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
|
||||
|
@ -316,11 +357,11 @@
|
|||
<tableColumnResizingMask key="resizingMask" resizeWithTable="YES" userResizable="YES"/>
|
||||
<prototypeCellViews>
|
||||
<tableCellView id="hhB-nv-e78">
|
||||
<rect key="frame" x="541" y="3" width="95" height="18"/>
|
||||
<rect key="frame" x="607.5" y="3" width="95.5" height="5"/>
|
||||
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
|
||||
<subviews>
|
||||
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" horizontalCompressionResistancePriority="250" translatesAutoresizingMaskIntoConstraints="NO" id="tHy-sM-HDB">
|
||||
<rect key="frame" x="0.0" y="1" width="96" height="16"/>
|
||||
<rect key="frame" x="0.0" y="-5" width="96" height="16"/>
|
||||
<textFieldCell key="cell" lineBreakMode="truncatingTail" sendsActionOnEndEditing="YES" title="Table View Cell" id="Igo-5f-yim">
|
||||
<font key="font" usesAppearanceFont="YES"/>
|
||||
<color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
|
||||
|
@ -360,11 +401,11 @@
|
|||
<tableColumnResizingMask key="resizingMask" resizeWithTable="YES" userResizable="YES"/>
|
||||
<prototypeCellViews>
|
||||
<tableCellView id="q93-oh-i5T">
|
||||
<rect key="frame" x="639" y="3" width="94" height="18"/>
|
||||
<rect key="frame" x="706" y="3" width="93.5" height="5"/>
|
||||
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
|
||||
<subviews>
|
||||
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" horizontalCompressionResistancePriority="250" translatesAutoresizingMaskIntoConstraints="NO" id="bOi-LI-TDx">
|
||||
<rect key="frame" x="0.0" y="1" width="94" height="16"/>
|
||||
<rect key="frame" x="0.0" y="-5" width="94" height="16"/>
|
||||
<textFieldCell key="cell" lineBreakMode="truncatingTail" sendsActionOnEndEditing="YES" title="Table View Cell" id="C2Q-qG-dwX">
|
||||
<font key="font" usesAppearanceFont="YES"/>
|
||||
<color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
|
||||
|
@ -387,7 +428,7 @@
|
|||
<binding destination="1689" name="fontSize" keyPath="values.fontSize" id="1921"/>
|
||||
</connections>
|
||||
</tableColumn>
|
||||
<tableColumn identifier="genre" editable="NO" width="144" minWidth="96" maxWidth="512" id="849">
|
||||
<tableColumn identifier="genre" editable="NO" width="64" minWidth="32" maxWidth="512" id="849">
|
||||
<tableHeaderCell key="headerCell" lineBreakMode="truncatingTail" borderStyle="border" alignment="left" title="Genre">
|
||||
<color key="textColor" name="headerTextColor" catalog="System" colorSpace="catalog"/>
|
||||
<color key="backgroundColor" name="headerColor" catalog="System" colorSpace="catalog"/>
|
||||
|
@ -401,11 +442,11 @@
|
|||
<tableColumnResizingMask key="resizingMask" resizeWithTable="YES" userResizable="YES"/>
|
||||
<prototypeCellViews>
|
||||
<tableCellView id="rRl-p9-Awr">
|
||||
<rect key="frame" x="736" y="3" width="144" height="18"/>
|
||||
<rect key="frame" x="802.5" y="3" width="64" height="5"/>
|
||||
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
|
||||
<subviews>
|
||||
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" horizontalCompressionResistancePriority="250" translatesAutoresizingMaskIntoConstraints="NO" id="yW6-2w-6mN">
|
||||
<rect key="frame" x="0.0" y="1" width="144" height="16"/>
|
||||
<rect key="frame" x="0.0" y="-5" width="64" height="16"/>
|
||||
<textFieldCell key="cell" lineBreakMode="truncatingTail" sendsActionOnEndEditing="YES" title="Table View Cell" id="js2-sT-U4M">
|
||||
<font key="font" usesAppearanceFont="YES"/>
|
||||
<color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
|
||||
|
@ -441,11 +482,11 @@
|
|||
<tableColumnResizingMask key="resizingMask" resizeWithTable="YES" userResizable="YES"/>
|
||||
<prototypeCellViews>
|
||||
<tableCellView id="hgh-VE-5kl">
|
||||
<rect key="frame" x="883" y="3" width="38" height="18"/>
|
||||
<rect key="frame" x="869.5" y="3" width="38.5" height="5"/>
|
||||
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
|
||||
<subviews>
|
||||
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" horizontalCompressionResistancePriority="250" translatesAutoresizingMaskIntoConstraints="NO" id="yEY-MI-d3o">
|
||||
<rect key="frame" x="0.0" y="1" width="39" height="16"/>
|
||||
<rect key="frame" x="0.0" y="-5" width="39" height="16"/>
|
||||
<textFieldCell key="cell" lineBreakMode="truncatingTail" sendsActionOnEndEditing="YES" title="Table View Cell" id="tus-lr-RhS">
|
||||
<font key="font" usesAppearanceFont="YES"/>
|
||||
<color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
|
||||
|
@ -481,11 +522,11 @@
|
|||
<tableColumnResizingMask key="resizingMask" resizeWithTable="YES" userResizable="YES"/>
|
||||
<prototypeCellViews>
|
||||
<tableCellView id="d01-Wn-4bd">
|
||||
<rect key="frame" x="1" y="3" width="0.0" height="18"/>
|
||||
<rect key="frame" x="1" y="3" width="-3" height="5"/>
|
||||
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
|
||||
<subviews>
|
||||
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" horizontalCompressionResistancePriority="250" translatesAutoresizingMaskIntoConstraints="NO" id="QFJ-4l-2O6">
|
||||
<rect key="frame" x="1" y="1" width="4" height="16"/>
|
||||
<rect key="frame" x="0.0" y="-5" width="4" height="16"/>
|
||||
<textFieldCell key="cell" lineBreakMode="truncatingTail" sendsActionOnEndEditing="YES" title="Table View Cell" id="gKK-cS-RP5">
|
||||
<font key="font" usesAppearanceFont="YES"/>
|
||||
<color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
|
||||
|
@ -525,11 +566,11 @@
|
|||
<tableColumnResizingMask key="resizingMask" resizeWithTable="YES" userResizable="YES"/>
|
||||
<prototypeCellViews>
|
||||
<tableCellView id="ICT-dh-UfT">
|
||||
<rect key="frame" x="1" y="3" width="0.0" height="18"/>
|
||||
<rect key="frame" x="1" y="3" width="-3" height="5"/>
|
||||
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
|
||||
<subviews>
|
||||
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" horizontalCompressionResistancePriority="250" translatesAutoresizingMaskIntoConstraints="NO" id="Qvd-sk-vRc">
|
||||
<rect key="frame" x="1" y="1" width="4" height="16"/>
|
||||
<rect key="frame" x="0.0" y="-5" width="4" height="16"/>
|
||||
<textFieldCell key="cell" lineBreakMode="truncatingTail" sendsActionOnEndEditing="YES" title="Table View Cell" id="YwT-z9-2d2">
|
||||
<font key="font" usesAppearanceFont="YES"/>
|
||||
<color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
|
||||
|
@ -569,11 +610,11 @@
|
|||
<tableColumnResizingMask key="resizingMask" resizeWithTable="YES" userResizable="YES"/>
|
||||
<prototypeCellViews>
|
||||
<tableCellView id="PuO-Ss-1Vs">
|
||||
<rect key="frame" x="1" y="3" width="0.0" height="18"/>
|
||||
<rect key="frame" x="1" y="3" width="-3" height="5"/>
|
||||
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
|
||||
<subviews>
|
||||
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" horizontalCompressionResistancePriority="250" translatesAutoresizingMaskIntoConstraints="NO" id="gXW-DX-EsQ">
|
||||
<rect key="frame" x="1" y="1" width="4" height="16"/>
|
||||
<rect key="frame" x="0.0" y="-5" width="4" height="16"/>
|
||||
<textFieldCell key="cell" lineBreakMode="truncatingTail" sendsActionOnEndEditing="YES" title="Table View Cell" id="vaJ-Bc-ebE">
|
||||
<font key="font" usesAppearanceFont="YES"/>
|
||||
<color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
|
||||
|
@ -624,24 +665,16 @@
|
|||
<autoresizingMask key="autoresizingMask"/>
|
||||
</scroller>
|
||||
<scroller key="verticalScroller" hidden="YES" wantsLayer="YES" verticalHuggingPriority="750" horizontal="NO" id="1515">
|
||||
<rect key="frame" x="85" y="17" width="15" height="68"/>
|
||||
<rect key="frame" x="1045" y="17" width="15" height="11"/>
|
||||
<autoresizingMask key="autoresizingMask"/>
|
||||
</scroller>
|
||||
<tableHeaderView key="headerView" wantsLayer="YES" id="1517">
|
||||
<rect key="frame" x="0.0" y="0.0" width="1015" height="17"/>
|
||||
<rect key="frame" x="0.0" y="0.0" width="1060" height="17"/>
|
||||
<autoresizingMask key="autoresizingMask"/>
|
||||
</tableHeaderView>
|
||||
</scrollView>
|
||||
</subviews>
|
||||
<holdingPriorities>
|
||||
<real value="250"/>
|
||||
</holdingPriorities>
|
||||
<connections>
|
||||
<outlet property="delegate" destination="2172" id="2182"/>
|
||||
</connections>
|
||||
</splitView>
|
||||
<textField verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="778">
|
||||
<rect key="frame" x="377" y="4" width="261" height="14"/>
|
||||
<rect key="frame" x="385" y="4" width="261" height="14"/>
|
||||
<textFieldCell key="cell" controlSize="small" lineBreakMode="truncatingTail" sendsActionOnEndEditing="YES" alignment="center" title="Total Duration: 00 hours 00 minutes 00 seconds" bezelStyle="round" id="1473">
|
||||
<font key="font" metaFont="controlContent" size="11"/>
|
||||
<color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
|
||||
|
@ -663,9 +696,7 @@
|
|||
</textField>
|
||||
</subviews>
|
||||
<constraints>
|
||||
<constraint firstAttribute="trailing" secondItem="2123" secondAttribute="trailing" id="cHp-aQ-EyQ"/>
|
||||
<constraint firstAttribute="bottom" secondItem="778" secondAttribute="bottom" constant="4" id="ecR-9t-bvJ"/>
|
||||
<constraint firstItem="2123" firstAttribute="leading" secondItem="2" secondAttribute="leading" id="wrv-PH-gyc"/>
|
||||
</constraints>
|
||||
<visibilityPriorities>
|
||||
<integer value="1000"/>
|
||||
|
@ -808,20 +839,6 @@
|
|||
</connections>
|
||||
</button>
|
||||
</toolbarItem>
|
||||
<toolbarItem implicitItemIdentifier="6EE50288-54ED-448F-BB25-347479AE119F" label="File Tree" paletteLabel="File Tree" image="navigatorTemplate" sizingBehavior="auto" navigational="YES" id="1630">
|
||||
<nil key="toolTip"/>
|
||||
<button key="view" verticalHuggingPriority="750" id="1631">
|
||||
<rect key="frame" x="12" y="14" width="28" height="23"/>
|
||||
<autoresizingMask key="autoresizingMask"/>
|
||||
<buttonCell key="cell" type="roundTextured" bezelStyle="texturedRounded" image="navigatorTemplate" imagePosition="only" alignment="center" borderStyle="border" id="1632">
|
||||
<behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/>
|
||||
<font key="font" metaFont="system"/>
|
||||
</buttonCell>
|
||||
<connections>
|
||||
<action selector="toggleSideView:" target="2172" id="2427"/>
|
||||
</connections>
|
||||
</button>
|
||||
</toolbarItem>
|
||||
<toolbarItem implicitItemIdentifier="972E4070-D310-48FE-BA9B-C06B248FF020" label="Randomize" paletteLabel="Randomize" image="randomizeTemplate" bordered="YES" sizingBehavior="auto" id="2466">
|
||||
<nil key="toolTip"/>
|
||||
<button key="view" verticalHuggingPriority="750" id="2467">
|
||||
|
@ -956,7 +973,6 @@
|
|||
<toolbarItem reference="1639"/>
|
||||
<toolbarItem reference="2466"/>
|
||||
<toolbarItem reference="1552"/>
|
||||
<toolbarItem reference="1630"/>
|
||||
<toolbarItem reference="1629"/>
|
||||
<toolbarItem reference="1529"/>
|
||||
<toolbarItem reference="NtB-XF-g07"/>
|
||||
|
@ -1242,9 +1258,21 @@
|
|||
<action selector="showWindow:" target="Hd4-Wy-Rfl" id="xfd-8T-SL4"/>
|
||||
</connections>
|
||||
</menuItem>
|
||||
<menuItem title="Check for Updates..." id="302">
|
||||
<connections>
|
||||
<action selector="checkForUpdates:" target="1303" id="1304"/>
|
||||
</connections>
|
||||
</menuItem>
|
||||
<menuItem isSeparatorItem="YES" id="1100">
|
||||
<modifierMask key="keyEquivalentModifierMask" command="YES"/>
|
||||
</menuItem>
|
||||
<menuItem title="Privacy Policy..." id="nb7-FW-egH">
|
||||
<modifierMask key="keyEquivalentModifierMask"/>
|
||||
<connections>
|
||||
<action selector="privacyPolicy:" target="226" id="c3c-kH-5sf"/>
|
||||
</connections>
|
||||
</menuItem>
|
||||
<menuItem isSeparatorItem="YES" id="0ig-xg-gkg"/>
|
||||
<menuItem title="Donate" id="751">
|
||||
<modifierMask key="keyEquivalentModifierMask"/>
|
||||
<menu key="submenu" title="Donate" id="kue-p2-G0Y">
|
||||
|
@ -1431,11 +1459,6 @@
|
|||
<action selector="toggleWindow:" target="1675" id="1880"/>
|
||||
</connections>
|
||||
</menuItem>
|
||||
<menuItem title="Show File Tree" keyEquivalent="d" id="2417">
|
||||
<connections>
|
||||
<action selector="toggleSideView:" target="2172" id="2419"/>
|
||||
</connections>
|
||||
</menuItem>
|
||||
<menuItem title="Show Equalizer" keyEquivalent="e" id="nBU-pH-J3I">
|
||||
<modifierMask key="keyEquivalentModifierMask" option="YES" command="YES"/>
|
||||
<connections>
|
||||
|
@ -1450,12 +1473,6 @@
|
|||
<menuItem isSeparatorItem="YES" id="1854">
|
||||
<modifierMask key="keyEquivalentModifierMask" command="YES"/>
|
||||
</menuItem>
|
||||
<menuItem title="Toggle File Tree Orientation" id="2160">
|
||||
<modifierMask key="keyEquivalentModifierMask"/>
|
||||
<connections>
|
||||
<action selector="toggleVertical:" target="2172" id="2176"/>
|
||||
</connections>
|
||||
</menuItem>
|
||||
<menuItem title="Toggle Toolbar Style" id="vBH-Mr-XWi">
|
||||
<modifierMask key="keyEquivalentModifierMask"/>
|
||||
<connections>
|
||||
|
@ -2002,6 +2019,7 @@ Gw
|
|||
</declaredKeys>
|
||||
<classReference key="objectClass" className="PlaylistEntry"/>
|
||||
<connections>
|
||||
<outlet property="appController" destination="226" id="lmS-HT-dqn"/>
|
||||
<outlet property="playbackController" destination="705" id="2121"/>
|
||||
<outlet property="playlistLoader" destination="1319" id="1321"/>
|
||||
<outlet property="spotlightWindowController" destination="1675" id="1709"/>
|
||||
|
@ -2025,17 +2043,15 @@ Gw
|
|||
<outlet property="currentArtistItem" destination="1454" id="lsF-eW-c5e"/>
|
||||
<outlet property="currentEntryController" destination="1897" id="2459"/>
|
||||
<outlet property="dockMenu" destination="513" id="hOo-MJ-WCK"/>
|
||||
<outlet property="fileButton" destination="1631" id="1661"/>
|
||||
<outlet property="fileTreeViewController" destination="2172" id="2460"/>
|
||||
<outlet property="infoButton" destination="1627" id="1663"/>
|
||||
<outlet property="infoButtonMini" destination="2430" id="8ur-Rl-qzm"/>
|
||||
<outlet property="mainView" destination="2123" id="2458"/>
|
||||
<outlet property="mainWindow" destination="21" id="359"/>
|
||||
<outlet property="miniWindow" destination="2234" id="2517"/>
|
||||
<outlet property="playbackController" destination="705" id="1300"/>
|
||||
<outlet property="playlistController" destination="218" id="236"/>
|
||||
<outlet property="playlistLoader" destination="1319" id="1322"/>
|
||||
<outlet property="playlistView" destination="207" id="1257"/>
|
||||
<outlet property="preferencesController" destination="1217" id="cps-Ql-RlL"/>
|
||||
<outlet property="randomizeButton" destination="2467" id="swo-wn-Yr8"/>
|
||||
<outlet property="repeatButton" destination="1640" id="twI-AO-RJG"/>
|
||||
<outlet property="showAlbumColumn" destination="1340" id="1350"/>
|
||||
|
@ -2049,6 +2065,7 @@ Gw
|
|||
<outlet property="shuffleButton" destination="1637" id="Nzr-Mw-z9P"/>
|
||||
<outlet property="spotlightWindowController" destination="1675" id="1677"/>
|
||||
<outlet property="totalTimeField" destination="778" id="1659"/>
|
||||
<outlet property="updater" destination="1303" id="gDn-jb-V0R"/>
|
||||
</connections>
|
||||
</customObject>
|
||||
<menu title="Menu" autoenablesItems="NO" id="513" userLabel="DockMenu">
|
||||
|
@ -2170,13 +2187,8 @@ Gw
|
|||
<menuItem title="Add to Queue" id="1893">
|
||||
<connections>
|
||||
<action selector="toggleQueued:" target="218" id="1934"/>
|
||||
<binding destination="2020" name="enabled" keyPath="selection" id="2068">
|
||||
<binding destination="2020" name="enabled" keyPath="selection" id="tl0-j5-Pok">
|
||||
<dictionary key="options">
|
||||
<integer key="NSMultipleValuesPlaceholder" value="0"/>
|
||||
<integer key="NSNoSelectionPlaceholder" value="0"/>
|
||||
<integer key="NSNotApplicablePlaceholder" value="0"/>
|
||||
<integer key="NSNullPlaceholder" value="0"/>
|
||||
<integer key="NSRaisesForNotApplicableKeys" value="1"/>
|
||||
<string key="NSValueTransformerName">NSIsNotNil</string>
|
||||
</dictionary>
|
||||
</binding>
|
||||
|
@ -2196,6 +2208,11 @@ Gw
|
|||
<modifierMask key="keyEquivalentModifierMask"/>
|
||||
<connections>
|
||||
<action selector="stopAfterSelection:" target="218" id="ZRy-Mw-4cY"/>
|
||||
<binding destination="2020" name="enabled" keyPath="selection" id="ytG-h2-5MA">
|
||||
<dictionary key="options">
|
||||
<string key="NSValueTransformerName">NSIsNotNil</string>
|
||||
</dictionary>
|
||||
</binding>
|
||||
</connections>
|
||||
</menuItem>
|
||||
<menuItem isSeparatorItem="YES" id="2047"/>
|
||||
|
@ -2203,12 +2220,8 @@ Gw
|
|||
<modifierMask key="keyEquivalentModifierMask"/>
|
||||
<connections>
|
||||
<action selector="searchByArtist:" target="218" id="2118"/>
|
||||
<binding destination="2020" name="enabled" keyPath="selection.artist" id="2066">
|
||||
<binding destination="2020" name="enabled" keyPath="selection.artist" id="gQw-pa-TIE">
|
||||
<dictionary key="options">
|
||||
<integer key="NSMultipleValuesPlaceholder" value="0"/>
|
||||
<integer key="NSNoSelectionPlaceholder" value="0"/>
|
||||
<integer key="NSNotApplicablePlaceholder" value="0"/>
|
||||
<integer key="NSNullPlaceholder" value="0"/>
|
||||
<string key="NSValueTransformerName">NSIsNotNil</string>
|
||||
</dictionary>
|
||||
</binding>
|
||||
|
@ -2218,12 +2231,8 @@ Gw
|
|||
<modifierMask key="keyEquivalentModifierMask"/>
|
||||
<connections>
|
||||
<action selector="searchByAlbum:" target="218" id="2119"/>
|
||||
<binding destination="2020" name="enabled" keyPath="selection.album" id="2067">
|
||||
<binding destination="2020" name="enabled" keyPath="selection.album" id="F1G-2E-nhM">
|
||||
<dictionary key="options">
|
||||
<integer key="NSMultipleValuesPlaceholder" value="0"/>
|
||||
<integer key="NSNoSelectionPlaceholder" value="0"/>
|
||||
<integer key="NSNotApplicablePlaceholder" value="0"/>
|
||||
<integer key="NSNullPlaceholder" value="0"/>
|
||||
<string key="NSValueTransformerName">NSIsNotNil</string>
|
||||
</dictionary>
|
||||
</binding>
|
||||
|
@ -2237,7 +2246,29 @@ Gw
|
|||
<modifierMask key="keyEquivalentModifierMask"/>
|
||||
<connections>
|
||||
<action selector="reloadTags:" target="218" id="Ghx-F8-uF3"/>
|
||||
<binding destination="2020" name="enabled" keyPath="selection" id="DmN-2M-3dY">
|
||||
<binding destination="2020" name="enabled" keyPath="selection" id="khw-aB-pyx">
|
||||
<dictionary key="options">
|
||||
<string key="NSValueTransformerName">NSIsNotNil</string>
|
||||
</dictionary>
|
||||
</binding>
|
||||
</connections>
|
||||
</menuItem>
|
||||
<menuItem title="Reset Play Count" id="5iV-dM-oX2">
|
||||
<modifierMask key="keyEquivalentModifierMask"/>
|
||||
<connections>
|
||||
<action selector="resetPlaycounts:" target="218" id="J9t-hL-TQZ"/>
|
||||
<binding destination="2020" name="enabled" keyPath="selection" id="Ixw-08-sA9">
|
||||
<dictionary key="options">
|
||||
<string key="NSValueTransformerName">NSIsNotNil</string>
|
||||
</dictionary>
|
||||
</binding>
|
||||
</connections>
|
||||
</menuItem>
|
||||
<menuItem title="Remove Rating" id="PyI-lF-iuz">
|
||||
<modifierMask key="keyEquivalentModifierMask"/>
|
||||
<connections>
|
||||
<action selector="removeRatings:" target="218" id="f0r-ur-bMZ"/>
|
||||
<binding destination="2020" name="enabled" keyPath="selection" id="BNy-Ih-BJg">
|
||||
<dictionary key="options">
|
||||
<string key="NSValueTransformerName">NSIsNotNil</string>
|
||||
</dictionary>
|
||||
|
@ -2247,12 +2278,8 @@ Gw
|
|||
<menuItem title="Show in Finder" id="1064">
|
||||
<connections>
|
||||
<action selector="showEntryInFinder:" target="218" id="1345"/>
|
||||
<binding destination="2020" name="enabled" keyPath="selection" id="2069">
|
||||
<binding destination="2020" name="enabled" keyPath="selection" id="sJT-oT-8Cw">
|
||||
<dictionary key="options">
|
||||
<integer key="NSMultipleValuesPlaceholder" value="0"/>
|
||||
<integer key="NSNoSelectionPlaceholder" value="0"/>
|
||||
<integer key="NSNotApplicablePlaceholder" value="0"/>
|
||||
<integer key="NSNullPlaceholder" value="0"/>
|
||||
<string key="NSValueTransformerName">NSIsNotNil</string>
|
||||
</dictionary>
|
||||
</binding>
|
||||
|
@ -2262,12 +2289,8 @@ Gw
|
|||
<menuItem title="Remove" id="1360">
|
||||
<connections>
|
||||
<action selector="remove:" target="218" id="1361"/>
|
||||
<binding destination="2020" name="enabled" keyPath="selection" id="2070">
|
||||
<binding destination="2020" name="enabled" keyPath="selection" id="Z62-ts-HSG">
|
||||
<dictionary key="options">
|
||||
<integer key="NSMultipleValuesPlaceholder" value="0"/>
|
||||
<integer key="NSNoSelectionPlaceholder" value="0"/>
|
||||
<integer key="NSNotApplicablePlaceholder" value="0"/>
|
||||
<integer key="NSNullPlaceholder" value="0"/>
|
||||
<string key="NSValueTransformerName">NSIsNotNil</string>
|
||||
</dictionary>
|
||||
</binding>
|
||||
|
@ -2277,12 +2300,8 @@ Gw
|
|||
<modifierMask key="keyEquivalentModifierMask"/>
|
||||
<connections>
|
||||
<action selector="trash:" target="218" id="7Vd-Vf-Ym1"/>
|
||||
<binding destination="2020" name="enabled" keyPath="selection" id="pGj-Wj-1bF">
|
||||
<binding destination="2020" name="enabled" keyPath="selection" id="Knx-iC-hoo">
|
||||
<dictionary key="options">
|
||||
<integer key="NSMultipleValuesPlaceholder" value="0"/>
|
||||
<integer key="NSNoSelectionPlaceholder" value="0"/>
|
||||
<integer key="NSNotApplicablePlaceholder" value="0"/>
|
||||
<integer key="NSNullPlaceholder" value="0"/>
|
||||
<string key="NSValueTransformerName">NSIsNotNil</string>
|
||||
</dictionary>
|
||||
</binding>
|
||||
|
@ -2293,12 +2312,8 @@ Gw
|
|||
<modifierMask key="keyEquivalentModifierMask"/>
|
||||
<connections>
|
||||
<action selector="showWindow:" target="2422" id="lET-Cq-KED"/>
|
||||
<binding destination="2020" name="enabled" keyPath="selection" id="Ff1-eV-AGk">
|
||||
<binding destination="2020" name="enabled" keyPath="selection" id="pj1-yp-Ojr">
|
||||
<dictionary key="options">
|
||||
<integer key="NSMultipleValuesPlaceholder" value="0"/>
|
||||
<integer key="NSNoSelectionPlaceholder" value="0"/>
|
||||
<integer key="NSNotApplicablePlaceholder" value="0"/>
|
||||
<integer key="NSNullPlaceholder" value="0"/>
|
||||
<string key="NSValueTransformerName">NSIsNotNil</string>
|
||||
</dictionary>
|
||||
</binding>
|
||||
|
@ -2308,6 +2323,7 @@ Gw
|
|||
<point key="canvasLocation" x="-117" y="-407"/>
|
||||
</menu>
|
||||
<customObject id="1217" userLabel="PreferencesController" customClass="PreferencesController"/>
|
||||
<customObject id="1303" userLabel="SUUpdater" customClass="SUUpdater"/>
|
||||
<customObject id="1319" userLabel="PlaylistLoader" customClass="PlaylistLoader">
|
||||
<connections>
|
||||
<outlet property="playbackController" destination="705" id="EBV-A8-3bM"/>
|
||||
|
@ -2376,14 +2392,6 @@ Gw
|
|||
<binding destination="218" name="selectionIndexes" keyPath="selectionIndexes" id="2041"/>
|
||||
</connections>
|
||||
</arrayController>
|
||||
<customObject id="2172" customClass="FileTreeViewController">
|
||||
<connections>
|
||||
<outlet property="mainView" destination="206" id="2421"/>
|
||||
<outlet property="playbackController" destination="705" id="2452"/>
|
||||
<outlet property="playlistLoader" destination="1319" id="2179"/>
|
||||
<outlet property="splitView" destination="2123" id="2181"/>
|
||||
</connections>
|
||||
</customObject>
|
||||
<customObject id="2422" customClass="InfoWindowController">
|
||||
<connections>
|
||||
<outlet property="appController" destination="226" id="2538"/>
|
||||
|
@ -2558,7 +2566,6 @@ oCGoIashsCG4AAAAAAAAAgEAAAAAAAAAQwAAAAAAAAAAAAAAAAAAIbs
|
|||
<image name="infoTemplate" width="16" height="16"/>
|
||||
<image name="miniModeOffTemplate" width="16" height="16"/>
|
||||
<image name="miniModeOnTemplate" width="16" height="16"/>
|
||||
<image name="navigatorTemplate" width="16" height="16"/>
|
||||
<image name="nextTemplate" width="20" height="19"/>
|
||||
<image name="playTemplate" width="16" height="16"/>
|
||||
<image name="previousTemplate" width="20" height="19"/>
|
||||
|
|
|
@ -2,16 +2,15 @@
|
|||
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||
<plist version="1.0">
|
||||
<dict>
|
||||
<key>com.apple.security.temporary-exception.mach-lookup.global-name</key>
|
||||
<array>
|
||||
<string>$(PRODUCT_BUNDLE_IDENTIFIER)-spks</string>
|
||||
<string>$(PRODUCT_BUNDLE_IDENTIFIER)-spki</string>
|
||||
</array>
|
||||
<key>com.apple.security.app-sandbox</key>
|
||||
<true/>
|
||||
<key>com.apple.security.assets.movies.read-only</key>
|
||||
<true/>
|
||||
<key>com.apple.security.assets.music.read-only</key>
|
||||
<true/>
|
||||
<key>com.apple.security.cs.allow-jit</key>
|
||||
<true/>
|
||||
<key>com.apple.security.files.downloads.read-only</key>
|
||||
<true/>
|
||||
<key>com.apple.security.files.user-selected.read-write</key>
|
||||
<true/>
|
||||
<key>com.apple.security.network.client</key>
|
||||
|
|
|
@ -24,7 +24,6 @@
|
|||
172A12330F5911D20078EF0C /* RepeatTransformers.m in Sources */ = {isa = PBXBuildFile; fileRef = 172A12320F5911D20078EF0C /* RepeatTransformers.m */; };
|
||||
172A123C0F5912AE0078EF0C /* ShuffleTransformers.m in Sources */ = {isa = PBXBuildFile; fileRef = 172A123B0F5912AE0078EF0C /* ShuffleTransformers.m */; };
|
||||
172A12A90F59AF8A0078EF0C /* NSString+CogSort.m in Sources */ = {isa = PBXBuildFile; fileRef = 172A12A80F59AF8A0078EF0C /* NSString+CogSort.m */; };
|
||||
173855FF0E0CC81F00488CD4 /* FileTreeOutlineView.m in Sources */ = {isa = PBXBuildFile; fileRef = 173855FE0E0CC81F00488CD4 /* FileTreeOutlineView.m */; };
|
||||
1752C36C0F59E00100F85F28 /* PlaybackButtons.m in Sources */ = {isa = PBXBuildFile; fileRef = 1752C36B0F59E00100F85F28 /* PlaybackButtons.m */; };
|
||||
1755E1F90BA0D2B600CA3560 /* PlaylistLoader.m in Sources */ = {isa = PBXBuildFile; fileRef = 1755E1F70BA0D2B600CA3560 /* PlaylistLoader.m */; };
|
||||
1770429C0B8BC53600B86321 /* AppController.m in Sources */ = {isa = PBXBuildFile; fileRef = 177042980B8BC53600B86321 /* AppController.m */; };
|
||||
|
@ -41,20 +40,8 @@
|
|||
17818A990C0B27AC001C4916 /* shn.icns in Resources */ = {isa = PBXBuildFile; fileRef = 17818A920C0B27AC001C4916 /* shn.icns */; };
|
||||
17818A9A0C0B27AC001C4916 /* wav.icns in Resources */ = {isa = PBXBuildFile; fileRef = 17818A930C0B27AC001C4916 /* wav.icns */; };
|
||||
17818A9B0C0B27AC001C4916 /* wv.icns in Resources */ = {isa = PBXBuildFile; fileRef = 17818A940C0B27AC001C4916 /* wv.icns */; };
|
||||
1784560F0F631E24007E8021 /* FileTreeViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 1784560E0F631E24007E8021 /* FileTreeViewController.m */; };
|
||||
178456120F631E31007E8021 /* SideViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 178456110F631E31007E8021 /* SideViewController.m */; };
|
||||
1791FF900CB43A2C0070BC5C /* MediaKeysApplication.m in Sources */ = {isa = PBXBuildFile; fileRef = 1791FF8E0CB43A2C0070BC5C /* MediaKeysApplication.m */; };
|
||||
179790E10C087AB7001D6996 /* OpenURLPanel.m in Sources */ = {isa = PBXBuildFile; fileRef = 179790DF0C087AB7001D6996 /* OpenURLPanel.m */; };
|
||||
179D031E0E0CB2500064A77A /* ContainedNode.m in Sources */ = {isa = PBXBuildFile; fileRef = 179D03090E0CB2500064A77A /* ContainedNode.m */; };
|
||||
179D031F0E0CB2500064A77A /* ContainerNode.m in Sources */ = {isa = PBXBuildFile; fileRef = 179D030B0E0CB2500064A77A /* ContainerNode.m */; };
|
||||
179D03200E0CB2500064A77A /* DirectoryNode.m in Sources */ = {isa = PBXBuildFile; fileRef = 179D030D0E0CB2500064A77A /* DirectoryNode.m */; };
|
||||
179D03210E0CB2500064A77A /* FileIconCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 179D030F0E0CB2500064A77A /* FileIconCell.m */; };
|
||||
179D03220E0CB2500064A77A /* FileNode.m in Sources */ = {isa = PBXBuildFile; fileRef = 179D03110E0CB2500064A77A /* FileNode.m */; };
|
||||
179D03230E0CB2500064A77A /* FileTreeDataSource.m in Sources */ = {isa = PBXBuildFile; fileRef = 179D03130E0CB2500064A77A /* FileTreeDataSource.m */; };
|
||||
179D03240E0CB2500064A77A /* FileTreeController.m in Sources */ = {isa = PBXBuildFile; fileRef = 179D03150E0CB2500064A77A /* FileTreeController.m */; };
|
||||
179D03260E0CB2500064A77A /* PathNode.m in Sources */ = {isa = PBXBuildFile; fileRef = 179D03190E0CB2500064A77A /* PathNode.m */; };
|
||||
179D03270E0CB2500064A77A /* PathWatcher.m in Sources */ = {isa = PBXBuildFile; fileRef = 179D031B0E0CB2500064A77A /* PathWatcher.m */; };
|
||||
179D03280E0CB2500064A77A /* SmartFolderNode.m in Sources */ = {isa = PBXBuildFile; fileRef = 179D031D0E0CB2500064A77A /* SmartFolderNode.m */; };
|
||||
17BB5CED0B8A86010009ACB1 /* AudioToolbox.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 17BB5CEC0B8A86010009ACB1 /* AudioToolbox.framework */; };
|
||||
17BB5CF90B8A86350009ACB1 /* AudioUnit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 17BB5CF60B8A86350009ACB1 /* AudioUnit.framework */; };
|
||||
17BB5CFA0B8A86350009ACB1 /* CoreAudio.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 17BB5CF70B8A86350009ACB1 /* CoreAudio.framework */; };
|
||||
|
@ -104,6 +91,8 @@
|
|||
831B99BF27C23E88005A969B /* Cog.sdef in Resources */ = {isa = PBXBuildFile; fileRef = 831B99BE27C23E88005A969B /* Cog.sdef */; };
|
||||
83229C9F283B0095004626A8 /* SpectrumWindowController.m in Sources */ = {isa = PBXBuildFile; fileRef = 83229C9D283B0095004626A8 /* SpectrumWindowController.m */; };
|
||||
83229CA0283B0095004626A8 /* SpectrumWindow.xib in Resources */ = {isa = PBXBuildFile; fileRef = 83229C9E283B0095004626A8 /* SpectrumWindow.xib */; };
|
||||
83256B68286661FC0036D9C0 /* libmpg123.0.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 83256B672866617F0036D9C0 /* libmpg123.0.dylib */; };
|
||||
83256B69286661FC0036D9C0 /* libmpg123.0.dylib in CopyFiles */ = {isa = PBXBuildFile; fileRef = 83256B672866617F0036D9C0 /* libmpg123.0.dylib */; settings = {ATTRIBUTES = (CodeSignOnCopy, ); }; };
|
||||
832923AF279FAC400048201E /* Cog.q1.json in Resources */ = {isa = PBXBuildFile; fileRef = 832923AE279FAC400048201E /* Cog.q1.json */; };
|
||||
83293070277886250010C07E /* OpenMPTOld.bundle in CopyFiles */ = {isa = PBXBuildFile; fileRef = 8329306D277885790010C07E /* OpenMPTOld.bundle */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
|
||||
832C1253180BD1E2005507C1 /* Cog.help in Resources */ = {isa = PBXBuildFile; fileRef = 832C1252180BD1E2005507C1 /* Cog.help */; };
|
||||
|
@ -126,7 +115,6 @@
|
|||
8355D6B8180613FB00D05687 /* Security.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8355D6B7180613FB00D05687 /* Security.framework */; };
|
||||
8359009D17FF06570060F3ED /* ArchiveSource.bundle in CopyFiles */ = {isa = PBXBuildFile; fileRef = 8359FF3117FEF35D0060F3ED /* ArchiveSource.bundle */; settings = {ATTRIBUTES = (CodeSignOnCopy, ); }; };
|
||||
835A8FD327957310005B3C39 /* json.c in Sources */ = {isa = PBXBuildFile; fileRef = 835A8FC627957310005B3C39 /* json.c */; };
|
||||
835EDD8A27A000E8001EDCCE /* gsx.wv in Resources */ = {isa = PBXBuildFile; fileRef = 835EDD8027A000E8001EDCCE /* gsx.wv */; };
|
||||
835F00BB279BD1CD00055FCF /* SecondsFormatter.m in Sources */ = {isa = PBXBuildFile; fileRef = 835F00B8279BD1CD00055FCF /* SecondsFormatter.m */; };
|
||||
835FAC7927BCDF2A00BA8562 /* AVIFDecoder.m in Sources */ = {isa = PBXBuildFile; fileRef = 835FAC7527BCDF2A00BA8562 /* AVIFDecoder.m */; };
|
||||
835FAC7E27BCDF5B00BA8562 /* libaom.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 835FAC7C27BCDF5B00BA8562 /* libaom.a */; };
|
||||
|
@ -175,11 +163,15 @@
|
|||
8384916C18083EAB00E7332D /* stopTemplate.pdf in Resources */ = {isa = PBXBuildFile; fileRef = 8384915618083EAB00E7332D /* stopTemplate.pdf */; };
|
||||
8384916D18083EAB00E7332D /* volume1Template.pdf in Resources */ = {isa = PBXBuildFile; fileRef = 8384915718083EAB00E7332D /* volume1Template.pdf */; };
|
||||
8384916E18083EAB00E7332D /* volume3Template.pdf in Resources */ = {isa = PBXBuildFile; fileRef = 8384915818083EAB00E7332D /* volume3Template.pdf */; };
|
||||
838F851E256B4E5E00C3E614 /* Sparkle.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 838F851D256B4E5E00C3E614 /* Sparkle.framework */; };
|
||||
838F851F256B4E8B00C3E614 /* Sparkle.framework in CopyFiles */ = {isa = PBXBuildFile; fileRef = 838F851D256B4E5E00C3E614 /* Sparkle.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
|
||||
83922FBA286B1AA900A0B039 /* WebKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 83922FB6286B1AA900A0B039 /* WebKit.framework */; };
|
||||
83978E16285C58190076ED21 /* FirebaseCrashlytics in Frameworks */ = {isa = PBXBuildFile; productRef = 83978E15285C58190076ED21 /* FirebaseCrashlytics */; };
|
||||
83978E26285C596F0076ED21 /* FirebaseAnalytics in Frameworks */ = {isa = PBXBuildFile; productRef = 83978E25285C596F0076ED21 /* FirebaseAnalytics */; };
|
||||
83978E29285C5C0A0076ED21 /* GoogleService-Info.plist in Resources */ = {isa = PBXBuildFile; fileRef = 83978E28285C5C0A0076ED21 /* GoogleService-Info.plist */; };
|
||||
83988F0E27BE0A5900A0E89A /* RedundantPlaylistDataStore.m in Sources */ = {isa = PBXBuildFile; fileRef = 83988F0D27BE0A5900A0E89A /* RedundantPlaylistDataStore.m */; };
|
||||
8399D4E21805A55000B503B1 /* XmlContainer.m in Sources */ = {isa = PBXBuildFile; fileRef = 8399D4E01805A55000B503B1 /* XmlContainer.m */; };
|
||||
839B837F286D7F8D00F529EE /* NumberHertzToStringTransformer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 839B837E286D7F8D00F529EE /* NumberHertzToStringTransformer.swift */; };
|
||||
839DA7CF274A2D4C001B18E5 /* NSDictionary+Merge.m in Sources */ = {isa = PBXBuildFile; fileRef = 839DA7CE274A2D4C001B18E5 /* NSDictionary+Merge.m */; };
|
||||
83A360B220E4E81D00192DAB /* Flac.bundle in CopyFiles */ = {isa = PBXBuildFile; fileRef = 8303A30C20E4E3D000951EF8 /* Flac.bundle */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
|
||||
83A3B734283AE89000CC6593 /* ColorToValueTransformer.m in Sources */ = {isa = PBXBuildFile; fileRef = 83A3B72F283AE6AA00CC6593 /* ColorToValueTransformer.m */; };
|
||||
|
@ -193,7 +185,6 @@
|
|||
83BC5ABF20E4CE7A00631CD4 /* InfoInspector.xib in Resources */ = {isa = PBXBuildFile; fileRef = 17D1B0D00F6320EA00694C57 /* InfoInspector.xib */; };
|
||||
83BC5AC020E4CE7D00631CD4 /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = 17342A980D5FD20B00E8D854 /* MainMenu.xib */; };
|
||||
83BC5AC120E4CE8700631CD4 /* OpenURLPanel.xib in Resources */ = {isa = PBXBuildFile; fileRef = 17342ABD0D5FD36400E8D854 /* OpenURLPanel.xib */; };
|
||||
83BC5AC220E4CE8A00631CD4 /* FileTree.xib in Resources */ = {isa = PBXBuildFile; fileRef = 17211A7C0D68B7C500911CA9 /* FileTree.xib */; };
|
||||
83BC5AC320E4CE8D00631CD4 /* SpotlightPanel.xib in Resources */ = {isa = PBXBuildFile; fileRef = 178456C00F6320B5007E8021 /* SpotlightPanel.xib */; };
|
||||
83BC5AC420E4CE9000631CD4 /* Feedback.xib in Resources */ = {isa = PBXBuildFile; fileRef = 17D1B1DA0F6330D400694C57 /* Feedback.xib */; };
|
||||
83BCB8DE17FC971300760340 /* FFMPEG.bundle in CopyFiles */ = {isa = PBXBuildFile; fileRef = B09E94350D747F7B0064F138 /* FFMPEG.bundle */; settings = {ATTRIBUTES = (CodeSignOnCopy, ); }; };
|
||||
|
@ -739,6 +730,7 @@
|
|||
836EF0E027BB98A800BF35B2 /* libopus.0.dylib in CopyFiles */,
|
||||
836EF0CB27BB91EE00BF35B2 /* libFLAC.8.dylib in CopyFiles */,
|
||||
836EF0CA27BB91EB00BF35B2 /* libvorbis.0.dylib in CopyFiles */,
|
||||
83256B69286661FC0036D9C0 /* libmpg123.0.dylib in CopyFiles */,
|
||||
836EF0C927BB91E900BF35B2 /* libvorbisfile.3.dylib in CopyFiles */,
|
||||
836EF0C827BB91E600BF35B2 /* libogg.0.dylib in CopyFiles */,
|
||||
83AA7D07279EBCAF00087AA4 /* libswresample.4.dylib in CopyFiles */,
|
||||
|
@ -748,6 +740,7 @@
|
|||
83B72E3B279045B7006007A3 /* libfdk-aac.2.dylib in CopyFiles */,
|
||||
8305963C277F013200EBFAAE /* File_Extractor.framework in CopyFiles */,
|
||||
ED69CBCA25BE32E80090B90D /* MASShortcut.framework in CopyFiles */,
|
||||
838F851F256B4E8B00C3E614 /* Sparkle.framework in CopyFiles */,
|
||||
17F561400C3BD4F30019975C /* CogAudio.framework in CopyFiles */,
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
|
@ -782,8 +775,6 @@
|
|||
172A123B0F5912AE0078EF0C /* ShuffleTransformers.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = ShuffleTransformers.m; path = Window/ShuffleTransformers.m; sourceTree = "<group>"; };
|
||||
172A12A70F59AF8A0078EF0C /* NSString+CogSort.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSString+CogSort.h"; sourceTree = "<group>"; };
|
||||
172A12A80F59AF8A0078EF0C /* NSString+CogSort.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSString+CogSort.m"; sourceTree = "<group>"; };
|
||||
173855FD0E0CC81F00488CD4 /* FileTreeOutlineView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = FileTreeOutlineView.h; path = FileTree/FileTreeOutlineView.h; sourceTree = "<group>"; };
|
||||
173855FE0E0CC81F00488CD4 /* FileTreeOutlineView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = FileTreeOutlineView.m; path = FileTree/FileTreeOutlineView.m; sourceTree = "<group>"; };
|
||||
1752C36A0F59E00100F85F28 /* PlaybackButtons.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = PlaybackButtons.h; path = Window/PlaybackButtons.h; sourceTree = "<group>"; };
|
||||
1752C36B0F59E00100F85F28 /* PlaybackButtons.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = PlaybackButtons.m; path = Window/PlaybackButtons.m; sourceTree = "<group>"; };
|
||||
1755E1F60BA0D2B600CA3560 /* PlaylistLoader.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = PlaylistLoader.h; sourceTree = "<group>"; };
|
||||
|
@ -809,34 +800,10 @@
|
|||
17818A920C0B27AC001C4916 /* shn.icns */ = {isa = PBXFileReference; lastKnownFileType = image.icns; path = shn.icns; sourceTree = "<group>"; };
|
||||
17818A930C0B27AC001C4916 /* wav.icns */ = {isa = PBXFileReference; lastKnownFileType = image.icns; path = wav.icns; sourceTree = "<group>"; };
|
||||
17818A940C0B27AC001C4916 /* wv.icns */ = {isa = PBXFileReference; lastKnownFileType = image.icns; path = wv.icns; sourceTree = "<group>"; };
|
||||
1784560D0F631E24007E8021 /* FileTreeViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = FileTreeViewController.h; path = FileTree/FileTreeViewController.h; sourceTree = "<group>"; };
|
||||
1784560E0F631E24007E8021 /* FileTreeViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = FileTreeViewController.m; path = FileTree/FileTreeViewController.m; sourceTree = "<group>"; };
|
||||
178456100F631E31007E8021 /* SideViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SideViewController.h; sourceTree = "<group>"; };
|
||||
178456110F631E31007E8021 /* SideViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SideViewController.m; sourceTree = "<group>"; };
|
||||
1791FF8D0CB43A2C0070BC5C /* MediaKeysApplication.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MediaKeysApplication.h; sourceTree = "<group>"; };
|
||||
1791FF8E0CB43A2C0070BC5C /* MediaKeysApplication.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MediaKeysApplication.m; sourceTree = "<group>"; };
|
||||
179790DE0C087AB7001D6996 /* OpenURLPanel.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = OpenURLPanel.h; sourceTree = "<group>"; };
|
||||
179790DF0C087AB7001D6996 /* OpenURLPanel.m */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.objc; path = OpenURLPanel.m; sourceTree = "<group>"; };
|
||||
179D03080E0CB2500064A77A /* ContainedNode.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ContainedNode.h; path = FileTree/ContainedNode.h; sourceTree = "<group>"; };
|
||||
179D03090E0CB2500064A77A /* ContainedNode.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = ContainedNode.m; path = FileTree/ContainedNode.m; sourceTree = "<group>"; };
|
||||
179D030A0E0CB2500064A77A /* ContainerNode.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ContainerNode.h; path = FileTree/ContainerNode.h; sourceTree = "<group>"; };
|
||||
179D030B0E0CB2500064A77A /* ContainerNode.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = ContainerNode.m; path = FileTree/ContainerNode.m; sourceTree = "<group>"; };
|
||||
179D030C0E0CB2500064A77A /* DirectoryNode.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = DirectoryNode.h; path = FileTree/DirectoryNode.h; sourceTree = "<group>"; };
|
||||
179D030D0E0CB2500064A77A /* DirectoryNode.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = DirectoryNode.m; path = FileTree/DirectoryNode.m; sourceTree = "<group>"; };
|
||||
179D030E0E0CB2500064A77A /* FileIconCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = FileIconCell.h; path = FileTree/FileIconCell.h; sourceTree = "<group>"; };
|
||||
179D030F0E0CB2500064A77A /* FileIconCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = FileIconCell.m; path = FileTree/FileIconCell.m; sourceTree = "<group>"; };
|
||||
179D03100E0CB2500064A77A /* FileNode.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = FileNode.h; path = FileTree/FileNode.h; sourceTree = "<group>"; };
|
||||
179D03110E0CB2500064A77A /* FileNode.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = FileNode.m; path = FileTree/FileNode.m; sourceTree = "<group>"; };
|
||||
179D03120E0CB2500064A77A /* FileTreeDataSource.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = FileTreeDataSource.h; path = FileTree/FileTreeDataSource.h; sourceTree = "<group>"; };
|
||||
179D03130E0CB2500064A77A /* FileTreeDataSource.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = FileTreeDataSource.m; path = FileTree/FileTreeDataSource.m; sourceTree = "<group>"; };
|
||||
179D03140E0CB2500064A77A /* FileTreeController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = FileTreeController.h; path = FileTree/FileTreeController.h; sourceTree = "<group>"; };
|
||||
179D03150E0CB2500064A77A /* FileTreeController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = FileTreeController.m; path = FileTree/FileTreeController.m; sourceTree = "<group>"; };
|
||||
179D03180E0CB2500064A77A /* PathNode.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = PathNode.h; path = FileTree/PathNode.h; sourceTree = "<group>"; };
|
||||
179D03190E0CB2500064A77A /* PathNode.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = PathNode.m; path = FileTree/PathNode.m; sourceTree = "<group>"; };
|
||||
179D031A0E0CB2500064A77A /* PathWatcher.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = PathWatcher.h; path = FileTree/PathWatcher.h; sourceTree = "<group>"; };
|
||||
179D031B0E0CB2500064A77A /* PathWatcher.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = PathWatcher.m; path = FileTree/PathWatcher.m; sourceTree = "<group>"; };
|
||||
179D031C0E0CB2500064A77A /* SmartFolderNode.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = SmartFolderNode.h; path = FileTree/SmartFolderNode.h; sourceTree = "<group>"; };
|
||||
179D031D0E0CB2500064A77A /* SmartFolderNode.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = SmartFolderNode.m; path = FileTree/SmartFolderNode.m; sourceTree = "<group>"; };
|
||||
17BB5CEC0B8A86010009ACB1 /* AudioToolbox.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AudioToolbox.framework; path = /System/Library/Frameworks/AudioToolbox.framework; sourceTree = "<absolute>"; };
|
||||
17BB5CF60B8A86350009ACB1 /* AudioUnit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AudioUnit.framework; path = /System/Library/Frameworks/AudioUnit.framework; sourceTree = "<absolute>"; };
|
||||
17BB5CF70B8A86350009ACB1 /* CoreAudio.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreAudio.framework; path = /System/Library/Frameworks/CoreAudio.framework; sourceTree = "<absolute>"; };
|
||||
|
@ -891,7 +858,6 @@
|
|||
29B97324FDCFA39411CA2CEA /* AppKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AppKit.framework; path = /System/Library/Frameworks/AppKit.framework; sourceTree = "<absolute>"; };
|
||||
29B97325FDCFA39411CA2CEA /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = /System/Library/Frameworks/Foundation.framework; sourceTree = "<absolute>"; };
|
||||
32CA4F630368D1EE00C91783 /* Cog_Prefix.pch */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Cog_Prefix.pch; sourceTree = "<group>"; };
|
||||
3DDFC2462344EC6B000F1453 /* DEVELOPMENT_TEAM.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = DEVELOPMENT_TEAM.xcconfig; sourceTree = "<group>"; };
|
||||
3DDFC2472344EC6B000F1453 /* Shared.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Shared.xcconfig; sourceTree = "<group>"; };
|
||||
5604D4590D60349B004F5C5D /* SpotlightWindowController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = SpotlightWindowController.m; path = Spotlight/SpotlightWindowController.m; sourceTree = "<group>"; };
|
||||
5604D45A0D60349B004F5C5D /* SpotlightWindowController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = SpotlightWindowController.h; path = Spotlight/SpotlightWindowController.h; sourceTree = "<group>"; };
|
||||
|
@ -923,6 +889,7 @@
|
|||
83229C9C283B0095004626A8 /* SpectrumWindowController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SpectrumWindowController.h; sourceTree = "<group>"; };
|
||||
83229C9D283B0095004626A8 /* SpectrumWindowController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = SpectrumWindowController.m; sourceTree = "<group>"; };
|
||||
83229C9E283B0095004626A8 /* SpectrumWindow.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = SpectrumWindow.xib; sourceTree = "<group>"; };
|
||||
83256B672866617F0036D9C0 /* libmpg123.0.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libmpg123.0.dylib; path = ThirdParty/mpg123/lib/libmpg123.0.dylib; sourceTree = "<group>"; };
|
||||
832923AE279FAC400048201E /* Cog.q1.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = Cog.q1.json; sourceTree = "<group>"; };
|
||||
83293065277885790010C07E /* OpenMPTOld.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = OpenMPTOld.xcodeproj; path = Plugins/OpenMPT.old/OpenMPTOld.xcodeproj; sourceTree = "<group>"; };
|
||||
832C1252180BD1E2005507C1 /* Cog.help */ = {isa = PBXFileReference; lastKnownFileType = folder; path = Cog.help; sourceTree = "<group>"; };
|
||||
|
@ -949,7 +916,6 @@
|
|||
835C888B22CC1881001B4B3F /* en */ = {isa = PBXFileReference; lastKnownFileType = text.html; name = en; path = en.lproj/Credits.html; sourceTree = "<group>"; };
|
||||
835C888C22CC1882001B4B3F /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = "<group>"; };
|
||||
835C888D22CC1882001B4B3F /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/Localizable.strings; sourceTree = "<group>"; };
|
||||
835EDD8027A000E8001EDCCE /* gsx.wv */ = {isa = PBXFileReference; lastKnownFileType = file; path = gsx.wv; sourceTree = "<group>"; };
|
||||
835F00B4279BD1CD00055FCF /* SecondsFormatter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SecondsFormatter.h; sourceTree = "<group>"; };
|
||||
835F00B8279BD1CD00055FCF /* SecondsFormatter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SecondsFormatter.m; sourceTree = "<group>"; };
|
||||
835FAC6727BCDF2A00BA8562 /* aomdx.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = aomdx.h; sourceTree = "<group>"; };
|
||||
|
@ -1021,13 +987,17 @@
|
|||
8384915818083EAB00E7332D /* volume3Template.pdf */ = {isa = PBXFileReference; lastKnownFileType = image.pdf; name = volume3Template.pdf; path = Images/volume3Template.pdf; sourceTree = "<group>"; };
|
||||
83859520234FEB35004E9946 /* Cog.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = Cog.entitlements; sourceTree = "<group>"; };
|
||||
838F84FF25687C5C00C3E614 /* Cog-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Cog-Bridging-Header.h"; sourceTree = "<group>"; };
|
||||
838F851D256B4E5E00C3E614 /* Sparkle.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Sparkle.framework; path = ThirdParty/Frameworks/Sparkle.framework; sourceTree = "<group>"; };
|
||||
83922FB6286B1AA900A0B039 /* WebKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = WebKit.framework; path = System/Library/Frameworks/WebKit.framework; sourceTree = SDKROOT; };
|
||||
83978E28285C5C0A0076ED21 /* GoogleService-Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = "GoogleService-Info.plist"; sourceTree = "<group>"; };
|
||||
83988F0C27BE0A5900A0E89A /* RedundantPlaylistDataStore.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = RedundantPlaylistDataStore.h; sourceTree = "<group>"; };
|
||||
83988F0D27BE0A5900A0E89A /* RedundantPlaylistDataStore.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = RedundantPlaylistDataStore.m; sourceTree = "<group>"; };
|
||||
8399D4E01805A55000B503B1 /* XmlContainer.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = XmlContainer.m; sourceTree = "<group>"; };
|
||||
8399D4E11805A55000B503B1 /* XmlContainer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = XmlContainer.h; sourceTree = "<group>"; };
|
||||
839B837E286D7F8D00F529EE /* NumberHertzToStringTransformer.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; name = NumberHertzToStringTransformer.swift; path = Transformers/NumberHertzToStringTransformer.swift; sourceTree = "<group>"; };
|
||||
839DA7CB274A2D4C001B18E5 /* NSDictionary+Merge.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSDictionary+Merge.h"; sourceTree = "<group>"; };
|
||||
839DA7CE274A2D4C001B18E5 /* NSDictionary+Merge.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSDictionary+Merge.m"; sourceTree = "<group>"; };
|
||||
839E3B53286595D700880EA2 /* GeneralPane.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GeneralPane.h; path = Preferences/Preferences/GeneralPane.h; sourceTree = "<group>"; };
|
||||
83A3B72F283AE6AA00CC6593 /* ColorToValueTransformer.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = ColorToValueTransformer.m; path = Preferences/Preferences/ColorToValueTransformer.m; sourceTree = "<group>"; };
|
||||
83A3B733283AE6AA00CC6593 /* ColorToValueTransformer.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = ColorToValueTransformer.h; path = Preferences/Preferences/ColorToValueTransformer.h; sourceTree = "<group>"; };
|
||||
83AA7D00279EBC8200087AA4 /* libavcodec.59.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libavcodec.59.dylib; path = ThirdParty/ffmpeg/lib/libavcodec.59.dylib; sourceTree = "<group>"; };
|
||||
|
@ -1042,7 +1012,6 @@
|
|||
83BC5AB420E4C91100631CD4 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/InfoInspector.xib; sourceTree = "<group>"; };
|
||||
83BC5AB520E4C91200631CD4 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/MainMenu.xib; sourceTree = "<group>"; };
|
||||
83BC5AB620E4C91300631CD4 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/OpenURLPanel.xib; sourceTree = "<group>"; };
|
||||
83BC5AB720E4C91400631CD4 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/FileTree.xib; sourceTree = "<group>"; };
|
||||
83BC5AB820E4C91400631CD4 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/SpotlightPanel.xib; sourceTree = "<group>"; };
|
||||
83BC5AB920E4C91500631CD4 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/Feedback.xib; sourceTree = "<group>"; };
|
||||
83BC5AC620E4D04600631CD4 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/MainMenu.strings; sourceTree = "<group>"; };
|
||||
|
@ -1051,8 +1020,6 @@
|
|||
83BC5ACC20E4D07700631CD4 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoInspector.strings; sourceTree = "<group>"; };
|
||||
83BC5ACE20E4D09700631CD4 /* es */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = es; path = es.lproj/OpenURLPanel.strings; sourceTree = "<group>"; };
|
||||
83BC5AD020E4D09800631CD4 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/OpenURLPanel.strings; sourceTree = "<group>"; };
|
||||
83BC5AD220E4D0B400631CD4 /* es */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = es; path = es.lproj/FileTree.strings; sourceTree = "<group>"; };
|
||||
83BC5AD420E4D0B600631CD4 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/FileTree.strings; sourceTree = "<group>"; };
|
||||
83BC5AD620E4D0D800631CD4 /* es */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = es; path = es.lproj/SpotlightPanel.strings; sourceTree = "<group>"; };
|
||||
83BC5AD820E4D0D900631CD4 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/SpotlightPanel.strings; sourceTree = "<group>"; };
|
||||
83BC5ADA20E4D0E900631CD4 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/Feedback.strings; sourceTree = "<group>"; };
|
||||
|
@ -1098,13 +1065,16 @@
|
|||
ED69CBC725BE32C00090B90D /* MASShortcut.framework in Frameworks */,
|
||||
8355D6B8180613FB00D05687 /* Security.framework in Frameworks */,
|
||||
8D11072F0486CEB800E47090 /* Cocoa.framework in Frameworks */,
|
||||
83256B68286661FC0036D9C0 /* libmpg123.0.dylib in Frameworks */,
|
||||
17BB5CED0B8A86010009ACB1 /* AudioToolbox.framework in Frameworks */,
|
||||
835FAC7F27BCDF5B00BA8562 /* libavif.a in Frameworks */,
|
||||
83922FBA286B1AA900A0B039 /* WebKit.framework in Frameworks */,
|
||||
835FAC7E27BCDF5B00BA8562 /* libaom.a in Frameworks */,
|
||||
837DC92B285B05710005C58A /* CoreData.framework in Frameworks */,
|
||||
83978E26285C596F0076ED21 /* FirebaseAnalytics in Frameworks */,
|
||||
17BB5CF90B8A86350009ACB1 /* AudioUnit.framework in Frameworks */,
|
||||
17BB5CFA0B8A86350009ACB1 /* CoreAudio.framework in Frameworks */,
|
||||
838F851E256B4E5E00C3E614 /* Sparkle.framework in Frameworks */,
|
||||
17BB5CFB0B8A86350009ACB1 /* CoreAudioKit.framework in Frameworks */,
|
||||
83978E16285C58190076ED21 /* FirebaseCrashlytics in Frameworks */,
|
||||
17BB5EA60B8A87850009ACB1 /* IOKit.framework in Frameworks */,
|
||||
|
@ -1132,7 +1102,6 @@
|
|||
8377C66027B8CF2300E8BC0F /* Visualization */,
|
||||
8E75752A09F31D5A0080F1EE /* Playlist */,
|
||||
8E07AAEA0AAC90DC00A4B32F /* Preferences */,
|
||||
17DDF6400E0CB6F100A2E4AD /* FileTree */,
|
||||
830C37A227B95E6000E02BB0 /* Equalizer */,
|
||||
17D1B0FE0F63252900694C57 /* InfoInspector */,
|
||||
569C52C50D5F2BD500BDBDC9 /* Spotlight */,
|
||||
|
@ -1148,6 +1117,7 @@
|
|||
isa = PBXGroup;
|
||||
children = (
|
||||
ED69CBB825BE328C0090B90D /* MASShortcut.xcodeproj */,
|
||||
838F851D256B4E5E00C3E614 /* Sparkle.framework */,
|
||||
17F5612A0C3BD4DC0019975C /* CogAudio.xcodeproj */,
|
||||
1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */,
|
||||
);
|
||||
|
@ -1157,6 +1127,7 @@
|
|||
1058C7A2FEA54F0111CA2CBB /* Other Frameworks */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
83256B672866617F0036D9C0 /* libmpg123.0.dylib */,
|
||||
835FAC7C27BCDF5B00BA8562 /* libaom.a */,
|
||||
835FAC7D27BCDF5B00BA8562 /* libavif.a */,
|
||||
836EF0CD27BB94F100BF35B2 /* libopusfile.0.dylib */,
|
||||
|
@ -1243,8 +1214,6 @@
|
|||
83988F0D27BE0A5900A0E89A /* RedundantPlaylistDataStore.m */,
|
||||
8381A09027C5F72F00A1C530 /* SHA256Digest.h */,
|
||||
8381A09127C5F72F00A1C530 /* SHA256Digest.m */,
|
||||
178456100F631E31007E8021 /* SideViewController.h */,
|
||||
178456110F631E31007E8021 /* SideViewController.m */,
|
||||
8370D739277419D200245CE0 /* SQLiteStore.h */,
|
||||
8370D73C277419F700245CE0 /* SQLiteStore.m */,
|
||||
17FAEBAA0F662985007C8707 /* ToolTipTextField.h */,
|
||||
|
@ -1394,37 +1363,6 @@
|
|||
name = InfoInspector;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
17DDF6400E0CB6F100A2E4AD /* FileTree */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
1784560D0F631E24007E8021 /* FileTreeViewController.h */,
|
||||
1784560E0F631E24007E8021 /* FileTreeViewController.m */,
|
||||
179D03140E0CB2500064A77A /* FileTreeController.h */,
|
||||
179D03150E0CB2500064A77A /* FileTreeController.m */,
|
||||
173855FD0E0CC81F00488CD4 /* FileTreeOutlineView.h */,
|
||||
173855FE0E0CC81F00488CD4 /* FileTreeOutlineView.m */,
|
||||
179D03120E0CB2500064A77A /* FileTreeDataSource.h */,
|
||||
179D03130E0CB2500064A77A /* FileTreeDataSource.m */,
|
||||
179D03080E0CB2500064A77A /* ContainedNode.h */,
|
||||
179D03090E0CB2500064A77A /* ContainedNode.m */,
|
||||
179D030A0E0CB2500064A77A /* ContainerNode.h */,
|
||||
179D030B0E0CB2500064A77A /* ContainerNode.m */,
|
||||
179D030C0E0CB2500064A77A /* DirectoryNode.h */,
|
||||
179D030D0E0CB2500064A77A /* DirectoryNode.m */,
|
||||
179D030E0E0CB2500064A77A /* FileIconCell.h */,
|
||||
179D030F0E0CB2500064A77A /* FileIconCell.m */,
|
||||
179D03100E0CB2500064A77A /* FileNode.h */,
|
||||
179D03110E0CB2500064A77A /* FileNode.m */,
|
||||
179D03180E0CB2500064A77A /* PathNode.h */,
|
||||
179D03190E0CB2500064A77A /* PathNode.m */,
|
||||
179D031A0E0CB2500064A77A /* PathWatcher.h */,
|
||||
179D031B0E0CB2500064A77A /* PathWatcher.m */,
|
||||
179D031C0E0CB2500064A77A /* SmartFolderNode.h */,
|
||||
179D031D0E0CB2500064A77A /* SmartFolderNode.m */,
|
||||
);
|
||||
name = FileTree;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
17E0D5D20F520E75005B6FED /* Window */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
|
@ -1470,6 +1408,7 @@
|
|||
838F84FF25687C5C00C3E614 /* Cog-Bridging-Header.h */,
|
||||
834B05E82859C006000B7DC0 /* TotalTimeTransformer.h */,
|
||||
834B05E92859C006000B7DC0 /* TotalTimeTransformer.m */,
|
||||
839B837E286D7F8D00F529EE /* NumberHertzToStringTransformer.swift */,
|
||||
);
|
||||
name = Transformers;
|
||||
sourceTree = "<group>";
|
||||
|
@ -1546,12 +1485,10 @@
|
|||
8E7575D909F31E930080F1EE /* Localizable.strings */,
|
||||
832923AE279FAC400048201E /* Cog.q1.json */,
|
||||
831B99BE27C23E88005A969B /* Cog.sdef */,
|
||||
835EDD8027A000E8001EDCCE /* gsx.wv */,
|
||||
830C379F27B95E3000E02BB0 /* Equalizer.xib */,
|
||||
17D1B0D00F6320EA00694C57 /* InfoInspector.xib */,
|
||||
17342A980D5FD20B00E8D854 /* MainMenu.xib */,
|
||||
17342ABD0D5FD36400E8D854 /* OpenURLPanel.xib */,
|
||||
17211A7C0D68B7C500911CA9 /* FileTree.xib */,
|
||||
178456C00F6320B5007E8021 /* SpotlightPanel.xib */,
|
||||
17E41E060C130DFF00AC744D /* Credits.html */,
|
||||
17D1B1DA0F6330D400694C57 /* Feedback.xib */,
|
||||
|
@ -1562,6 +1499,7 @@
|
|||
29B97323FDCFA39411CA2CEA /* Frameworks */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
83922FB6286B1AA900A0B039 /* WebKit.framework */,
|
||||
837DC92A285B05710005C58A /* CoreData.framework */,
|
||||
8370D73E2775AE1300245CE0 /* libsqlite3.tbd */,
|
||||
83AB9031237CEFD300A433D5 /* MediaPlayer.framework */,
|
||||
|
@ -1575,7 +1513,6 @@
|
|||
3DDFC2452344EC6A000F1453 /* Xcode-config */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
3DDFC2462344EC6B000F1453 /* DEVELOPMENT_TEAM.xcconfig */,
|
||||
3DDFC2472344EC6B000F1453 /* Shared.xcconfig */,
|
||||
);
|
||||
path = "Xcode-config";
|
||||
|
@ -1888,6 +1825,7 @@
|
|||
8E07AAEA0AAC90DC00A4B32F /* Preferences */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
839E3B53286595D700880EA2 /* GeneralPane.h */,
|
||||
ED69CF0925BE74BB0090B90D /* Shortcuts.h */,
|
||||
17D1B2610F633D2C00694C57 /* PreferencePanePlugin.h */,
|
||||
17D1B25B0F633A4F00694C57 /* PreferencePluginController.h */,
|
||||
|
@ -2000,13 +1938,13 @@
|
|||
isa = PBXNativeTarget;
|
||||
buildConfigurationList = C01FCF4A08A954540054247B /* Build configuration list for PBXNativeTarget "Cog" */;
|
||||
buildPhases = (
|
||||
8384911C1807E9ED00E7332D /* Run version generator script */,
|
||||
8D11072C0486CEB800E47090 /* Sources */,
|
||||
8D11072E0486CEB800E47090 /* Frameworks */,
|
||||
8D1107290486CEB800E47090 /* Resources */,
|
||||
8E757AEC09F3265E0080F1EE /* CopyFiles */,
|
||||
177FD1000B90CB570011C3B5 /* CopyFiles */,
|
||||
07DFC3930ECDF80100DA400D /* CopyFiles */,
|
||||
8384911C1807E9ED00E7332D /* Run version generator script */,
|
||||
83978E27285C5A4C0076ED21 /* Run Crashlytics symbol upload */,
|
||||
);
|
||||
buildRules = (
|
||||
|
@ -2049,7 +1987,7 @@
|
|||
83978E15285C58190076ED21 /* FirebaseCrashlytics */,
|
||||
83978E25285C596F0076ED21 /* FirebaseAnalytics */,
|
||||
);
|
||||
productInstallPath = "/Applications";
|
||||
productInstallPath = /Applications;
|
||||
productName = Cog;
|
||||
productReference = 1770424E0B8BC41800B86321 /* Cog.app */;
|
||||
productType = "com.apple.product-type.application";
|
||||
|
@ -2476,7 +2414,6 @@
|
|||
836F462C28207FA4005B9B87 /* PauseNormal.png in Resources */,
|
||||
83BC5AC420E4CE9000631CD4 /* Feedback.xib in Resources */,
|
||||
83BC5AC320E4CE8D00631CD4 /* SpotlightPanel.xib in Resources */,
|
||||
83BC5AC220E4CE8A00631CD4 /* FileTree.xib in Resources */,
|
||||
83BC5AC120E4CE8700631CD4 /* OpenURLPanel.xib in Resources */,
|
||||
83BC5AC020E4CE7D00631CD4 /* MainMenu.xib in Resources */,
|
||||
83BC5ABF20E4CE7A00631CD4 /* InfoInspector.xib in Resources */,
|
||||
|
@ -2508,7 +2445,6 @@
|
|||
17818A950C0B27AC001C4916 /* aiff.icns in Resources */,
|
||||
8384916818083EAB00E7332D /* shuffleOffTemplate.pdf in Resources */,
|
||||
836F462128207F43005B9B87 /* Plaque.png in Resources */,
|
||||
835EDD8A27A000E8001EDCCE /* gsx.wv in Resources */,
|
||||
17818A960C0B27AC001C4916 /* ape.icns in Resources */,
|
||||
17818A970C0B27AC001C4916 /* m3u.icns in Resources */,
|
||||
17818A980C0B27AC001C4916 /* mpc.icns in Resources */,
|
||||
|
@ -2555,10 +2491,14 @@
|
|||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
);
|
||||
inputFileListPaths = (
|
||||
);
|
||||
inputPaths = (
|
||||
"$(SRCROOT)/Info.plist.template",
|
||||
);
|
||||
name = "Run version generator script";
|
||||
outputPaths = (
|
||||
"$(SRCROOT)/Info.plist",
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
shellPath = /bin/sh;
|
||||
|
@ -2628,23 +2568,12 @@
|
|||
170B55940D6E5E7B006B9E92 /* StatusImageTransformer.m in Sources */,
|
||||
830C37FC27B9956C00E02BB0 /* analyzer.c in Sources */,
|
||||
17249F0F0D82E17700F33392 /* ToggleQueueTitleTransformer.m in Sources */,
|
||||
179D031E0E0CB2500064A77A /* ContainedNode.m in Sources */,
|
||||
179D031F0E0CB2500064A77A /* ContainerNode.m in Sources */,
|
||||
834B05EA2859C006000B7DC0 /* TotalTimeTransformer.m in Sources */,
|
||||
839DA7CF274A2D4C001B18E5 /* NSDictionary+Merge.m in Sources */,
|
||||
179D03200E0CB2500064A77A /* DirectoryNode.m in Sources */,
|
||||
179D03210E0CB2500064A77A /* FileIconCell.m in Sources */,
|
||||
179D03220E0CB2500064A77A /* FileNode.m in Sources */,
|
||||
0A9CEA0B286152DF00E47168 /* DraggableView.swift in Sources */,
|
||||
83988F0E27BE0A5900A0E89A /* RedundantPlaylistDataStore.m in Sources */,
|
||||
179D03230E0CB2500064A77A /* FileTreeDataSource.m in Sources */,
|
||||
179D03240E0CB2500064A77A /* FileTreeController.m in Sources */,
|
||||
8370D73D277419F700245CE0 /* SQLiteStore.m in Sources */,
|
||||
179D03260E0CB2500064A77A /* PathNode.m in Sources */,
|
||||
179D03270E0CB2500064A77A /* PathWatcher.m in Sources */,
|
||||
179D03280E0CB2500064A77A /* SmartFolderNode.m in Sources */,
|
||||
8381A09227C5F72F00A1C530 /* SHA256Digest.m in Sources */,
|
||||
173855FF0E0CC81F00488CD4 /* FileTreeOutlineView.m in Sources */,
|
||||
07D971E60ED1DAA800E7602E /* TagEditorController.m in Sources */,
|
||||
17E0D5EA0F520F02005B6FED /* MainWindow.m in Sources */,
|
||||
836D28A818086386005B7299 /* MiniModeMenuTitleTransformer.m in Sources */,
|
||||
|
@ -2654,6 +2583,7 @@
|
|||
17E0D5ED0F520F02005B6FED /* TimeField.m in Sources */,
|
||||
17E0D6160F520F87005B6FED /* FontSizetoLineHeightTransformer.m in Sources */,
|
||||
17E0D6170F520F87005B6FED /* StringToURLTransformer.m in Sources */,
|
||||
839B837F286D7F8D00F529EE /* NumberHertzToStringTransformer.swift in Sources */,
|
||||
17E0D61C0F520F9F005B6FED /* VolumeButton.m in Sources */,
|
||||
17E0D61D0F520F9F005B6FED /* VolumeSlider.m in Sources */,
|
||||
172A12330F5911D20078EF0C /* RepeatTransformers.m in Sources */,
|
||||
|
@ -2666,8 +2596,6 @@
|
|||
8307D30E28606148000FF8EB /* SandboxBroker.m in Sources */,
|
||||
83229C9F283B0095004626A8 /* SpectrumWindowController.m in Sources */,
|
||||
835F00BB279BD1CD00055FCF /* SecondsFormatter.m in Sources */,
|
||||
1784560F0F631E24007E8021 /* FileTreeViewController.m in Sources */,
|
||||
178456120F631E31007E8021 /* SideViewController.m in Sources */,
|
||||
17D1B1010F63255200694C57 /* InfoWindowController.m in Sources */,
|
||||
835A8FD327957310005B3C39 /* json.c in Sources */,
|
||||
17D1B25D0F633A4F00694C57 /* PreferencePluginController.m in Sources */,
|
||||
|
@ -2850,16 +2778,6 @@
|
|||
name = InfoPlist.strings;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
17211A7C0D68B7C500911CA9 /* FileTree.xib */ = {
|
||||
isa = PBXVariantGroup;
|
||||
children = (
|
||||
83BC5AB720E4C91400631CD4 /* Base */,
|
||||
83BC5AD220E4D0B400631CD4 /* es */,
|
||||
83BC5AD420E4D0B600631CD4 /* en */,
|
||||
);
|
||||
name = FileTree.xib;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
17342A980D5FD20B00E8D854 /* MainMenu.xib */ = {
|
||||
isa = PBXVariantGroup;
|
||||
children = (
|
||||
|
@ -2958,7 +2876,7 @@
|
|||
GCC_OPTIMIZATION_LEVEL = 0;
|
||||
HEADER_SEARCH_PATHS = ThirdParty/avif/include;
|
||||
INFOPLIST_FILE = Info.plist;
|
||||
INSTALL_PATH = "/Applications";
|
||||
INSTALL_PATH = /Applications;
|
||||
LD_RUNPATH_SEARCH_PATHS = (
|
||||
"$(inherited)",
|
||||
"@executable_path/../Frameworks",
|
||||
|
@ -2967,13 +2885,13 @@
|
|||
LIBRARY_SEARCH_PATHS = (
|
||||
"$(inherited)",
|
||||
"$(PROJECT_DIR)/ThirdParty/avif/lib",
|
||||
"$(PROJECT_DIR)/ThirdParty/mpg123/lib",
|
||||
);
|
||||
MACOSX_DEPLOYMENT_TARGET = 10.12;
|
||||
MACOSX_DEPLOYMENT_TARGET = 10.13;
|
||||
OTHER_CFLAGS = (
|
||||
"-D__MACOSX__",
|
||||
"-DHAVE_CONFIG_H",
|
||||
);
|
||||
OTHER_CODE_SIGN_FLAGS = "--deep -f";
|
||||
OTHER_LDFLAGS = (
|
||||
"-weak_framework",
|
||||
CogAudio,
|
||||
|
@ -3011,7 +2929,7 @@
|
|||
GCC_ENABLE_OBJC_EXCEPTIONS = YES;
|
||||
HEADER_SEARCH_PATHS = ThirdParty/avif/include;
|
||||
INFOPLIST_FILE = Info.plist;
|
||||
INSTALL_PATH = "/Applications";
|
||||
INSTALL_PATH = /Applications;
|
||||
LD_RUNPATH_SEARCH_PATHS = (
|
||||
"$(inherited)",
|
||||
"@executable_path/../Frameworks",
|
||||
|
@ -3020,13 +2938,13 @@
|
|||
LIBRARY_SEARCH_PATHS = (
|
||||
"$(inherited)",
|
||||
"$(PROJECT_DIR)/ThirdParty/avif/lib",
|
||||
"$(PROJECT_DIR)/ThirdParty/mpg123/lib",
|
||||
);
|
||||
MACOSX_DEPLOYMENT_TARGET = 10.12;
|
||||
MACOSX_DEPLOYMENT_TARGET = 10.13;
|
||||
OTHER_CFLAGS = (
|
||||
"-D__MACOSX__",
|
||||
"-DHAVE_CONFIG_H",
|
||||
);
|
||||
OTHER_CODE_SIGN_FLAGS = "--deep -f";
|
||||
OTHER_LDFLAGS = (
|
||||
"-weak_framework",
|
||||
CogAudio,
|
||||
|
@ -3084,7 +3002,7 @@
|
|||
GCC_WARN_UNINITIALIZED_AUTOS = YES;
|
||||
GCC_WARN_UNUSED_FUNCTION = YES;
|
||||
GCC_WARN_UNUSED_VARIABLE = YES;
|
||||
MACOSX_DEPLOYMENT_TARGET = 10.12;
|
||||
MACOSX_DEPLOYMENT_TARGET = 10.13;
|
||||
ONLY_ACTIVE_ARCH = YES;
|
||||
SDKROOT = macosx;
|
||||
};
|
||||
|
@ -3125,7 +3043,7 @@
|
|||
GCC_WARN_UNINITIALIZED_AUTOS = YES;
|
||||
GCC_WARN_UNUSED_FUNCTION = YES;
|
||||
GCC_WARN_UNUSED_VARIABLE = YES;
|
||||
MACOSX_DEPLOYMENT_TARGET = 10.12;
|
||||
MACOSX_DEPLOYMENT_TARGET = 10.13;
|
||||
SDKROOT = macosx;
|
||||
SWIFT_COMPILATION_MODE = wholemodule;
|
||||
};
|
||||
|
|
|
@ -0,0 +1,113 @@
|
|||
{
|
||||
"pins" : [
|
||||
{
|
||||
"identity" : "abseil-cpp-swiftpm",
|
||||
"kind" : "remoteSourceControl",
|
||||
"location" : "https://github.com/firebase/abseil-cpp-SwiftPM.git",
|
||||
"state" : {
|
||||
"revision" : "d302de612e3d57c6f4afaf087da18fba8eac72a7",
|
||||
"version" : "0.20220203.1"
|
||||
}
|
||||
},
|
||||
{
|
||||
"identity" : "boringssl-swiftpm",
|
||||
"kind" : "remoteSourceControl",
|
||||
"location" : "https://github.com/firebase/boringssl-SwiftPM.git",
|
||||
"state" : {
|
||||
"revision" : "79db6516894a932d0ddaff3b05b9da1e4f6c4069",
|
||||
"version" : "0.9.0"
|
||||
}
|
||||
},
|
||||
{
|
||||
"identity" : "firebase-ios-sdk",
|
||||
"kind" : "remoteSourceControl",
|
||||
"location" : "https://github.com/firebase/firebase-ios-sdk",
|
||||
"state" : {
|
||||
"revision" : "2eb177effe7baf1f13ad0c5f4eb8c71a98429fb5",
|
||||
"version" : "9.1.0"
|
||||
}
|
||||
},
|
||||
{
|
||||
"identity" : "googleappmeasurement",
|
||||
"kind" : "remoteSourceControl",
|
||||
"location" : "https://github.com/google/GoogleAppMeasurement.git",
|
||||
"state" : {
|
||||
"revision" : "192cce3e0486aecfdb61102a9c694c78dc89dc48",
|
||||
"version" : "9.1.0"
|
||||
}
|
||||
},
|
||||
{
|
||||
"identity" : "googledatatransport",
|
||||
"kind" : "remoteSourceControl",
|
||||
"location" : "https://github.com/google/GoogleDataTransport.git",
|
||||
"state" : {
|
||||
"revision" : "b905c49326b72211531ed9d7baa02d724828a8dc",
|
||||
"version" : "9.1.4"
|
||||
}
|
||||
},
|
||||
{
|
||||
"identity" : "googleutilities",
|
||||
"kind" : "remoteSourceControl",
|
||||
"location" : "https://github.com/google/GoogleUtilities.git",
|
||||
"state" : {
|
||||
"revision" : "f4abe56ce62a779e64b525eb133c8fc2a84bbc1f",
|
||||
"version" : "7.7.1"
|
||||
}
|
||||
},
|
||||
{
|
||||
"identity" : "grpc-ios",
|
||||
"kind" : "remoteSourceControl",
|
||||
"location" : "https://github.com/grpc/grpc-ios.git",
|
||||
"state" : {
|
||||
"revision" : "2af4f6e9c2b18beae228f50b1198c641be859d2b",
|
||||
"version" : "1.44.2-grpc"
|
||||
}
|
||||
},
|
||||
{
|
||||
"identity" : "gtm-session-fetcher",
|
||||
"kind" : "remoteSourceControl",
|
||||
"location" : "https://github.com/google/gtm-session-fetcher.git",
|
||||
"state" : {
|
||||
"revision" : "19605024d59eaefdb1f6a2cb11ebe75df4421126",
|
||||
"version" : "2.0.0"
|
||||
}
|
||||
},
|
||||
{
|
||||
"identity" : "leveldb",
|
||||
"kind" : "remoteSourceControl",
|
||||
"location" : "https://github.com/firebase/leveldb.git",
|
||||
"state" : {
|
||||
"revision" : "0706abcc6b0bd9cedfbb015ba840e4a780b5159b",
|
||||
"version" : "1.22.2"
|
||||
}
|
||||
},
|
||||
{
|
||||
"identity" : "nanopb",
|
||||
"kind" : "remoteSourceControl",
|
||||
"location" : "https://github.com/firebase/nanopb.git",
|
||||
"state" : {
|
||||
"revision" : "819d0a2173aff699fb8c364b6fb906f7cdb1a692",
|
||||
"version" : "2.30909.0"
|
||||
}
|
||||
},
|
||||
{
|
||||
"identity" : "promises",
|
||||
"kind" : "remoteSourceControl",
|
||||
"location" : "https://github.com/google/promises.git",
|
||||
"state" : {
|
||||
"revision" : "46c1e6b5ac09d8f82c991061c659f67e573d425d",
|
||||
"version" : "2.1.0"
|
||||
}
|
||||
},
|
||||
{
|
||||
"identity" : "swift-protobuf",
|
||||
"kind" : "remoteSourceControl",
|
||||
"location" : "https://github.com/apple/swift-protobuf.git",
|
||||
"state" : {
|
||||
"revision" : "e1499bc69b9040b29184f7f2996f7bab467c1639",
|
||||
"version" : "1.19.0"
|
||||
}
|
||||
}
|
||||
],
|
||||
"version" : 2
|
||||
}
|
|
@ -1,10 +1,28 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<Scheme
|
||||
LastUpgradeVersion = "1400"
|
||||
version = "1.3">
|
||||
version = "1.7">
|
||||
<BuildAction
|
||||
parallelizeBuildables = "YES"
|
||||
buildImplicitDependencies = "YES">
|
||||
<PreActions>
|
||||
<ExecutionAction
|
||||
ActionType = "Xcode.IDEStandardExecutionActionsCore.ExecutionActionType.ShellScriptAction">
|
||||
<ActionContent
|
||||
title = "Run Script"
|
||||
scriptText = ""${PROJECT_DIR}/Scripts/extract_libraries.sh" ">
|
||||
<EnvironmentBuildable>
|
||||
<BuildableReference
|
||||
BuildableIdentifier = "primary"
|
||||
BlueprintIdentifier = "8D1107260486CEB800E47090"
|
||||
BuildableName = "Cog.app"
|
||||
BlueprintName = "Cog"
|
||||
ReferencedContainer = "container:Cog.xcodeproj">
|
||||
</BuildableReference>
|
||||
</EnvironmentBuildable>
|
||||
</ActionContent>
|
||||
</ExecutionAction>
|
||||
</PreActions>
|
||||
<BuildActionEntries>
|
||||
<BuildActionEntry
|
||||
buildForTesting = "YES"
|
||||
|
|
|
@ -11,6 +11,7 @@
|
|||
<attribute name="filename" optional="YES" attributeType="String"/>
|
||||
<attribute name="firstSeen" optional="YES" attributeType="Date" usesScalarValueType="NO"/>
|
||||
<attribute name="lastPlayed" optional="YES" attributeType="Date" usesScalarValueType="NO"/>
|
||||
<attribute name="rating" optional="YES" attributeType="Float" defaultValueString="0.0" usesScalarValueType="YES"/>
|
||||
<attribute name="title" optional="YES" attributeType="String"/>
|
||||
</entity>
|
||||
<entity name="PlaylistEntry" representedClassName="PlaylistEntry" syncable="YES" codeGenerationType="class">
|
||||
|
@ -63,12 +64,13 @@
|
|||
</entity>
|
||||
<entity name="SandboxToken" representedClassName="SandboxToken" syncable="YES" codeGenerationType="class">
|
||||
<attribute name="bookmark" optional="YES" attributeType="Binary"/>
|
||||
<attribute name="folder" optional="YES" attributeType="Boolean" defaultValueString="YES" usesScalarValueType="YES"/>
|
||||
<attribute name="path" optional="YES" attributeType="String"/>
|
||||
</entity>
|
||||
<elements>
|
||||
<element name="AlbumArtwork" positionX="0" positionY="207" width="128" height="59"/>
|
||||
<element name="PlayCount" positionX="-18" positionY="171" width="128" height="134"/>
|
||||
<element name="PlayCount" positionX="-18" positionY="171" width="128" height="149"/>
|
||||
<element name="PlaylistEntry" positionX="-36" positionY="9" width="128" height="719"/>
|
||||
<element name="SandboxToken" positionX="-18" positionY="171" width="128" height="59"/>
|
||||
<element name="SandboxToken" positionX="-18" positionY="171" width="128" height="74"/>
|
||||
</elements>
|
||||
</model>
|
|
@ -326,9 +326,7 @@ void equalizerApplyPreset(AudioUnit au, const NSDictionary *preset) {
|
|||
@implementation EqualizerSlider
|
||||
|
||||
- (void)awakeFromNib {
|
||||
if(@available(macOS 10.12.2, *)) {
|
||||
[self setTrackFillColor:[NSColor systemGrayColor]];
|
||||
}
|
||||
}
|
||||
|
||||
@end
|
||||
|
|
|
@ -1,16 +0,0 @@
|
|||
//
|
||||
// ContainedNode.h
|
||||
// Cog
|
||||
//
|
||||
// Created by Vincent Spader on 10/15/07.
|
||||
// Copyright 2007 __MyCompanyName__. All rights reserved.
|
||||
//
|
||||
|
||||
#import <Cocoa/Cocoa.h>
|
||||
|
||||
#import "PathNode.h"
|
||||
|
||||
@interface ContainedNode : PathNode {
|
||||
}
|
||||
|
||||
@end
|
|
@ -1,42 +0,0 @@
|
|||
//
|
||||
// ContainedNode.m
|
||||
// Cog
|
||||
//
|
||||
// Created by Vincent Spader on 10/15/07.
|
||||
// Copyright 2007 __MyCompanyName__. All rights reserved.
|
||||
//
|
||||
|
||||
#import "ContainedNode.h"
|
||||
#import "CogAudio/AudioMetadataReader.h"
|
||||
|
||||
@implementation ContainedNode
|
||||
|
||||
- (BOOL)isLeaf {
|
||||
return YES;
|
||||
}
|
||||
|
||||
- (void)setURL:(NSURL *)u {
|
||||
[super setURL:u];
|
||||
|
||||
if([u fragment]) {
|
||||
NSDictionary *metadata = [AudioMetadataReader metadataForURL:u];
|
||||
NSString *title = nil;
|
||||
NSString *artist = nil;
|
||||
if(metadata) {
|
||||
title = [metadata valueForKey:@"title"];
|
||||
artist = [metadata valueForKey:@"artist"];
|
||||
}
|
||||
|
||||
if(title && [title length]) {
|
||||
if(artist && [artist length]) {
|
||||
display = [[u fragment] stringByAppendingFormat:@": %@ - %@", artist, title];
|
||||
} else {
|
||||
display = [[u fragment] stringByAppendingFormat:@": %@", title];
|
||||
}
|
||||
} else {
|
||||
display = [u fragment];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@end
|
|
@ -1,16 +0,0 @@
|
|||
//
|
||||
// ContainerNode.h
|
||||
// Cog
|
||||
//
|
||||
// Created by Vincent Spader on 10/15/07.
|
||||
// Copyright 2007 __MyCompanyName__. All rights reserved.
|
||||
//
|
||||
|
||||
#import <Cocoa/Cocoa.h>
|
||||
|
||||
#import "PathNode.h"
|
||||
|
||||
@interface ContainerNode : PathNode {
|
||||
}
|
||||
|
||||
@end
|
|
@ -1,35 +0,0 @@
|
|||
//
|
||||
// ContainerNode.m
|
||||
// Cog
|
||||
//
|
||||
// Created by Vincent Spader on 10/15/07.
|
||||
// Copyright 2007 __MyCompanyName__. All rights reserved.
|
||||
//
|
||||
|
||||
#import "ContainerNode.h"
|
||||
#import "CogAudio/AudioContainer.h"
|
||||
|
||||
#import "ContainedNode.h"
|
||||
|
||||
#import "Logging.h"
|
||||
|
||||
@implementation ContainerNode
|
||||
|
||||
- (BOOL)isLeaf {
|
||||
return NO;
|
||||
}
|
||||
|
||||
- (void)updatePath {
|
||||
NSArray *urls = [AudioContainer urlsForContainerURL:url];
|
||||
|
||||
NSMutableArray *paths = [[NSMutableArray alloc] init];
|
||||
for(NSURL *u in urls) {
|
||||
ContainedNode *node = [[ContainedNode alloc] initWithDataSource:dataSource url:u];
|
||||
DLog(@"Node: %@", u);
|
||||
[paths addObject:node];
|
||||
}
|
||||
|
||||
[self setSubpaths:paths];
|
||||
}
|
||||
|
||||
@end
|
|
@ -1,15 +0,0 @@
|
|||
//
|
||||
// DirectoryNode.h
|
||||
// Cog
|
||||
//
|
||||
// Created by Vincent Spader on 8/20/2006.
|
||||
// Copyright 2006 Vincent Spader. All rights reserved.
|
||||
//
|
||||
|
||||
#import "PathNode.h"
|
||||
#import <Cocoa/Cocoa.h>
|
||||
|
||||
@interface DirectoryNode : PathNode {
|
||||
}
|
||||
|
||||
@end
|
|
@ -1,38 +0,0 @@
|
|||
//
|
||||
// DirectoryNode.m
|
||||
// Cog
|
||||
//
|
||||
// Created by Vincent Spader on 8/20/2006.
|
||||
// Copyright 2006 Vincent Spader. All rights reserved.
|
||||
//
|
||||
|
||||
#import "DirectoryNode.h"
|
||||
|
||||
#import "FileNode.h"
|
||||
#import "SmartFolderNode.h"
|
||||
|
||||
#import "NSString+FinderCompare.h"
|
||||
|
||||
@implementation DirectoryNode
|
||||
|
||||
- (BOOL)isLeaf {
|
||||
return NO;
|
||||
}
|
||||
|
||||
- (void)updatePath {
|
||||
NSDirectoryEnumerator *enumerator = [[NSFileManager defaultManager] enumeratorAtURL:url
|
||||
includingPropertiesForKeys:@[NSURLNameKey, NSURLIsDirectoryKey]
|
||||
options:(NSDirectoryEnumerationSkipsSubdirectoryDescendants | NSDirectoryEnumerationSkipsPackageDescendants | NSDirectoryEnumerationSkipsHiddenFiles)
|
||||
errorHandler:^BOOL(NSURL *url, NSError *error) {
|
||||
return NO;
|
||||
}];
|
||||
NSMutableArray *fullPaths = [[NSMutableArray alloc] init];
|
||||
|
||||
for(NSURL *theUrl in enumerator) {
|
||||
[fullPaths addObject:[theUrl path]];
|
||||
}
|
||||
|
||||
[self processPaths:[fullPaths sortedArrayUsingSelector:@selector(finderCompare:)]];
|
||||
}
|
||||
|
||||
@end
|
|
@ -1,15 +0,0 @@
|
|||
//
|
||||
// FileIconTextCell.h
|
||||
// Cog
|
||||
//
|
||||
// Created by Vincent Spader on 8/20/06.
|
||||
// Copyright 2006 Vincent Spader. All rights reserved.
|
||||
//
|
||||
|
||||
#import "ImageTextCell.h"
|
||||
#import <Cocoa/Cocoa.h>
|
||||
|
||||
@interface FileIconCell : ImageTextCell {
|
||||
}
|
||||
|
||||
@end
|
|
@ -1,23 +0,0 @@
|
|||
//
|
||||
// FileIconTextCell.m
|
||||
// Cog
|
||||
//
|
||||
// Created by Vincent Spader on 8/20/06.
|
||||
// Copyright 2006 Vincent Spader. All rights reserved.
|
||||
//
|
||||
|
||||
#import "FileIconCell.h"
|
||||
#import "PathNode.h"
|
||||
|
||||
@implementation FileIconCell
|
||||
|
||||
- (void)setObjectValue:(PathNode *)o {
|
||||
if([o respondsToSelector:@selector(icon)] && [o respondsToSelector:@selector(display)]) {
|
||||
[super setObjectValue:[o display]];
|
||||
[super setImage:[o icon]];
|
||||
} else {
|
||||
[super setObjectValue:(id)o];
|
||||
}
|
||||
}
|
||||
|
||||
@end
|
|
@ -1,15 +0,0 @@
|
|||
//
|
||||
// FileNode.h
|
||||
// Cog
|
||||
//
|
||||
// Created by Vincent Spader on 8/20/2006.
|
||||
// Copyright 2006 Vincent Spader. All rights reserved.
|
||||
//
|
||||
|
||||
#import "PathNode.h"
|
||||
#import <Cocoa/Cocoa.h>
|
||||
|
||||
@interface FileNode : PathNode {
|
||||
}
|
||||
|
||||
@end
|
|
@ -1,17 +0,0 @@
|
|||
//
|
||||
// FileNode.m
|
||||
// Cog
|
||||
//
|
||||
// Created by Vincent Spader on 8/20/2006.
|
||||
// Copyright 2006 Vincent Spader. All rights reserved.
|
||||
//
|
||||
|
||||
#import "FileNode.h"
|
||||
|
||||
@implementation FileNode
|
||||
|
||||
- (BOOL)isLeaf {
|
||||
return YES;
|
||||
}
|
||||
|
||||
@end
|
|
@ -1,26 +0,0 @@
|
|||
//
|
||||
// FileTreeController.h
|
||||
// Cog
|
||||
//
|
||||
// Created by Vincent Spader on 2/17/08.
|
||||
// Copyright 2008 __MyCompanyName__. All rights reserved.
|
||||
//
|
||||
|
||||
#import "FileTreeDataSource.h"
|
||||
#import <Cocoa/Cocoa.h>
|
||||
|
||||
@class SideViewController;
|
||||
@interface FileTreeController : NSObject {
|
||||
IBOutlet SideViewController *controller;
|
||||
IBOutlet NSOutlineView *outlineView;
|
||||
IBOutlet FileTreeDataSource *dataSource;
|
||||
}
|
||||
|
||||
- (IBAction)addToPlaylist:(id)sender;
|
||||
- (IBAction)addToPlaylistExternal:(id)sender;
|
||||
- (IBAction)setAsPlaylist:(id)sender;
|
||||
- (IBAction)playPauseResume:(NSObject *)id;
|
||||
- (IBAction)showEntryInFinder:(id)sender;
|
||||
- (IBAction)setAsRoot:(id)sender;
|
||||
|
||||
@end
|
|
@ -1,85 +0,0 @@
|
|||
//
|
||||
// FileTreeController.m
|
||||
// Cog
|
||||
//
|
||||
// Created by Vincent Spader on 2/17/08.
|
||||
// Copyright 2008 __MyCompanyName__. All rights reserved.
|
||||
//
|
||||
|
||||
#import "FileTreeController.h"
|
||||
#import "PlaylistController.h"
|
||||
#import "SideViewController.h"
|
||||
|
||||
@implementation FileTreeController
|
||||
|
||||
- (IBAction)addToPlaylist:(id)sender {
|
||||
[self doAddToPlaylist:sender origin:URLOriginInternal];
|
||||
}
|
||||
|
||||
- (void)doAddToPlaylist:(id)sender origin:(URLOrigin)origin {
|
||||
NSUInteger index;
|
||||
NSIndexSet *selectedIndexes = [outlineView selectedRowIndexes];
|
||||
NSMutableArray *urls = [[NSMutableArray alloc] init];
|
||||
|
||||
for(index = [selectedIndexes firstIndex];
|
||||
index != NSNotFound; index = [selectedIndexes indexGreaterThanIndex:index]) {
|
||||
[urls addObject:[[outlineView itemAtRow:index] URL]];
|
||||
}
|
||||
|
||||
[controller doAddToPlaylist:urls origin:origin];
|
||||
}
|
||||
|
||||
- (void)addToPlaylistExternal:(id)sender {
|
||||
[self doAddToPlaylist:sender origin:URLOriginExternal];
|
||||
}
|
||||
|
||||
- (IBAction)setAsPlaylist:(id)sender {
|
||||
[controller clear:sender];
|
||||
[self addToPlaylist:sender];
|
||||
}
|
||||
|
||||
- (IBAction)playPauseResume:(NSObject *)id {
|
||||
[controller playPauseResume:id];
|
||||
}
|
||||
|
||||
- (IBAction)showEntryInFinder:(id)sender {
|
||||
NSUInteger index;
|
||||
NSWorkspace *ws = [NSWorkspace sharedWorkspace];
|
||||
NSIndexSet *selectedIndexes = [outlineView selectedRowIndexes];
|
||||
|
||||
for(index = [selectedIndexes firstIndex];
|
||||
index != NSNotFound; index = [selectedIndexes indexGreaterThanIndex:index]) {
|
||||
NSURL *url = [[outlineView itemAtRow:index] URL];
|
||||
[ws selectFile:[url path] inFileViewerRootedAtPath:[url path]];
|
||||
}
|
||||
}
|
||||
|
||||
- (IBAction)setAsRoot:(id)sender {
|
||||
NSUInteger index = [[outlineView selectedRowIndexes] firstIndex];
|
||||
|
||||
if(index != NSNotFound) {
|
||||
[dataSource changeURL:[[outlineView itemAtRow:index] URL]];
|
||||
}
|
||||
}
|
||||
|
||||
- (BOOL)validateMenuItem:(NSMenuItem *)menuItem {
|
||||
SEL action = [menuItem action];
|
||||
|
||||
if([outlineView numberOfSelectedRows] == 0)
|
||||
return NO;
|
||||
|
||||
if(action == @selector(setAsRoot:)) {
|
||||
BOOL isDir;
|
||||
NSInteger row = [outlineView selectedRow];
|
||||
|
||||
if([outlineView numberOfSelectedRows] > 1)
|
||||
return NO;
|
||||
|
||||
// Only let directories be Set as Root
|
||||
[[NSFileManager defaultManager] fileExistsAtPath:[[[outlineView itemAtRow:row] URL] path] isDirectory:&isDir];
|
||||
return isDir;
|
||||
}
|
||||
|
||||
return YES;
|
||||
}
|
||||
@end
|
|
@ -1,24 +0,0 @@
|
|||
//
|
||||
// FileTreeDataSource.h
|
||||
// Cog
|
||||
//
|
||||
// Created by Vincent Spader on 10/14/07.
|
||||
// Copyright 2007 __MyCompanyName__. All rights reserved.
|
||||
//
|
||||
|
||||
#import <Cocoa/Cocoa.h>
|
||||
|
||||
@class PathNode;
|
||||
@class PathWatcher;
|
||||
|
||||
@interface FileTreeDataSource : NSObject <NSOutlineViewDataSource>
|
||||
|
||||
@property(nonatomic, weak) IBOutlet NSOutlineView *outlineView;
|
||||
@property(nonatomic, weak) IBOutlet NSPathControl *pathControl;
|
||||
@property(nonatomic, weak) IBOutlet PathWatcher *watcher;
|
||||
|
||||
- (void)changeURL:(NSURL *)rootURL;
|
||||
|
||||
- (void)reloadPathNode:(PathNode *)item;
|
||||
|
||||
@end
|
|
@ -1,197 +0,0 @@
|
|||
//
|
||||
// FileTreeDataSource.m
|
||||
// Cog
|
||||
//
|
||||
// Created by Vincent Spader on 10/14/07.
|
||||
// Copyright 2007 __MyCompanyName__. All rights reserved.
|
||||
//
|
||||
|
||||
#import "FileTreeDataSource.h"
|
||||
|
||||
#import "DirectoryNode.h"
|
||||
#import "PathWatcher.h"
|
||||
|
||||
#import "Logging.h"
|
||||
|
||||
#import "SandboxBroker.h"
|
||||
|
||||
static void *kFileTreeDataSourceContext = &kFileTreeDataSourceContext;
|
||||
|
||||
static NSURL *defaultMusicDirectory(void) {
|
||||
return [[NSFileManager defaultManager] URLForDirectory:NSMusicDirectory
|
||||
inDomain:NSUserDomainMask
|
||||
appropriateForURL:nil
|
||||
create:NO
|
||||
error:nil];
|
||||
}
|
||||
|
||||
@interface FileTreeDataSource ()
|
||||
|
||||
@property NSURL *rootURL;
|
||||
|
||||
@property const void *sbHandle;
|
||||
|
||||
@end
|
||||
|
||||
@implementation FileTreeDataSource {
|
||||
PathNode *rootNode;
|
||||
const void *_sbHandle;
|
||||
}
|
||||
|
||||
+ (void)initialize {
|
||||
NSString *path = [defaultMusicDirectory() absoluteString];
|
||||
NSDictionary *userDefaultsValuesDict = @{ @"fileTreeRootURL": path };
|
||||
[[NSUserDefaults standardUserDefaults] registerDefaults:userDefaultsValuesDict];
|
||||
}
|
||||
|
||||
- (void)awakeFromNib {
|
||||
_sbHandle = NULL;
|
||||
[self.pathControl setTarget:self];
|
||||
[self.pathControl setAction:@selector(pathControlAction:)];
|
||||
[[NSUserDefaultsController sharedUserDefaultsController] addObserver:self
|
||||
forKeyPath:@"values.fileTreeRootURL"
|
||||
options:NSKeyValueObservingOptionNew |
|
||||
NSKeyValueObservingOptionInitial
|
||||
context:kFileTreeDataSourceContext];
|
||||
}
|
||||
|
||||
- (void)observeValueForKeyPath:(NSString *)keyPath
|
||||
ofObject:(id)object
|
||||
change:(NSDictionary *)change
|
||||
context:(void *)context {
|
||||
if(context == kFileTreeDataSourceContext) {
|
||||
if([keyPath isEqualToString:@"values.fileTreeRootURL"]) {
|
||||
NSString *url =
|
||||
[[[NSUserDefaultsController sharedUserDefaultsController] defaults] objectForKey:@"fileTreeRootURL"];
|
||||
DLog(@"File tree root URL: %@\n", url);
|
||||
self.rootURL = [NSURL URLWithString:url];
|
||||
}
|
||||
} else {
|
||||
[super observeValueForKeyPath:keyPath ofObject:object change:change context:context];
|
||||
}
|
||||
}
|
||||
|
||||
- (void)changeURL:(NSURL *)url {
|
||||
if(url != nil) {
|
||||
[[[NSUserDefaultsController sharedUserDefaultsController] defaults] setObject:[url absoluteString]
|
||||
forKey:@"fileTreeRootURL"];
|
||||
}
|
||||
}
|
||||
|
||||
- (void)pathControlAction:(id)sender {
|
||||
NSPathControlItem *item = [self.pathControl clickedPathItem];
|
||||
if(item != nil && item.URL != nil) {
|
||||
[self changeURL:item.URL];
|
||||
}
|
||||
}
|
||||
|
||||
- (NSURL *)rootURL {
|
||||
return [rootNode URL];
|
||||
}
|
||||
|
||||
- (void)setRootURL:(NSURL *)rootURL {
|
||||
SandboxBroker *sharedSandboxBroker = [SandboxBroker sharedSandboxBroker];
|
||||
if(self.sbHandle) [sharedSandboxBroker endFolderAccess:self.sbHandle];
|
||||
self.sbHandle = [sharedSandboxBroker beginFolderAccess:rootURL];
|
||||
|
||||
if(![[NSFileManager defaultManager] fileExistsAtPath:[rootURL path]]) {
|
||||
rootURL = defaultMusicDirectory();
|
||||
}
|
||||
|
||||
rootNode = [[DirectoryNode alloc] initWithDataSource:self url:rootURL];
|
||||
|
||||
[self.watcher setPath:[rootURL path]];
|
||||
|
||||
[self reloadPathNode:rootNode];
|
||||
}
|
||||
|
||||
- (const void *)sbHandle {
|
||||
return _sbHandle;
|
||||
}
|
||||
|
||||
- (void)setSbHandle:(const void *)sbHandle {
|
||||
_sbHandle = sbHandle;
|
||||
}
|
||||
|
||||
- (void)dealloc {
|
||||
if(self.sbHandle) [[SandboxBroker sharedSandboxBroker] endFolderAccess:self.sbHandle];
|
||||
}
|
||||
|
||||
- (PathNode *)nodeForPath:(NSString *)path {
|
||||
NSString *relativePath = [[path stringByReplacingOccurrencesOfString:[[[self rootURL] path] stringByAppendingString:@"/"]
|
||||
withString:@""
|
||||
options:NSAnchoredSearch
|
||||
range:NSMakeRange(0, [path length])] stringByStandardizingPath];
|
||||
PathNode *node = rootNode;
|
||||
DLog(@"Root | Relative | Path: %@ | %@ | %@", [[self rootURL] path], relativePath, path);
|
||||
for(NSString *c in [relativePath pathComponents]) {
|
||||
DLog(@"COMPONENT: %@", c);
|
||||
BOOL found = NO;
|
||||
for(PathNode *subnode in [node subpaths]) {
|
||||
if([[[[subnode URL] path] lastPathComponent] isEqualToString:c]) {
|
||||
node = subnode;
|
||||
found = YES;
|
||||
}
|
||||
}
|
||||
|
||||
if(!found) {
|
||||
DLog(@"Not found!");
|
||||
return nil;
|
||||
}
|
||||
}
|
||||
|
||||
return node;
|
||||
}
|
||||
|
||||
- (void)pathDidChange:(NSString *)path {
|
||||
DLog(@"PATH DID CHANGE: %@", path);
|
||||
// Need to find the corresponding node...and call [node reloadPath], then [self reloadPathNode:node]
|
||||
PathNode *node = [self nodeForPath:path];
|
||||
DLog(@"NODE IS: %@", node);
|
||||
[node updatePath];
|
||||
[self reloadPathNode:node];
|
||||
}
|
||||
|
||||
- (NSInteger)outlineView:(NSOutlineView *)outlineView numberOfChildrenOfItem:(id)item {
|
||||
PathNode *n = (item == nil ? rootNode : item);
|
||||
|
||||
return (int)[[n subpaths] count];
|
||||
}
|
||||
|
||||
- (BOOL)outlineView:(NSOutlineView *)outlineView isItemExpandable:(id)item {
|
||||
PathNode *n = (item == nil ? rootNode : item);
|
||||
|
||||
return ![n isLeaf];
|
||||
}
|
||||
|
||||
- (id)outlineView:(NSOutlineView *)outlineView child:(NSInteger)index ofItem:(id)item {
|
||||
PathNode *n = (item == nil ? rootNode : item);
|
||||
|
||||
return [n subpaths][(NSUInteger)index];
|
||||
}
|
||||
|
||||
- (id)outlineView:(NSOutlineView *)outlineView objectValueForTableColumn:(NSTableColumn *)tableColumn byItem:(id)item {
|
||||
PathNode *n = (item == nil ? rootNode : item);
|
||||
|
||||
return n;
|
||||
}
|
||||
|
||||
- (id<NSPasteboardWriting>)outlineView:(NSOutlineView *)outlineView pasteboardWriterForItem:(id)item {
|
||||
NSPasteboardItem *paste = [[NSPasteboardItem alloc] init];
|
||||
if(@available(macOS 10.13, *)) {
|
||||
[paste setData:[[item URL] dataRepresentation] forType:NSPasteboardTypeFileURL];
|
||||
} else {
|
||||
[paste setPropertyList:@[[item URL]] forType:NSFilenamesPboardType];
|
||||
}
|
||||
return paste;
|
||||
}
|
||||
|
||||
- (void)reloadPathNode:(PathNode *)item {
|
||||
if(item == rootNode) {
|
||||
[self.outlineView reloadData];
|
||||
} else {
|
||||
[self.outlineView reloadItem:item reloadChildren:YES];
|
||||
}
|
||||
}
|
||||
|
||||
@end
|
|
@ -1,16 +0,0 @@
|
|||
//
|
||||
// FileTreeOutlineView.h
|
||||
// Cog
|
||||
//
|
||||
// Created by Vincent Spader on 6/21/08.
|
||||
// Copyright 2008 __MyCompanyName__. All rights reserved.
|
||||
//
|
||||
|
||||
#import <Cocoa/Cocoa.h>
|
||||
|
||||
@interface FileTreeOutlineView : NSOutlineView {
|
||||
}
|
||||
|
||||
- (void)keyDown:(NSEvent *)e;
|
||||
|
||||
@end
|
|
@ -1,66 +0,0 @@
|
|||
//
|
||||
// FileTreeOutlineView.m
|
||||
// Cog
|
||||
//
|
||||
// Created by Vincent Spader on 6/21/08.
|
||||
// Copyright 2008 __MyCompanyName__. All rights reserved.
|
||||
//
|
||||
|
||||
#import "FileTreeOutlineView.h"
|
||||
#import "FileTreeController.h"
|
||||
#import "FileTreeViewController.h"
|
||||
#import "PlaybackController.h"
|
||||
|
||||
@implementation FileTreeOutlineView
|
||||
|
||||
- (void)awakeFromNib {
|
||||
[self setDoubleAction:@selector(addToPlaylistExternal:)];
|
||||
[self setTarget:[self delegate]];
|
||||
}
|
||||
|
||||
- (void)keyDown:(NSEvent *)e {
|
||||
unsigned int modifiers = [e modifierFlags] & (NSEventModifierFlagCommand | NSEventModifierFlagShift | NSEventModifierFlagControl | NSEventModifierFlagOption);
|
||||
NSString *characters = [e characters];
|
||||
unichar c;
|
||||
|
||||
if([characters length] == 1) {
|
||||
c = [characters characterAtIndex:0];
|
||||
|
||||
if(modifiers == 0 && (c == NSEnterCharacter || c == NSCarriageReturnCharacter)) {
|
||||
[(FileTreeController *)[self delegate] addToPlaylistExternal:self];
|
||||
|
||||
return;
|
||||
} else if(modifiers == 0 && c == ' ') {
|
||||
[(FileTreeController *)[self delegate] playPauseResume:self];
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
[super keyDown:e];
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
// enables right-click selection for "Show in Finder" contextual menu
|
||||
- (NSMenu *)menuForEvent:(NSEvent *)event {
|
||||
// Find which row is under the cursor
|
||||
[[self window] makeFirstResponder:self];
|
||||
NSPoint menuPoint = [self convertPoint:[event locationInWindow] fromView:nil];
|
||||
NSInteger iRow = [self rowAtPoint:menuPoint];
|
||||
NSMenu *contextMenu = [self menu];
|
||||
|
||||
/* Update the file tree selection before showing menu
|
||||
Preserves the selection if the row under the mouse is selected (to allow for
|
||||
multiple items to be selected), otherwise selects the row under the mouse */
|
||||
BOOL currentRowIsSelected = [[self selectedRowIndexes] containsIndex:iRow];
|
||||
|
||||
if(iRow == -1) {
|
||||
[self deselectAll:self];
|
||||
} else if(!currentRowIsSelected) {
|
||||
[self selectRowIndexes:[NSIndexSet indexSetWithIndex:iRow] byExtendingSelection:NO];
|
||||
}
|
||||
|
||||
return contextMenu;
|
||||
}
|
||||
|
||||
@end
|
|
@ -1,23 +0,0 @@
|
|||
//
|
||||
// SideBarController.h
|
||||
// Cog
|
||||
//
|
||||
// Created by Vincent Spader on 6/21/08.
|
||||
// Copyright 2008 __MyCompanyName__. All rights reserved.
|
||||
//
|
||||
|
||||
#import "SideViewController.h"
|
||||
#import <Cocoa/Cocoa.h>
|
||||
|
||||
@class PlaylistLoader;
|
||||
@class PlaybackController;
|
||||
@class FileTreeOutlineView;
|
||||
@interface FileTreeViewController : SideViewController {
|
||||
IBOutlet PlaylistLoader *playlistLoader;
|
||||
IBOutlet PlaybackController *playbackController;
|
||||
IBOutlet FileTreeOutlineView *fileTreeOutlineView;
|
||||
}
|
||||
|
||||
- (FileTreeOutlineView *)outlineView;
|
||||
|
||||
@end
|
|
@ -1,44 +0,0 @@
|
|||
//
|
||||
// SplitViewController.m
|
||||
// Cog
|
||||
//
|
||||
// Created by Vincent Spader on 6/20/08.
|
||||
// Copyright 2008 __MyCompanyName__. All rights reserved.
|
||||
//
|
||||
|
||||
#import "FileTreeViewController.h"
|
||||
#import "PlaybackController.h"
|
||||
#import "PlaylistLoader.h"
|
||||
|
||||
@implementation FileTreeViewController
|
||||
|
||||
- (id)init {
|
||||
return [super initWithNibName:@"FileTree" bundle:[NSBundle mainBundle]];
|
||||
}
|
||||
|
||||
- (void)addToPlaylistInternal:(NSArray *)urls {
|
||||
[self doAddToPlaylist:urls origin:URLOriginInternal];
|
||||
}
|
||||
|
||||
- (void)addToPlaylistExternal:(NSArray *)urls {
|
||||
[self doAddToPlaylist:urls origin:URLOriginExternal];
|
||||
}
|
||||
|
||||
- (void)doAddToPlaylist:(NSArray *)urls origin:(URLOrigin)origin {
|
||||
[playlistLoader willInsertURLs:urls origin:origin];
|
||||
[playlistLoader didInsertURLs:[playlistLoader addURLs:urls sort:YES] origin:origin];
|
||||
}
|
||||
|
||||
- (void)clear:(id)sender {
|
||||
[playlistLoader clear:sender];
|
||||
}
|
||||
|
||||
- (void)playPauseResume:(NSObject *)id {
|
||||
[playbackController playPauseResume:id];
|
||||
}
|
||||
|
||||
- (FileTreeOutlineView *)outlineView {
|
||||
return fileTreeOutlineView;
|
||||
}
|
||||
|
||||
@end
|
|
@ -1,43 +0,0 @@
|
|||
//
|
||||
// Node.h
|
||||
// Cog
|
||||
//
|
||||
// Created by Vincent Spader on 8/20/2006.
|
||||
// Copyright 2006 Vincent Spader. All rights reserved.
|
||||
//
|
||||
|
||||
#import <Cocoa/Cocoa.h>
|
||||
|
||||
@class FileTreeDataSource;
|
||||
|
||||
@interface PathNode : NSObject {
|
||||
FileTreeDataSource *dataSource;
|
||||
|
||||
NSURL *url;
|
||||
NSString *display; // The pretty path to display.
|
||||
|
||||
NSImage *icon;
|
||||
|
||||
NSArray *subpaths;
|
||||
}
|
||||
|
||||
- (id)initWithDataSource:(FileTreeDataSource *)ds url:(NSURL *)u;
|
||||
|
||||
- (NSURL *)URL;
|
||||
- (void)setURL:(NSURL *)url;
|
||||
|
||||
- (void)processPaths:(NSArray *)contents;
|
||||
|
||||
- (NSArray *)subpaths;
|
||||
- (void)setSubpaths:(NSArray *)s;
|
||||
|
||||
- (NSString *)display;
|
||||
- (void)setDisplay:(NSString *)s;
|
||||
|
||||
- (NSImage *)icon;
|
||||
|
||||
- (BOOL)isLeaf;
|
||||
|
||||
- (void)updatePath;
|
||||
|
||||
@end
|
|
@ -1,155 +0,0 @@
|
|||
//
|
||||
// Node.m
|
||||
// Cog
|
||||
//
|
||||
// Created by Vincent Spader on 8/20/2006.
|
||||
// Copyright 2006 Vincent Spader. All rights reserved.
|
||||
//
|
||||
|
||||
#import "PathNode.h"
|
||||
|
||||
#import "CogAudio/AudioPlayer.h"
|
||||
|
||||
#import "FileTreeDataSource.h"
|
||||
|
||||
#import "ContainerNode.h"
|
||||
#import "DirectoryNode.h"
|
||||
#import "FileNode.h"
|
||||
#import "SmartFolderNode.h"
|
||||
|
||||
#import "Logging.h"
|
||||
|
||||
@implementation PathNode
|
||||
|
||||
// From http://developer.apple.com/documentation/Cocoa/Conceptual/LowLevelFileMgmt/Tasks/ResolvingAliases.html
|
||||
// Updated 2018-06-28
|
||||
NSURL *resolveAliases(NSURL *url) {
|
||||
CFErrorRef error;
|
||||
CFDataRef bookmarkRef = CFURLCreateBookmarkDataFromFile(kCFAllocatorDefault, (__bridge CFURLRef)url, &error);
|
||||
if(bookmarkRef) {
|
||||
Boolean isStale;
|
||||
CFURLRef urlRef = CFURLCreateByResolvingBookmarkData(kCFAllocatorDefault, bookmarkRef, kCFURLBookmarkResolutionWithSecurityScope, NULL, NULL, &isStale, &error);
|
||||
CFRelease(bookmarkRef);
|
||||
|
||||
if(urlRef) {
|
||||
if(!isStale) {
|
||||
return (NSURL *)CFBridgingRelease(urlRef);
|
||||
} else {
|
||||
CFRelease(urlRef);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// DLog(@"Not resolved");
|
||||
return url;
|
||||
}
|
||||
|
||||
- (id)initWithDataSource:(FileTreeDataSource *)ds url:(NSURL *)u {
|
||||
self = [super init];
|
||||
|
||||
if(self) {
|
||||
dataSource = ds;
|
||||
[self setURL:u];
|
||||
}
|
||||
|
||||
return self;
|
||||
}
|
||||
|
||||
- (void)setURL:(NSURL *)u {
|
||||
url = u;
|
||||
|
||||
display = [[NSFileManager defaultManager] displayNameAtPath:[u path]];
|
||||
|
||||
icon = [[NSWorkspace sharedWorkspace] iconForFile:[url path]];
|
||||
|
||||
[icon setSize:NSMakeSize(16.0, 16.0)];
|
||||
}
|
||||
|
||||
- (NSURL *)URL {
|
||||
return url;
|
||||
}
|
||||
|
||||
- (void)updatePath {
|
||||
}
|
||||
|
||||
- (void)processPaths:(NSArray *)contents {
|
||||
NSMutableArray *newSubpathsDirs = [[NSMutableArray alloc] init];
|
||||
NSMutableArray *newSubpaths = [[NSMutableArray alloc] init];
|
||||
|
||||
for(NSString *s in contents) {
|
||||
if([s characterAtIndex:0] == '.') {
|
||||
continue;
|
||||
}
|
||||
|
||||
NSURL *u = [NSURL fileURLWithPath:s];
|
||||
NSString *displayName = [[NSFileManager defaultManager] displayNameAtPath:[u path]];
|
||||
|
||||
PathNode *newNode;
|
||||
|
||||
// DLog(@"Before: %@", u);
|
||||
u = resolveAliases(u);
|
||||
// DLog(@"After: %@", u);
|
||||
|
||||
BOOL isDir;
|
||||
|
||||
if([[s pathExtension] caseInsensitiveCompare:@"savedSearch"] == NSOrderedSame) {
|
||||
DLog(@"Smart folder!");
|
||||
newNode = [[SmartFolderNode alloc] initWithDataSource:dataSource url:u];
|
||||
isDir = NO;
|
||||
} else {
|
||||
[[NSFileManager defaultManager] fileExistsAtPath:[u path] isDirectory:&isDir];
|
||||
|
||||
if(!isDir && ![[AudioPlayer fileTypes] containsObject:[[u pathExtension] lowercaseString]]) {
|
||||
continue;
|
||||
}
|
||||
|
||||
if(isDir) {
|
||||
newNode = [[DirectoryNode alloc] initWithDataSource:dataSource url:u];
|
||||
} else if([[AudioPlayer containerTypes] containsObject:[[u pathExtension] lowercaseString]]) {
|
||||
newNode = [[ContainerNode alloc] initWithDataSource:dataSource url:u];
|
||||
} else {
|
||||
newNode = [[FileNode alloc] initWithDataSource:dataSource url:u];
|
||||
}
|
||||
}
|
||||
|
||||
[newNode setDisplay:displayName];
|
||||
|
||||
if(isDir)
|
||||
[newSubpathsDirs addObject:newNode];
|
||||
else
|
||||
[newSubpaths addObject:newNode];
|
||||
}
|
||||
|
||||
[newSubpathsDirs addObjectsFromArray:newSubpaths];
|
||||
[self setSubpaths:newSubpathsDirs];
|
||||
}
|
||||
|
||||
- (NSArray *)subpaths {
|
||||
if(subpaths == nil) {
|
||||
[self updatePath];
|
||||
}
|
||||
|
||||
return subpaths;
|
||||
}
|
||||
|
||||
- (void)setSubpaths:(NSArray *)s {
|
||||
subpaths = s;
|
||||
}
|
||||
|
||||
- (BOOL)isLeaf {
|
||||
return YES;
|
||||
}
|
||||
|
||||
- (void)setDisplay:(NSString *)s {
|
||||
display = s;
|
||||
}
|
||||
|
||||
- (NSString *)display {
|
||||
return display;
|
||||
}
|
||||
|
||||
- (NSImage *)icon {
|
||||
return icon;
|
||||
}
|
||||
|
||||
@end
|
|
@ -1,30 +0,0 @@
|
|||
//
|
||||
// PathWatcher.h
|
||||
// Cog
|
||||
//
|
||||
// Created by Vincent Spader on 2/17/08.
|
||||
// Copyright 2008 __MyCompanyName__. All rights reserved.
|
||||
//
|
||||
|
||||
#import <Cocoa/Cocoa.h>
|
||||
#include <CoreServices/CoreServices.h>
|
||||
|
||||
@interface PathWatcher : NSObject {
|
||||
FSEventStreamRef stream;
|
||||
FSEventStreamContext *context;
|
||||
|
||||
IBOutlet id delegate;
|
||||
}
|
||||
|
||||
- (void)setDelegate:(id)d;
|
||||
- (id)delegate;
|
||||
|
||||
- (void)setPath:(NSString *)path; // Set the path to watch
|
||||
- (void)cleanUp;
|
||||
@end
|
||||
|
||||
@protocol PathWatcherDelegate
|
||||
|
||||
- (void)pathDidChange:(NSString *)path;
|
||||
|
||||
@end
|
|
@ -1,82 +0,0 @@
|
|||
//
|
||||
// PathWatcher.m
|
||||
// Cog
|
||||
//
|
||||
// Created by Vincent Spader on 2/17/08.
|
||||
// Copyright 2008 __MyCompanyName__. All rights reserved.
|
||||
//
|
||||
|
||||
#import "PathWatcher.h"
|
||||
|
||||
static void myFSEventCallback(
|
||||
ConstFSEventStreamRef streamRef,
|
||||
void *clientCallBackInfo,
|
||||
size_t numEvents,
|
||||
void *eventPaths,
|
||||
const FSEventStreamEventFlags eventFlags[],
|
||||
const FSEventStreamEventId eventIds[]) {
|
||||
int i;
|
||||
char **paths = eventPaths;
|
||||
PathWatcher *pathWatcher = (__bridge PathWatcher *)clientCallBackInfo;
|
||||
|
||||
printf("Callback called\n");
|
||||
for(i = 0; i < numEvents; i++) {
|
||||
NSString *pathString = [[NSString alloc] initWithUTF8String:paths[i]];
|
||||
[[pathWatcher delegate] pathDidChange:pathString];
|
||||
}
|
||||
}
|
||||
|
||||
@implementation PathWatcher
|
||||
|
||||
- (void)cleanUp {
|
||||
if(stream) {
|
||||
FSEventStreamStop(stream);
|
||||
FSEventStreamInvalidate(stream);
|
||||
FSEventStreamRelease(stream);
|
||||
stream = NULL;
|
||||
}
|
||||
if(context) {
|
||||
free(context);
|
||||
context = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
- (void)setPath:(NSString *)path {
|
||||
[self cleanUp];
|
||||
|
||||
// Create FSEvent stream
|
||||
NSArray *pathsToWatch = @[path];
|
||||
|
||||
context = (FSEventStreamContext *)malloc(sizeof(FSEventStreamContext));
|
||||
context->version = 0;
|
||||
context->info = (__bridge void *)self;
|
||||
context->retain = NULL;
|
||||
context->release = NULL;
|
||||
|
||||
// Create the stream, passing in a callback
|
||||
stream = FSEventStreamCreate(NULL,
|
||||
&myFSEventCallback,
|
||||
context,
|
||||
(__bridge CFArrayRef)pathsToWatch,
|
||||
kFSEventStreamEventIdSinceNow, // Or a previous event ID
|
||||
1.0, // latency in seconds
|
||||
kFSEventStreamCreateFlagNone // Watch this and all its subdirectories
|
||||
);
|
||||
|
||||
FSEventStreamScheduleWithRunLoop(stream, CFRunLoopGetCurrent(), kCFRunLoopDefaultMode);
|
||||
|
||||
FSEventStreamStart(stream);
|
||||
}
|
||||
|
||||
- (void)setDelegate:(id)d {
|
||||
delegate = d;
|
||||
}
|
||||
- (id)delegate {
|
||||
return delegate;
|
||||
}
|
||||
|
||||
- (void)dealloc {
|
||||
[self cleanUp];
|
||||
}
|
||||
|
||||
@end
|
|
@ -1,17 +0,0 @@
|
|||
//
|
||||
// SmartFolderNode.h
|
||||
// Cog
|
||||
//
|
||||
// Created by Vincent Spader on 9/25/06.
|
||||
// Copyright 2006 __MyCompanyName__. All rights reserved.
|
||||
//
|
||||
|
||||
#import <Cocoa/Cocoa.h>
|
||||
|
||||
#import "PathNode.h"
|
||||
|
||||
@interface SmartFolderNode : PathNode {
|
||||
MDQueryRef _query;
|
||||
}
|
||||
|
||||
@end
|
|
@ -1,90 +0,0 @@
|
|||
//
|
||||
// SmartFolderNode.m
|
||||
// Cog
|
||||
//
|
||||
// Created by Vincent Spader on 9/25/06.
|
||||
// Copyright 2006 __MyCompanyName__. All rights reserved.
|
||||
//
|
||||
|
||||
#import "SmartFolderNode.h"
|
||||
#import "DirectoryNode.h"
|
||||
#import "FileNode.h"
|
||||
#import "FileTreeDataSource.h"
|
||||
|
||||
#import "Logging.h"
|
||||
|
||||
@implementation SmartFolderNode
|
||||
|
||||
- (BOOL)isLeaf {
|
||||
return NO;
|
||||
}
|
||||
|
||||
- (void)updatePath {
|
||||
NSDictionary *doc = [NSDictionary dictionaryWithContentsOfFile:[url path]];
|
||||
NSString *rawQuery = [doc objectForKey:@"RawQuery"];
|
||||
NSArray *searchPaths = [[doc objectForKey:@"SearchCriteria"] objectForKey:@"CurrentFolderPath"];
|
||||
|
||||
// Ugh, Carbon from now on...
|
||||
MDQueryRef query = MDQueryCreate(kCFAllocatorDefault, (CFStringRef)rawQuery, NULL, NULL);
|
||||
_query = query;
|
||||
|
||||
MDQuerySetSearchScope(query, (CFArrayRef)searchPaths, 0);
|
||||
|
||||
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(queryFinished:) name:(NSString *)kMDQueryDidFinishNotification object:(__bridge id)query];
|
||||
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(queryUpdate:) name:(NSString *)kMDQueryDidUpdateNotification object:(__bridge id)query];
|
||||
|
||||
DLog(@"Making query!");
|
||||
MDQueryExecute(query, kMDQueryWantsUpdates);
|
||||
|
||||
// Note: This is asynchronous!
|
||||
}
|
||||
|
||||
- (void)setSubpaths:(id)s {
|
||||
subpaths = s;
|
||||
}
|
||||
|
||||
- (unsigned int)countOfSubpaths {
|
||||
return (unsigned int)[[self subpaths] count];
|
||||
}
|
||||
|
||||
- (PathNode *)objectInSubpathsAtIndex:(unsigned int)index {
|
||||
return [[self subpaths] objectAtIndex:index];
|
||||
}
|
||||
|
||||
- (void)queryFinished:(NSNotification *)notification {
|
||||
DLog(@"Query finished!");
|
||||
MDQueryRef query = (__bridge MDQueryRef)[notification object];
|
||||
|
||||
NSMutableArray *results = [NSMutableArray array];
|
||||
|
||||
MDQueryDisableUpdates(query);
|
||||
int c = (int)MDQueryGetResultCount(query);
|
||||
|
||||
int i;
|
||||
for(i = 0; i < c; i++) {
|
||||
MDItemRef item = (MDItemRef)MDQueryGetResultAtIndex(query, i);
|
||||
|
||||
NSString *itemPath = (NSString *)CFBridgingRelease(MDItemCopyAttribute(item, kMDItemPath));
|
||||
|
||||
[results addObject:itemPath];
|
||||
}
|
||||
|
||||
MDQueryEnableUpdates(query);
|
||||
|
||||
DLog(@"Query update!");
|
||||
|
||||
[self processPaths:[results sortedArrayUsingSelector:@selector(caseInsensitiveCompare:)]];
|
||||
|
||||
[dataSource reloadPathNode:self];
|
||||
}
|
||||
|
||||
- (void)queryUpdate:(NSNotification *)notification {
|
||||
DLog(@"Query update!");
|
||||
[self queryFinished:notification];
|
||||
}
|
||||
|
||||
- (void)dealloc {
|
||||
CFRelease(_query);
|
||||
}
|
||||
|
||||
@end
|
|
@ -9,6 +9,7 @@
|
|||
/* Begin PBXBuildFile section */
|
||||
830E1DA1263B90CB005B01D2 /* rad2.h in Headers */ = {isa = PBXBuildFile; fileRef = 830E1D9F263B90CB005B01D2 /* rad2.h */; };
|
||||
830E1DA2263B90CB005B01D2 /* rad2.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 830E1DA0263B90CB005B01D2 /* rad2.cpp */; };
|
||||
83747B7C2862D4B70021245F /* Shared.xcconfig in Resources */ = {isa = PBXBuildFile; fileRef = 83747B7A2862D4B70021245F /* Shared.xcconfig */; };
|
||||
83D3C578201C66E3005564CB /* adplug.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 83D3C505201C66C1005564CB /* adplug.cpp */; };
|
||||
83D3C579201C66E3005564CB /* mtk.h in Headers */ = {isa = PBXBuildFile; fileRef = 83D3C506201C66C2005564CB /* mtk.h */; };
|
||||
83D3C57A201C66E3005564CB /* psi.h in Headers */ = {isa = PBXBuildFile; fileRef = 83D3C507201C66C2005564CB /* psi.h */; };
|
||||
|
@ -150,6 +151,7 @@
|
|||
/* Begin PBXFileReference section */
|
||||
830E1D9F263B90CB005B01D2 /* rad2.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = rad2.h; path = adplug/src/rad2.h; sourceTree = "<group>"; };
|
||||
830E1DA0263B90CB005B01D2 /* rad2.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = rad2.cpp; path = adplug/src/rad2.cpp; sourceTree = "<group>"; };
|
||||
83747B7A2862D4B70021245F /* Shared.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = Shared.xcconfig; sourceTree = "<group>"; };
|
||||
83D3C4D4201C654F005564CB /* libAdPlug.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = libAdPlug.framework; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||
83D3C4D8201C6550005564CB /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
|
||||
83D3C505201C66C1005564CB /* adplug.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = adplug.cpp; path = adplug/src/adplug.cpp; sourceTree = "<group>"; };
|
||||
|
@ -285,9 +287,19 @@
|
|||
/* End PBXFrameworksBuildPhase section */
|
||||
|
||||
/* Begin PBXGroup section */
|
||||
83747B792862D4B70021245F /* Xcode-config */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
83747B7A2862D4B70021245F /* Shared.xcconfig */,
|
||||
);
|
||||
name = "Xcode-config";
|
||||
path = "../../Xcode-config";
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
83D3C4CA201C654F005564CB = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
83747B792862D4B70021245F /* Xcode-config */,
|
||||
83D3C4D6201C654F005564CB /* AdPlug */,
|
||||
83D3C609201C6788005564CB /* Frameworks */,
|
||||
83D3C4D5201C654F005564CB /* Products */,
|
||||
|
@ -550,8 +562,7 @@
|
|||
ORGANIZATIONNAME = "Christopher Snowhill";
|
||||
TargetAttributes = {
|
||||
83D3C4D3201C654F005564CB = {
|
||||
DevelopmentTeam = "";
|
||||
ProvisioningStyle = Automatic;
|
||||
ProvisioningStyle = Manual;
|
||||
};
|
||||
};
|
||||
};
|
||||
|
@ -594,6 +605,7 @@
|
|||
isa = PBXResourcesBuildPhase;
|
||||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
83747B7C2862D4B70021245F /* Shared.xcconfig in Resources */,
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
};
|
||||
|
@ -678,6 +690,7 @@
|
|||
/* Begin XCBuildConfiguration section */
|
||||
83D3C4DA201C6550005564CB /* Debug */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
baseConfigurationReference = 83747B7A2862D4B70021245F /* Shared.xcconfig */;
|
||||
buildSettings = {
|
||||
ALWAYS_SEARCH_USER_PATHS = NO;
|
||||
CLANG_ANALYZER_NONNULL = YES;
|
||||
|
@ -708,7 +721,6 @@
|
|||
CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
|
||||
CLANG_WARN_UNREACHABLE_CODE = YES;
|
||||
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
|
||||
CODE_SIGN_IDENTITY = "Mac Developer";
|
||||
COPY_PHASE_STRIP = NO;
|
||||
CURRENT_PROJECT_VERSION = 1;
|
||||
DEAD_CODE_STRIPPING = YES;
|
||||
|
@ -730,7 +742,7 @@
|
|||
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
|
||||
GCC_WARN_UNUSED_FUNCTION = YES;
|
||||
GCC_WARN_UNUSED_VARIABLE = YES;
|
||||
MACOSX_DEPLOYMENT_TARGET = 10.12;
|
||||
MACOSX_DEPLOYMENT_TARGET = 10.13;
|
||||
MTL_ENABLE_DEBUG_INFO = YES;
|
||||
ONLY_ACTIVE_ARCH = YES;
|
||||
SDKROOT = macosx;
|
||||
|
@ -741,6 +753,7 @@
|
|||
};
|
||||
83D3C4DB201C6550005564CB /* Release */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
baseConfigurationReference = 83747B7A2862D4B70021245F /* Shared.xcconfig */;
|
||||
buildSettings = {
|
||||
ALWAYS_SEARCH_USER_PATHS = NO;
|
||||
CLANG_ANALYZER_NONNULL = YES;
|
||||
|
@ -771,7 +784,6 @@
|
|||
CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
|
||||
CLANG_WARN_UNREACHABLE_CODE = YES;
|
||||
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
|
||||
CODE_SIGN_IDENTITY = "Mac Developer";
|
||||
COPY_PHASE_STRIP = NO;
|
||||
CURRENT_PROJECT_VERSION = 1;
|
||||
DEAD_CODE_STRIPPING = YES;
|
||||
|
@ -787,7 +799,7 @@
|
|||
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
|
||||
GCC_WARN_UNUSED_FUNCTION = YES;
|
||||
GCC_WARN_UNUSED_VARIABLE = YES;
|
||||
MACOSX_DEPLOYMENT_TARGET = 10.12;
|
||||
MACOSX_DEPLOYMENT_TARGET = 10.13;
|
||||
MTL_ENABLE_DEBUG_INFO = NO;
|
||||
SDKROOT = macosx;
|
||||
VERSIONING_SYSTEM = "apple-generic";
|
||||
|
@ -798,11 +810,8 @@
|
|||
83D3C4DD201C6550005564CB /* Debug */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
buildSettings = {
|
||||
CODE_SIGN_IDENTITY = "";
|
||||
CODE_SIGN_STYLE = Automatic;
|
||||
COMBINE_HIDPI_IMAGES = YES;
|
||||
DEAD_CODE_STRIPPING = YES;
|
||||
DEVELOPMENT_TEAM = "";
|
||||
DYLIB_COMPATIBILITY_VERSION = 1;
|
||||
DYLIB_CURRENT_VERSION = 1;
|
||||
FRAMEWORK_VERSION = A;
|
||||
|
@ -820,7 +829,6 @@
|
|||
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/Frameworks";
|
||||
PRODUCT_BUNDLE_IDENTIFIER = net.kode54.libAdPlug;
|
||||
PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)";
|
||||
PROVISIONING_PROFILE_SPECIFIER = "";
|
||||
SKIP_INSTALL = YES;
|
||||
};
|
||||
name = Debug;
|
||||
|
@ -828,11 +836,8 @@
|
|||
83D3C4DE201C6550005564CB /* Release */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
buildSettings = {
|
||||
CODE_SIGN_IDENTITY = "";
|
||||
CODE_SIGN_STYLE = Automatic;
|
||||
COMBINE_HIDPI_IMAGES = YES;
|
||||
DEAD_CODE_STRIPPING = YES;
|
||||
DEVELOPMENT_TEAM = "";
|
||||
DYLIB_COMPATIBILITY_VERSION = 1;
|
||||
DYLIB_CURRENT_VERSION = 1;
|
||||
FRAMEWORK_VERSION = A;
|
||||
|
@ -846,7 +851,6 @@
|
|||
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/Frameworks";
|
||||
PRODUCT_BUNDLE_IDENTIFIER = net.kode54.libAdPlug;
|
||||
PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)";
|
||||
PROVISIONING_PROFILE_SPECIFIER = "";
|
||||
SKIP_INSTALL = YES;
|
||||
};
|
||||
name = Release;
|
||||
|
|
|
@ -720,7 +720,7 @@
|
|||
GCC_WARN_UNINITIALIZED_AUTOS = YES;
|
||||
GCC_WARN_UNUSED_FUNCTION = YES;
|
||||
GCC_WARN_UNUSED_VARIABLE = YES;
|
||||
MACOSX_DEPLOYMENT_TARGET = 10.7;
|
||||
MACOSX_DEPLOYMENT_TARGET = 10.13;
|
||||
OBJROOT = ../../build;
|
||||
ONLY_ACTIVE_ARCH = YES;
|
||||
PREBINDING = NO;
|
||||
|
@ -762,7 +762,7 @@
|
|||
GCC_WARN_UNINITIALIZED_AUTOS = YES;
|
||||
GCC_WARN_UNUSED_FUNCTION = YES;
|
||||
GCC_WARN_UNUSED_VARIABLE = YES;
|
||||
MACOSX_DEPLOYMENT_TARGET = 10.7;
|
||||
MACOSX_DEPLOYMENT_TARGET = 10.13;
|
||||
OBJROOT = ../../build;
|
||||
PREBINDING = NO;
|
||||
SDKROOT = macosx;
|
||||
|
|
|
@ -129,6 +129,7 @@
|
|||
8359008D17FEF40E0060F3ED /* unrar_misc.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8359000117FEF40E0060F3ED /* unrar_misc.cpp */; };
|
||||
8359009F17FF073E0060F3ED /* 7zStream.c in Sources */ = {isa = PBXBuildFile; fileRef = 8359009E17FF073E0060F3ED /* 7zStream.c */; };
|
||||
8359FF4A17FEF39F0060F3ED /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 8359FF4817FEF39F0060F3ED /* InfoPlist.strings */; };
|
||||
83747BE32862D78F0021245F /* Shared.xcconfig in Resources */ = {isa = PBXBuildFile; fileRef = 83747BE12862D78E0021245F /* Shared.xcconfig */; };
|
||||
83756F621D23A95B003A7676 /* CoreServices.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 83756F611D23A95B003A7676 /* CoreServices.framework */; };
|
||||
83C2109719CD81F50093C461 /* headers.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 83C2108E19CD81F50093C461 /* headers.cpp */; };
|
||||
83C2109819CD81F50093C461 /* headers5.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 83C2108F19CD81F50093C461 /* headers5.hpp */; };
|
||||
|
@ -270,6 +271,7 @@
|
|||
8359FFFB17FEF40E0060F3ED /* unpack.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = unpack.cpp; sourceTree = "<group>"; };
|
||||
8359FFFC17FEF40E0060F3ED /* unpack.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = unpack.hpp; sourceTree = "<group>"; };
|
||||
8359FFFF17FEF40E0060F3ED /* unrar.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = unrar.cpp; sourceTree = "<group>"; };
|
||||
83747BE12862D78E0021245F /* Shared.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = Shared.xcconfig; sourceTree = "<group>"; };
|
||||
83756F611D23A95B003A7676 /* CoreServices.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreServices.framework; path = System/Library/Frameworks/CoreServices.framework; sourceTree = SDKROOT; };
|
||||
83C2108E19CD81F50093C461 /* headers.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = headers.cpp; sourceTree = "<group>"; };
|
||||
83C2108F19CD81F50093C461 /* headers5.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = headers5.hpp; sourceTree = "<group>"; };
|
||||
|
@ -301,6 +303,7 @@
|
|||
8359FF3217FEF39F0060F3ED = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
83747BE02862D78E0021245F /* Xcode-config */,
|
||||
8359FF4517FEF39F0060F3ED /* File_Extractor */,
|
||||
8359FF3E17FEF39F0060F3ED /* Frameworks */,
|
||||
8359FF3D17FEF39F0060F3ED /* Products */,
|
||||
|
@ -513,6 +516,15 @@
|
|||
path = unrar;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
83747BE02862D78E0021245F /* Xcode-config */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
83747BE12862D78E0021245F /* Shared.xcconfig */,
|
||||
);
|
||||
name = "Xcode-config";
|
||||
path = "../../Xcode-config";
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
/* End PBXGroup section */
|
||||
|
||||
/* Begin PBXHeadersBuildPhase section */
|
||||
|
@ -624,7 +636,7 @@
|
|||
TargetAttributes = {
|
||||
8359FF3B17FEF39F0060F3ED = {
|
||||
DevelopmentTeam = "";
|
||||
ProvisioningStyle = Automatic;
|
||||
ProvisioningStyle = Manual;
|
||||
};
|
||||
};
|
||||
};
|
||||
|
@ -654,6 +666,7 @@
|
|||
files = (
|
||||
8359004817FEF40E0060F3ED /* readme.txt in Resources */,
|
||||
8359FF4A17FEF39F0060F3ED /* InfoPlist.strings in Resources */,
|
||||
83747BE32862D78F0021245F /* Shared.xcconfig in Resources */,
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
};
|
||||
|
@ -746,6 +759,7 @@
|
|||
/* Begin XCBuildConfiguration section */
|
||||
8359FF6217FEF39F0060F3ED /* Debug */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
baseConfigurationReference = 83747BE12862D78E0021245F /* Shared.xcconfig */;
|
||||
buildSettings = {
|
||||
ALWAYS_SEARCH_USER_PATHS = NO;
|
||||
CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES;
|
||||
|
@ -793,7 +807,7 @@
|
|||
GCC_WARN_UNINITIALIZED_AUTOS = YES;
|
||||
GCC_WARN_UNUSED_FUNCTION = YES;
|
||||
GCC_WARN_UNUSED_VARIABLE = YES;
|
||||
MACOSX_DEPLOYMENT_TARGET = 10.12;
|
||||
MACOSX_DEPLOYMENT_TARGET = 10.13;
|
||||
ONLY_ACTIVE_ARCH = YES;
|
||||
SDKROOT = macosx;
|
||||
};
|
||||
|
@ -801,6 +815,7 @@
|
|||
};
|
||||
8359FF6317FEF39F0060F3ED /* Release */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
baseConfigurationReference = 83747BE12862D78E0021245F /* Shared.xcconfig */;
|
||||
buildSettings = {
|
||||
ALWAYS_SEARCH_USER_PATHS = NO;
|
||||
CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES;
|
||||
|
@ -841,7 +856,7 @@
|
|||
GCC_WARN_UNINITIALIZED_AUTOS = YES;
|
||||
GCC_WARN_UNUSED_FUNCTION = YES;
|
||||
GCC_WARN_UNUSED_VARIABLE = YES;
|
||||
MACOSX_DEPLOYMENT_TARGET = 10.12;
|
||||
MACOSX_DEPLOYMENT_TARGET = 10.13;
|
||||
SDKROOT = macosx;
|
||||
};
|
||||
name = Release;
|
||||
|
@ -849,11 +864,8 @@
|
|||
8359FF6517FEF39F0060F3ED /* Debug */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
buildSettings = {
|
||||
CODE_SIGN_IDENTITY = "";
|
||||
CODE_SIGN_STYLE = Automatic;
|
||||
COMBINE_HIDPI_IMAGES = YES;
|
||||
DEAD_CODE_STRIPPING = YES;
|
||||
DEVELOPMENT_TEAM = "";
|
||||
DYLIB_COMPATIBILITY_VERSION = 1;
|
||||
DYLIB_CURRENT_VERSION = 1;
|
||||
FRAMEWORK_VERSION = A;
|
||||
|
@ -867,7 +879,6 @@
|
|||
INSTALL_PATH = "@rpath";
|
||||
PRODUCT_BUNDLE_IDENTIFIER = net.kode54.fileextractor;
|
||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||
PROVISIONING_PROFILE_SPECIFIER = "";
|
||||
SDKROOT = macosx;
|
||||
SKIP_INSTALL = YES;
|
||||
WRAPPER_EXTENSION = framework;
|
||||
|
@ -877,11 +888,8 @@
|
|||
8359FF6617FEF39F0060F3ED /* Release */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
buildSettings = {
|
||||
CODE_SIGN_IDENTITY = "";
|
||||
CODE_SIGN_STYLE = Automatic;
|
||||
COMBINE_HIDPI_IMAGES = YES;
|
||||
DEAD_CODE_STRIPPING = YES;
|
||||
DEVELOPMENT_TEAM = "";
|
||||
DYLIB_COMPATIBILITY_VERSION = 1;
|
||||
DYLIB_CURRENT_VERSION = 1;
|
||||
FRAMEWORK_VERSION = A;
|
||||
|
@ -895,7 +903,6 @@
|
|||
INSTALL_PATH = "@rpath";
|
||||
PRODUCT_BUNDLE_IDENTIFIER = net.kode54.fileextractor;
|
||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||
PROVISIONING_PROFILE_SPECIFIER = "";
|
||||
SDKROOT = macosx;
|
||||
SKIP_INSTALL = YES;
|
||||
WRAPPER_EXTENSION = framework;
|
||||
|
|
|
@ -112,6 +112,7 @@
|
|||
8370B7AE17F615FE001A4D7A /* Spc_Filter.h in Headers */ = {isa = PBXBuildFile; fileRef = 8370B70B17F615FE001A4D7A /* Spc_Filter.h */; };
|
||||
8370B7AF17F615FE001A4D7A /* Spc_Sfm.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8370B70C17F615FE001A4D7A /* Spc_Sfm.cpp */; };
|
||||
8370B7B017F615FE001A4D7A /* Spc_Sfm.h in Headers */ = {isa = PBXBuildFile; fileRef = 8370B70D17F615FE001A4D7A /* Spc_Sfm.h */; };
|
||||
83747B812862D4DB0021245F /* Shared.xcconfig in Resources */ = {isa = PBXBuildFile; fileRef = 83747B7F2862D4DB0021245F /* Shared.xcconfig */; };
|
||||
83FC5D5E181B47FB00B917E5 /* dsp.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 83FC5D3B181B47FB00B917E5 /* dsp.cpp */; };
|
||||
83FC5D5F181B47FB00B917E5 /* dsp.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 83FC5D3C181B47FB00B917E5 /* dsp.hpp */; };
|
||||
83FC5D78181B47FB00B917E5 /* smp.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 83FC5D57181B47FB00B917E5 /* smp.cpp */; };
|
||||
|
@ -236,6 +237,7 @@
|
|||
8370B70B17F615FE001A4D7A /* Spc_Filter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = Spc_Filter.h; path = gme/Spc_Filter.h; sourceTree = "<group>"; };
|
||||
8370B70C17F615FE001A4D7A /* Spc_Sfm.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = Spc_Sfm.cpp; path = gme/Spc_Sfm.cpp; sourceTree = "<group>"; };
|
||||
8370B70D17F615FE001A4D7A /* Spc_Sfm.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = Spc_Sfm.h; path = gme/Spc_Sfm.h; sourceTree = "<group>"; };
|
||||
83747B7F2862D4DB0021245F /* Shared.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = Shared.xcconfig; sourceTree = "<group>"; };
|
||||
83FC5D3B181B47FB00B917E5 /* dsp.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = dsp.cpp; sourceTree = "<group>"; };
|
||||
83FC5D3C181B47FB00B917E5 /* dsp.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = dsp.hpp; sourceTree = "<group>"; };
|
||||
83FC5D57181B47FB00B917E5 /* smp.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = smp.cpp; sourceTree = "<group>"; };
|
||||
|
@ -279,6 +281,7 @@
|
|||
0867D691FE84028FC02AAC07 /* GME */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
83747B7E2862D4DB0021245F /* Xcode-config */,
|
||||
17C8F1850CBED267008D969D /* Headers */,
|
||||
17C8F1860CBED26C008D969D /* Source */,
|
||||
089C1665FE841158C02AAC07 /* Resources */,
|
||||
|
@ -460,6 +463,15 @@
|
|||
path = ext;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
83747B7E2862D4DB0021245F /* Xcode-config */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
83747B7F2862D4DB0021245F /* Shared.xcconfig */,
|
||||
);
|
||||
name = "Xcode-config";
|
||||
path = "../../Xcode-config";
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
83FC5D35181B47FB00B917E5 /* higan */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
|
@ -619,7 +631,7 @@
|
|||
TargetAttributes = {
|
||||
8DC2EF4F0486A6940098B216 = {
|
||||
DevelopmentTeam = "";
|
||||
ProvisioningStyle = Automatic;
|
||||
ProvisioningStyle = Manual;
|
||||
};
|
||||
};
|
||||
};
|
||||
|
@ -649,6 +661,7 @@
|
|||
files = (
|
||||
83489CE22783CAC100BDCEA2 /* emu2413_NESpatches.txt in Resources */,
|
||||
8DC2EF530486A6940098B216 /* InfoPlist.strings in Resources */,
|
||||
83747B812862D4DB0021245F /* Shared.xcconfig in Resources */,
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
};
|
||||
|
@ -730,12 +743,9 @@
|
|||
buildSettings = {
|
||||
CLANG_CXX_LANGUAGE_STANDARD = "c++0x";
|
||||
CLANG_CXX_LIBRARY = "libc++";
|
||||
CODE_SIGN_IDENTITY = "";
|
||||
CODE_SIGN_STYLE = Automatic;
|
||||
COMBINE_HIDPI_IMAGES = YES;
|
||||
COPY_PHASE_STRIP = NO;
|
||||
DEAD_CODE_STRIPPING = YES;
|
||||
DEVELOPMENT_TEAM = "";
|
||||
DYLIB_COMPATIBILITY_VERSION = 1;
|
||||
DYLIB_CURRENT_VERSION = 1;
|
||||
FRAMEWORK_VERSION = A;
|
||||
|
@ -754,7 +764,6 @@
|
|||
PRECOMPS_INCLUDE_HEADERS_FROM_BUILT_PRODUCTS_DIR = NO;
|
||||
PRODUCT_BUNDLE_IDENTIFIER = org.cogx.lib.gme;
|
||||
PRODUCT_NAME = GME;
|
||||
PROVISIONING_PROFILE_SPECIFIER = "";
|
||||
SDKROOT = macosx;
|
||||
SHARED_PRECOMPS_DIR = "";
|
||||
SKIP_INSTALL = YES;
|
||||
|
@ -769,11 +778,8 @@
|
|||
buildSettings = {
|
||||
CLANG_CXX_LANGUAGE_STANDARD = "c++0x";
|
||||
CLANG_CXX_LIBRARY = "libc++";
|
||||
CODE_SIGN_IDENTITY = "";
|
||||
CODE_SIGN_STYLE = Automatic;
|
||||
COMBINE_HIDPI_IMAGES = YES;
|
||||
DEAD_CODE_STRIPPING = YES;
|
||||
DEVELOPMENT_TEAM = "";
|
||||
DYLIB_COMPATIBILITY_VERSION = 1;
|
||||
DYLIB_CURRENT_VERSION = 1;
|
||||
FRAMEWORK_VERSION = A;
|
||||
|
@ -790,7 +796,6 @@
|
|||
PRECOMPS_INCLUDE_HEADERS_FROM_BUILT_PRODUCTS_DIR = NO;
|
||||
PRODUCT_BUNDLE_IDENTIFIER = org.cogx.lib.gme;
|
||||
PRODUCT_NAME = GME;
|
||||
PROVISIONING_PROFILE_SPECIFIER = "";
|
||||
SDKROOT = macosx;
|
||||
SHARED_PRECOMPS_DIR = "";
|
||||
SKIP_INSTALL = YES;
|
||||
|
@ -801,6 +806,7 @@
|
|||
};
|
||||
1DEB91B208733DA50010E9CD /* Debug */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
baseConfigurationReference = 83747B7F2862D4DB0021245F /* Shared.xcconfig */;
|
||||
buildSettings = {
|
||||
ALWAYS_SEARCH_USER_PATHS = NO;
|
||||
CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES;
|
||||
|
@ -836,7 +842,7 @@
|
|||
GCC_WARN_UNINITIALIZED_AUTOS = YES;
|
||||
GCC_WARN_UNUSED_FUNCTION = YES;
|
||||
GCC_WARN_UNUSED_VARIABLE = YES;
|
||||
MACOSX_DEPLOYMENT_TARGET = 10.12;
|
||||
MACOSX_DEPLOYMENT_TARGET = 10.13;
|
||||
OBJROOT = ../../build;
|
||||
ONLY_ACTIVE_ARCH = YES;
|
||||
SDKROOT = macosx;
|
||||
|
@ -846,6 +852,7 @@
|
|||
};
|
||||
1DEB91B308733DA50010E9CD /* Release */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
baseConfigurationReference = 83747B7F2862D4DB0021245F /* Shared.xcconfig */;
|
||||
buildSettings = {
|
||||
ALWAYS_SEARCH_USER_PATHS = NO;
|
||||
CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES;
|
||||
|
@ -879,7 +886,7 @@
|
|||
GCC_WARN_UNINITIALIZED_AUTOS = YES;
|
||||
GCC_WARN_UNUSED_FUNCTION = YES;
|
||||
GCC_WARN_UNUSED_VARIABLE = YES;
|
||||
MACOSX_DEPLOYMENT_TARGET = 10.12;
|
||||
MACOSX_DEPLOYMENT_TARGET = 10.13;
|
||||
OBJROOT = ../../build;
|
||||
SDKROOT = macosx;
|
||||
SYMROOT = ../../build;
|
||||
|
|
|
@ -34,6 +34,7 @@
|
|||
834379A017F97CF600584396 /* Globals.h in Headers */ = {isa = PBXBuildFile; fileRef = 8343798617F97CF600584396 /* Globals.h */; settings = {ATTRIBUTES = (Private, ); }; };
|
||||
834379A117F97CF600584396 /* Sound.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8343798717F97CF600584396 /* Sound.cpp */; };
|
||||
834379A217F97CF600584396 /* Sound.h in Headers */ = {isa = PBXBuildFile; fileRef = 8343798817F97CF600584396 /* Sound.h */; settings = {ATTRIBUTES = (Private, ); }; };
|
||||
83747B902862D5040021245F /* Shared.xcconfig in Resources */ = {isa = PBXBuildFile; fileRef = 83747B8E2862D5040021245F /* Shared.xcconfig */; };
|
||||
/* End PBXBuildFile section */
|
||||
|
||||
/* Begin PBXFileReference section */
|
||||
|
@ -67,6 +68,7 @@
|
|||
8343798617F97CF600584396 /* Globals.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Globals.h; sourceTree = "<group>"; };
|
||||
8343798717F97CF600584396 /* Sound.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Sound.cpp; sourceTree = "<group>"; };
|
||||
8343798817F97CF600584396 /* Sound.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Sound.h; sourceTree = "<group>"; };
|
||||
83747B8E2862D5040021245F /* Shared.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = Shared.xcconfig; sourceTree = "<group>"; };
|
||||
/* End PBXFileReference section */
|
||||
|
||||
/* Begin PBXFrameworksBuildPhase section */
|
||||
|
@ -83,6 +85,7 @@
|
|||
8343792B17F97BDB00584396 = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
83747B8D2862D5040021245F /* Xcode-config */,
|
||||
8343793E17F97BDB00584396 /* HighlyAdvanced */,
|
||||
8343793717F97BDB00584396 /* Frameworks */,
|
||||
8343793617F97BDB00584396 /* Products */,
|
||||
|
@ -182,6 +185,15 @@
|
|||
path = vbam/gba;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
83747B8D2862D5040021245F /* Xcode-config */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
83747B8E2862D5040021245F /* Shared.xcconfig */,
|
||||
);
|
||||
name = "Xcode-config";
|
||||
path = "../../Xcode-config";
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
/* End PBXGroup section */
|
||||
|
||||
/* Begin PBXHeadersBuildPhase section */
|
||||
|
@ -240,7 +252,7 @@
|
|||
TargetAttributes = {
|
||||
8343793417F97BDB00584396 = {
|
||||
DevelopmentTeam = "";
|
||||
ProvisioningStyle = Automatic;
|
||||
ProvisioningStyle = Manual;
|
||||
};
|
||||
};
|
||||
};
|
||||
|
@ -269,6 +281,7 @@
|
|||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
8343794317F97BDB00584396 /* InfoPlist.strings in Resources */,
|
||||
83747B902862D5040021245F /* Shared.xcconfig in Resources */,
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
};
|
||||
|
@ -309,6 +322,7 @@
|
|||
/* Begin XCBuildConfiguration section */
|
||||
8343795B17F97BDB00584396 /* Debug */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
baseConfigurationReference = 83747B8E2862D5040021245F /* Shared.xcconfig */;
|
||||
buildSettings = {
|
||||
ALWAYS_SEARCH_USER_PATHS = NO;
|
||||
CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES;
|
||||
|
@ -355,7 +369,7 @@
|
|||
GCC_WARN_UNINITIALIZED_AUTOS = YES;
|
||||
GCC_WARN_UNUSED_FUNCTION = YES;
|
||||
GCC_WARN_UNUSED_VARIABLE = YES;
|
||||
MACOSX_DEPLOYMENT_TARGET = 10.12;
|
||||
MACOSX_DEPLOYMENT_TARGET = 10.13;
|
||||
ONLY_ACTIVE_ARCH = YES;
|
||||
SDKROOT = macosx;
|
||||
};
|
||||
|
@ -363,6 +377,7 @@
|
|||
};
|
||||
8343795C17F97BDB00584396 /* Release */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
baseConfigurationReference = 83747B8E2862D5040021245F /* Shared.xcconfig */;
|
||||
buildSettings = {
|
||||
ALWAYS_SEARCH_USER_PATHS = NO;
|
||||
CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES;
|
||||
|
@ -402,7 +417,7 @@
|
|||
GCC_WARN_UNINITIALIZED_AUTOS = YES;
|
||||
GCC_WARN_UNUSED_FUNCTION = YES;
|
||||
GCC_WARN_UNUSED_VARIABLE = YES;
|
||||
MACOSX_DEPLOYMENT_TARGET = 10.12;
|
||||
MACOSX_DEPLOYMENT_TARGET = 10.13;
|
||||
SDKROOT = macosx;
|
||||
};
|
||||
name = Release;
|
||||
|
@ -410,11 +425,8 @@
|
|||
8343795E17F97BDB00584396 /* Debug */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
buildSettings = {
|
||||
CODE_SIGN_IDENTITY = "";
|
||||
CODE_SIGN_STYLE = Automatic;
|
||||
COMBINE_HIDPI_IMAGES = YES;
|
||||
DEAD_CODE_STRIPPING = YES;
|
||||
DEVELOPMENT_TEAM = "";
|
||||
DYLIB_COMPATIBILITY_VERSION = 1;
|
||||
DYLIB_CURRENT_VERSION = 1;
|
||||
FRAMEWORK_VERSION = A;
|
||||
|
@ -427,7 +439,6 @@
|
|||
INSTALL_PATH = "@loader_path/../Frameworks";
|
||||
PRODUCT_BUNDLE_IDENTIFIER = net.kode54.highlyadvanced;
|
||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||
PROVISIONING_PROFILE_SPECIFIER = "";
|
||||
SDKROOT = macosx;
|
||||
SKIP_INSTALL = YES;
|
||||
WRAPPER_EXTENSION = framework;
|
||||
|
@ -437,11 +448,8 @@
|
|||
8343795F17F97BDB00584396 /* Release */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
buildSettings = {
|
||||
CODE_SIGN_IDENTITY = "";
|
||||
CODE_SIGN_STYLE = Automatic;
|
||||
COMBINE_HIDPI_IMAGES = YES;
|
||||
DEAD_CODE_STRIPPING = YES;
|
||||
DEVELOPMENT_TEAM = "";
|
||||
DYLIB_COMPATIBILITY_VERSION = 1;
|
||||
DYLIB_CURRENT_VERSION = 1;
|
||||
FRAMEWORK_VERSION = A;
|
||||
|
@ -451,7 +459,6 @@
|
|||
INSTALL_PATH = "@loader_path/../Frameworks";
|
||||
PRODUCT_BUNDLE_IDENTIFIER = net.kode54.highlyadvanced;
|
||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||
PROVISIONING_PROFILE_SPECIFIER = "";
|
||||
SDKROOT = macosx;
|
||||
SKIP_INSTALL = YES;
|
||||
WRAPPER_EXTENSION = framework;
|
||||
|
|
|
@ -25,6 +25,7 @@
|
|||
8360EF6A17F92DB0005208A4 /* spucore.h in Headers */ = {isa = PBXBuildFile; fileRef = 8360EF5717F92DB0005208A4 /* spucore.h */; };
|
||||
8360EF6B17F92DB0005208A4 /* vfs.c in Sources */ = {isa = PBXBuildFile; fileRef = 8360EF5817F92DB0005208A4 /* vfs.c */; };
|
||||
8360EF6C17F92DB0005208A4 /* vfs.h in Headers */ = {isa = PBXBuildFile; fileRef = 8360EF5917F92DB0005208A4 /* vfs.h */; };
|
||||
83747BA42862D5390021245F /* Shared.xcconfig in Resources */ = {isa = PBXBuildFile; fileRef = 83747BA22862D5390021245F /* Shared.xcconfig */; };
|
||||
/* End PBXBuildFile section */
|
||||
|
||||
/* Begin PBXFileReference section */
|
||||
|
@ -49,6 +50,7 @@
|
|||
8360EF5717F92DB0005208A4 /* spucore.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = spucore.h; path = Core/spucore.h; sourceTree = "<group>"; };
|
||||
8360EF5817F92DB0005208A4 /* vfs.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = vfs.c; path = Core/vfs.c; sourceTree = "<group>"; };
|
||||
8360EF5917F92DB0005208A4 /* vfs.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = vfs.h; path = Core/vfs.h; sourceTree = "<group>"; };
|
||||
83747BA22862D5390021245F /* Shared.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = Shared.xcconfig; sourceTree = "<group>"; };
|
||||
/* End PBXFileReference section */
|
||||
|
||||
/* Begin PBXFrameworksBuildPhase section */
|
||||
|
@ -65,6 +67,7 @@
|
|||
8360EF0617F92C91005208A4 = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
83747BA12862D5390021245F /* Xcode-config */,
|
||||
8360EF1917F92C91005208A4 /* HighlyExperimental */,
|
||||
8360EF1217F92C91005208A4 /* Frameworks */,
|
||||
8360EF1117F92C91005208A4 /* Products */,
|
||||
|
@ -128,6 +131,15 @@
|
|||
name = "Supporting Files";
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
83747BA12862D5390021245F /* Xcode-config */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
83747BA22862D5390021245F /* Shared.xcconfig */,
|
||||
);
|
||||
name = "Xcode-config";
|
||||
path = "../../Xcode-config";
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
/* End PBXGroup section */
|
||||
|
||||
/* Begin PBXHeadersBuildPhase section */
|
||||
|
@ -179,7 +191,7 @@
|
|||
TargetAttributes = {
|
||||
8360EF0F17F92C91005208A4 = {
|
||||
DevelopmentTeam = "";
|
||||
ProvisioningStyle = Automatic;
|
||||
ProvisioningStyle = Manual;
|
||||
};
|
||||
};
|
||||
};
|
||||
|
@ -208,6 +220,7 @@
|
|||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
8360EF1E17F92C91005208A4 /* InfoPlist.strings in Resources */,
|
||||
83747BA42862D5390021245F /* Shared.xcconfig in Resources */,
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
};
|
||||
|
@ -246,6 +259,7 @@
|
|||
/* Begin XCBuildConfiguration section */
|
||||
8360EF3617F92C91005208A4 /* Debug */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
baseConfigurationReference = 83747BA22862D5390021245F /* Shared.xcconfig */;
|
||||
buildSettings = {
|
||||
ALWAYS_SEARCH_USER_PATHS = NO;
|
||||
CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES;
|
||||
|
@ -293,13 +307,14 @@
|
|||
GCC_WARN_UNINITIALIZED_AUTOS = YES;
|
||||
GCC_WARN_UNUSED_FUNCTION = YES;
|
||||
GCC_WARN_UNUSED_VARIABLE = YES;
|
||||
MACOSX_DEPLOYMENT_TARGET = 10.12;
|
||||
MACOSX_DEPLOYMENT_TARGET = 10.13;
|
||||
ONLY_ACTIVE_ARCH = YES;
|
||||
};
|
||||
name = Debug;
|
||||
};
|
||||
8360EF3717F92C91005208A4 /* Release */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
baseConfigurationReference = 83747BA22862D5390021245F /* Shared.xcconfig */;
|
||||
buildSettings = {
|
||||
ALWAYS_SEARCH_USER_PATHS = NO;
|
||||
CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES;
|
||||
|
@ -340,18 +355,15 @@
|
|||
GCC_WARN_UNINITIALIZED_AUTOS = YES;
|
||||
GCC_WARN_UNUSED_FUNCTION = YES;
|
||||
GCC_WARN_UNUSED_VARIABLE = YES;
|
||||
MACOSX_DEPLOYMENT_TARGET = 10.12;
|
||||
MACOSX_DEPLOYMENT_TARGET = 10.13;
|
||||
};
|
||||
name = Release;
|
||||
};
|
||||
8360EF3917F92C91005208A4 /* Debug */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
buildSettings = {
|
||||
CODE_SIGN_IDENTITY = "";
|
||||
CODE_SIGN_STYLE = Automatic;
|
||||
COMBINE_HIDPI_IMAGES = YES;
|
||||
DEAD_CODE_STRIPPING = YES;
|
||||
DEVELOPMENT_TEAM = "";
|
||||
DYLIB_COMPATIBILITY_VERSION = 1;
|
||||
DYLIB_CURRENT_VERSION = 1;
|
||||
FRAMEWORK_VERSION = A;
|
||||
|
@ -367,7 +379,6 @@
|
|||
INSTALL_PATH = "@loader_path/../Frameworks";
|
||||
PRODUCT_BUNDLE_IDENTIFIER = net.kode54.highlyexperimental;
|
||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||
PROVISIONING_PROFILE_SPECIFIER = "";
|
||||
SKIP_INSTALL = YES;
|
||||
WRAPPER_EXTENSION = framework;
|
||||
};
|
||||
|
@ -376,11 +387,8 @@
|
|||
8360EF3A17F92C91005208A4 /* Release */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
buildSettings = {
|
||||
CODE_SIGN_IDENTITY = "";
|
||||
CODE_SIGN_STYLE = Automatic;
|
||||
COMBINE_HIDPI_IMAGES = YES;
|
||||
DEAD_CODE_STRIPPING = YES;
|
||||
DEVELOPMENT_TEAM = "";
|
||||
DYLIB_COMPATIBILITY_VERSION = 1;
|
||||
DYLIB_CURRENT_VERSION = 1;
|
||||
FRAMEWORK_VERSION = A;
|
||||
|
@ -395,7 +403,6 @@
|
|||
INSTALL_PATH = "@loader_path/../Frameworks";
|
||||
PRODUCT_BUNDLE_IDENTIFIER = net.kode54.highlyexperimental;
|
||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||
PROVISIONING_PROFILE_SPECIFIER = "";
|
||||
SKIP_INSTALL = YES;
|
||||
WRAPPER_EXTENSION = framework;
|
||||
};
|
||||
|
|
|
@ -17,6 +17,7 @@
|
|||
8343792417F96EA600584396 /* qsound.h in Headers */ = {isa = PBXBuildFile; fileRef = 8343791B17F96EA600584396 /* qsound.h */; settings = {ATTRIBUTES = (Public, ); }; };
|
||||
8343792517F96EA600584396 /* z80.c in Sources */ = {isa = PBXBuildFile; fileRef = 8343791C17F96EA600584396 /* z80.c */; };
|
||||
8343792617F96EA600584396 /* z80.h in Headers */ = {isa = PBXBuildFile; fileRef = 8343791D17F96EA600584396 /* z80.h */; };
|
||||
83747B952862D5160021245F /* Shared.xcconfig in Resources */ = {isa = PBXBuildFile; fileRef = 83747B932862D5160021245F /* Shared.xcconfig */; };
|
||||
/* End PBXBuildFile section */
|
||||
|
||||
/* Begin PBXFileReference section */
|
||||
|
@ -33,6 +34,7 @@
|
|||
8343791B17F96EA600584396 /* qsound.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = qsound.h; path = Core/qsound.h; sourceTree = "<group>"; };
|
||||
8343791C17F96EA600584396 /* z80.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = z80.c; path = Core/z80.c; sourceTree = "<group>"; };
|
||||
8343791D17F96EA600584396 /* z80.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = z80.h; path = Core/z80.h; sourceTree = "<group>"; };
|
||||
83747B932862D5160021245F /* Shared.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = Shared.xcconfig; sourceTree = "<group>"; };
|
||||
/* End PBXFileReference section */
|
||||
|
||||
/* Begin PBXFrameworksBuildPhase section */
|
||||
|
@ -49,6 +51,7 @@
|
|||
834378D417F96E2600584396 = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
83747B922862D5160021245F /* Xcode-config */,
|
||||
834378E717F96E2600584396 /* HighlyQuixotic */,
|
||||
834378E017F96E2600584396 /* Frameworks */,
|
||||
834378DF17F96E2600584396 /* Products */,
|
||||
|
@ -104,6 +107,15 @@
|
|||
name = "Supporting Files";
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
83747B922862D5160021245F /* Xcode-config */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
83747B932862D5160021245F /* Shared.xcconfig */,
|
||||
);
|
||||
name = "Xcode-config";
|
||||
path = "../../Xcode-config";
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
/* End PBXGroup section */
|
||||
|
||||
/* Begin PBXHeadersBuildPhase section */
|
||||
|
@ -151,7 +163,7 @@
|
|||
TargetAttributes = {
|
||||
834378DD17F96E2600584396 = {
|
||||
DevelopmentTeam = "";
|
||||
ProvisioningStyle = Automatic;
|
||||
ProvisioningStyle = Manual;
|
||||
};
|
||||
};
|
||||
};
|
||||
|
@ -180,6 +192,7 @@
|
|||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
834378EC17F96E2600584396 /* InfoPlist.strings in Resources */,
|
||||
83747B952862D5160021245F /* Shared.xcconfig in Resources */,
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
};
|
||||
|
@ -214,6 +227,7 @@
|
|||
/* Begin XCBuildConfiguration section */
|
||||
8343790417F96E2600584396 /* Debug */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
baseConfigurationReference = 83747B932862D5160021245F /* Shared.xcconfig */;
|
||||
buildSettings = {
|
||||
ALWAYS_SEARCH_USER_PATHS = NO;
|
||||
CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES;
|
||||
|
@ -263,7 +277,7 @@
|
|||
GCC_WARN_UNINITIALIZED_AUTOS = YES;
|
||||
GCC_WARN_UNUSED_FUNCTION = YES;
|
||||
GCC_WARN_UNUSED_VARIABLE = YES;
|
||||
MACOSX_DEPLOYMENT_TARGET = 10.12;
|
||||
MACOSX_DEPLOYMENT_TARGET = 10.13;
|
||||
ONLY_ACTIVE_ARCH = YES;
|
||||
SDKROOT = macosx;
|
||||
SKIP_INSTALL = YES;
|
||||
|
@ -272,6 +286,7 @@
|
|||
};
|
||||
8343790517F96E2600584396 /* Release */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
baseConfigurationReference = 83747B932862D5160021245F /* Shared.xcconfig */;
|
||||
buildSettings = {
|
||||
ALWAYS_SEARCH_USER_PATHS = NO;
|
||||
CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES;
|
||||
|
@ -317,7 +332,7 @@
|
|||
GCC_WARN_UNINITIALIZED_AUTOS = YES;
|
||||
GCC_WARN_UNUSED_FUNCTION = YES;
|
||||
GCC_WARN_UNUSED_VARIABLE = YES;
|
||||
MACOSX_DEPLOYMENT_TARGET = 10.12;
|
||||
MACOSX_DEPLOYMENT_TARGET = 10.13;
|
||||
SDKROOT = macosx;
|
||||
SKIP_INSTALL = YES;
|
||||
};
|
||||
|
@ -326,11 +341,8 @@
|
|||
8343790717F96E2600584396 /* Debug */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
buildSettings = {
|
||||
CODE_SIGN_IDENTITY = "";
|
||||
CODE_SIGN_STYLE = Automatic;
|
||||
COMBINE_HIDPI_IMAGES = YES;
|
||||
DEAD_CODE_STRIPPING = YES;
|
||||
DEVELOPMENT_TEAM = "";
|
||||
DYLIB_COMPATIBILITY_VERSION = 1;
|
||||
DYLIB_CURRENT_VERSION = 1;
|
||||
FRAMEWORK_VERSION = A;
|
||||
|
@ -339,7 +351,6 @@
|
|||
INSTALL_PATH = "@loader_path/../Frameworks";
|
||||
PRODUCT_BUNDLE_IDENTIFIER = net.kode54.highlyquixotic;
|
||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||
PROVISIONING_PROFILE_SPECIFIER = "";
|
||||
SDKROOT = macosx;
|
||||
WRAPPER_EXTENSION = framework;
|
||||
};
|
||||
|
@ -348,11 +359,8 @@
|
|||
8343790817F96E2600584396 /* Release */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
buildSettings = {
|
||||
CODE_SIGN_IDENTITY = "";
|
||||
CODE_SIGN_STYLE = Automatic;
|
||||
COMBINE_HIDPI_IMAGES = YES;
|
||||
DEAD_CODE_STRIPPING = YES;
|
||||
DEVELOPMENT_TEAM = "";
|
||||
DYLIB_COMPATIBILITY_VERSION = 1;
|
||||
DYLIB_CURRENT_VERSION = 1;
|
||||
FRAMEWORK_VERSION = A;
|
||||
|
@ -361,7 +369,6 @@
|
|||
INSTALL_PATH = "@loader_path/../Frameworks";
|
||||
PRODUCT_BUNDLE_IDENTIFIER = net.kode54.highlyquixotic;
|
||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||
PROVISIONING_PROFILE_SPECIFIER = "";
|
||||
SDKROOT = macosx;
|
||||
WRAPPER_EXTENSION = framework;
|
||||
};
|
||||
|
|
|
@ -26,6 +26,7 @@
|
|||
834378CC17F9666D00584396 /* m68kops.c in Sources */ = {isa = PBXBuildFile; fileRef = 834378C217F9666D00584396 /* m68kops.c */; };
|
||||
834378CD17F9666D00584396 /* m68kops.h in Headers */ = {isa = PBXBuildFile; fileRef = 834378C317F9666D00584396 /* m68kops.h */; };
|
||||
834378CE17F9666D00584396 /* macros.h in Headers */ = {isa = PBXBuildFile; fileRef = 834378C417F9666D00584396 /* macros.h */; };
|
||||
83747B9A2862D5230021245F /* Shared.xcconfig in Resources */ = {isa = PBXBuildFile; fileRef = 83747B982862D5230021245F /* Shared.xcconfig */; };
|
||||
/* End PBXBuildFile section */
|
||||
|
||||
/* Begin PBXFileReference section */
|
||||
|
@ -51,6 +52,7 @@
|
|||
834378C217F9666D00584396 /* m68kops.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = m68kops.c; sourceTree = "<group>"; };
|
||||
834378C317F9666D00584396 /* m68kops.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = m68kops.h; sourceTree = "<group>"; };
|
||||
834378C417F9666D00584396 /* macros.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = macros.h; sourceTree = "<group>"; };
|
||||
83747B982862D5230021245F /* Shared.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = Shared.xcconfig; sourceTree = "<group>"; };
|
||||
/* End PBXFileReference section */
|
||||
|
||||
/* Begin PBXFrameworksBuildPhase section */
|
||||
|
@ -67,6 +69,7 @@
|
|||
8343786417F9658E00584396 = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
83747B972862D5230021245F /* Xcode-config */,
|
||||
8343787717F9658E00584396 /* HighlyTheoretical */,
|
||||
8343787017F9658E00584396 /* Frameworks */,
|
||||
8343786F17F9658E00584396 /* Products */,
|
||||
|
@ -140,6 +143,15 @@
|
|||
path = Core/m68k;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
83747B972862D5230021245F /* Xcode-config */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
83747B982862D5230021245F /* Shared.xcconfig */,
|
||||
);
|
||||
name = "Xcode-config";
|
||||
path = "../../Xcode-config";
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
/* End PBXGroup section */
|
||||
|
||||
/* Begin PBXHeadersBuildPhase section */
|
||||
|
@ -193,7 +205,7 @@
|
|||
TargetAttributes = {
|
||||
8343786D17F9658E00584396 = {
|
||||
DevelopmentTeam = "";
|
||||
ProvisioningStyle = Automatic;
|
||||
ProvisioningStyle = Manual;
|
||||
};
|
||||
};
|
||||
};
|
||||
|
@ -222,6 +234,7 @@
|
|||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
8343787C17F9658E00584396 /* InfoPlist.strings in Resources */,
|
||||
83747B9A2862D5230021245F /* Shared.xcconfig in Resources */,
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
};
|
||||
|
@ -259,6 +272,7 @@
|
|||
/* Begin XCBuildConfiguration section */
|
||||
8343789417F9658E00584396 /* Debug */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
baseConfigurationReference = 83747B982862D5230021245F /* Shared.xcconfig */;
|
||||
buildSettings = {
|
||||
ALWAYS_SEARCH_USER_PATHS = NO;
|
||||
CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES;
|
||||
|
@ -311,7 +325,7 @@
|
|||
GCC_WARN_UNINITIALIZED_AUTOS = YES;
|
||||
GCC_WARN_UNUSED_FUNCTION = YES;
|
||||
GCC_WARN_UNUSED_VARIABLE = YES;
|
||||
MACOSX_DEPLOYMENT_TARGET = 10.12;
|
||||
MACOSX_DEPLOYMENT_TARGET = 10.13;
|
||||
ONLY_ACTIVE_ARCH = YES;
|
||||
SDKROOT = macosx;
|
||||
};
|
||||
|
@ -319,6 +333,7 @@
|
|||
};
|
||||
8343789517F9658E00584396 /* Release */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
baseConfigurationReference = 83747B982862D5230021245F /* Shared.xcconfig */;
|
||||
buildSettings = {
|
||||
ALWAYS_SEARCH_USER_PATHS = NO;
|
||||
CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES;
|
||||
|
@ -367,7 +382,7 @@
|
|||
GCC_WARN_UNINITIALIZED_AUTOS = YES;
|
||||
GCC_WARN_UNUSED_FUNCTION = YES;
|
||||
GCC_WARN_UNUSED_VARIABLE = YES;
|
||||
MACOSX_DEPLOYMENT_TARGET = 10.12;
|
||||
MACOSX_DEPLOYMENT_TARGET = 10.13;
|
||||
SDKROOT = macosx;
|
||||
};
|
||||
name = Release;
|
||||
|
@ -375,11 +390,8 @@
|
|||
8343789717F9658E00584396 /* Debug */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
buildSettings = {
|
||||
CODE_SIGN_IDENTITY = "";
|
||||
CODE_SIGN_STYLE = Automatic;
|
||||
COMBINE_HIDPI_IMAGES = YES;
|
||||
DEAD_CODE_STRIPPING = YES;
|
||||
DEVELOPMENT_TEAM = "";
|
||||
DYLIB_COMPATIBILITY_VERSION = 1;
|
||||
DYLIB_CURRENT_VERSION = 1;
|
||||
FRAMEWORK_VERSION = A;
|
||||
|
@ -388,7 +400,6 @@
|
|||
INSTALL_PATH = "@loader_path/../Frameworks";
|
||||
PRODUCT_BUNDLE_IDENTIFIER = net.kode54.highlytheoretical;
|
||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||
PROVISIONING_PROFILE_SPECIFIER = "";
|
||||
SDKROOT = macosx;
|
||||
SKIP_INSTALL = YES;
|
||||
WRAPPER_EXTENSION = framework;
|
||||
|
@ -398,11 +409,8 @@
|
|||
8343789817F9658E00584396 /* Release */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
buildSettings = {
|
||||
CODE_SIGN_IDENTITY = "";
|
||||
CODE_SIGN_STYLE = Automatic;
|
||||
COMBINE_HIDPI_IMAGES = YES;
|
||||
DEAD_CODE_STRIPPING = YES;
|
||||
DEVELOPMENT_TEAM = "";
|
||||
DYLIB_COMPATIBILITY_VERSION = 1;
|
||||
DYLIB_CURRENT_VERSION = 1;
|
||||
FRAMEWORK_VERSION = A;
|
||||
|
@ -411,7 +419,6 @@
|
|||
INSTALL_PATH = "@loader_path/../Frameworks";
|
||||
PRODUCT_BUNDLE_IDENTIFIER = net.kode54.highlytheoretical;
|
||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||
PROVISIONING_PROFILE_SPECIFIER = "";
|
||||
SDKROOT = macosx;
|
||||
SKIP_INSTALL = YES;
|
||||
WRAPPER_EXTENSION = framework;
|
||||
|
|
|
@ -12,6 +12,7 @@
|
|||
836FB592182054B700B3AD2D /* hvl_replay.h in Headers */ = {isa = PBXBuildFile; fileRef = 836FB58E182054B700B3AD2D /* hvl_replay.h */; settings = {ATTRIBUTES = (Public, ); }; };
|
||||
836FB593182054B700B3AD2D /* blip_buf.c in Sources */ = {isa = PBXBuildFile; fileRef = 836FB58F182054B700B3AD2D /* blip_buf.c */; };
|
||||
836FB594182054B700B3AD2D /* blip_buf.h in Headers */ = {isa = PBXBuildFile; fileRef = 836FB590182054B700B3AD2D /* blip_buf.h */; settings = {ATTRIBUTES = (Public, ); }; };
|
||||
83747BB32862D55A0021245F /* Shared.xcconfig in Resources */ = {isa = PBXBuildFile; fileRef = 83747BB12862D55A0021245F /* Shared.xcconfig */; };
|
||||
/* End PBXBuildFile section */
|
||||
|
||||
/* Begin PBXFileReference section */
|
||||
|
@ -23,6 +24,7 @@
|
|||
836FB58E182054B700B3AD2D /* hvl_replay.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = hvl_replay.h; sourceTree = "<group>"; };
|
||||
836FB58F182054B700B3AD2D /* blip_buf.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = blip_buf.c; sourceTree = "<group>"; };
|
||||
836FB590182054B700B3AD2D /* blip_buf.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = blip_buf.h; sourceTree = "<group>"; };
|
||||
83747BB12862D55A0021245F /* Shared.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = Shared.xcconfig; sourceTree = "<group>"; };
|
||||
/* End PBXFileReference section */
|
||||
|
||||
/* Begin PBXFrameworksBuildPhase section */
|
||||
|
@ -39,6 +41,7 @@
|
|||
836FB54C182053D700B3AD2D = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
83747BB02862D55A0021245F /* Xcode-config */,
|
||||
836FB55F182053D700B3AD2D /* HivelyPlayer */,
|
||||
836FB558182053D700B3AD2D /* Frameworks */,
|
||||
836FB557182053D700B3AD2D /* Products */,
|
||||
|
@ -89,6 +92,15 @@
|
|||
name = "Supporting Files";
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
83747BB02862D55A0021245F /* Xcode-config */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
83747BB12862D55A0021245F /* Shared.xcconfig */,
|
||||
);
|
||||
name = "Xcode-config";
|
||||
path = "../../Xcode-config";
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
/* End PBXGroup section */
|
||||
|
||||
/* Begin PBXHeadersBuildPhase section */
|
||||
|
@ -133,7 +145,7 @@
|
|||
TargetAttributes = {
|
||||
836FB555182053D700B3AD2D = {
|
||||
DevelopmentTeam = "";
|
||||
ProvisioningStyle = Automatic;
|
||||
ProvisioningStyle = Manual;
|
||||
};
|
||||
};
|
||||
};
|
||||
|
@ -162,6 +174,7 @@
|
|||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
836FB564182053D700B3AD2D /* InfoPlist.strings in Resources */,
|
||||
83747BB32862D55A0021245F /* Shared.xcconfig in Resources */,
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
};
|
||||
|
@ -194,6 +207,7 @@
|
|||
/* Begin XCBuildConfiguration section */
|
||||
836FB57C182053D700B3AD2D /* Debug */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
baseConfigurationReference = 83747BB12862D55A0021245F /* Shared.xcconfig */;
|
||||
buildSettings = {
|
||||
ALWAYS_SEARCH_USER_PATHS = NO;
|
||||
CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES;
|
||||
|
@ -240,7 +254,7 @@
|
|||
GCC_WARN_UNINITIALIZED_AUTOS = YES;
|
||||
GCC_WARN_UNUSED_FUNCTION = YES;
|
||||
GCC_WARN_UNUSED_VARIABLE = YES;
|
||||
MACOSX_DEPLOYMENT_TARGET = 10.12;
|
||||
MACOSX_DEPLOYMENT_TARGET = 10.13;
|
||||
ONLY_ACTIVE_ARCH = YES;
|
||||
SDKROOT = macosx;
|
||||
SKIP_INSTALL = YES;
|
||||
|
@ -249,6 +263,7 @@
|
|||
};
|
||||
836FB57D182053D700B3AD2D /* Release */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
baseConfigurationReference = 83747BB12862D55A0021245F /* Shared.xcconfig */;
|
||||
buildSettings = {
|
||||
ALWAYS_SEARCH_USER_PATHS = NO;
|
||||
CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES;
|
||||
|
@ -289,7 +304,7 @@
|
|||
GCC_WARN_UNINITIALIZED_AUTOS = YES;
|
||||
GCC_WARN_UNUSED_FUNCTION = YES;
|
||||
GCC_WARN_UNUSED_VARIABLE = YES;
|
||||
MACOSX_DEPLOYMENT_TARGET = 10.12;
|
||||
MACOSX_DEPLOYMENT_TARGET = 10.13;
|
||||
SDKROOT = macosx;
|
||||
SKIP_INSTALL = YES;
|
||||
};
|
||||
|
@ -298,11 +313,8 @@
|
|||
836FB57F182053D700B3AD2D /* Debug */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
buildSettings = {
|
||||
CODE_SIGN_IDENTITY = "";
|
||||
CODE_SIGN_STYLE = Automatic;
|
||||
COMBINE_HIDPI_IMAGES = YES;
|
||||
DEAD_CODE_STRIPPING = YES;
|
||||
DEVELOPMENT_TEAM = "";
|
||||
DYLIB_COMPATIBILITY_VERSION = 1;
|
||||
DYLIB_CURRENT_VERSION = 1;
|
||||
FRAMEWORK_VERSION = A;
|
||||
|
@ -310,7 +322,6 @@
|
|||
INSTALL_PATH = "@loader_path/../Frameworks";
|
||||
PRODUCT_BUNDLE_IDENTIFIER = net.kode54.hivelyplayer;
|
||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||
PROVISIONING_PROFILE_SPECIFIER = "";
|
||||
SDKROOT = macosx;
|
||||
WRAPPER_EXTENSION = framework;
|
||||
};
|
||||
|
@ -319,11 +330,8 @@
|
|||
836FB580182053D700B3AD2D /* Release */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
buildSettings = {
|
||||
CODE_SIGN_IDENTITY = "";
|
||||
CODE_SIGN_STYLE = Automatic;
|
||||
COMBINE_HIDPI_IMAGES = YES;
|
||||
DEAD_CODE_STRIPPING = YES;
|
||||
DEVELOPMENT_TEAM = "";
|
||||
DYLIB_COMPATIBILITY_VERSION = 1;
|
||||
DYLIB_CURRENT_VERSION = 1;
|
||||
FRAMEWORK_VERSION = A;
|
||||
|
@ -331,7 +339,6 @@
|
|||
INSTALL_PATH = "@loader_path/../Frameworks";
|
||||
PRODUCT_BUNDLE_IDENTIFIER = net.kode54.hivelyplayer;
|
||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||
PROVISIONING_PROFILE_SPECIFIER = "";
|
||||
SDKROOT = macosx;
|
||||
WRAPPER_EXTENSION = framework;
|
||||
};
|
||||
|
|
|
@ -7,6 +7,7 @@
|
|||
objects = {
|
||||
|
||||
/* Begin PBXBuildFile section */
|
||||
83747BBD2862D5760021245F /* Shared.xcconfig in Resources */ = {isa = PBXBuildFile; fileRef = 83747BBB2862D5760021245F /* Shared.xcconfig */; };
|
||||
83A16EF019F48A2E00842DBC /* huffman.c in Sources */ = {isa = PBXBuildFile; fileRef = 83A16EED19F48A2E00842DBC /* huffman.c */; };
|
||||
83A16EF119F48A2E00842DBC /* mpc_bits_reader.c in Sources */ = {isa = PBXBuildFile; fileRef = 83A16EEE19F48A2E00842DBC /* mpc_bits_reader.c */; };
|
||||
83A16EF219F48A2E00842DBC /* mpc_demux.c in Sources */ = {isa = PBXBuildFile; fileRef = 83A16EEF19F48A2E00842DBC /* mpc_demux.c */; };
|
||||
|
@ -38,6 +39,7 @@
|
|||
/* Begin PBXFileReference section */
|
||||
833F683F1CDBCAB300AFB9F0 /* es */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = es; path = es.lproj/InfoPlist.strings; sourceTree = "<group>"; };
|
||||
835C889222CC1885001B4B3F /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = "<group>"; };
|
||||
83747BBB2862D5760021245F /* Shared.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = Shared.xcconfig; sourceTree = "<group>"; };
|
||||
83A16EED19F48A2E00842DBC /* huffman.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = huffman.c; path = Files/src/huffman.c; sourceTree = "<group>"; };
|
||||
83A16EEE19F48A2E00842DBC /* mpc_bits_reader.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = mpc_bits_reader.c; path = Files/src/mpc_bits_reader.c; sourceTree = "<group>"; };
|
||||
83A16EEF19F48A2E00842DBC /* mpc_demux.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = mpc_demux.c; path = Files/src/mpc_demux.c; sourceTree = "<group>"; };
|
||||
|
@ -89,6 +91,7 @@
|
|||
0867D691FE84028FC02AAC07 /* MPCDec */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
83747BBA2862D5760021245F /* Xcode-config */,
|
||||
8E6096BB09F314B2006D8BD7 /* Headers */,
|
||||
8E6096BA09F314AD006D8BD7 /* Source */,
|
||||
089C1665FE841158C02AAC07 /* Resources */,
|
||||
|
@ -130,6 +133,15 @@
|
|||
name = "Other Frameworks";
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
83747BBA2862D5760021245F /* Xcode-config */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
83747BBB2862D5760021245F /* Shared.xcconfig */,
|
||||
);
|
||||
name = "Xcode-config";
|
||||
path = "../../Xcode-config";
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
83A16F1619F48FB800842DBC /* mpcdec */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
|
@ -233,7 +245,7 @@
|
|||
TargetAttributes = {
|
||||
8DC2EF4F0486A6940098B216 = {
|
||||
DevelopmentTeam = "";
|
||||
ProvisioningStyle = Automatic;
|
||||
ProvisioningStyle = Manual;
|
||||
};
|
||||
};
|
||||
};
|
||||
|
@ -262,6 +274,7 @@
|
|||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
8DC2EF530486A6940098B216 /* InfoPlist.strings in Resources */,
|
||||
83747BBD2862D5760021245F /* Shared.xcconfig in Resources */,
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
};
|
||||
|
@ -306,12 +319,9 @@
|
|||
isa = XCBuildConfiguration;
|
||||
buildSettings = {
|
||||
CLANG_ENABLE_OBJC_WEAK = YES;
|
||||
CODE_SIGN_IDENTITY = "";
|
||||
CODE_SIGN_STYLE = Automatic;
|
||||
COMBINE_HIDPI_IMAGES = YES;
|
||||
COPY_PHASE_STRIP = NO;
|
||||
DEAD_CODE_STRIPPING = YES;
|
||||
DEVELOPMENT_TEAM = "";
|
||||
DYLIB_COMPATIBILITY_VERSION = 1;
|
||||
DYLIB_CURRENT_VERSION = 1;
|
||||
FRAMEWORK_VERSION = A;
|
||||
|
@ -325,7 +335,6 @@
|
|||
INSTALL_PATH = "@loader_path/../Frameworks";
|
||||
PRODUCT_BUNDLE_IDENTIFIER = org.cogx.lib.mpcdec;
|
||||
PRODUCT_NAME = mpcdec;
|
||||
PROVISIONING_PROFILE_SPECIFIER = "";
|
||||
SDKROOT = macosx;
|
||||
SKIP_INSTALL = YES;
|
||||
WRAPPER_EXTENSION = framework;
|
||||
|
@ -337,11 +346,8 @@
|
|||
isa = XCBuildConfiguration;
|
||||
buildSettings = {
|
||||
CLANG_ENABLE_OBJC_WEAK = YES;
|
||||
CODE_SIGN_IDENTITY = "";
|
||||
CODE_SIGN_STYLE = Automatic;
|
||||
COMBINE_HIDPI_IMAGES = YES;
|
||||
DEAD_CODE_STRIPPING = YES;
|
||||
DEVELOPMENT_TEAM = "";
|
||||
DYLIB_COMPATIBILITY_VERSION = 1;
|
||||
DYLIB_CURRENT_VERSION = 1;
|
||||
FRAMEWORK_VERSION = A;
|
||||
|
@ -352,7 +358,6 @@
|
|||
INSTALL_PATH = "@loader_path/../Frameworks";
|
||||
PRODUCT_BUNDLE_IDENTIFIER = org.cogx.lib.mpcdec;
|
||||
PRODUCT_NAME = mpcdec;
|
||||
PROVISIONING_PROFILE_SPECIFIER = "";
|
||||
SDKROOT = macosx;
|
||||
SKIP_INSTALL = YES;
|
||||
USER_HEADER_SEARCH_PATHS = Files/include/;
|
||||
|
@ -362,6 +367,7 @@
|
|||
};
|
||||
1DEB91B208733DA50010E9CD /* Debug */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
baseConfigurationReference = 83747BBB2862D5760021245F /* Shared.xcconfig */;
|
||||
buildSettings = {
|
||||
ALWAYS_SEARCH_USER_PATHS = NO;
|
||||
CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES;
|
||||
|
@ -396,7 +402,7 @@
|
|||
GCC_WARN_UNINITIALIZED_AUTOS = YES;
|
||||
GCC_WARN_UNUSED_FUNCTION = YES;
|
||||
GCC_WARN_UNUSED_VARIABLE = YES;
|
||||
MACOSX_DEPLOYMENT_TARGET = 10.12;
|
||||
MACOSX_DEPLOYMENT_TARGET = 10.13;
|
||||
ONLY_ACTIVE_ARCH = YES;
|
||||
SDKROOT = macosx;
|
||||
SYMROOT = ../../build;
|
||||
|
@ -405,6 +411,7 @@
|
|||
};
|
||||
1DEB91B308733DA50010E9CD /* Release */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
baseConfigurationReference = 83747BBB2862D5760021245F /* Shared.xcconfig */;
|
||||
buildSettings = {
|
||||
ALWAYS_SEARCH_USER_PATHS = NO;
|
||||
CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES;
|
||||
|
@ -437,7 +444,7 @@
|
|||
GCC_WARN_UNINITIALIZED_AUTOS = YES;
|
||||
GCC_WARN_UNUSED_FUNCTION = YES;
|
||||
GCC_WARN_UNUSED_VARIABLE = YES;
|
||||
MACOSX_DEPLOYMENT_TARGET = 10.12;
|
||||
MACOSX_DEPLOYMENT_TARGET = 10.13;
|
||||
SDKROOT = macosx;
|
||||
SYMROOT = ../../build;
|
||||
};
|
||||
|
|
|
@ -25,6 +25,7 @@
|
|||
831132EA21F9565F001F678F /* OPL.h in Headers */ = {isa = PBXBuildFile; fileRef = 831132E521F9565F001F678F /* OPL.h */; };
|
||||
831132EB21F9565F001F678F /* Load_c67.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 831132E621F9565F001F678F /* Load_c67.cpp */; };
|
||||
831132EC21F9565F001F678F /* OPL.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 831132E721F9565F001F678F /* OPL.cpp */; };
|
||||
83747BC72862D58D0021245F /* Shared.xcconfig in Resources */ = {isa = PBXBuildFile; fileRef = 83747BC52862D58D0021245F /* Shared.xcconfig */; };
|
||||
83AA7D1D2519B619004C5298 /* mptOSError.h in Headers */ = {isa = PBXBuildFile; fileRef = 83AA7D1B2519B618004C5298 /* mptOSError.h */; };
|
||||
83AA7D1E2519B619004C5298 /* mptOSException.h in Headers */ = {isa = PBXBuildFile; fileRef = 83AA7D1C2519B618004C5298 /* mptOSException.h */; };
|
||||
83AA7D252519B643004C5298 /* Dither.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 83AA7D212519B643004C5298 /* Dither.cpp */; };
|
||||
|
@ -303,6 +304,7 @@
|
|||
831132E521F9565F001F678F /* OPL.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = OPL.h; sourceTree = "<group>"; };
|
||||
831132E621F9565F001F678F /* Load_c67.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Load_c67.cpp; sourceTree = "<group>"; };
|
||||
831132E721F9565F001F678F /* OPL.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = OPL.cpp; sourceTree = "<group>"; };
|
||||
83747BC52862D58D0021245F /* Shared.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = Shared.xcconfig; sourceTree = "<group>"; };
|
||||
83AA7D1B2519B618004C5298 /* mptOSError.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = mptOSError.h; sourceTree = "<group>"; };
|
||||
83AA7D1C2519B618004C5298 /* mptOSException.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = mptOSException.h; sourceTree = "<group>"; };
|
||||
83AA7D212519B643004C5298 /* Dither.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Dither.cpp; sourceTree = "<group>"; };
|
||||
|
@ -579,9 +581,19 @@
|
|||
/* End PBXFrameworksBuildPhase section */
|
||||
|
||||
/* Begin PBXGroup section */
|
||||
83747BC42862D58D0021245F /* Xcode-config */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
83747BC52862D58D0021245F /* Shared.xcconfig */,
|
||||
);
|
||||
name = "Xcode-config";
|
||||
path = "../../Xcode-config";
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
83E5EFB31FFEF7CC00659F0F = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
83747BC42862D58D0021245F /* Xcode-config */,
|
||||
83E5EFBF1FFEF7CC00659F0F /* OpenMPT */,
|
||||
83E5EFBE1FFEF7CC00659F0F /* Products */,
|
||||
83E5FE641FFEFFA400659F0F /* Frameworks */,
|
||||
|
@ -1156,8 +1168,7 @@
|
|||
ORGANIZATIONNAME = "Christopher Snowhill";
|
||||
TargetAttributes = {
|
||||
83E5EFBC1FFEF7CC00659F0F = {
|
||||
DevelopmentTeam = "";
|
||||
ProvisioningStyle = Automatic;
|
||||
ProvisioningStyle = Manual;
|
||||
};
|
||||
};
|
||||
};
|
||||
|
@ -1185,6 +1196,7 @@
|
|||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
831132E221F955F4001F678F /* LICENSE in Resources */,
|
||||
83747BC72862D58D0021245F /* Shared.xcconfig in Resources */,
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
};
|
||||
|
@ -1339,6 +1351,7 @@
|
|||
/* Begin XCBuildConfiguration section */
|
||||
83E5EFC31FFEF7CC00659F0F /* Debug */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
baseConfigurationReference = 83747BC52862D58D0021245F /* Shared.xcconfig */;
|
||||
buildSettings = {
|
||||
ALWAYS_SEARCH_USER_PATHS = NO;
|
||||
CLANG_ANALYZER_NONNULL = YES;
|
||||
|
@ -1369,7 +1382,6 @@
|
|||
CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
|
||||
CLANG_WARN_UNREACHABLE_CODE = YES;
|
||||
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
|
||||
CODE_SIGN_IDENTITY = "Mac Developer";
|
||||
COPY_PHASE_STRIP = NO;
|
||||
CURRENT_PROJECT_VERSION = 1;
|
||||
DEAD_CODE_STRIPPING = YES;
|
||||
|
@ -1400,7 +1412,7 @@
|
|||
OpenMPT/include,
|
||||
OpenMPT/build/svn_version,
|
||||
);
|
||||
MACOSX_DEPLOYMENT_TARGET = 10.12;
|
||||
MACOSX_DEPLOYMENT_TARGET = 10.13;
|
||||
MTL_ENABLE_DEBUG_INFO = YES;
|
||||
ONLY_ACTIVE_ARCH = YES;
|
||||
SDKROOT = macosx;
|
||||
|
@ -1412,6 +1424,7 @@
|
|||
};
|
||||
83E5EFC41FFEF7CC00659F0F /* Release */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
baseConfigurationReference = 83747BC52862D58D0021245F /* Shared.xcconfig */;
|
||||
buildSettings = {
|
||||
ALWAYS_SEARCH_USER_PATHS = NO;
|
||||
CLANG_ANALYZER_NONNULL = YES;
|
||||
|
@ -1442,7 +1455,6 @@
|
|||
CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
|
||||
CLANG_WARN_UNREACHABLE_CODE = YES;
|
||||
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
|
||||
CODE_SIGN_IDENTITY = "Mac Developer";
|
||||
COPY_PHASE_STRIP = NO;
|
||||
CURRENT_PROJECT_VERSION = 1;
|
||||
DEAD_CODE_STRIPPING = YES;
|
||||
|
@ -1469,7 +1481,7 @@
|
|||
OpenMPT/include,
|
||||
OpenMPT/build/svn_version,
|
||||
);
|
||||
MACOSX_DEPLOYMENT_TARGET = 10.12;
|
||||
MACOSX_DEPLOYMENT_TARGET = 10.13;
|
||||
MTL_ENABLE_DEBUG_INFO = NO;
|
||||
SDKROOT = macosx;
|
||||
USE_HEADERMAP = YES;
|
||||
|
@ -1481,11 +1493,8 @@
|
|||
83E5EFC61FFEF7CC00659F0F /* Debug */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
buildSettings = {
|
||||
CODE_SIGN_IDENTITY = "";
|
||||
CODE_SIGN_STYLE = Automatic;
|
||||
COMBINE_HIDPI_IMAGES = YES;
|
||||
DEAD_CODE_STRIPPING = YES;
|
||||
DEVELOPMENT_TEAM = "";
|
||||
DYLIB_COMPATIBILITY_VERSION = 1;
|
||||
DYLIB_CURRENT_VERSION = 1;
|
||||
FRAMEWORK_VERSION = A;
|
||||
|
@ -1496,7 +1505,6 @@
|
|||
LIBRARY_SEARCH_PATHS = "$(inherited)";
|
||||
PRODUCT_BUNDLE_IDENTIFIER = net.kode54.libOpenMPTOld;
|
||||
PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)";
|
||||
PROVISIONING_PROFILE_SPECIFIER = "";
|
||||
SKIP_INSTALL = YES;
|
||||
};
|
||||
name = Debug;
|
||||
|
@ -1504,11 +1512,8 @@
|
|||
83E5EFC71FFEF7CC00659F0F /* Release */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
buildSettings = {
|
||||
CODE_SIGN_IDENTITY = "";
|
||||
CODE_SIGN_STYLE = Automatic;
|
||||
COMBINE_HIDPI_IMAGES = YES;
|
||||
DEAD_CODE_STRIPPING = YES;
|
||||
DEVELOPMENT_TEAM = "";
|
||||
DYLIB_COMPATIBILITY_VERSION = 1;
|
||||
DYLIB_CURRENT_VERSION = 1;
|
||||
FRAMEWORK_VERSION = A;
|
||||
|
@ -1519,7 +1524,6 @@
|
|||
LIBRARY_SEARCH_PATHS = "$(inherited)";
|
||||
PRODUCT_BUNDLE_IDENTIFIER = net.kode54.libOpenMPTOld;
|
||||
PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)";
|
||||
PROVISIONING_PROFILE_SPECIFIER = "";
|
||||
SKIP_INSTALL = YES;
|
||||
};
|
||||
name = Release;
|
||||
|
|
|
@ -184,6 +184,7 @@
|
|||
831132EA21F9565F001F678F /* OPL.h in Headers */ = {isa = PBXBuildFile; fileRef = 831132E521F9565F001F678F /* OPL.h */; };
|
||||
831132EB21F9565F001F678F /* Load_c67.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 831132E621F9565F001F678F /* Load_c67.cpp */; };
|
||||
831132EC21F9565F001F678F /* OPL.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 831132E721F9565F001F678F /* OPL.cpp */; };
|
||||
83747BC22862D5820021245F /* Shared.xcconfig in Resources */ = {isa = PBXBuildFile; fileRef = 83747BC02862D5820021245F /* Shared.xcconfig */; };
|
||||
83AA7D322519B694004C5298 /* TinyFFT.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 83AA7D2E2519B694004C5298 /* TinyFFT.cpp */; };
|
||||
83AA7D332519B694004C5298 /* SampleFormatSFZ.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 83AA7D2F2519B694004C5298 /* SampleFormatSFZ.cpp */; };
|
||||
83AA7D342519B694004C5298 /* SampleFormatBRR.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 83AA7D302519B694004C5298 /* SampleFormatBRR.cpp */; };
|
||||
|
@ -591,6 +592,7 @@
|
|||
831132E521F9565F001F678F /* OPL.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = OPL.h; sourceTree = "<group>"; };
|
||||
831132E621F9565F001F678F /* Load_c67.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Load_c67.cpp; sourceTree = "<group>"; };
|
||||
831132E721F9565F001F678F /* OPL.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = OPL.cpp; sourceTree = "<group>"; };
|
||||
83747BC02862D5820021245F /* Shared.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = Shared.xcconfig; sourceTree = "<group>"; };
|
||||
83AA7D2E2519B694004C5298 /* TinyFFT.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = TinyFFT.cpp; sourceTree = "<group>"; };
|
||||
83AA7D2F2519B694004C5298 /* SampleFormatSFZ.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = SampleFormatSFZ.cpp; sourceTree = "<group>"; };
|
||||
83AA7D302519B694004C5298 /* SampleFormatBRR.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = SampleFormatBRR.cpp; sourceTree = "<group>"; };
|
||||
|
@ -1326,9 +1328,19 @@
|
|||
path = base;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
83747BBF2862D5820021245F /* Xcode-config */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
83747BC02862D5820021245F /* Shared.xcconfig */,
|
||||
);
|
||||
name = "Xcode-config";
|
||||
path = "../../Xcode-config";
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
83E5EFB31FFEF7CC00659F0F = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
83747BBF2862D5820021245F /* Xcode-config */,
|
||||
83E5EFBF1FFEF7CC00659F0F /* OpenMPT */,
|
||||
83E5EFBE1FFEF7CC00659F0F /* Products */,
|
||||
83E5FE641FFEFFA400659F0F /* Frameworks */,
|
||||
|
@ -2001,8 +2013,7 @@
|
|||
ORGANIZATIONNAME = "Christopher Snowhill";
|
||||
TargetAttributes = {
|
||||
83E5EFBC1FFEF7CC00659F0F = {
|
||||
DevelopmentTeam = "";
|
||||
ProvisioningStyle = Automatic;
|
||||
ProvisioningStyle = Manual;
|
||||
};
|
||||
};
|
||||
};
|
||||
|
@ -2030,6 +2041,7 @@
|
|||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
831132E221F955F4001F678F /* LICENSE in Resources */,
|
||||
83747BC22862D5820021245F /* Shared.xcconfig in Resources */,
|
||||
830996BF27787E9A00857684 /* .clang-format in Resources */,
|
||||
830996CF27787E9A00857684 /* LICENSE.BSD-3-Clause.txt in Resources */,
|
||||
830996AC27787E9A00857684 /* LICENSE.BSL-1.0.txt in Resources */,
|
||||
|
@ -2183,6 +2195,7 @@
|
|||
/* Begin XCBuildConfiguration section */
|
||||
83E5EFC31FFEF7CC00659F0F /* Debug */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
baseConfigurationReference = 83747BC02862D5820021245F /* Shared.xcconfig */;
|
||||
buildSettings = {
|
||||
ALWAYS_SEARCH_USER_PATHS = NO;
|
||||
CLANG_ANALYZER_NONNULL = YES;
|
||||
|
@ -2213,7 +2226,6 @@
|
|||
CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
|
||||
CLANG_WARN_UNREACHABLE_CODE = YES;
|
||||
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
|
||||
CODE_SIGN_IDENTITY = "Mac Developer";
|
||||
COPY_PHASE_STRIP = NO;
|
||||
CURRENT_PROJECT_VERSION = 1;
|
||||
DEAD_CODE_STRIPPING = YES;
|
||||
|
@ -2258,6 +2270,7 @@
|
|||
};
|
||||
83E5EFC41FFEF7CC00659F0F /* Release */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
baseConfigurationReference = 83747BC02862D5820021245F /* Shared.xcconfig */;
|
||||
buildSettings = {
|
||||
ALWAYS_SEARCH_USER_PATHS = NO;
|
||||
CLANG_ANALYZER_NONNULL = YES;
|
||||
|
@ -2288,7 +2301,6 @@
|
|||
CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
|
||||
CLANG_WARN_UNREACHABLE_CODE = YES;
|
||||
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
|
||||
CODE_SIGN_IDENTITY = "Mac Developer";
|
||||
COPY_PHASE_STRIP = NO;
|
||||
CURRENT_PROJECT_VERSION = 1;
|
||||
DEAD_CODE_STRIPPING = YES;
|
||||
|
@ -2329,11 +2341,8 @@
|
|||
83E5EFC61FFEF7CC00659F0F /* Debug */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
buildSettings = {
|
||||
CODE_SIGN_IDENTITY = "";
|
||||
CODE_SIGN_STYLE = Automatic;
|
||||
COMBINE_HIDPI_IMAGES = YES;
|
||||
DEAD_CODE_STRIPPING = YES;
|
||||
DEVELOPMENT_TEAM = "";
|
||||
DYLIB_COMPATIBILITY_VERSION = 1;
|
||||
DYLIB_CURRENT_VERSION = 1;
|
||||
FRAMEWORK_VERSION = A;
|
||||
|
@ -2343,7 +2352,6 @@
|
|||
LIBRARY_SEARCH_PATHS = "$(inherited)";
|
||||
PRODUCT_BUNDLE_IDENTIFIER = net.kode54.libOpenMPT;
|
||||
PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)";
|
||||
PROVISIONING_PROFILE_SPECIFIER = "";
|
||||
SKIP_INSTALL = YES;
|
||||
};
|
||||
name = Debug;
|
||||
|
@ -2351,11 +2359,8 @@
|
|||
83E5EFC71FFEF7CC00659F0F /* Release */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
buildSettings = {
|
||||
CODE_SIGN_IDENTITY = "";
|
||||
CODE_SIGN_STYLE = Automatic;
|
||||
COMBINE_HIDPI_IMAGES = YES;
|
||||
DEAD_CODE_STRIPPING = YES;
|
||||
DEVELOPMENT_TEAM = "";
|
||||
DYLIB_COMPATIBILITY_VERSION = 1;
|
||||
DYLIB_CURRENT_VERSION = 1;
|
||||
FRAMEWORK_VERSION = A;
|
||||
|
@ -2365,7 +2370,6 @@
|
|||
LIBRARY_SEARCH_PATHS = "$(inherited)";
|
||||
PRODUCT_BUNDLE_IDENTIFIER = net.kode54.libOpenMPT;
|
||||
PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)";
|
||||
PROVISIONING_PROFILE_SPECIFIER = "";
|
||||
SKIP_INSTALL = YES;
|
||||
};
|
||||
name = Release;
|
||||
|
|
|
@ -9,6 +9,7 @@
|
|||
/* Begin PBXBuildFile section */
|
||||
830109F91A09BC0A0004F8D8 /* codecvt.h in Headers */ = {isa = PBXBuildFile; fileRef = 830109F71A09BC0A0004F8D8 /* codecvt.h */; };
|
||||
830109FA1A09BC0A0004F8D8 /* wstring_convert.h in Headers */ = {isa = PBXBuildFile; fileRef = 830109F81A09BC0A0004F8D8 /* wstring_convert.h */; };
|
||||
83747B8B2862D4F90021245F /* Shared.xcconfig in Resources */ = {isa = PBXBuildFile; fileRef = 83747B892862D4F90021245F /* Shared.xcconfig */; };
|
||||
83848FBC1807623F00E7332D /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 83848FBB1807623F00E7332D /* Cocoa.framework */; };
|
||||
83848FC61807623F00E7332D /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 83848FC41807623F00E7332D /* InfoPlist.strings */; };
|
||||
838490251807649A00E7332D /* Channel.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 838490011807649A00E7332D /* Channel.cpp */; };
|
||||
|
@ -46,6 +47,7 @@
|
|||
830109F71A09BC0A0004F8D8 /* codecvt.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = codecvt.h; sourceTree = "<group>"; };
|
||||
830109F81A09BC0A0004F8D8 /* wstring_convert.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = wstring_convert.h; sourceTree = "<group>"; };
|
||||
833F68301CDBCAB100AFB9F0 /* es */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = es; path = es.lproj/InfoPlist.strings; sourceTree = "<group>"; };
|
||||
83747B892862D4F90021245F /* Shared.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = Shared.xcconfig; sourceTree = "<group>"; };
|
||||
83848FB81807623F00E7332D /* SSEQPlayer.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = SSEQPlayer.framework; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||
83848FBB1807623F00E7332D /* Cocoa.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Cocoa.framework; path = System/Library/Frameworks/Cocoa.framework; sourceTree = SDKROOT; };
|
||||
83848FBE1807623F00E7332D /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; };
|
||||
|
@ -97,9 +99,19 @@
|
|||
/* End PBXFrameworksBuildPhase section */
|
||||
|
||||
/* Begin PBXGroup section */
|
||||
83747B882862D4F90021245F /* Xcode-config */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
83747B892862D4F90021245F /* Shared.xcconfig */,
|
||||
);
|
||||
name = "Xcode-config";
|
||||
path = "../../Xcode-config";
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
83848FAE1807623F00E7332D = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
83747B882862D4F90021245F /* Xcode-config */,
|
||||
83848FC11807623F00E7332D /* SSEQPlayer */,
|
||||
83848FBA1807623F00E7332D /* Frameworks */,
|
||||
83848FB91807623F00E7332D /* Products */,
|
||||
|
@ -242,7 +254,7 @@
|
|||
TargetAttributes = {
|
||||
83848FB71807623F00E7332D = {
|
||||
DevelopmentTeam = "";
|
||||
ProvisioningStyle = Automatic;
|
||||
ProvisioningStyle = Manual;
|
||||
};
|
||||
};
|
||||
};
|
||||
|
@ -271,6 +283,7 @@
|
|||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
83848FC61807623F00E7332D /* InfoPlist.strings in Resources */,
|
||||
83747B8B2862D4F90021245F /* Shared.xcconfig in Resources */,
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
};
|
||||
|
@ -314,6 +327,7 @@
|
|||
/* Begin XCBuildConfiguration section */
|
||||
83848FDE1807623F00E7332D /* Debug */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
baseConfigurationReference = 83747B892862D4F90021245F /* Shared.xcconfig */;
|
||||
buildSettings = {
|
||||
ALWAYS_SEARCH_USER_PATHS = NO;
|
||||
CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES;
|
||||
|
@ -360,7 +374,7 @@
|
|||
GCC_WARN_UNINITIALIZED_AUTOS = YES;
|
||||
GCC_WARN_UNUSED_FUNCTION = YES;
|
||||
GCC_WARN_UNUSED_VARIABLE = YES;
|
||||
MACOSX_DEPLOYMENT_TARGET = 10.12;
|
||||
MACOSX_DEPLOYMENT_TARGET = 10.13;
|
||||
ONLY_ACTIVE_ARCH = YES;
|
||||
SDKROOT = macosx;
|
||||
};
|
||||
|
@ -368,6 +382,7 @@
|
|||
};
|
||||
83848FDF1807623F00E7332D /* Release */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
baseConfigurationReference = 83747B892862D4F90021245F /* Shared.xcconfig */;
|
||||
buildSettings = {
|
||||
ALWAYS_SEARCH_USER_PATHS = NO;
|
||||
CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES;
|
||||
|
@ -407,7 +422,7 @@
|
|||
GCC_WARN_UNINITIALIZED_AUTOS = YES;
|
||||
GCC_WARN_UNUSED_FUNCTION = YES;
|
||||
GCC_WARN_UNUSED_VARIABLE = YES;
|
||||
MACOSX_DEPLOYMENT_TARGET = 10.12;
|
||||
MACOSX_DEPLOYMENT_TARGET = 10.13;
|
||||
SDKROOT = macosx;
|
||||
};
|
||||
name = Release;
|
||||
|
@ -415,11 +430,8 @@
|
|||
83848FE11807623F00E7332D /* Debug */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
buildSettings = {
|
||||
CODE_SIGN_IDENTITY = "";
|
||||
CODE_SIGN_STYLE = Automatic;
|
||||
COMBINE_HIDPI_IMAGES = YES;
|
||||
DEAD_CODE_STRIPPING = YES;
|
||||
DEVELOPMENT_TEAM = "";
|
||||
DYLIB_COMPATIBILITY_VERSION = 1;
|
||||
DYLIB_CURRENT_VERSION = 1;
|
||||
FRAMEWORK_VERSION = A;
|
||||
|
@ -427,7 +439,6 @@
|
|||
INSTALL_PATH = "@loader_path/../Frameworks";
|
||||
PRODUCT_BUNDLE_IDENTIFIER = net.kode54.sseqplayer;
|
||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||
PROVISIONING_PROFILE_SPECIFIER = "";
|
||||
SDKROOT = macosx;
|
||||
SKIP_INSTALL = YES;
|
||||
WRAPPER_EXTENSION = framework;
|
||||
|
@ -437,11 +448,8 @@
|
|||
83848FE21807623F00E7332D /* Release */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
buildSettings = {
|
||||
CODE_SIGN_IDENTITY = "";
|
||||
CODE_SIGN_STYLE = Automatic;
|
||||
COMBINE_HIDPI_IMAGES = YES;
|
||||
DEAD_CODE_STRIPPING = YES;
|
||||
DEVELOPMENT_TEAM = "";
|
||||
DYLIB_COMPATIBILITY_VERSION = 1;
|
||||
DYLIB_CURRENT_VERSION = 1;
|
||||
FRAMEWORK_VERSION = A;
|
||||
|
@ -449,7 +457,6 @@
|
|||
INSTALL_PATH = "@loader_path/../Frameworks";
|
||||
PRODUCT_BUNDLE_IDENTIFIER = net.kode54.sseqplayer;
|
||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||
PROVISIONING_PROFILE_SPECIFIER = "";
|
||||
SDKROOT = macosx;
|
||||
SKIP_INSTALL = YES;
|
||||
WRAPPER_EXTENSION = framework;
|
||||
|
|
|
@ -19,6 +19,7 @@
|
|||
59FDCD700A2922E1006C1800 /* shn_reader.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 59FDCD690A2922E1006C1800 /* shn_reader.cpp */; };
|
||||
59FDCD710A2922E1006C1800 /* sulawalaw.c in Sources */ = {isa = PBXBuildFile; fileRef = 59FDCD6A0A2922E1006C1800 /* sulawalaw.c */; };
|
||||
59FDCD720A2922E1006C1800 /* vario.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 59FDCD6B0A2922E1006C1800 /* vario.cpp */; };
|
||||
83747BCC2862D5970021245F /* Shared.xcconfig in Resources */ = {isa = PBXBuildFile; fileRef = 83747BCA2862D5970021245F /* Shared.xcconfig */; };
|
||||
8DC2EF530486A6940098B216 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 089C1666FE841158C02AAC07 /* InfoPlist.strings */; };
|
||||
/* End PBXBuildFile section */
|
||||
|
||||
|
@ -37,6 +38,7 @@
|
|||
59FDCD6B0A2922E1006C1800 /* vario.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = vario.cpp; path = Files/shorten/src/vario.cpp; sourceTree = "<group>"; };
|
||||
833F683E1CDBCAB300AFB9F0 /* es */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = es; path = es.lproj/InfoPlist.strings; sourceTree = "<group>"; };
|
||||
835C889522CC1888001B4B3F /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = "<group>"; };
|
||||
83747BCA2862D5970021245F /* Shared.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = Shared.xcconfig; sourceTree = "<group>"; };
|
||||
8DC2EF5A0486A6940098B216 /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist; path = Info.plist; sourceTree = "<group>"; };
|
||||
8DC2EF5B0486A6940098B216 /* Shorten.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Shorten.framework; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||
/* End PBXFileReference section */
|
||||
|
@ -63,6 +65,7 @@
|
|||
0867D691FE84028FC02AAC07 /* Shorten */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
83747BC92862D5970021245F /* Xcode-config */,
|
||||
8E756C6B09F3171C0080F1EE /* Headers */,
|
||||
8E756C6A09F317170080F1EE /* Source */,
|
||||
089C1665FE841158C02AAC07 /* Resources */,
|
||||
|
@ -104,6 +107,15 @@
|
|||
name = "Other Frameworks";
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
83747BC92862D5970021245F /* Xcode-config */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
83747BCA2862D5970021245F /* Shared.xcconfig */,
|
||||
);
|
||||
name = "Xcode-config";
|
||||
path = "../../Xcode-config";
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
8E756C6A09F317170080F1EE /* Source */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
|
@ -177,7 +189,7 @@
|
|||
TargetAttributes = {
|
||||
8DC2EF4F0486A6940098B216 = {
|
||||
DevelopmentTeam = "";
|
||||
ProvisioningStyle = Automatic;
|
||||
ProvisioningStyle = Manual;
|
||||
};
|
||||
};
|
||||
};
|
||||
|
@ -206,6 +218,7 @@
|
|||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
8DC2EF530486A6940098B216 /* InfoPlist.strings in Resources */,
|
||||
83747BCC2862D5970021245F /* Shared.xcconfig in Resources */,
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
};
|
||||
|
@ -245,12 +258,9 @@
|
|||
isa = XCBuildConfiguration;
|
||||
buildSettings = {
|
||||
CLANG_ENABLE_OBJC_WEAK = YES;
|
||||
CODE_SIGN_IDENTITY = "";
|
||||
CODE_SIGN_STYLE = Automatic;
|
||||
COMBINE_HIDPI_IMAGES = YES;
|
||||
COPY_PHASE_STRIP = NO;
|
||||
DEAD_CODE_STRIPPING = YES;
|
||||
DEVELOPMENT_TEAM = "";
|
||||
DYLIB_COMPATIBILITY_VERSION = 1;
|
||||
DYLIB_CURRENT_VERSION = 1;
|
||||
FRAMEWORK_VERSION = A;
|
||||
|
@ -264,7 +274,6 @@
|
|||
INSTALL_PATH = "@loader_path/../Frameworks";
|
||||
PRODUCT_BUNDLE_IDENTIFIER = org.cogx.lib.shorten;
|
||||
PRODUCT_NAME = Shorten;
|
||||
PROVISIONING_PROFILE_SPECIFIER = "";
|
||||
SDKROOT = macosx;
|
||||
SKIP_INSTALL = YES;
|
||||
WRAPPER_EXTENSION = framework;
|
||||
|
@ -276,11 +285,8 @@
|
|||
isa = XCBuildConfiguration;
|
||||
buildSettings = {
|
||||
CLANG_ENABLE_OBJC_WEAK = YES;
|
||||
CODE_SIGN_IDENTITY = "";
|
||||
CODE_SIGN_STYLE = Automatic;
|
||||
COMBINE_HIDPI_IMAGES = YES;
|
||||
DEAD_CODE_STRIPPING = YES;
|
||||
DEVELOPMENT_TEAM = "";
|
||||
DYLIB_COMPATIBILITY_VERSION = 1;
|
||||
DYLIB_CURRENT_VERSION = 1;
|
||||
FRAMEWORK_VERSION = A;
|
||||
|
@ -294,7 +300,6 @@
|
|||
OTHER_CFLAGS = "-DHAVE_CONFIG_H";
|
||||
PRODUCT_BUNDLE_IDENTIFIER = org.cogx.lib.shorten;
|
||||
PRODUCT_NAME = Shorten;
|
||||
PROVISIONING_PROFILE_SPECIFIER = "";
|
||||
SDKROOT = macosx;
|
||||
SHARED_PRECOMPS_DIR = "$(CACHE_ROOT)/SharedPrecompiledHeaders";
|
||||
SKIP_INSTALL = YES;
|
||||
|
@ -305,6 +310,7 @@
|
|||
};
|
||||
1DEB91B208733DA50010E9CD /* Debug */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
baseConfigurationReference = 83747BCA2862D5970021245F /* Shared.xcconfig */;
|
||||
buildSettings = {
|
||||
ALWAYS_SEARCH_USER_PATHS = NO;
|
||||
CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES;
|
||||
|
@ -346,7 +352,7 @@
|
|||
../../include,
|
||||
include,
|
||||
);
|
||||
MACOSX_DEPLOYMENT_TARGET = 10.12;
|
||||
MACOSX_DEPLOYMENT_TARGET = 10.13;
|
||||
ONLY_ACTIVE_ARCH = YES;
|
||||
SDKROOT = macosx;
|
||||
SYMROOT = ../../build;
|
||||
|
@ -355,6 +361,7 @@
|
|||
};
|
||||
1DEB91B308733DA50010E9CD /* Release */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
baseConfigurationReference = 83747BCA2862D5970021245F /* Shared.xcconfig */;
|
||||
buildSettings = {
|
||||
ALWAYS_SEARCH_USER_PATHS = NO;
|
||||
CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES;
|
||||
|
@ -394,7 +401,7 @@
|
|||
../../include,
|
||||
include,
|
||||
);
|
||||
MACOSX_DEPLOYMENT_TARGET = 10.12;
|
||||
MACOSX_DEPLOYMENT_TARGET = 10.13;
|
||||
SDKROOT = macosx;
|
||||
SYMROOT = ../../build;
|
||||
};
|
||||
|
|
|
@ -148,6 +148,7 @@
|
|||
32AE5AFF14E70ED700420CA0 /* taglib_config.h in Headers */ = {isa = PBXBuildFile; fileRef = 32AE5A5914E70ED600420CA0 /* taglib_config.h */; settings = {ATTRIBUTES = (Public, ); }; };
|
||||
32AE5B0014E70F4700420CA0 /* tlist.tcc in Headers */ = {isa = PBXBuildFile; fileRef = 32AE5A4614E70ED600420CA0 /* tlist.tcc */; settings = {ATTRIBUTES = (Public, ); }; };
|
||||
32AE5B0114E70F4A00420CA0 /* tmap.tcc in Headers */ = {isa = PBXBuildFile; fileRef = 32AE5A4814E70ED600420CA0 /* tmap.tcc */; settings = {ATTRIBUTES = (Public, ); }; };
|
||||
83747BD42862D5B00021245F /* Shared.xcconfig in Resources */ = {isa = PBXBuildFile; fileRef = 83747BD22862D5B00021245F /* Shared.xcconfig */; };
|
||||
83790D241809E8CA0073CF51 /* opusfile.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 83790D201809E8CA0073CF51 /* opusfile.cpp */; };
|
||||
83790D261809E8CA0073CF51 /* opusproperties.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 83790D221809E8CA0073CF51 /* opusproperties.cpp */; };
|
||||
83942C67269116530058BD3B /* flacfile.h in Headers */ = {isa = PBXBuildFile; fileRef = 32AE59BF14E70ED600420CA0 /* flacfile.h */; settings = {ATTRIBUTES = (Public, ); }; };
|
||||
|
@ -360,6 +361,7 @@
|
|||
32AE5A5914E70ED600420CA0 /* taglib_config.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = taglib_config.h; path = taglib/taglib_config.h; sourceTree = "<group>"; };
|
||||
833F683D1CDBCAB300AFB9F0 /* es */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = es; path = es.lproj/InfoPlist.strings; sourceTree = "<group>"; };
|
||||
835C889822CC1889001B4B3F /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = "<group>"; };
|
||||
83747BD22862D5B00021245F /* Shared.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = Shared.xcconfig; sourceTree = "<group>"; };
|
||||
83790D201809E8CA0073CF51 /* opusfile.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = opusfile.cpp; sourceTree = "<group>"; };
|
||||
83790D211809E8CA0073CF51 /* opusfile.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = opusfile.h; sourceTree = "<group>"; };
|
||||
83790D221809E8CA0073CF51 /* opusproperties.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = opusproperties.cpp; sourceTree = "<group>"; };
|
||||
|
@ -508,6 +510,7 @@
|
|||
0867D691FE84028FC02AAC07 /* TagLib */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
83747BD12862D5B00021245F /* Xcode-config */,
|
||||
8E75700C09F318D70080F1EE /* Source */,
|
||||
089C1665FE841158C02AAC07 /* Resources */,
|
||||
0867D69AFE84028FC02AAC07 /* External Frameworks and Libraries */,
|
||||
|
@ -887,6 +890,15 @@
|
|||
path = wavpack;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
83747BD12862D5B00021245F /* Xcode-config */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
83747BD22862D5B00021245F /* Shared.xcconfig */,
|
||||
);
|
||||
name = "Xcode-config";
|
||||
path = "../../Xcode-config";
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
83790D1F1809E8CA0073CF51 /* opus */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
|
@ -1200,7 +1212,7 @@
|
|||
TargetAttributes = {
|
||||
8DC2EF4F0486A6940098B216 = {
|
||||
DevelopmentTeam = "";
|
||||
ProvisioningStyle = Automatic;
|
||||
ProvisioningStyle = Manual;
|
||||
};
|
||||
};
|
||||
};
|
||||
|
@ -1229,6 +1241,7 @@
|
|||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
8DC2EF530486A6940098B216 /* InfoPlist.strings in Resources */,
|
||||
83747BD42862D5B00021245F /* Shared.xcconfig in Resources */,
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
};
|
||||
|
@ -1363,11 +1376,8 @@
|
|||
1DEB91AE08733DA50010E9CD /* Debug */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
buildSettings = {
|
||||
CODE_SIGN_IDENTITY = "";
|
||||
CODE_SIGN_STYLE = Automatic;
|
||||
COMBINE_HIDPI_IMAGES = YES;
|
||||
DEAD_CODE_STRIPPING = YES;
|
||||
DEVELOPMENT_TEAM = "";
|
||||
DYLIB_COMPATIBILITY_VERSION = 1;
|
||||
DYLIB_CURRENT_VERSION = 1;
|
||||
FRAMEWORK_VERSION = A;
|
||||
|
@ -1384,7 +1394,6 @@
|
|||
INSTALL_PATH = "@loader_path/../Frameworks";
|
||||
PRODUCT_BUNDLE_IDENTIFIER = org.cogx.lib.taglib;
|
||||
PRODUCT_NAME = TagLib;
|
||||
PROVISIONING_PROFILE_SPECIFIER = "";
|
||||
SDKROOT = macosx;
|
||||
WRAPPER_EXTENSION = framework;
|
||||
ZERO_LINK = YES;
|
||||
|
@ -1394,11 +1403,8 @@
|
|||
1DEB91AF08733DA50010E9CD /* Release */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
buildSettings = {
|
||||
CODE_SIGN_IDENTITY = "";
|
||||
CODE_SIGN_STYLE = Automatic;
|
||||
COMBINE_HIDPI_IMAGES = YES;
|
||||
DEAD_CODE_STRIPPING = YES;
|
||||
DEVELOPMENT_TEAM = "";
|
||||
DYLIB_COMPATIBILITY_VERSION = 1;
|
||||
DYLIB_CURRENT_VERSION = 1;
|
||||
FRAMEWORK_VERSION = A;
|
||||
|
@ -1413,7 +1419,6 @@
|
|||
INSTALL_PATH = "@loader_path/../Frameworks";
|
||||
PRODUCT_BUNDLE_IDENTIFIER = org.cogx.lib.taglib;
|
||||
PRODUCT_NAME = TagLib;
|
||||
PROVISIONING_PROFILE_SPECIFIER = "";
|
||||
SDKROOT = macosx;
|
||||
WRAPPER_EXTENSION = framework;
|
||||
};
|
||||
|
@ -1421,6 +1426,7 @@
|
|||
};
|
||||
1DEB91B208733DA50010E9CD /* Debug */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
baseConfigurationReference = 83747BD22862D5B00021245F /* Shared.xcconfig */;
|
||||
buildSettings = {
|
||||
ALWAYS_SEARCH_USER_PATHS = NO;
|
||||
CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES;
|
||||
|
@ -1457,7 +1463,7 @@
|
|||
GCC_WARN_UNINITIALIZED_AUTOS = YES;
|
||||
GCC_WARN_UNUSED_FUNCTION = YES;
|
||||
GCC_WARN_UNUSED_VARIABLE = YES;
|
||||
MACOSX_DEPLOYMENT_TARGET = 10.12;
|
||||
MACOSX_DEPLOYMENT_TARGET = 10.13;
|
||||
ONLY_ACTIVE_ARCH = YES;
|
||||
OTHER_CFLAGS = "-DHAVE_CONFIG_H";
|
||||
SDKROOT = macosx;
|
||||
|
@ -1468,6 +1474,7 @@
|
|||
};
|
||||
1DEB91B308733DA50010E9CD /* Release */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
baseConfigurationReference = 83747BD22862D5B00021245F /* Shared.xcconfig */;
|
||||
buildSettings = {
|
||||
ALWAYS_SEARCH_USER_PATHS = NO;
|
||||
CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES;
|
||||
|
@ -1502,7 +1509,7 @@
|
|||
GCC_WARN_UNINITIALIZED_AUTOS = YES;
|
||||
GCC_WARN_UNUSED_FUNCTION = YES;
|
||||
GCC_WARN_UNUSED_VARIABLE = YES;
|
||||
MACOSX_DEPLOYMENT_TARGET = 10.12;
|
||||
MACOSX_DEPLOYMENT_TARGET = 10.13;
|
||||
OTHER_CFLAGS = "-DHAVE_CONFIG_H";
|
||||
SDKROOT = macosx;
|
||||
SKIP_INSTALL = YES;
|
||||
|
|
|
@ -27,6 +27,7 @@
|
|||
8310BA4D1D7377DC0055CEC5 /* pack_dsd.c in Sources */ = {isa = PBXBuildFile; fileRef = 8310BA471D7377DC0055CEC5 /* pack_dsd.c */; };
|
||||
8310BA4E1D7377DC0055CEC5 /* pack_floats.c in Sources */ = {isa = PBXBuildFile; fileRef = 8310BA481D7377DC0055CEC5 /* pack_floats.c */; };
|
||||
8310BA4F1D7377DC0055CEC5 /* pack_utils.c in Sources */ = {isa = PBXBuildFile; fileRef = 8310BA491D7377DC0055CEC5 /* pack_utils.c */; };
|
||||
83747BDE2862D5C50021245F /* Shared.xcconfig in Resources */ = {isa = PBXBuildFile; fileRef = 83747BDC2862D5C50021245F /* Shared.xcconfig */; };
|
||||
83DD1DD017FA038A00249519 /* utils.h in Headers */ = {isa = PBXBuildFile; fileRef = 83DD1DCD17FA038A00249519 /* utils.h */; settings = {ATTRIBUTES = (Public, ); }; };
|
||||
83DD1DD117FA038A00249519 /* wavpack_local.h in Headers */ = {isa = PBXBuildFile; fileRef = 83DD1DCE17FA038A00249519 /* wavpack_local.h */; };
|
||||
83DD1DD217FA038A00249519 /* wavpack_version.h in Headers */ = {isa = PBXBuildFile; fileRef = 83DD1DCF17FA038A00249519 /* wavpack_version.h */; };
|
||||
|
@ -68,6 +69,7 @@
|
|||
8310BA491D7377DC0055CEC5 /* pack_utils.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = pack_utils.c; path = Files/pack_utils.c; sourceTree = "<group>"; };
|
||||
833F683A1CDBCAB200AFB9F0 /* es */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = es; path = es.lproj/InfoPlist.strings; sourceTree = "<group>"; };
|
||||
835C889B22CC188A001B4B3F /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = "<group>"; };
|
||||
83747BDC2862D5C50021245F /* Shared.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = Shared.xcconfig; sourceTree = "<group>"; };
|
||||
83DD1DCD17FA038A00249519 /* utils.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = utils.h; path = Files/utils.h; sourceTree = "<group>"; };
|
||||
83DD1DCE17FA038A00249519 /* wavpack_local.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = wavpack_local.h; path = Files/wavpack_local.h; sourceTree = "<group>"; };
|
||||
83DD1DCF17FA038A00249519 /* wavpack_version.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = wavpack_version.h; path = Files/wavpack_version.h; sourceTree = "<group>"; };
|
||||
|
@ -110,6 +112,7 @@
|
|||
0867D691FE84028FC02AAC07 /* WavPack */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
83747BDB2862D5C50021245F /* Xcode-config */,
|
||||
8E7574A909F31B9A0080F1EE /* Headers */,
|
||||
8E7574A809F31B940080F1EE /* Source */,
|
||||
089C1665FE841158C02AAC07 /* Resources */,
|
||||
|
@ -152,6 +155,15 @@
|
|||
name = "Other Frameworks";
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
83747BDB2862D5C50021245F /* Xcode-config */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
83747BDC2862D5C50021245F /* Shared.xcconfig */,
|
||||
);
|
||||
name = "Xcode-config";
|
||||
path = "../../Xcode-config";
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
8E7574A809F31B940080F1EE /* Source */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
|
@ -249,7 +261,7 @@
|
|||
TargetAttributes = {
|
||||
8DC2EF4F0486A6940098B216 = {
|
||||
DevelopmentTeam = "";
|
||||
ProvisioningStyle = Automatic;
|
||||
ProvisioningStyle = Manual;
|
||||
};
|
||||
};
|
||||
};
|
||||
|
@ -278,6 +290,7 @@
|
|||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
8DC2EF530486A6940098B216 /* InfoPlist.strings in Resources */,
|
||||
83747BDE2862D5C50021245F /* Shared.xcconfig in Resources */,
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
};
|
||||
|
@ -336,12 +349,9 @@
|
|||
1DEB91AE08733DA50010E9CD /* Debug */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
buildSettings = {
|
||||
CODE_SIGN_IDENTITY = "";
|
||||
CODE_SIGN_STYLE = Automatic;
|
||||
COMBINE_HIDPI_IMAGES = YES;
|
||||
COPY_PHASE_STRIP = NO;
|
||||
DEAD_CODE_STRIPPING = YES;
|
||||
DEVELOPMENT_TEAM = "";
|
||||
DYLIB_COMPATIBILITY_VERSION = 1;
|
||||
DYLIB_CURRENT_VERSION = 1;
|
||||
FRAMEWORK_VERSION = A;
|
||||
|
@ -371,7 +381,6 @@
|
|||
INSTALL_PATH = "@loader_path/../Frameworks";
|
||||
PRODUCT_BUNDLE_IDENTIFIER = org.cogx.lib.wavpack;
|
||||
PRODUCT_NAME = WavPack;
|
||||
PROVISIONING_PROFILE_SPECIFIER = "";
|
||||
SDKROOT = macosx;
|
||||
SKIP_INSTALL = YES;
|
||||
WRAPPER_EXTENSION = framework;
|
||||
|
@ -382,11 +391,8 @@
|
|||
1DEB91AF08733DA50010E9CD /* Release */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
buildSettings = {
|
||||
CODE_SIGN_IDENTITY = "";
|
||||
CODE_SIGN_STYLE = Automatic;
|
||||
COMBINE_HIDPI_IMAGES = YES;
|
||||
DEAD_CODE_STRIPPING = YES;
|
||||
DEVELOPMENT_TEAM = "";
|
||||
DYLIB_COMPATIBILITY_VERSION = 1;
|
||||
DYLIB_CURRENT_VERSION = 1;
|
||||
FRAMEWORK_VERSION = A;
|
||||
|
@ -413,7 +419,6 @@
|
|||
INSTALL_PATH = "@loader_path/../Frameworks";
|
||||
PRODUCT_BUNDLE_IDENTIFIER = org.cogx.lib.wavpack;
|
||||
PRODUCT_NAME = WavPack;
|
||||
PROVISIONING_PROFILE_SPECIFIER = "";
|
||||
SDKROOT = macosx;
|
||||
SKIP_INSTALL = YES;
|
||||
WRAPPER_EXTENSION = framework;
|
||||
|
@ -422,6 +427,7 @@
|
|||
};
|
||||
1DEB91B208733DA50010E9CD /* Debug */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
baseConfigurationReference = 83747BDC2862D5C50021245F /* Shared.xcconfig */;
|
||||
buildSettings = {
|
||||
ALWAYS_SEARCH_USER_PATHS = NO;
|
||||
CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES;
|
||||
|
@ -457,7 +463,7 @@
|
|||
GCC_WARN_UNINITIALIZED_AUTOS = YES;
|
||||
GCC_WARN_UNUSED_FUNCTION = YES;
|
||||
GCC_WARN_UNUSED_VARIABLE = YES;
|
||||
MACOSX_DEPLOYMENT_TARGET = 10.12;
|
||||
MACOSX_DEPLOYMENT_TARGET = 10.13;
|
||||
ONLY_ACTIVE_ARCH = YES;
|
||||
SDKROOT = macosx;
|
||||
SYMROOT = ../../build;
|
||||
|
@ -466,6 +472,7 @@
|
|||
};
|
||||
1DEB91B308733DA50010E9CD /* Release */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
baseConfigurationReference = 83747BDC2862D5C50021245F /* Shared.xcconfig */;
|
||||
buildSettings = {
|
||||
ALWAYS_SEARCH_USER_PATHS = NO;
|
||||
CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES;
|
||||
|
@ -499,7 +506,7 @@
|
|||
GCC_WARN_UNINITIALIZED_AUTOS = YES;
|
||||
GCC_WARN_UNUSED_FUNCTION = YES;
|
||||
GCC_WARN_UNUSED_VARIABLE = YES;
|
||||
MACOSX_DEPLOYMENT_TARGET = 10.12;
|
||||
MACOSX_DEPLOYMENT_TARGET = 10.13;
|
||||
SDKROOT = macosx;
|
||||
SYMROOT = ../../build;
|
||||
};
|
||||
|
|
|
@ -351,7 +351,7 @@
|
|||
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
|
||||
GCC_WARN_UNUSED_FUNCTION = YES;
|
||||
GCC_WARN_UNUSED_VARIABLE = YES;
|
||||
MACOSX_DEPLOYMENT_TARGET = 10.12;
|
||||
MACOSX_DEPLOYMENT_TARGET = 10.13;
|
||||
MTL_ENABLE_DEBUG_INFO = YES;
|
||||
ONLY_ACTIVE_ARCH = YES;
|
||||
SDKROOT = macosx;
|
||||
|
@ -403,7 +403,7 @@
|
|||
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
|
||||
GCC_WARN_UNUSED_FUNCTION = YES;
|
||||
GCC_WARN_UNUSED_VARIABLE = YES;
|
||||
MACOSX_DEPLOYMENT_TARGET = 10.12;
|
||||
MACOSX_DEPLOYMENT_TARGET = 10.13;
|
||||
MTL_ENABLE_DEBUG_INFO = NO;
|
||||
SDKROOT = macosx;
|
||||
VERSIONING_SYSTEM = "apple-generic";
|
||||
|
|
|
@ -722,7 +722,7 @@
|
|||
GCC_WARN_UNINITIALIZED_AUTOS = YES;
|
||||
GCC_WARN_UNUSED_FUNCTION = YES;
|
||||
GCC_WARN_UNUSED_VARIABLE = YES;
|
||||
MACOSX_DEPLOYMENT_TARGET = 10.8;
|
||||
MACOSX_DEPLOYMENT_TARGET = 10.13;
|
||||
ONLY_ACTIVE_ARCH = YES;
|
||||
SDKROOT = macosx;
|
||||
};
|
||||
|
@ -767,7 +767,7 @@
|
|||
GCC_WARN_UNINITIALIZED_AUTOS = YES;
|
||||
GCC_WARN_UNUSED_FUNCTION = YES;
|
||||
GCC_WARN_UNUSED_VARIABLE = YES;
|
||||
MACOSX_DEPLOYMENT_TARGET = 10.8;
|
||||
MACOSX_DEPLOYMENT_TARGET = 10.13;
|
||||
SDKROOT = macosx;
|
||||
};
|
||||
name = Release;
|
||||
|
|
|
@ -8,6 +8,7 @@
|
|||
|
||||
/* Begin PBXBuildFile section */
|
||||
8333B6721DCC498B004C140D /* libz.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = 8333B6711DCC498B004C140D /* libz.tbd */; };
|
||||
83747BAE2862D54D0021245F /* Shared.xcconfig in Resources */ = {isa = PBXBuildFile; fileRef = 83747BAC2862D54D0021245F /* Shared.xcconfig */; };
|
||||
8379B58A1AA4237E00F28A95 /* barray.c in Sources */ = {isa = PBXBuildFile; fileRef = 8379B5881AA4237E00F28A95 /* barray.c */; };
|
||||
8379B58B1AA4237E00F28A95 /* barray.h in Headers */ = {isa = PBXBuildFile; fileRef = 8379B5891AA4237E00F28A95 /* barray.h */; };
|
||||
83AA660627B7CB490098D4B8 /* hvqm.c in Sources */ = {isa = PBXBuildFile; fileRef = 83AA660427B7CB490098D4B8 /* hvqm.c */; };
|
||||
|
@ -205,6 +206,7 @@
|
|||
|
||||
/* Begin PBXFileReference section */
|
||||
8333B6711DCC498B004C140D /* libz.tbd */ = {isa = PBXFileReference; lastKnownFileType = "sourcecode.text-based-dylib-definition"; name = libz.tbd; path = usr/lib/libz.tbd; sourceTree = SDKROOT; };
|
||||
83747BAC2862D54D0021245F /* Shared.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = Shared.xcconfig; sourceTree = "<group>"; };
|
||||
8379B5881AA4237E00F28A95 /* barray.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = barray.c; sourceTree = "<group>"; };
|
||||
8379B5891AA4237E00F28A95 /* barray.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = barray.h; sourceTree = "<group>"; };
|
||||
83AA660427B7CB490098D4B8 /* hvqm.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = hvqm.c; sourceTree = "<group>"; };
|
||||
|
@ -414,9 +416,19 @@
|
|||
/* End PBXFrameworksBuildPhase section */
|
||||
|
||||
/* Begin PBXGroup section */
|
||||
83747BAB2862D54C0021245F /* Xcode-config */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
83747BAC2862D54D0021245F /* Shared.xcconfig */,
|
||||
);
|
||||
name = "Xcode-config";
|
||||
path = "../../Xcode-config";
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
83C8B61818AF57770071B040 = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
83747BAB2862D54C0021245F /* Xcode-config */,
|
||||
83C8B62B18AF57770071B040 /* lazyusf2 */,
|
||||
83C8B62418AF57770071B040 /* Frameworks */,
|
||||
83C8B62318AF57770071B040 /* Products */,
|
||||
|
@ -961,7 +973,7 @@
|
|||
TargetAttributes = {
|
||||
83C8B62118AF57770071B040 = {
|
||||
DevelopmentTeam = "";
|
||||
ProvisioningStyle = Automatic;
|
||||
ProvisioningStyle = Manual;
|
||||
};
|
||||
};
|
||||
};
|
||||
|
@ -989,6 +1001,7 @@
|
|||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
83CA15911A988138005E7ED4 /* interpreter_tlb.def in Resources */,
|
||||
83747BAE2862D54D0021245F /* Shared.xcconfig in Resources */,
|
||||
83CA15901A988138005E7ED4 /* interpreter_special.def in Resources */,
|
||||
83CA15641A988138005E7ED4 /* api_export.ver in Resources */,
|
||||
83CA158C1A988138005E7ED4 /* interpreter_cop0.def in Resources */,
|
||||
|
@ -1080,6 +1093,7 @@
|
|||
/* Begin XCBuildConfiguration section */
|
||||
83C8B64818AF57770071B040 /* Debug */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
baseConfigurationReference = 83747BAC2862D54D0021245F /* Shared.xcconfig */;
|
||||
buildSettings = {
|
||||
ALWAYS_SEARCH_USER_PATHS = NO;
|
||||
CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES;
|
||||
|
@ -1127,7 +1141,7 @@
|
|||
GCC_WARN_UNINITIALIZED_AUTOS = YES;
|
||||
GCC_WARN_UNUSED_FUNCTION = YES;
|
||||
GCC_WARN_UNUSED_VARIABLE = YES;
|
||||
MACOSX_DEPLOYMENT_TARGET = 10.12;
|
||||
MACOSX_DEPLOYMENT_TARGET = 10.13;
|
||||
ONLY_ACTIVE_ARCH = YES;
|
||||
SDKROOT = macosx;
|
||||
};
|
||||
|
@ -1135,6 +1149,7 @@
|
|||
};
|
||||
83C8B64918AF57770071B040 /* Release */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
baseConfigurationReference = 83747BAC2862D54D0021245F /* Shared.xcconfig */;
|
||||
buildSettings = {
|
||||
ALWAYS_SEARCH_USER_PATHS = NO;
|
||||
CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES;
|
||||
|
@ -1175,7 +1190,7 @@
|
|||
GCC_WARN_UNINITIALIZED_AUTOS = YES;
|
||||
GCC_WARN_UNUSED_FUNCTION = YES;
|
||||
GCC_WARN_UNUSED_VARIABLE = YES;
|
||||
MACOSX_DEPLOYMENT_TARGET = 10.12;
|
||||
MACOSX_DEPLOYMENT_TARGET = 10.13;
|
||||
SDKROOT = macosx;
|
||||
};
|
||||
name = Release;
|
||||
|
@ -1183,11 +1198,8 @@
|
|||
83C8B64B18AF57770071B040 /* Debug */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
buildSettings = {
|
||||
CODE_SIGN_IDENTITY = "";
|
||||
CODE_SIGN_STYLE = Automatic;
|
||||
COMBINE_HIDPI_IMAGES = YES;
|
||||
DEAD_CODE_STRIPPING = YES;
|
||||
DEVELOPMENT_TEAM = "";
|
||||
DYLIB_COMPATIBILITY_VERSION = 1;
|
||||
DYLIB_CURRENT_VERSION = 1;
|
||||
FRAMEWORK_VERSION = A;
|
||||
|
@ -1201,7 +1213,6 @@
|
|||
INSTALL_PATH = "@loader_path/../Frameworks";
|
||||
PRODUCT_BUNDLE_IDENTIFIER = net.kode54.lazyusf2;
|
||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||
PROVISIONING_PROFILE_SPECIFIER = "";
|
||||
SDKROOT = macosx;
|
||||
SKIP_INSTALL = YES;
|
||||
USER_HEADER_SEARCH_PATHS = lazyusf2;
|
||||
|
@ -1212,11 +1223,8 @@
|
|||
83C8B64C18AF57770071B040 /* Release */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
buildSettings = {
|
||||
CODE_SIGN_IDENTITY = "";
|
||||
CODE_SIGN_STYLE = Automatic;
|
||||
COMBINE_HIDPI_IMAGES = YES;
|
||||
DEAD_CODE_STRIPPING = YES;
|
||||
DEVELOPMENT_TEAM = "";
|
||||
DYLIB_COMPATIBILITY_VERSION = 1;
|
||||
DYLIB_CURRENT_VERSION = 1;
|
||||
FRAMEWORK_VERSION = A;
|
||||
|
@ -1231,7 +1239,6 @@
|
|||
INSTALL_PATH = "@loader_path/../Frameworks";
|
||||
PRODUCT_BUNDLE_IDENTIFIER = net.kode54.lazyusf2;
|
||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||
PROVISIONING_PROFILE_SPECIFIER = "";
|
||||
SDKROOT = macosx;
|
||||
SKIP_INSTALL = YES;
|
||||
USER_HEADER_SEARCH_PATHS = lazyusf2;
|
||||
|
|
|
@ -299,7 +299,7 @@
|
|||
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
|
||||
GCC_WARN_UNUSED_FUNCTION = YES;
|
||||
GCC_WARN_UNUSED_VARIABLE = YES;
|
||||
MACOSX_DEPLOYMENT_TARGET = 10.12;
|
||||
MACOSX_DEPLOYMENT_TARGET = 10.13;
|
||||
MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;
|
||||
MTL_FAST_MATH = YES;
|
||||
ONLY_ACTIVE_ARCH = YES;
|
||||
|
@ -357,7 +357,7 @@
|
|||
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
|
||||
GCC_WARN_UNUSED_FUNCTION = YES;
|
||||
GCC_WARN_UNUSED_VARIABLE = YES;
|
||||
MACOSX_DEPLOYMENT_TARGET = 10.12;
|
||||
MACOSX_DEPLOYMENT_TARGET = 10.13;
|
||||
MTL_ENABLE_DEBUG_INFO = NO;
|
||||
MTL_FAST_MATH = YES;
|
||||
SDKROOT = macosx;
|
||||
|
|
|
@ -7,6 +7,7 @@
|
|||
objects = {
|
||||
|
||||
/* Begin PBXBuildFile section */
|
||||
83747FEA2862E8FA0021245F /* Shared.xcconfig in Resources */ = {isa = PBXBuildFile; fileRef = 83747FE82862E8FA0021245F /* Shared.xcconfig */; };
|
||||
83D3C693201D3870005564CB /* binio.h in Headers */ = {isa = PBXBuildFile; fileRef = 83D3C692201D3870005564CB /* binio.h */; settings = {ATTRIBUTES = (Public, ); }; };
|
||||
83D3C69B201D388C005564CB /* binfile.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 83D3C694201D388B005564CB /* binfile.cpp */; };
|
||||
83D3C69C201D388C005564CB /* binwrap.h in Headers */ = {isa = PBXBuildFile; fileRef = 83D3C695201D388B005564CB /* binwrap.h */; settings = {ATTRIBUTES = (Public, ); }; };
|
||||
|
@ -18,6 +19,7 @@
|
|||
/* End PBXBuildFile section */
|
||||
|
||||
/* Begin PBXFileReference section */
|
||||
83747FE82862E8FA0021245F /* Shared.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = Shared.xcconfig; sourceTree = "<group>"; };
|
||||
83D3C67B201D37D8005564CB /* libbinio.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = libbinio.framework; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||
83D3C67F201D37D8005564CB /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
|
||||
83D3C692201D3870005564CB /* binio.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = binio.h; sourceTree = "<group>"; };
|
||||
|
@ -41,9 +43,19 @@
|
|||
/* End PBXFrameworksBuildPhase section */
|
||||
|
||||
/* Begin PBXGroup section */
|
||||
83747FE72862E8FA0021245F /* Xcode-config */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
83747FE82862E8FA0021245F /* Shared.xcconfig */,
|
||||
);
|
||||
name = "Xcode-config";
|
||||
path = "../../Xcode-config";
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
83D3C671201D37D8005564CB = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
83747FE72862E8FA0021245F /* Xcode-config */,
|
||||
83D3C67D201D37D8005564CB /* libbinio */,
|
||||
83D3C67C201D37D8005564CB /* Products */,
|
||||
);
|
||||
|
@ -118,8 +130,7 @@
|
|||
ORGANIZATIONNAME = "Christopher Snowhill";
|
||||
TargetAttributes = {
|
||||
83D3C67A201D37D8005564CB = {
|
||||
DevelopmentTeam = "";
|
||||
ProvisioningStyle = Automatic;
|
||||
ProvisioningStyle = Manual;
|
||||
};
|
||||
};
|
||||
};
|
||||
|
@ -146,6 +157,7 @@
|
|||
isa = PBXResourcesBuildPhase;
|
||||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
83747FEA2862E8FA0021245F /* Shared.xcconfig in Resources */,
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
};
|
||||
|
@ -168,6 +180,7 @@
|
|||
/* Begin XCBuildConfiguration section */
|
||||
83D3C681201D37D8005564CB /* Debug */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
baseConfigurationReference = 83747FE82862E8FA0021245F /* Shared.xcconfig */;
|
||||
buildSettings = {
|
||||
ALWAYS_SEARCH_USER_PATHS = NO;
|
||||
CLANG_ANALYZER_NONNULL = YES;
|
||||
|
@ -198,7 +211,6 @@
|
|||
CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
|
||||
CLANG_WARN_UNREACHABLE_CODE = YES;
|
||||
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
|
||||
CODE_SIGN_IDENTITY = "Mac Developer";
|
||||
COPY_PHASE_STRIP = NO;
|
||||
CURRENT_PROJECT_VERSION = 1;
|
||||
DEAD_CODE_STRIPPING = YES;
|
||||
|
@ -220,7 +232,7 @@
|
|||
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
|
||||
GCC_WARN_UNUSED_FUNCTION = YES;
|
||||
GCC_WARN_UNUSED_VARIABLE = YES;
|
||||
MACOSX_DEPLOYMENT_TARGET = 10.12;
|
||||
MACOSX_DEPLOYMENT_TARGET = 10.13;
|
||||
MTL_ENABLE_DEBUG_INFO = YES;
|
||||
ONLY_ACTIVE_ARCH = YES;
|
||||
SDKROOT = macosx;
|
||||
|
@ -231,6 +243,7 @@
|
|||
};
|
||||
83D3C682201D37D8005564CB /* Release */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
baseConfigurationReference = 83747FE82862E8FA0021245F /* Shared.xcconfig */;
|
||||
buildSettings = {
|
||||
ALWAYS_SEARCH_USER_PATHS = NO;
|
||||
CLANG_ANALYZER_NONNULL = YES;
|
||||
|
@ -261,7 +274,6 @@
|
|||
CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
|
||||
CLANG_WARN_UNREACHABLE_CODE = YES;
|
||||
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
|
||||
CODE_SIGN_IDENTITY = "Mac Developer";
|
||||
COPY_PHASE_STRIP = NO;
|
||||
CURRENT_PROJECT_VERSION = 1;
|
||||
DEAD_CODE_STRIPPING = YES;
|
||||
|
@ -277,7 +289,7 @@
|
|||
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
|
||||
GCC_WARN_UNUSED_FUNCTION = YES;
|
||||
GCC_WARN_UNUSED_VARIABLE = YES;
|
||||
MACOSX_DEPLOYMENT_TARGET = 10.12;
|
||||
MACOSX_DEPLOYMENT_TARGET = 10.13;
|
||||
MTL_ENABLE_DEBUG_INFO = NO;
|
||||
SDKROOT = macosx;
|
||||
VERSIONING_SYSTEM = "apple-generic";
|
||||
|
@ -288,11 +300,8 @@
|
|||
83D3C684201D37D8005564CB /* Debug */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
buildSettings = {
|
||||
CODE_SIGN_IDENTITY = "";
|
||||
CODE_SIGN_STYLE = Automatic;
|
||||
COMBINE_HIDPI_IMAGES = YES;
|
||||
DEAD_CODE_STRIPPING = YES;
|
||||
DEVELOPMENT_TEAM = "";
|
||||
DYLIB_COMPATIBILITY_VERSION = 1;
|
||||
DYLIB_CURRENT_VERSION = 1;
|
||||
DYLIB_INSTALL_NAME_BASE = "@rpath";
|
||||
|
@ -302,7 +311,6 @@
|
|||
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @loader_path/Frameworks @loader_path/../Frameworks";
|
||||
PRODUCT_BUNDLE_IDENTIFIER = net.kode54.libbinio;
|
||||
PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)";
|
||||
PROVISIONING_PROFILE_SPECIFIER = "";
|
||||
SKIP_INSTALL = YES;
|
||||
};
|
||||
name = Debug;
|
||||
|
@ -310,11 +318,8 @@
|
|||
83D3C685201D37D8005564CB /* Release */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
buildSettings = {
|
||||
CODE_SIGN_IDENTITY = "";
|
||||
CODE_SIGN_STYLE = Automatic;
|
||||
COMBINE_HIDPI_IMAGES = YES;
|
||||
DEAD_CODE_STRIPPING = YES;
|
||||
DEVELOPMENT_TEAM = "";
|
||||
DYLIB_COMPATIBILITY_VERSION = 1;
|
||||
DYLIB_CURRENT_VERSION = 1;
|
||||
DYLIB_INSTALL_NAME_BASE = "@rpath";
|
||||
|
@ -324,7 +329,6 @@
|
|||
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @loader_path/Frameworks @loader_path/../Frameworks";
|
||||
PRODUCT_BUNDLE_IDENTIFIER = net.kode54.libbinio;
|
||||
PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)";
|
||||
PROVISIONING_PROFILE_SPECIFIER = "";
|
||||
SKIP_INSTALL = YES;
|
||||
};
|
||||
name = Release;
|
||||
|
|
|
@ -432,7 +432,7 @@
|
|||
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
|
||||
GCC_WARN_UNUSED_FUNCTION = YES;
|
||||
GCC_WARN_UNUSED_VARIABLE = YES;
|
||||
MACOSX_DEPLOYMENT_TARGET = 10.12;
|
||||
MACOSX_DEPLOYMENT_TARGET = 10.13;
|
||||
MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;
|
||||
MTL_FAST_MATH = YES;
|
||||
ONLY_ACTIVE_ARCH = YES;
|
||||
|
@ -531,7 +531,7 @@
|
|||
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
|
||||
GCC_WARN_UNUSED_FUNCTION = YES;
|
||||
GCC_WARN_UNUSED_VARIABLE = YES;
|
||||
MACOSX_DEPLOYMENT_TARGET = 10.12;
|
||||
MACOSX_DEPLOYMENT_TARGET = 10.13;
|
||||
MTL_ENABLE_DEBUG_INFO = NO;
|
||||
MTL_FAST_MATH = YES;
|
||||
SDKROOT = macosx;
|
||||
|
|
|
@ -420,7 +420,7 @@
|
|||
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
|
||||
GCC_WARN_UNUSED_FUNCTION = YES;
|
||||
GCC_WARN_UNUSED_VARIABLE = YES;
|
||||
MACOSX_DEPLOYMENT_TARGET = 10.12;
|
||||
MACOSX_DEPLOYMENT_TARGET = 10.13;
|
||||
MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;
|
||||
MTL_FAST_MATH = YES;
|
||||
ONLY_ACTIVE_ARCH = YES;
|
||||
|
@ -519,7 +519,7 @@
|
|||
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
|
||||
GCC_WARN_UNUSED_FUNCTION = YES;
|
||||
GCC_WARN_UNUSED_VARIABLE = YES;
|
||||
MACOSX_DEPLOYMENT_TARGET = 10.12;
|
||||
MACOSX_DEPLOYMENT_TARGET = 10.13;
|
||||
MTL_ENABLE_DEBUG_INFO = NO;
|
||||
MTL_FAST_MATH = YES;
|
||||
SDKROOT = macosx;
|
||||
|
|
|
@ -198,6 +198,7 @@
|
|||
/* Begin PBXFileReference section */
|
||||
8354900726186D9E004988A7 /* mos652x.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = mos652x.cpp; sourceTree = "<group>"; };
|
||||
8354900826186D9E004988A7 /* mos652x.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = mos652x.h; sourceTree = "<group>"; };
|
||||
83747BCF2862D5A30021245F /* Shared.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Shared.xcconfig; sourceTree = "<group>"; };
|
||||
EDBE8EF925E7E641001EB4A4 /* sidplayfp.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = sidplayfp.framework; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||
EDBE8F1225E7E79F001EB4A4 /* sidrandom.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = sidrandom.h; path = sidplayfp/src/sidrandom.h; sourceTree = "<group>"; };
|
||||
EDBE8F1325E7E79F001EB4A4 /* reloc65.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = reloc65.cpp; path = sidplayfp/src/reloc65.cpp; sourceTree = "<group>"; };
|
||||
|
@ -454,9 +455,19 @@
|
|||
/* End PBXFrameworksBuildPhase section */
|
||||
|
||||
/* Begin PBXGroup section */
|
||||
83747BCE2862D5A30021245F /* Xcode-config */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
83747BCF2862D5A30021245F /* Shared.xcconfig */,
|
||||
);
|
||||
name = "Xcode-config";
|
||||
path = "../../Xcode-config";
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
EDBE8EEF25E7E641001EB4A4 = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
83747BCE2862D5A30021245F /* Xcode-config */,
|
||||
EDBE911625E7E7F9001EB4A4 /* Info.plist */,
|
||||
EDBE8F1125E7E782001EB4A4 /* generated */,
|
||||
EDBE8F1025E7E76A001EB4A4 /* libsidplay */,
|
||||
|
@ -1248,6 +1259,7 @@
|
|||
/* Begin XCBuildConfiguration section */
|
||||
EDBE8EFF25E7E641001EB4A4 /* Debug */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
baseConfigurationReference = 83747BCF2862D5A30021245F /* Shared.xcconfig */;
|
||||
buildSettings = {
|
||||
ALWAYS_SEARCH_USER_PATHS = NO;
|
||||
CLANG_ANALYZER_NONNULL = YES;
|
||||
|
@ -1299,7 +1311,7 @@
|
|||
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
|
||||
GCC_WARN_UNUSED_FUNCTION = YES;
|
||||
GCC_WARN_UNUSED_VARIABLE = YES;
|
||||
MACOSX_DEPLOYMENT_TARGET = 10.12;
|
||||
MACOSX_DEPLOYMENT_TARGET = 10.13;
|
||||
MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;
|
||||
MTL_FAST_MATH = YES;
|
||||
ONLY_ACTIVE_ARCH = YES;
|
||||
|
@ -1311,6 +1323,7 @@
|
|||
};
|
||||
EDBE8F0025E7E641001EB4A4 /* Release */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
baseConfigurationReference = 83747BCF2862D5A30021245F /* Shared.xcconfig */;
|
||||
buildSettings = {
|
||||
ALWAYS_SEARCH_USER_PATHS = NO;
|
||||
CLANG_ANALYZER_NONNULL = YES;
|
||||
|
@ -1356,7 +1369,7 @@
|
|||
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
|
||||
GCC_WARN_UNUSED_FUNCTION = YES;
|
||||
GCC_WARN_UNUSED_VARIABLE = YES;
|
||||
MACOSX_DEPLOYMENT_TARGET = 10.12;
|
||||
MACOSX_DEPLOYMENT_TARGET = 10.13;
|
||||
MTL_ENABLE_DEBUG_INFO = NO;
|
||||
MTL_FAST_MATH = YES;
|
||||
SDKROOT = macosx;
|
||||
|
@ -1369,7 +1382,6 @@
|
|||
isa = XCBuildConfiguration;
|
||||
buildSettings = {
|
||||
CLANG_WARN_DOCUMENTATION_COMMENTS = NO;
|
||||
CODE_SIGN_STYLE = Automatic;
|
||||
COMBINE_HIDPI_IMAGES = YES;
|
||||
DEAD_CODE_STRIPPING = YES;
|
||||
DEFINES_MODULE = NO;
|
||||
|
@ -1405,7 +1417,6 @@
|
|||
isa = XCBuildConfiguration;
|
||||
buildSettings = {
|
||||
CLANG_WARN_DOCUMENTATION_COMMENTS = NO;
|
||||
CODE_SIGN_STYLE = Automatic;
|
||||
COMBINE_HIDPI_IMAGES = YES;
|
||||
DEAD_CODE_STRIPPING = YES;
|
||||
DEFINES_MODULE = NO;
|
||||
|
|
|
@ -120,6 +120,7 @@
|
|||
83299FC31E7657ED003A3242 /* timing.c in Sources */ = {isa = PBXBuildFile; fileRef = 83299FC11E7657ED003A3242 /* timing.c */; };
|
||||
8333B6631DCC440C004C140D /* sharkport.c in Sources */ = {isa = PBXBuildFile; fileRef = 8333B6611DCC440C004C140D /* sharkport.c */; };
|
||||
8333B6671DCC4451004C140D /* tile-cache.c in Sources */ = {isa = PBXBuildFile; fileRef = 8333B6651DCC4451004C140D /* tile-cache.c */; };
|
||||
83747BA92862D5430021245F /* Shared.xcconfig in Resources */ = {isa = PBXBuildFile; fileRef = 83747BA72862D5430021245F /* Shared.xcconfig */; };
|
||||
837612EE1DD6AA2B001EED3D /* LICENSE in Resources */ = {isa = PBXBuildFile; fileRef = 837612ED1DD6AA2B001EED3D /* LICENSE */; };
|
||||
837CEA73234875D700E62A4A /* audio-mixer.c in Sources */ = {isa = PBXBuildFile; fileRef = 837CEA70234875D700E62A4A /* audio-mixer.c */; };
|
||||
83C9A7D02632122C00725A49 /* gpio.c in Sources */ = {isa = PBXBuildFile; fileRef = 83C9A7CC2632122C00725A49 /* gpio.c */; };
|
||||
|
@ -301,6 +302,7 @@
|
|||
83299FC11E7657ED003A3242 /* timing.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = timing.c; sourceTree = "<group>"; };
|
||||
8333B6611DCC440C004C140D /* sharkport.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = sharkport.c; sourceTree = "<group>"; };
|
||||
8333B6651DCC4451004C140D /* tile-cache.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = "tile-cache.c"; sourceTree = "<group>"; };
|
||||
83747BA72862D5430021245F /* Shared.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = Shared.xcconfig; sourceTree = "<group>"; };
|
||||
837612ED1DD6AA2B001EED3D /* LICENSE */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = LICENSE; sourceTree = "<group>"; };
|
||||
837CEA70234875D700E62A4A /* audio-mixer.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = "audio-mixer.c"; sourceTree = "<group>"; };
|
||||
83C9A7CC2632122C00725A49 /* gpio.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = gpio.c; sourceTree = "<group>"; };
|
||||
|
@ -697,6 +699,15 @@
|
|||
path = windows;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
83747BA62862D5430021245F /* Xcode-config */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
83747BA72862D5430021245F /* Shared.xcconfig */,
|
||||
);
|
||||
name = "Xcode-config";
|
||||
path = "../../Xcode-config";
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
837CEA6E234875D700E62A4A /* extra */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
|
@ -739,6 +750,7 @@
|
|||
83CA24091D7BC47C00F2EA53 = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
83747BA62862D5430021245F /* Xcode-config */,
|
||||
83CA24151D7BC47C00F2EA53 /* mGBA */,
|
||||
83CA24141D7BC47C00F2EA53 /* Products */,
|
||||
);
|
||||
|
@ -1099,7 +1111,7 @@
|
|||
TargetAttributes = {
|
||||
83CA24121D7BC47C00F2EA53 = {
|
||||
DevelopmentTeam = "";
|
||||
ProvisioningStyle = Automatic;
|
||||
ProvisioningStyle = Manual;
|
||||
};
|
||||
};
|
||||
};
|
||||
|
@ -1127,6 +1139,7 @@
|
|||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
837612EE1DD6AA2B001EED3D /* LICENSE in Resources */,
|
||||
83747BA92862D5430021245F /* Shared.xcconfig in Resources */,
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
};
|
||||
|
@ -1204,6 +1217,7 @@
|
|||
/* Begin XCBuildConfiguration section */
|
||||
83CA24191D7BC47C00F2EA53 /* Debug */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
baseConfigurationReference = 83747BA72862D5430021245F /* Shared.xcconfig */;
|
||||
buildSettings = {
|
||||
ALWAYS_SEARCH_USER_PATHS = NO;
|
||||
CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES;
|
||||
|
@ -1254,7 +1268,7 @@
|
|||
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
|
||||
GCC_WARN_UNUSED_FUNCTION = YES;
|
||||
GCC_WARN_UNUSED_VARIABLE = YES;
|
||||
MACOSX_DEPLOYMENT_TARGET = 10.12;
|
||||
MACOSX_DEPLOYMENT_TARGET = 10.13;
|
||||
MTL_ENABLE_DEBUG_INFO = YES;
|
||||
ONLY_ACTIVE_ARCH = YES;
|
||||
SDKROOT = macosx;
|
||||
|
@ -1265,6 +1279,7 @@
|
|||
};
|
||||
83CA241A1D7BC47C00F2EA53 /* Release */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
baseConfigurationReference = 83747BA72862D5430021245F /* Shared.xcconfig */;
|
||||
buildSettings = {
|
||||
ALWAYS_SEARCH_USER_PATHS = NO;
|
||||
CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES;
|
||||
|
@ -1309,7 +1324,7 @@
|
|||
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
|
||||
GCC_WARN_UNUSED_FUNCTION = YES;
|
||||
GCC_WARN_UNUSED_VARIABLE = YES;
|
||||
MACOSX_DEPLOYMENT_TARGET = 10.12;
|
||||
MACOSX_DEPLOYMENT_TARGET = 10.13;
|
||||
MTL_ENABLE_DEBUG_INFO = NO;
|
||||
SDKROOT = macosx;
|
||||
VERSIONING_SYSTEM = "apple-generic";
|
||||
|
@ -1320,11 +1335,8 @@
|
|||
83CA241C1D7BC47C00F2EA53 /* Debug */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
buildSettings = {
|
||||
CODE_SIGN_IDENTITY = "";
|
||||
CODE_SIGN_STYLE = Automatic;
|
||||
COMBINE_HIDPI_IMAGES = YES;
|
||||
DEAD_CODE_STRIPPING = YES;
|
||||
DEVELOPMENT_TEAM = "";
|
||||
DYLIB_COMPATIBILITY_VERSION = 1;
|
||||
DYLIB_CURRENT_VERSION = 1;
|
||||
FRAMEWORK_VERSION = A;
|
||||
|
@ -1349,7 +1361,6 @@
|
|||
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/Frameworks";
|
||||
PRODUCT_BUNDLE_IDENTIFIER = net.kode54.mGBA;
|
||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||
PROVISIONING_PROFILE_SPECIFIER = "";
|
||||
SKIP_INSTALL = YES;
|
||||
};
|
||||
name = Debug;
|
||||
|
@ -1357,11 +1368,8 @@
|
|||
83CA241D1D7BC47C00F2EA53 /* Release */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
buildSettings = {
|
||||
CODE_SIGN_IDENTITY = "";
|
||||
CODE_SIGN_STYLE = Automatic;
|
||||
COMBINE_HIDPI_IMAGES = YES;
|
||||
DEAD_CODE_STRIPPING = YES;
|
||||
DEVELOPMENT_TEAM = "";
|
||||
DYLIB_COMPATIBILITY_VERSION = 1;
|
||||
DYLIB_CURRENT_VERSION = 1;
|
||||
FRAMEWORK_VERSION = A;
|
||||
|
@ -1385,7 +1393,6 @@
|
|||
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/Frameworks";
|
||||
PRODUCT_BUNDLE_IDENTIFIER = net.kode54.mGBA;
|
||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||
PROVISIONING_PROFILE_SPECIFIER = "";
|
||||
SKIP_INSTALL = YES;
|
||||
};
|
||||
name = Release;
|
||||
|
|
Some files were not shown because too many files have changed in this diff Show more
Loading…
Reference in a new issue