4

AVAudioEngine's入力コールバックをinputNodeに追加しようとしていますが、呼び出されません。

希望は、AVAudioEngineiOS と OS X の両方で基本的な AUGraph を管理するために使用でき、その間で独自のコードを実行できることです。入力ノードにタップを取り付けてみましたが、バッファの長さを変更できません。

私はシングル ビュー 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;
}

同じ方法で、出力ノードのオーディオ ユニットにレンダー コールバックをインストールできましたが、入力コールバックが呼び出されません。

入力ノードのオーディオ ユニットが出力ノードのオーディオ ユニットと同じであることを確認しました。これは、グラフが正しく設定されていることを示しています。kAudioOutputUnitProperty_EnableIOまた、ユニットに設定しようとしましたRemoteIO(inputNode.audioUnit)

誰か提案がありますか?

4

3 に答える 3

1

I/O を有効にするコードを表示できますか? scopekAudioUnitScope_Inputと elementにある必要があることに注意してください1

于 2015-09-01T07:30:47.763 に答える
0

間違っている可能性があることが 2 つあります。オーディオセッションについて言及していません。入力を取るものに設定したのだろうか:

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

入力または出力を個別に有効/無効にできるため、にもkAudioOutputUnitProperty_EnableIO適用する必要があります。kAudioUnitScope_Input

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

他にもチェックすべき点がありますが、他の場所でコールバックが機能しているとのことでしたので、これらはこのユニットとバスに固有のものです。

注: このコードは完全ではなく、オーディオ セッションをセットアップして入力を有効にする際の主要な関連ポイントにすぎません。

于 2015-09-03T11:23:05.023 に答える