Xamarin Monotouch音频单元回调

时间:2013-09-14 14:34:15

标签: c# ios audio xamarin.ios xamarin

我在MonoTouch / Xamarin中遇到音频单元问题。

似乎我无法在录制时收到回调,只是回放。 我用这个例子: https://github.com/xamarin/monotouch-samples/blob/master/AUSoundTriggeredPlayingSoundMemoryBased/ExtAudioBufferPlayer.cs

并寻找Obj C的例子。 Obj C的例子和我的代码几乎一样,所以我对这件事情有点困惑。

运行我的示例时的输出是:

INPUT0

输出的总线编号。

所以预期的输出应该是:

INPUT1

所以我的问题是:如何在同一时间运行录音回调和回放回调,或者我如何获得录音回调。

我的代码:

void prepareAudioUnit()
{
    // AudioSession
    AudioSession.Initialize();
    AudioSession.Category = AudioSessionCategory.PlayAndRecord;
    AudioSession.PreferredHardwareIOBufferDuration = Config.packetLength;
    AudioSession.PreferredHardwareSampleRate = Format.samplingRate;
    //AudioSession.SetActive (false);
    AudioSession.SetActive(true);
    Logger.log("HWSR:" + AudioSession.CurrentHardwareSampleRate);

    // Getting AudioComponent Remote output 
    _audioComponent = AudioComponent.FindComponent(AudioTypeOutput.VoiceProcessingIO);

    // creating an audio unit instanc
    _audioUnit = new AudioUnit(_audioComponent);

    // turning on microphone
    _audioUnit.SetEnableIO(true,
                            AudioUnitScopeType.Input,
                            1 // Remote Input
                            );
    _audioUnit.SetEnableIO(true,
                            AudioUnitScopeType.Output,
                            0 // Remote output
                            );

    // setting audio format
    _audioUnit.SetAudioFormat(Format.AudioStreamBasicDescription,
                               AudioUnitScopeType.Output,
                               1
                               );
    _audioUnit.SetAudioFormat(Format.AudioStreamBasicDescription,
                               AudioUnitScopeType.Input,
                               0
                               );

    // setting callback method
    _audioUnit.SetRenderCallback(_audioUnit_OutputCallback, AudioUnitScopeType.Global, 0);
    _audioUnit.SetRenderCallback(_audioUnit_InputCallback, AudioUnitScopeType.Global, 1);
}

AudioUnitStatus _audioUnit_OutputCallback(AudioUnitRenderActionFlags actionFlags, AudioTimeStamp timeStamp, uint busNumber, uint numberFrames, AudioBuffers data)
{
    Logger.log("OUTPUT" + busNumber);
    return AudioUnitStatus.NoError;
}

AudioUnitStatus _audioUnit_InputCallback(AudioUnitRenderActionFlags actionFlags, AudioTimeStamp timeStamp, uint busNumber, uint numberFrames, AudioBuffers data)
{
    Logger.log("INPUT" + busNumber);
    return AudioUnitStatus.NoError;
}

1 个答案:

答案 0 :(得分:0)

这个问题是Xamarin中的一个错误,他们忘了为InputCallbacks添加一个方法。

我报告了这个错误,但对于那些需要相同的人:

http://nopaste.info/8d0aca98d9.html

它不好,但它显示了如何解决问题,自己编写修复程序,直到Xamarin更新它。