2012-12-03 74 views
1

我正在用Audio Unit編寫一個簡單的iOS應用程序。我想添加混響效果。 因此,該圖看起來像RemoteIO_Input - > Reverb - > RemoveIO_Output。 但嘗試爲混響單元設置流格式時出現錯誤 - kAudioUnitErr_FormatNotSupported。 這段代碼工作正常,沒有使用混響單元(圖中的單個遠程IO),所以其他配置看起來很好,我不提供他們的代碼。iOS音頻單元混響流格式問題-10868 kAudioUnitErr_FormatNotSupported

UPD:iOS 6中使用

所以問題:

  1. 是否有允許的格式限制?

  2. 我應該使用什麼格式的參數?

  3. 是否應該在RemoteIO輸出元素的任何範圍內設置格式?

感謝您的關注。

CODE: 說明:

desc.componentType = kAudioUnitType_Output; 
desc.componentSubType = kAudioUnitSubType_RemoteIO; 
desc.componentFlags = 0; 
desc.componentFlagsMask = 0; 
desc.componentManufacturer = kAudioUnitManufacturer_Apple; 

descRev.componentType = kAudioUnitType_Effect; 
descRev.componentSubType = kAudioUnitSubType_Reverb2; 
descRev.componentFlags = 0; 
descRev.componentFlagsMask = 0; 
descRev.componentManufacturer = kAudioUnitManufacturer_Apple; 

圖形設置

NewAUGraph(&graph); 
AUNode ioNode; 
AUNode rNode; 
AUGraphAddNode(graph, &desc, &ioNode); 
AUGraphAddNode(graph, &descRev, &rNode); 
AUGraphOpen(graph); 
AUGraphConnectNodeInput(graph, ioNode, 1, rNode, 0); 
AUGraphConnectNodeInput(graph, rNode, 0, ioNode, 0); 

格式的描述,併成立

// Describe format 
audioFormat.mSampleRate   = rate;//44100.00; 
audioFormat.mFormatID   = kAudioFormatLinearPCM; 
audioFormat.mFormatFlags  = kAudioFormatFlagIsSignedInteger | kAudioFormatFlagIsPacked; 
audioFormat.mFramesPerPacket = 1; 
audioFormat.mChannelsPerFrame = 1; 
audioFormat.mBitsPerChannel  = 16; 
audioFormat.mBytesPerPacket  = 2; 
audioFormat.mBytesPerFrame  = 2; 

    OSStatus err = AudioUnitSetProperty(unit, 
            kAudioUnitProperty_StreamFormat, 
            kAudioUnitScope_Output, 
            kInputBus, 
            &audioFormat, 
            sizeof(audioFormat)); 
    if (noErr != err) { 
     [self showStatus:err]; 
    } 

    err = AudioUnitSetProperty(unitRev, 
          kAudioUnitProperty_StreamFormat, 
          kAudioUnitScope_Input, 
          0, 
          &audioFormat, 
          sizeof(audioFormat)); 
    if (noErr != err) { 
     [self showStatus:err]; 
    } 

回答

2

是否有允許的格式限制?

是的,他們通常是相當嚴格的。

應該使用什麼格式的參數?

您將有最幸運或者使用單位的默認ASBD,或者使用基於關閉預建組標誌(kAudioFormatFlagsAudioUnitCanonicalkAudioFormatFlagsCanonical)之一。正如,而不是彌補自己的格式如下:

audioFormat.mFormatFlags = kAudioFormatFlagIsSignedInteger | kAudioFormatFlagIsPacked; 

你可以這樣做:

audioFormat.mFormatFlags = kAudioFormatFlagsAudioUnitCanonical; 

一般來說,如果你只是連接兩臺機組對方,他們會能夠爲自己排序。如果您需要提供自己的音頻,則必須指定輸入格式(並且可能需要基於kAudioFormatFlagsAudioUnitCanonical,這是非交錯線性PCM,每個樣本表示爲固定的8.24數字一個容器SInt32)。

如果您需要更大的靈活性,您可以在混響單元之前粘貼一個AUConverter音頻單元,因爲AUConverter將能夠處理更多輸入格式(例如適當的浮點採樣)。請注意,由於AUConverter必須實時轉換音頻格式,因此需要增加處理時間。

您可以在Core Audio Essentials頁面的標題規範音頻數據格式下看到完整的ASBD示例。

應該在RemoteIO輸出元素的任何範圍內設置格式?

如果您的混響單元直接連接到RemoteIO輸出端,單元應該能夠自行排序。