I'm looking into how to package an Audio Unit consisting of several other audio units. I came up with the following solution, calling the AUAudioUnit render function explicitly from the AUInternalRenderBlock. But the audio unit doesn't seem to run, since mData inside outputData remains uninitialized after the render function has been triggered.
Any suggestions?
From myAudioUnit.m inheriting from AUAudioUnit:
- (AUInternalRenderBlock)internalRenderBlock {
return ^AUAudioUnitStatus(AudioUnitRenderActionFlags *actionFlags, const AudioTimeStamp *timestamp, AVAudioFrameCount frameCount, NSInteger outputBusNumber, AudioBufferList *outputData, const AURenderEvent *realtimeEventListHead, AURenderPullInputBlock pullInputBlock) {
[_eqAudioUnit.audioUnit renderBlock](actionFlags,
timestamp,
frameCount,
outputBusNumber,
outputData,
pullInputBlock);
return noErr;
};
}
_eqAudioUnit is an instance of EQAudioUnit (ensuring that allocateRenderResources is invoked before triggering the renderBlock):
public class EQAudioUnit: NSObject {
public var audioUnit: AUAudioUnit
override init() {
let kAudioUnitSubType = kAudioUnitSubType_Distortion
let audioUnitDesc = AudioComponentDescription(componentType: kAudioUnitType_Effect,
componentSubType: kAudioUnitSubType,
componentManufacturer: kAudioUnitManufacturer_Apple,
componentFlags: 0, componentFlagsMask: 0)
audioUnit = try! AUAudioUnit(componentDescription: audioUnitDesc, options: AudioComponentInstantiationOptions())
let inputFormat = AVAudioFormat(standardFormatWithSampleRate: 44100.0, channels: 2)
try! audioUnit.inputBusses[0].setFormat(inputFormat)
try! audioUnit.outputBusses[0].setFormat(inputFormat)
audioUnit.maximumFramesToRender = 512;
super.init()
}
}