2017-09-27 126 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

相關問題