2015-08-21 71 views
3

我試圖輸入回調添加到AVAudioEngine's inputNode但它永遠不會被調用。添加輸入回調AVAudioEngine

希望的是,我可以使用AVAudioEngine來管理iOS和OS X的基本AUGraph,我可以在運行之間我自己的代碼。我也嘗試在輸入節點上安裝一個tap,但是我無法改變緩衝區的長度。

我做了一個單一的視圖iOS應用,並把這個代碼viewDidLoad

_audioEngine = [AVAudioEngine new]; 
_inputNode = _audioEngine.inputNode; 
_outputNode = _audioEngine.outputNode; 

AURenderCallbackStruct inputCallback; 
inputCallback.inputProc = inputCalbackProc; 
inputCallback.inputProcRefCon = (__bridge void *)(self); 


AudioUnitSetProperty(_inputNode.audioUnit, 
        kAudioOutputUnitProperty_SetInputCallback, 
        kAudioUnitScope_Global, 
        0, 
        &inputCallback, 
        sizeof(inputCallback)); 


[_audioEngine startAndReturnError:nil]; 

渲染回調的定義是這樣的:

OSStatus inputCalbackProc (void *       inRefCon, 
          AudioUnitRenderActionFlags * ioActionFlags, 
          const AudioTimeStamp *   inTimeStamp, 
          UInt32       inBusNumber, 
          UInt32       inNumberFrames, 
          AudioBufferList *    ioData) 
{ 
    printf("Called"); 
    return noErr; 
} 

我已經成功地安裝一個渲染以同樣的方式在輸出節點的音頻單元上進行回調,但我的輸入回調從不會被調用。

我已經檢查該輸入節點的音頻單元是相同的這表明該圖已被正確地設置了所述輸出節點的音頻單元。我也嘗試在RemoteIO單元上設置kAudioOutputUnitProperty_EnableIO(inputNode.audioUnit)

有人有什麼建議嗎?

回答

1

RemoteIO實際上並沒有提供一個回調時,它已經準備好進行渲染。 由於硬件與輸出相同,因此可以在輸出單元被渲染時渲染輸入單元

1

你可以顯示你的代碼來啓用I/O嗎?請注意,它應該在範圍kAudioUnitScope_Input和元素1上。

0

有兩件事情我看可能是錯誤的。你不會提到音頻會話。我不知道你是否將其設置爲一些需要輸入:

let audioSession = AVAudioSession.sharedInstance() 
audioSession.setCategory(AVAudioSessionCategoryPlayAndRecord) 
audioSession.setActive(true) 

而且kAudioOutputUnitProperty_EnableIO需要被應用到kAudioUnitScope_Input因爲你可以單獨啓用/禁用輸入或輸出。

AudioUnitSetProperty(ioUnit, kAudioOutputUnitProperty_EnableIO, 
kAudioUnitScope_Input, bus1, &enableInput,sizeof(enableInput)) 

還有其他的事情要檢查,但你說你有一個回調在其他地方工作,所以這些是特定於這個單位和巴士。

注意:此代碼是不完整的,並且僅在建立音頻會話和使能輸入的主要和相關的問題。