2012-01-20 3 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: Возможно ли, что трехмерное возвышение ничего не должно делать?

+0

Раньше я получил эту ошибку 10863. «kAudioUnitErr_CannotDoInCurrentContext» http://developer.apple.com/library/mac/#documentation/AudioUnit/Reference/AUComponentServicesReference/Reference/reference.html. Мне еще предстоит найти подробное объяснение, хотя – dubbeat

ответ

1

Не все аудиоустройства, доступные в OSX, доступны на iOS. На самом деле, только немногие. В соответствии с приведенной ниже документацией эффект highpassfilter не поддерживается на 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

, если у вас все еще есть проблема ... u должен добавить блок конвертера между mixernode и узлом эффекта и установить его формат ввода в качестве выхода микшера и выходной формат в формате u get from audiounitgetproperty (преобразование)

Смежные вопросы