Xamarin Monotouch 音频单元回调

Posted

技术标签:

【中文标题】Xamarin Monotouch 音频单元回调【英文标题】:Xamarin Monotouch Audio Units Callbacks 【发布时间】:2013-09-14 14:34:15 【问题描述】:

我对 MonoTouch/Xamarin 中的音频单元有疑问。

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

并寻找 Obj C 示例。 Obj C 示例与我的代码几乎相同,所以我对这件事有点困惑。

如果运行我的示例,输出是:

输入0

输出的总线号是什么。

所以预期的输出应该是:

输入1

所以我的问题是:如何让录制回调和播放回调同时运行,或者我如何获得录制回调。

我的代码:

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;

【问题讨论】:

也许发布一个指向 Objective-C 示例的链接,以尝试重现和理解差异。 @miguel.de.icaza 这个例子 100% 有效 atastypixel.com/blog/using-remoteio-audio-unit/comment-page-1 我试图打开一张票,但不知何故你的票务系统忽略了我的电子邮件。 你有没有得到这个工作,我有同样的问题。 【参考方案1】:

这个问题是 Xamarin 的一个 bug,他们忘记为 InputCallbacks 添加一个方法。

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

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

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

【讨论】:

以上是关于Xamarin Monotouch 音频单元回调的主要内容,如果未能解决你的问题,请参考以下文章

在 monotouch/monodroid 中使用 mocks 进行单元测试

输入上方的 Monotouch.Dialog EntryElement 标签

使 PCL Xamarin (MonoDroid/MonoTouch) 兼容的问题

C# Monotouch/Xamarin.iOS - 不支持推送导航控制器

MonoTouch (Xamarin.iOS) Facebook 应用程序切换支持 iOS 5+

C# Monotouch/Xamarin.iOS - 可滚动的 UIView