如何在Xamarin中使用AudioRecord.SetRecordPositionUpdateLister?
问题描述:
我正在尝试设置一个侦听器到音频流。这里是(缩短的)源代码:如何在Xamarin中使用AudioRecord.SetRecordPositionUpdateLister?
class AndroidAudioDriver : AudioRecord.IOnRecordPositionUpdateListener
{
private AudioRecord _recorder;
private byte[] _audioData;
private int _bufferSize;
private Sensor _sensor;
public AndroidAudioDriver(Sensor sensor, int desiredSampleRate)
{
_recorder = new AudioRecord(AudioSource.Mic, SampleRate, ChannelIn.Mono, Encoding.PcmFloat, _bufferSize);
_recorder.SetRecordPositionUpdateListener(this);
_recorder.SetPositionNotificationPeriod(_bufferSize/2);
}
public void OnMarkerReached(AudioRecord recorder)
{
//not used
}
public void OnPeriodicNotification(AudioRecord recorder)
{
var count = _recorder.Read(_audioData, 0, _bufferSize/2);
var floats = DataConversion.ConvertBytesToFloatsBigEndian(_audioData.Take(count).ToArray());
NewAudio(_sensor, floats);
}
public void Dispose()
{
throw new NotImplementedException();
}
}
我的类继承IOnRecordPositionUpdateListener。 _recorder.SetRecordPositionUpdateListener
期望这种类型作为参数,但在运行时我得到一个“System.InvalidCastException:指定的转换无效”。我不明白如何在Xamarin中设置更新侦听器,Android示例非常不同,并且似乎没有应用相同的逻辑。
谢谢。
答
我的类继承的IOnRecordPositionUpdateListener
您是实现接口,但你从Java.Lang.Object
需要继承。
一旦你这样做了,将该类公开为将生成的ACW(Android Callable Wrapper)。
删除public void Dispose()
为Java.Lang.Object
实现。如果需要,override
它和处理任何资源,如硬件的Sensor
对象。
public class AndroidAudioDriver : Java.Lang.Object, AudioRecord.IOnRecordPositionUpdateListener
{
~~~
}
非常感谢。我可以问你在哪里找到这些信息?这在我找不到的任何地方的Xamarin文档中都没有提到... – Lukeyb
@Lukeyb任何需要在Android Java VM(ART或Dalvik)中使用的对象都需要基于Java(基于JNI)的包装器,以便它可以调用回到Mono运行时并重定向到您的C#/ F#托管代码。查看以下界面部分:https://developer.xamarin.com/guides/android/advanced_topics/java_integration_overview/android_callable_wrappers/ – SushiHangover