Created: 2012-03-23 22:10
Updated: 2015-06-30 18:37



YBAudioFramework is a convenience wrapper framework around Apple's CoreAudio and in particular the AudioUnit C APIs. It attempts to abstract away the hairy, meticulous things that you need to deal with when using Apple's APIs. The framework is still under construction, only a limited set of APIs has been wrapped so far. It's geared towards iOS 5+, but may also work on OS X.

Working parts

  • Audio graph
  • Audio node / unit base class (these are merged into one class for convenience)
  • RemoteIO unit (iOS' only audio hardware AudioUnit)
  • Multi channel mixer unit
  • Scheduled sound player unit
  • Audio file player unit
  • Distortion filter unit


  • Finish varispeed unit
  • Wrap more of the standard filter units
  • Write more unit tests. It already has pretty decent code coverage, but needs to be improved.
  • Create a convenient filter base class (on top of / around Apple's public AUEffectBase C++ class)

Code example

This example is taken from the example app that is part of the framework project. It creates two audio players, connected to a mixer, connected to the remote IO output of the iDevice. One of the players also has a distortion effect filter between the output of the player and the input of the mixer. The first player is primed with an audio file with a guitar track. The second player is primed with a corresponding track of the band playing along.

// Create an audio processing graph:
graph = [[YBAudioUnitGraph alloc] init];

// IO:
YBAudioUnitNode *ioNode = [graph addNodeWithType:YBAudioComponentTypeRemoteIO];

// Mixer:
mixerNode = [graph addNodeWithType:YBAudioComponentTypeMultiChannelMixer];
[mixerNode setMaximumFramesPerSlice:4096]; // optional, enables playback during screen lock
[mixerNode setBusCount:2 scope:kAudioUnitScope_Input]; // define 2 inputs busses on the mixer
[mixerNode connectOutput:0 toInput:0 ofNode:ioNode];

// Distortion filter:
distortionFilter = [graph addNodeWithType:YBAudioComponentTypeDistortion];
distortionFilter.delay = 500.;
[distortionFilter connectOutput:0 toInput:0 ofNode:mixerNode];

{   // Guitar file player:
    guitarPlayerNode = [graph addNodeWithType:YBAudioComponentTypeAudioFilePlayer];
    [guitarPlayerNode connectOutput:0 toInput:0 ofNode:distortionFilter];
    NSURL *fileURL = [[NSBundle bundleForClass:[self class]] URLForResource:@"guitar" withExtension:@"m4a"];
    [guitarPlayerNode setFileURL:fileURL typeHint:kAudioFileM4AType];
    [guitarPlayerNode scheduleEntireFilePrimeAndStartImmediately];

{   // Band file player:
    bandPlayerNode = [graph addNodeWithType:YBAudioComponentTypeAudioFilePlayer];
    [bandPlayerNode connectOutput:0 toInput:1 ofNode:mixerNode];
    NSURL *fileURL = [[NSBundle bundleForClass:[self class]] URLForResource:@"band" withExtension:@"m4a"];
    [bandPlayerNode setFileURL:fileURL typeHint:kAudioFileM4AType];
    [bandPlayerNode scheduleEntireFilePrimeAndStartImmediately];

To start the graph's playback:

[graph start];

To stop the graph's playback:

[graph stop];

To change the volume (e.g. 75%) of a channel (e.g. bus 1) on the mixer:

[mixerNode setVolume:0.75 forBus:1];
Cookies help us deliver our services. By using our services, you agree to our use of cookies Learn more