2012-01-20 68 views
3

我試圖設置一個高通濾波器,但AUGraphStart給我-10863,當我嘗試。我根本找不到多少文件。這裏是我設置過濾器的意圖:爲CoreAudio設置效果音頻單元

- (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); 
} 

它可以工作,當我刪除高通濾波器。我如何獲得過濾器的工作?

謝謝。

PS:3D立面應該什麼都不做?

+0

我已經得到了這個10863錯誤之前。「kAudioUnitErr_CannotDoInCurrentContext」http://developer.apple.com/library/mac/#documentation/AudioUnit/Reference/AUComponentServicesReference/Reference/reference.html。我還沒有找到詳細的解釋,但 – dubbeat

回答

1

並非所有在OSX上可用的音頻單元均可在iOS上使用。實際上,只有少數是。根據以下文檔,iOS不支持高通濾波器效果:http://developer.apple.com/library/ios/#documentation/MusicAudio/Conceptual/AudioUnitHostingGuide_iOS/UsingSpecificAudioUnits/UsingSpecificAudioUnits.html#//apple_ref/doc/uid/TP40009492-CH17-SW1

「iPod EQ單元(子類型kAudioUnitSubType_AUiPodEQ)是iOS 4中提供的唯一效果單元。」

請注意,它提到了iOS4。但是我無法找到任何關於iOS的更新版本的文檔。

+1

沒有(這是超級過時)。但是從iOS 5開始,iOS中也有很多新的效果單元。 –

3

如果你仍然有問題...你應該在mixernode和效果節點之間添加一個轉換器單元,並將它的輸入格式設置爲混音器輸出和輸出格式爲你從audiounitgetproperty獲得的格式(converternode )