From 0b0834a7ffdf397fe2fab0fd2ff0d8e350d42b31 Mon Sep 17 00:00:00 2001 From: vspader Date: Tue, 20 Feb 2007 01:02:23 +0000 Subject: [PATCH] Added output device selection through preferences...hopefully. --- PlaybackController.h | 2 + PlaybackController.m | 2 +- .../English.lproj/Preferences.nib/classes.nib | 13 +++ .../English.lproj/Preferences.nib/info.nib | 15 ++-- .../Preferences.nib/keyedobjects.nib | Bin 9435 -> 12708 bytes .../General/General.xcodeproj/project.pbxproj | 24 ++++++ Preferences/General/OutputPane.h | 19 +++++ Preferences/General/OutputPane.m | 29 +++++++ Preferences/General/OutputsArrayController.h | 10 +++ Preferences/General/OutputsArrayController.m | 47 ++++++++++ Preferences/General/PrefPaneController.h | 3 + Preferences/General/PrefPaneController.m | 7 +- Sound/OutputCoreAudio.h | 4 + Sound/OutputCoreAudio.m | 80 +++++++++++++++++- Sound/SoundController.m | 3 +- 15 files changed, 246 insertions(+), 12 deletions(-) create mode 100644 Preferences/General/OutputPane.h create mode 100644 Preferences/General/OutputPane.m create mode 100644 Preferences/General/OutputsArrayController.h create mode 100644 Preferences/General/OutputsArrayController.m diff --git a/PlaybackController.h b/PlaybackController.h index c94b7cebd..ada95f374 100644 --- a/PlaybackController.h +++ b/PlaybackController.h @@ -21,6 +21,8 @@ IBOutlet NSButton *playButton; + IBOutlet NSArrayController *outputDevices; + NSTimer *positionTimer; BOOL waitingForPlay; //No sneaky changing on us diff --git a/PlaybackController.m b/PlaybackController.m index f567d2550..10f0636c8 100644 --- a/PlaybackController.m +++ b/PlaybackController.m @@ -26,7 +26,7 @@ [volumeSlider setDoubleValue:pow(10.0, log10(0.5)/4.0)*[volumeSlider maxValue]]; } - + - (IBAction)playPauseResume:(id)sender { DBLog(@"PLAYING"); diff --git a/Preferences/General/English.lproj/Preferences.nib/classes.nib b/Preferences/General/English.lproj/Preferences.nib/classes.nib index 9636e27fd..0d1b71b3f 100644 --- a/Preferences/General/English.lproj/Preferences.nib/classes.nib +++ b/Preferences/General/English.lproj/Preferences.nib/classes.nib @@ -26,12 +26,25 @@ SUPERCLASS = PreferencePane; }, {CLASS = NDHotKeyControl; LANGUAGE = ObjC; SUPERCLASS = NSTextField; }, + { + ACTIONS = {takeDeviceID = id; }; + CLASS = OutputPane; + LANGUAGE = ObjC; + OUTLETS = {outputDevices = OutputsArrayController; }; + SUPERCLASS = PreferencePane; + }, + { + CLASS = OutputsArrayController; + LANGUAGE = ObjC; + SUPERCLASS = NSArrayController; + }, { CLASS = PrefPaneController; LANGUAGE = ObjC; OUTLETS = { fileDrawerPane = FileDrawerPane; hotKeyPane = HotKeyPane; + outputPane = OutputPane; remotePane = RemotePane; updatesPane = UpdatesPane; }; diff --git a/Preferences/General/English.lproj/Preferences.nib/info.nib b/Preferences/General/English.lproj/Preferences.nib/info.nib index eaa7bdd15..5b8344bba 100644 --- a/Preferences/General/English.lproj/Preferences.nib/info.nib +++ b/Preferences/General/English.lproj/Preferences.nib/info.nib @@ -3,17 +3,19 @@ IBDocumentLocation - 102 216 356 240 0 0 1024 746 + 218 642 356 240 0 0 1680 1028 IBEditorPositions 10 - 259 468 506 102 0 0 1024 746 + 587 659 506 102 0 0 1680 1028 11 - 375 444 273 151 0 0 1024 746 + 703 634 273 151 0 0 1680 1028 43 - 166 564 337 96 0 0 1024 746 + 671 662 337 96 0 0 1680 1028 50 - 233 146 355 96 0 0 1024 746 + 662 662 355 96 0 0 1680 1028 + 58 + 634 659 411 101 0 0 1680 1028 IBFramework Version 446.1 @@ -21,10 +23,11 @@ 11 10 + 58 50 43 IBSystem Version - 8L127 + 8L2127 diff --git a/Preferences/General/English.lproj/Preferences.nib/keyedobjects.nib b/Preferences/General/English.lproj/Preferences.nib/keyedobjects.nib index 2e84930cadda94f69821ca465d73acf343b3e232..144cb21c933d161e065e8b9389fa41bba5036adc 100644 GIT binary patch literal 12708 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 M_R447dn5k;0dOInH~;_u literal 9435 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 T@*AN3QK}u;x7xAsQ$F>7Z9r&s diff --git a/Preferences/General/General.xcodeproj/project.pbxproj b/Preferences/General/General.xcodeproj/project.pbxproj index f73a670c2..42e404d72 100644 --- a/Preferences/General/General.xcodeproj/project.pbxproj +++ b/Preferences/General/General.xcodeproj/project.pbxproj @@ -9,6 +9,11 @@ /* Begin PBXBuildFile section */ 172D72480B891FEF00D095BB /* RemotePane.m in Sources */ = {isa = PBXBuildFile; fileRef = 172D72470B891FEF00D095BB /* RemotePane.m */; }; 172D72AD0B8926CA00D095BB /* apple_remote.png in Resources */ = {isa = PBXBuildFile; fileRef = 172D72AC0B8926CA00D095BB /* apple_remote.png */; }; + 17C643380B8A77CC00C53518 /* OutputsArrayController.m in Sources */ = {isa = PBXBuildFile; fileRef = 17C643360B8A77CC00C53518 /* OutputsArrayController.m */; }; + 17C6433F0B8A783F00C53518 /* OutputPane.m in Sources */ = {isa = PBXBuildFile; fileRef = 17C6433E0B8A783F00C53518 /* OutputPane.m */; }; + 17C643690B8A788000C53518 /* output.png in Resources */ = {isa = PBXBuildFile; fileRef = 17C643680B8A788000C53518 /* output.png */; }; + 17C644330B8A791D00C53518 /* CoreAudio.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 17C644310B8A791D00C53518 /* CoreAudio.framework */; }; + 17C644340B8A791D00C53518 /* CoreAudioKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 17C644320B8A791D00C53518 /* CoreAudioKit.framework */; }; 8D5B49B0048680CD000E48DA /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 089C167DFE841241C02AAC07 /* InfoPlist.strings */; }; 8D5B49B4048680CD000E48DA /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7ADFEA557BF11CA2CBB /* Cocoa.framework */; }; 8E07AA870AAC8EA200A4B32F /* FileDrawerPane.m in Sources */ = {isa = PBXBuildFile; fileRef = 8E07AA7F0AAC8EA200A4B32F /* FileDrawerPane.m */; }; @@ -34,6 +39,13 @@ 172D72460B891FEF00D095BB /* RemotePane.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = RemotePane.h; sourceTree = ""; }; 172D72470B891FEF00D095BB /* RemotePane.m */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.objc; path = RemotePane.m; sourceTree = ""; }; 172D72AC0B8926CA00D095BB /* apple_remote.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = apple_remote.png; path = Icons/apple_remote.png; sourceTree = ""; }; + 17C643360B8A77CC00C53518 /* OutputsArrayController.m */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.objc; path = OutputsArrayController.m; sourceTree = ""; }; + 17C643370B8A77CC00C53518 /* OutputsArrayController.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = OutputsArrayController.h; sourceTree = ""; }; + 17C6433D0B8A783F00C53518 /* OutputPane.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = OutputPane.h; sourceTree = ""; }; + 17C6433E0B8A783F00C53518 /* OutputPane.m */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.objc; path = OutputPane.m; sourceTree = ""; }; + 17C643680B8A788000C53518 /* output.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = output.png; path = Icons/output.png; sourceTree = ""; }; + 17C644310B8A791D00C53518 /* CoreAudio.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreAudio.framework; path = /System/Library/Frameworks/CoreAudio.framework; sourceTree = ""; }; + 17C644320B8A791D00C53518 /* CoreAudioKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreAudioKit.framework; path = /System/Library/Frameworks/CoreAudioKit.framework; sourceTree = ""; }; 32DBCF630370AF2F00C91783 /* General_Prefix.pch */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = General_Prefix.pch; sourceTree = ""; }; 8D5B49B6048680CD000E48DA /* General.preferencePane */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = General.preferencePane; sourceTree = BUILT_PRODUCTS_DIR; }; 8D5B49B7048680CD000E48DA /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = Info.plist; sourceTree = ""; }; @@ -69,6 +81,8 @@ files = ( 8D5B49B4048680CD000E48DA /* Cocoa.framework in Frameworks */, 8E6C123A0AACAEF200819171 /* Carbon.framework in Frameworks */, + 17C644330B8A791D00C53518 /* CoreAudio.framework in Frameworks */, + 17C644340B8A791D00C53518 /* CoreAudioKit.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -131,6 +145,8 @@ 1058C7AEFEA557BF11CA2CBB /* Other Frameworks */ = { isa = PBXGroup; children = ( + 17C644310B8A791D00C53518 /* CoreAudio.framework */, + 17C644320B8A791D00C53518 /* CoreAudioKit.framework */, 089C167FFE841241C02AAC07 /* AppKit.framework */, D2F7E65807B2D6F200F64583 /* CoreData.framework */, 089C1672FE841209C02AAC07 /* Foundation.framework */, @@ -151,6 +167,8 @@ 172D72470B891FEF00D095BB /* RemotePane.m */, 8E15A8340B8944C4006DC802 /* UpdatesPane.h */, 8E15A8350B8944C4006DC802 /* UpdatesPane.m */, + 17C6433D0B8A783F00C53518 /* OutputPane.h */, + 17C6433E0B8A783F00C53518 /* OutputPane.m */, ); name = Panes; sourceTree = ""; @@ -164,6 +182,8 @@ 8E6C12150AACAE4100819171 /* NDHotKeyEvent.m */, 8E6C139E0AACBAB500819171 /* HotKeyControl.h */, 8E6C139F0AACBAB500819171 /* HotKeyControl.m */, + 17C643370B8A77CC00C53518 /* OutputsArrayController.h */, + 17C643360B8A77CC00C53518 /* OutputsArrayController.m */, ); name = Custom; sourceTree = ""; @@ -187,6 +207,7 @@ 8E07ABD90AAC95AF00A4B32F /* Icons */ = { isa = PBXGroup; children = ( + 17C643680B8A788000C53518 /* output.png */, 8E15A86B0B894768006DC802 /* updates.png */, 172D72AC0B8926CA00D095BB /* apple_remote.png */, 8E07ABDA0AAC95BC00A4B32F /* file_drawer.png */, @@ -242,6 +263,7 @@ 8E07AC050AAC968C00A4B32F /* Preferences.nib in Resources */, 172D72AD0B8926CA00D095BB /* apple_remote.png in Resources */, 8E15A86C0B894768006DC802 /* updates.png in Resources */, + 17C643690B8A788000C53518 /* output.png in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -261,6 +283,8 @@ 8E6C13A00AACBAB500819171 /* HotKeyControl.m in Sources */, 172D72480B891FEF00D095BB /* RemotePane.m in Sources */, 8E15A8360B8944C4006DC802 /* UpdatesPane.m in Sources */, + 17C643380B8A77CC00C53518 /* OutputsArrayController.m in Sources */, + 17C6433F0B8A783F00C53518 /* OutputPane.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/Preferences/General/OutputPane.h b/Preferences/General/OutputPane.h new file mode 100644 index 000000000..d47b2f50d --- /dev/null +++ b/Preferences/General/OutputPane.h @@ -0,0 +1,19 @@ +// +// OutputPane.h +// Preferences +// +// Created by Vincent Spader on 9/4/06. +// Copyright 2006 Vincent Spader. All rights reserved. +// + +#import +#import "PreferencePane.h" +#import "OutputsArrayController.h" + +@interface OutputPane : PreferencePane { + IBOutlet OutputsArrayController *outputDevices; +} + +- (IBAction) takeDeviceID:(id)sender; + +@end diff --git a/Preferences/General/OutputPane.m b/Preferences/General/OutputPane.m new file mode 100644 index 000000000..f0e8d2834 --- /dev/null +++ b/Preferences/General/OutputPane.m @@ -0,0 +1,29 @@ +// +// OutputPane.m +// Preferences +// +// Created by Vincent Spader on 9/4/06. +// Copyright 2006 Vincent Spader. All rights reserved. +// + +#import "OutputPane.h" + + +@implementation OutputPane + +- (void)awakeFromNib +{ + NSLog(@"AWOKEN!"); + [self setName:@"Output"]; + [self setIcon:@"output"]; +} + +- (IBAction) takeDeviceID:(id)sender +{ + NSLog(@"Taking thing: %@", [outputDevices selectedObjects]); + NSDictionary *device = [[outputDevices selectedObjects] objectAtIndex:0]; + [[NSUserDefaults standardUserDefaults] setObject: device forKey:@"outputDevice"]; +} + + +@end diff --git a/Preferences/General/OutputsArrayController.h b/Preferences/General/OutputsArrayController.h new file mode 100644 index 000000000..ea581f6ae --- /dev/null +++ b/Preferences/General/OutputsArrayController.h @@ -0,0 +1,10 @@ +/* OutputsArrayController */ + +#import + +#import + +@interface OutputsArrayController : NSArrayController +{ +} +@end diff --git a/Preferences/General/OutputsArrayController.m b/Preferences/General/OutputsArrayController.m new file mode 100644 index 000000000..b9426104c --- /dev/null +++ b/Preferences/General/OutputsArrayController.m @@ -0,0 +1,47 @@ +#import "OutputsArrayController.h" + +@implementation OutputsArrayController + +- (void)awakeFromNib +{ + NSLog(@"initOutputDeviceList"); + [self removeObjects:[self arrangedObjects]]; + + [self setSelectsInsertedObjects:NO]; + + NSLog(@"OutputCoreAudio.setup()"); + UInt32 propsize; + verify_noerr(AudioHardwareGetPropertyInfo(kAudioHardwarePropertyDevices, &propsize, NULL)); + int nDevices = propsize / sizeof(AudioDeviceID); + AudioDeviceID *devids = malloc(propsize); + verify_noerr(AudioHardwareGetProperty(kAudioHardwarePropertyDevices, &propsize, devids)); + int i; + NSLog(@"Number of devices: %d", nDevices); + for (i = 0; i < nDevices; ++i) { + char name[64]; + UInt32 maxlen = 64; + verify_noerr(AudioDeviceGetProperty(devids[i], 0, false, kAudioDevicePropertyDeviceName, &maxlen, name)); + NSLog(@"Device: %d %s", devids[i], name); + + // Ignore devices that have no output channels: + // This tells us the size of the buffer required to hold the information about the channels + UInt32 propSize; + verify_noerr(AudioDeviceGetPropertyInfo(devids[i], 0, false, kAudioDevicePropertyStreamConfiguration, &propSize, NULL)); + // Knowing the size of the required buffer, we can determine how many channels there are + // without actually allocating a buffer and requesting the information. + // (we don't care about the exact number of channels, only if there are more than zero or not) + if (propSize <= sizeof(UInt32)) continue; + + NSObject *deviceInfo = [NSDictionary dictionaryWithObjectsAndKeys: + [NSString stringWithCString:name], @"name", + [NSNumber numberWithLong:devids[i]], @"deviceID", + nil]; + [self addObject:deviceInfo]; + [deviceInfo release]; + } + free(devids); + + [self setSelectionIndex:0]; +} + +@end diff --git a/Preferences/General/PrefPaneController.h b/Preferences/General/PrefPaneController.h index c1219e720..38d3407fa 100644 --- a/Preferences/General/PrefPaneController.h +++ b/Preferences/General/PrefPaneController.h @@ -13,17 +13,20 @@ #import "FileDrawerPane.h" #import "RemotePane.h" #import "UpdatesPane.h" +#import "OutputPane.h" @interface PrefPaneController : NSObject { IBOutlet HotKeyPane *hotKeyPane; IBOutlet FileDrawerPane *fileDrawerPane; IBOutlet RemotePane *remotePane; IBOutlet UpdatesPane *updatesPane; + IBOutlet OutputPane *outputPane; } - (HotKeyPane *)hotKeyPane; - (FileDrawerPane *)fileDrawerPane; - (RemotePane *)remotePane; - (UpdatesPane *)updatesPane; +- (UpdatesPane *)outputPane; @end diff --git a/Preferences/General/PrefPaneController.m b/Preferences/General/PrefPaneController.m index 376cb987f..65a49d3a1 100644 --- a/Preferences/General/PrefPaneController.m +++ b/Preferences/General/PrefPaneController.m @@ -18,7 +18,7 @@ PrefPaneController *prefPaneController = [[PrefPaneController alloc] init]; loaded = [NSBundle loadNibNamed:@"Preferences" owner:prefPaneController]; - return [NSArray arrayWithObjects: [prefPaneController hotKeyPane], [prefPaneController fileDrawerPane], [prefPaneController remotePane], [prefPaneController updatesPane], nil]; + return [NSArray arrayWithObjects: [prefPaneController hotKeyPane], [prefPaneController fileDrawerPane], [prefPaneController remotePane], [prefPaneController updatesPane], [prefPaneController outputPane], nil]; } - (HotKeyPane *)hotKeyPane @@ -41,4 +41,9 @@ return updatesPane; } +- (OutputPane *)outputPane +{ + return outputPane; +} + @end diff --git a/Sound/OutputCoreAudio.h b/Sound/OutputCoreAudio.h index 2a56b9b52..708888430 100644 --- a/Sound/OutputCoreAudio.h +++ b/Sound/OutputCoreAudio.h @@ -23,7 +23,11 @@ - (id)initWithController:(id)c; - (BOOL)setup; +- (BOOL)setOutputDevice:(AudioDeviceID)outputDevice; - (void)start; +- (void)pause; +- (void)resume; +- (void)stop; - (void)setVolume:(double) v; diff --git a/Sound/OutputCoreAudio.m b/Sound/OutputCoreAudio.m index 2b03fde1f..60b3ee273 100644 --- a/Sound/OutputCoreAudio.m +++ b/Sound/OutputCoreAudio.m @@ -18,6 +18,8 @@ { outputController = c; outputUnit = NULL; + + [[NSUserDefaultsController sharedUserDefaultsController] addObserver:self forKeyPath:@"values.outputDevice" options:0 context:NULL]; } return self; @@ -54,11 +56,65 @@ static OSStatus Sound_Renderer(void *inRefCon, AudioUnitRenderActionFlags *ioAc ioData->mBuffers[0].mDataByteSize = amountRead; return err; -} +} + +- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context +{ + if ([keyPath isEqualToString:@"values.outputDevice"]) { + NSLog(@"CHANGED!"); + NSDictionary *device = [[[NSUserDefaultsController sharedUserDefaultsController] defaults] objectForKey:@"outputDevice"]; + + NSNumber *deviceID = [device objectForKey:@"deviceID"]; + + NSLog(@"Selecting output device %d %@", [deviceID longValue], [device objectForKey:@"name"]); + [self setOutputDevice:[deviceID longValue]]; + } +} + + + +- (BOOL)setOutputDevice:(AudioDeviceID)outputDevice +{ + // Set the output device + AudioDeviceID deviceID = outputDevice; //XXX use default if null + NSLog(@"WEEE"); + NSLog(@"Using output device %d", deviceID); + OSStatus err; + + if (outputDevice == -1) { + UInt32 size = sizeof(AudioDeviceID); + err = AudioHardwareGetProperty(kAudioHardwarePropertyDefaultOutputDevice, + &size, + &deviceID); + + if (err != noErr) { + NSLog(@"THERES NO DEFAULT OUTPUT DEVICE! GARRRGGHHH"); + + return NO; + } + + NSLog(@"Default output device: %i", deviceID); + } + + + err = AudioUnitSetProperty(outputUnit, + kAudioOutputUnitProperty_CurrentDevice, + kAudioUnitScope_Global, + 0, + &deviceID, + sizeof(AudioDeviceID)); + + if (err != noErr) { + NSLog(@"THERES NO OUTPUT DEVICE! AHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH!!!!! %i", err); + + return NO; + } + + return YES; +} - (BOOL)setup { - DBLog(@"SETUP"); if (outputUnit) [self stop]; @@ -84,6 +140,7 @@ static OSStatus Sound_Renderer(void *inRefCon, AudioUnitRenderActionFlags *ioAc if (err != noErr) return NO; + NSLog(@"SETUP"); UInt32 size = sizeof (AudioStreamBasicDescription); Boolean outWritable; @@ -138,6 +195,25 @@ static OSStatus Sound_Renderer(void *inRefCon, AudioUnitRenderActionFlags *ioAc DBLog(@"Audio output successfully initialized"); + NSDictionary *device = [[[NSUserDefaultsController sharedUserDefaultsController] defaults] objectForKey:@"outputDevice"]; + + if (device) { + NSLog(@"THIS ONE"); + BOOL ok = [self setOutputDevice:[[device objectForKey:@"deviceID"] longValue]]; + if (!ok) { + //Ruh roh. + [self setOutputDevice: -1]; + + [[[NSUserDefaultsController sharedUserDefaultsController] defaults] removeObjectForKey:@"outputDevice"]; + } + } + else { + NSLog(@"THAT ONE"); + + [self setOutputDevice: -1]; + } + + NSLog(@"DONE SETTING UP"); return (err == noErr); } diff --git a/Sound/SoundController.m b/Sound/SoundController.m index 82dacff63..fb94d0719 100644 --- a/Sound/SoundController.m +++ b/Sound/SoundController.m @@ -14,7 +14,7 @@ - (id)initWithDelegate:(id)d { DBLog(@"Initializing\n"); - + self = [super init]; if (self) { @@ -120,7 +120,6 @@ - (void)setNextEntry:(PlaylistEntry *)pe { [pe retain]; - NSLog(@"Releasing: %@", [pe display]); [nextEntry release]; nextEntry = pe; }