2012-05-30 31 views
2

我正在開發iOS應用程序,該應用程序使用RemoteIO音頻單元錄製來自麥克風的音頻,將其處理並輸出到揚聲器(耳機)。目前我使用單聲道(單聲道)進行輸入和輸出。使用Core Audio控制單聲道播放輸出

我想要做的是讓用戶選擇一個輸出揚聲器:只剩下,只有右側或兩者兼而有之。我目前的代碼只支持「both」設置 - 兩個揚聲器都有相同的聲音。

下面是如何設置的輸入和輸出總線的流格式(kAudioUnitProperty_StreamFormat):

AudioStreamBasicDescription ASBD = {0}; 
size_t bytesPerSample = sizeof(SInt16); 
ASBD.mFormatID = kAudioFormatLinearPCM; 
ASBD.mFormatFlags = kAudioFormatFlagIsSignedInteger | kAudioFormatFlagIsPacked; 
ASBD.mSampleRate = 44100; 
ASBD.mFramesPerPacket = 1; 
ASBD.mBytesPerFrame = bytesPerSample; 
ASBD.mBytesPerPacket = bytesPerSample; 
ASBD.mBitsPerChannel = 8 * bytesPerSample; 
ASBD.mChannelsPerFrame = 1; 

我的渲​​染回調(kAudioUnitProperty_SetRenderCallback)看起來大致是這樣的:

AudioUnitRender(remoteIO, ioActionFlags, inTimeStamp, inputBus, inNumberFrames, ioData); 
SInt16 *renderBuffer = ioData->mBuffers[0].mData; 
// Process renderBuffer and modify the samples 

會是什麼實現僅限左側/僅限右側設置的最簡單方法?如果有任何相關的話,我不介意更改設備設置。

回答

1

最簡單的方法是在您控制的兩個RemoteIO元素(即輸入範圍的輸出元素和輸出範圍的輸入元素)上使用立體ASBD,然後僅發送零作爲樣本不活動的頻道,如果有的話。

RemoteIO單元對動態格式轉換的容量有限,但它可以使用其內部格式轉換器將單聲道流從麥克風分離爲立體聲流。

當配置正確時,根據確切的ASBD,您的呈現回調將接收緩衝區列表,每個通道(非交錯)或單個交錯緩衝區都有單獨的緩衝區。您需要緩衝區之一(非交錯的情況),或迭代採樣並將其靜音(設置爲零;交織情況)。 (注意:選擇性通道靜音大概會在您自己的處理後發生,因此您可能需要更改自己的代碼以適應立體聲數據;或者,將RemoteIO單元的輸入範圍的輸出元素設置爲發出單聲道採樣,在那裏處理,然後使用自己的AudioConverter將流分割爲立體聲。)

+1

你能發佈一個適合你的配置嗎?沒有解決方案爲我工作:我不能將兩個元素都設置爲立體聲,因爲麥克風是單聲道的。如果我將輸入定義爲單聲道並將輸出定義爲立體聲,則對於交錯的情況,AudioBufferList包含與以前相同數量的樣本(無立體聲)。對於非交叉的情況,我得到初始化時的「fmt」錯誤。經過iPod第二代iOS 4.2的測試。 – kshahar

+2

試試這個示例項目。它演示瞭如何使用LFO調製輸入採樣,同時選擇性地對任一通道進行靜音:http://dl.dropbox.com/u/13103695/StereoSelector.zip – warrenm

+0

感謝您的努力! – kshahar