2017-09-27 10 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(); 
    } 
} 

MyクラスはIOnRecordPositionUpdateListenerを継承します。 _recorder.SetRecordPositionUpdateListenerはこの型を引数として想定していますが、実行時に"System.InvalidCastException:指定されたキャストが無効です"が発生します。私はXamarinで更新リスナーを設定する方法を理解していない、Androidの例は非常に異なり、同じロジックを適用していないようです。

ありがとうございました。

答えて

1

私のクラスは、あなたがインターフェイスを実装ですが、あなたはJava.Lang.Objectから継承に必要IOnRecordPositionUpdateListener

を継承します。

これを実行したら、生成されるACW(Android Callable Wrapper)のクラスをpublicにします。

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

関連する問題