2017-09-27 131 views
1

我正在尝试设置一个侦听器到音频流。这里是(缩短的)源代码:如何在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示例非常不同,并且似乎没有应用相同的逻辑。

谢谢。

回答

1

我的类继承的IOnRecordPositionUpdateListener

您是实现接口,但你从Java.Lang.Object需要继承

一旦你这样做了,将该类公开为将生成的ACW(Android Callable Wrapper)。

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

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

    ~~~ 
} 
+0

非常感谢。我可以问你在哪里找到这些信息?这在我找不到的任何地方的Xamarin文档中都没有提到... – Lukeyb

+0

@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

相关问题