如何在 Xamarin 中使用 AudioRecord.SetRecordPositionUpdateLister?

How to use AudioRecord.SetRecordPositionUpdateLister in Xamarin?

我正在尝试为音频流设置监听器。这是(缩短的)来源:

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

我的class继承了IOnRecordPositionUpdateListener。 _recorder.SetRecordPositionUpdateListener 期望此类型作为参数,但在运行时我得到 "System.InvalidCastException: Specified cast is not valid"。我不明白如何在 Xamarin 中设置更新侦听器,Android 示例非常不同,似乎没有应用相同的逻辑。

谢谢。

My class inherits the IOnRecordPositionUpdateListener

您正在实现接口,但您需要Java.Lang.Object继承

完成后,为将要生成的 ACW(Android 可调用包装器)创建 class public。

删除 public void Dispose(),因为 Java.Lang.Object 实现了它。如果需要,override 它并处理您的任何资源,例如硬件的 Sensor 对象。

public class AndroidAudioDriver : Java.Lang.Object, AudioRecord.IOnRecordPositionUpdateListener
{

   ~~~
}