Xamarin Monotouch音频单元回调 [英] Xamarin Monotouch Audio Units Callbacks

查看:89
本文介绍了Xamarin Monotouch音频单元回调的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我在MonoTouch/Xamarin中的音频单元有问题.

I have a problem with Audio Units in MonoTouch/Xamarin.

似乎我无法在录音中获得回调,只能在回放时获得回调. 我用这个例子: https://github.com/xamarin/monotouch-samples/blob/master/AUSoundTriggeredPlayingSoundMemoryBased/ExtAudioBufferPlayer.cs

It seems like I can't get a callback on recording, just playback. I used this example: https://github.com/xamarin/monotouch-samples/blob/master/AUSoundTriggeredPlayingSoundMemoryBased/ExtAudioBufferPlayer.cs

并查找Obj C示例. Obj C示例与我的代码几乎相同,因此我对此事有点困惑.

and looked for Obj C examples. The Obj C examples are pretty much the same like my code so Im a little bit confused about this thing.

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

The output if running my example is:

INPUT0

哪个是输出的总线号.

因此,预期输出应为:

INPUT1

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

So my question is: How do I get a recording callback and a playback callback running the same time, or just how do I get a recording callback.

我的代码:

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;
}

推荐答案

此问题是Xamarin中的错误,他们忘记为InputCallbacks添加方法.

This problem is a bug in Xamarin, they forgot to add a method for InputCallbacks.

我报告了该错误,但对于需要相同错误的人来说:

I reported the bug but for the people needing the same:

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

这不好,但是它显示了如何解决问题,直到Xamarin更新它为止,自己编写补丁.

Its not good, but it shows how to solve the problem to write a fix yourself till Xamarin updates this.

这篇关于Xamarin Monotouch音频单元回调的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆