Search code examples
iosavfoundationcore-audio

Can't get AudioStreamBasicDescription from AudioUnit inside MTAudioProcessingTap


Since there's very little (more like none, really) documentation on MTAudioProcessingTap, I'm using Apple's demo app from WWDC 2012.

I am trying to have an Audio Graph inside the MTAudioProcessingTap, so I need to set different stream formats for different units that require specific . But every time I try to use AudioUnitGetProperty to get the AudioUnit's ASBD I get an EXC_BAD_ADDRESS error.

Here's the relevant code which results in EXC_BAD_ACCESS. You can try by yourself by downloading Apple's app and adding this to tap_PrepareCallback

OSStatus status = noErr;

AudioStreamBasicDescription testStream;
        // Set audio unit input/output stream format to processing format.

if (noErr == status)
{
    status = AudioUnitGetProperty(audioUnit, kAudioUnitProperty_StreamFormat, kAudioUnitScope_Input, 0, &testStream, sizeof(AudioStreamBasicDescription));
}

Solution

  • AudioUnitGetProperty takes a pointer to a UInt32 for its size argument, in your sample code you gave a value. Here is the header:

    AudioUnitGetProperty(               AudioUnit               inUnit,
                                    AudioUnitPropertyID     inID,
                                    AudioUnitScope          inScope,
                                    AudioUnitElement        inElement,
                                    void *                  outData,
                                    UInt32 *                ioDataSize)
    

    You should be getting it like this:

    AudioStreamBasicDescription testStream = {0};
    UInt32 sizeTestStream = sizeof(AudioStreamBasicDescription);
    OSStatus status = AudioUnitGetProperty(audioUnit,kAudioUnitProperty_StreamFormat,kAudioUnitScope_Input,0,&testStream,&sizeTestStream);
    if(status){
        //handle error
    }