Here is a complete, if somewhat crude function that will play some kind of sound for testing (select another file if you do not have GarageBand installed there). To avoid hard coding of the device identifier, it switches to your notification device (“sound effects”), which you can set in the system settings.
AVAudioEngine *engine = [[AVAudioEngine alloc] init]; AudioUnit outputUnit = engine.outputNode.audioUnit; OSStatus err = noErr; AudioDeviceID outputDeviceID; UInt32 propertySize; AudioObjectPropertyAddress propertyAddress = { kAudioHardwarePropertyDefaultSystemOutputDevice, kAudioObjectPropertyScopeGlobal, kAudioObjectPropertyElementMaster }; propertySize = sizeof(outputDeviceID); err = AudioObjectGetPropertyData(kAudioObjectSystemObject, &propertyAddress, 0, NULL, &propertySize, &outputDeviceID); if (err) { NSLog(@"AudioHardwareGetProperty: %d", (int)err); return; } err = AudioUnitSetProperty(outputUnit, kAudioOutputUnitProperty_CurrentDevice, kAudioUnitScope_Global, 0, &outputDeviceID, sizeof(outputDeviceID)); if (err) { NSLog(@"AudioUnitSetProperty: %d", (int)err); return; } NSURL *url = [NSURL URLWithString:@"/Applications/GarageBand.app/Contents/Frameworks/MAAlchemy.framework/Versions/A/Resources/Libraries/WaveNoise/Liquid.wav"]; NSError *error = nil; AVAudioFile *file = [[AVAudioFile alloc] initForReading:url error:&error]; if (file == nil) { NSLog(@"AVAudioFile error: %@", error); return; } AVAudioPlayerNode *player = [[AVAudioPlayerNode alloc] init]; [engine attachNode:player]; [engine connect:player to:engine.outputNode format:nil]; NSLog(@"engine: %@", engine); if (![engine startAndReturnError:&error]) { NSLog(@"engine failed to start: %@", error); return; } [player scheduleFile:file atTime:[AVAudioTime timeWithHostTime:mach_absolute_time()] completionHandler:^{ NSLog(@"complete"); }]; [player play];
source share