2012-01-23 112 views
2

我正嘗試使用遠程IO連接,並通過內置濾波器效果(僅適用於iOS 5)路由音頻輸入,然後退出硬件。我可以直接從輸入路由到輸出,但是我無法讓過濾器工作。我不確定它是過濾器音頻單元還是我錯誤的路由。在iOS5中使用濾波器音頻單元效果

這一點只是我嘗試設置過濾器和更改路由,以便數據由它處理。

任何幫助表示讚賞。

// ******* BEGIN FILTER ******** 

NSLog(@"Begin filter"); 

// Creates Audio Component Description - Output Filter  
AudioComponentDescription filterCompDesc; 
filterCompDesc .componentType = kAudioUnitType_Effect; 
filterCompDesc.componentSubType = kAudioUnitSubType_LowPassFilter; 
filterCompDesc.componentManufacturer = kAudioUnitManufacturer_Apple; 
filterCompDesc.componentFlags = 1; 
filterCompDesc.componentFlagsMask = 1; 


// Create Filter Unit 
AudioUnit lpFilterUnit; 
AudioComponent filterComponent = AudioComponentFindNext(NULL, &filterCompDesc); 
setupErr = AudioComponentInstanceNew(filterComponent, &lpFilterUnit); 
NSAssert(setupErr == noErr, @"No instance of filter"); 

AudioUnitElement bus2 = 2; 
setupErr = AudioUnitSetProperty(lpFilterUnit, kAudioUnitSubType_LowPassFilter, kAudioUnitScope_Output, bus2, &oneFlag, sizeof(oneFlag)); 

AudioUnitElement bus3 = 3; 
setupErr = AudioUnitSetProperty(lpFilterUnit, kAudioUnitSubType_LowPassFilter, kAudioUnitScope_Input, bus3, &oneFlag, sizeof(oneFlag)); 



// ******** END FILTER ******** // 


AudioUnitConnection hardInToLP; 
hardInToLP.sourceAudioUnit = remoteIOunit; 
hardInToLP.sourceOutputNumber = 1; 
hardInToLP.destInputNumber = 3; 

setupErr = AudioUnitSetProperty (
         remoteIOunit,      // connection destination 
         kAudioUnitProperty_MakeConnection, // property key 
         kAudioUnitScope_Input,    // destination scope 
         bus3,    // destination element 
         &hardInToLP,    // connection definition 
         sizeof (hardInToLP) 
        ); 

AudioUnitConnection LPToHardOut; 
LPToHardOut.sourceAudioUnit = lpFilterUnit; 
LPToHardOut.sourceOutputNumber = 1; 
LPToHardOut.destInputNumber = 3; 

setupErr = AudioUnitSetProperty (
         remoteIOunit,      // connection destination 
         kAudioUnitProperty_MakeConnection, // property key 
         kAudioUnitScope_Input,    // destination scope 
         bus3,    // destination element 
         &hardInToLP,    // connection definition 
         sizeof (hardInToLP) 
        ); 


/* 
// Sets up the Audio Units Connection - new instance called connection 
AudioUnitConnection connection; 

// Connect Audio Input's out to Audio Out's in 
connection.sourceAudioUnit = remoteIOunit; 
connection.sourceOutputNumber = bus1; 
connection.destInputNumber = bus0; 


setupErr = AudioUnitSetProperty(remoteIOunit, kAudioUnitProperty_MakeConnection, kAudioUnitScope_Input, bus0, &connection, sizeof(connection)); 
*/ 

NSAssert(setupErr == noErr, @"No RIO connection"); 

回答

7

有兩件事情會在這裏:

  • 你以後每隔會幫助自己很多,如果你做一個斷言(或某種校驗錯誤和日誌吧)呼叫可以返回一個OSStatus。這樣你就會知道你有多遠。可能還希望在!= noErr時記錄實際的OSStatus值,然後查看它(從Xcode文檔查看器中的「Audio Unit Component Services Reference」開始)。
  • 創建過濾器AudioUnit後,我不明白你在做什麼與AudioUnitSetProperty()調用。第二個參數應該是一個屬性的名稱(以kAudioUnitProperty開頭的東西)。這幾乎肯定會在那裏返回一個錯誤。
  • remoteIOunit只有兩條總線,它們有特殊的含義。總線1從麥克風輸入,總線0輸出到硬件。嘗試連接到遠程IO輸入範圍總線3可能會是另一個錯誤

建議您回滾到音頻直通工作時。這意味着你只有remoteIO,並且從輸出範圍/總線1到輸入範圍/總線0的連接。

然後創建過濾器單元。改變你的連接,以便連接:

  • remoteIO輸出範圍總線進行過濾輸入範圍總線0
  • 濾波器輸出範圍總線0到remoteIO輸入範圍總線0

的另一件事,那將一個問題是,所有這些iOS 5過濾器似乎都想使用浮點LPCM格式,這不是其他單位默認使用的規範格式。您可能必須從過濾器單元(輸入或輸出範圍可能是相同的?)獲取流格式,然後將其設置爲remoteIO輸出範圍/總線1產生的格式和remoteIO輸入範圍/總線0接受的格式。另一種選擇是在濾波單元之前和之後引入AUConverter單元。

+0

「所有這些iOS 5的過濾器似乎是想用浮點LPCM格式」 - 我想這爲什麼我的圖表無法啓動(使用'kAudioUnitErr_CannotDoInCurrentContext'),當我將其設置爲mixer-> bandpass-> io時,但如果將帶通濾波器更改爲iOS 5之前的iPod EQualizer,則工作正常。 –

3

這裏給出的第一個答案只是爲我節省了很多挫折。 Apple文檔沒有告訴您,效果單元的文件格式需要浮點。我無法弄清楚爲什麼在我閱讀這篇文章之前,它一直無法正常播放我的音頻。我按照上面的建議從低通濾波器單元中檢索了流格式,並用它來設置我創建的兩個轉換器單元(即,設置前置濾波器轉換器的輸出格式以及後置濾波器的輸入格式一旦我這樣做,並連接所有節點在一起,它開始按預期工作

+0

同意。蘋果應該完全將音頻單元文檔更新到我們居住的iOS 5後世界! –

0

即時嘗試使用低通濾波器,當試圖按照建議做的時候設置格式我不斷收到錯誤「操作可能不完成「這段代碼中有什麼錯誤? 檢索lowpassUnit後,我也檢查錯誤,但沒有。

result = AudioUnitSetProperty(lowpassUnit, kAudioUnitProperty_StreamFormat, kAudioUnitScope_Input, 0, &stereoStreamFormat, sizeof (stereoStreamFormat)); 
    if (noErr != result) 
{ 
    NSLog(@"%@", [NSError errorWithDomain:NSOSStatusErrorDomain code:result  userInfo:nil]); 
    return; 
} 

PS:如果有人適當的音頻單元文檔知道請分享作爲官方文檔真是個缺乏