Matthew Mitchell
Matthew Mitchell

Reputation: 5383

Setting up effect audio units for CoreAudio

I'm trying to setup a high-pass filter but AUGraphStart gives me -10863 when I try. I cannot find much documntation at all. Here is my attent to set up the filter:

 - (void)initializeAUGraph{
    AUNode outputNode;
    AUNode mixerNode;
    AUNode effectNode;
    NewAUGraph(&mGraph);
    // Create AudioComponentDescriptions for the AUs we want in the graph
    // mixer component
    AudioComponentDescription mixer_desc;
    mixer_desc.componentType = kAudioUnitType_Mixer;
    mixer_desc.componentSubType = kAudioUnitSubType_AU3DMixerEmbedded;
    mixer_desc.componentFlags = 0;
    mixer_desc.componentFlagsMask = 0;
    mixer_desc.componentManufacturer = kAudioUnitManufacturer_Apple;
    //  output component
    AudioComponentDescription output_desc;
    output_desc.componentType = kAudioUnitType_Output;
    output_desc.componentSubType = kAudioUnitSubType_RemoteIO;
    output_desc.componentFlags = 0;
    output_desc.componentFlagsMask = 0;
    output_desc.componentManufacturer = kAudioUnitManufacturer_Apple;
    //effect component
    AudioComponentDescription effect_desc;
    effect_desc.componentType = kAudioUnitType_Effect;
    effect_desc.componentSubType = kAudioUnitSubType_HighPassFilter;
    effect_desc.componentFlags = 0;
    effect_desc.componentFlagsMask = 0;
    effect_desc.componentManufacturer = kAudioUnitManufacturer_Apple;
    // Add nodes to the graph to hold our AudioUnits
    AUGraphAddNode(mGraph, &output_desc, &outputNode);
    AUGraphAddNode(mGraph, &mixer_desc, &mixerNode);
    AUGraphAddNode(mGraph, &effect_desc, &effectNode);
    // Connect the nodes
    AUGraphConnectNodeInput(mGraph, mixerNode, 0, effectNode, 0);
    AUGraphConnectNodeInput(mGraph, effectNode, 0, outputNode, 0);
    //Open Graph
    AUGraphOpen(mGraph);
    // Get a link to the mixer AU
    AUGraphNodeInfo(mGraph, mixerNode, NULL, &mMixer);
    // Get a link to the effect AU
    AUGraphNodeInfo(mGraph, effectNode, NULL, &mEffect);
    //Setup buses
    size_t numbuses = track_count;
    UInt32 size = sizeof(numbuses);
    AudioUnitSetProperty(mMixer, kAudioUnitProperty_ElementCount, kAudioUnitScope_Input, 0, &numbuses, size);
    //Setup Stream Format Data
    AudioStreamBasicDescription desc;
    size = sizeof(desc);
    // Setup Stream Format
    desc.mSampleRate = kGraphSampleRate;
    desc.mFormatID = kAudioFormatLinearPCM;
    desc.mFormatFlags = kAudioFormatFlagIsSignedInteger | kAudioFormatFlagIsPacked;
    desc.mBitsPerChannel = sizeof(AudioSampleType) * 8; // AudioSampleType == 16 bit signed ints
    desc.mChannelsPerFrame = 1;
    desc.mFramesPerPacket = 1;
    desc.mBytesPerFrame = sizeof(AudioSampleType);
    desc.mBytesPerPacket = desc.mBytesPerFrame;
    // Loop through and setup a callback for each source you want to send to the mixer.
    for (int i = 0; i < numbuses; ++i) {
        // Setup render callback struct
        AURenderCallbackStruct renderCallbackStruct;
        renderCallbackStruct.inputProc = &renderInput;
        renderCallbackStruct.inputProcRefCon = self;
        // Connect the callback to the mixer input channel
        AUGraphSetNodeInputCallback(mGraph, mixerNode, i, &renderCallbackStruct);
        // Apply Stream Data
        AudioUnitSetProperty(mMixer, kAudioUnitProperty_StreamFormat,kAudioUnitScope_Input,i,&desc,size);
        AudioUnitSetParameter(mMixer, k3DMixerParam_Distance, kAudioUnitScope_Input, i, rand() % 6, 0);
        rotation[i] = rand() % 360;
        rotation_speed[i] = rand() % 5;
        AudioUnitSetParameter(mMixer, k3DMixerParam_Azimuth, kAudioUnitScope_Input, i, rotation[i], 0);
        AudioUnitSetParameter(mMixer, k3DMixerParam_Elevation, kAudioUnitScope_Input, i, 30, 0);
    }
    // Reset stream fromat data to 0
    memset (&desc, 0, sizeof (desc));
    // Setup output stream format
    desc.mSampleRate = kGraphSampleRate;
    // Apply Stream Data to Output
    AudioUnitSetProperty(mEffect,kAudioUnitProperty_StreamFormat,kAudioUnitScope_Input,0,&desc,size);
    AudioUnitSetProperty(mEffect,kAudioUnitProperty_StreamFormat,kAudioUnitScope_Output,0,&desc,size);
    AudioUnitSetProperty(mMixer,kAudioUnitProperty_StreamFormat,kAudioUnitScope_Output,0,&desc,size);
    //All done so initialise
    AUGraphInitialize(mGraph);
}

It works when I remove the high pass filter. How do I get the filter working?

Thank you.

PS: Is the 3D elevation supposed to do nothing?

Upvotes: 3

Views: 5003

Answers (2)

Arno van Goch
Arno van Goch

Reputation: 128

Not all Audio Units that are available on OSX are available on iOS. In fact, only a few are. According to below documentation the highpassfilter effect is not supported on iOS : http://developer.apple.com/library/ios/#documentation/MusicAudio/Conceptual/AudioUnitHostingGuide_iOS/UsingSpecificAudioUnits/UsingSpecificAudioUnits.html#//apple_ref/doc/uid/TP40009492-CH17-SW1

"The iPod EQ unit (subtype kAudioUnitSubType_AUiPodEQ) is the only effect unit provided in iOS 4."

Note that it mentions iOS4. But I am unable to find any documentation on this for later versions of iOS.

Upvotes: 2

Moataz Hossam
Moataz Hossam

Reputation: 413

if u still have the problem...u should add a converter unit between the mixernode and the effect node and set the input format of it as the mixer output and the output format to the format u get from audiounitgetproperty (converternode)

Upvotes: 3

Related Questions