2016-09-07 7 views
0

私はandroid.media.midiで働いていると私はこのような遅延値でMidiInputPortにMIDIデータの束を送っています:MidiInputPort.flush()がAndroidのバッファをクリアしないのはなぜですか?

long start = System.nanoTime(); 
if (messages != null) 
{ 
    for (int i = 0; i < messages.length(); i++) 
    { 

     MidiNote note = MidiHelper.parseMessageForNote(messages.getString(i)); 
     if (note != null) 
      { 
       byte[] buffer = new byte[32]; 
       int numBytes = 0; 
       int channel = 1; // MIDI channels 1-16 are encoded as 0-15. 
       buffer[numBytes++] = (byte) (note.action + (channel - 1)); 
       buffer[numBytes++] = (byte) note.note; 
       buffer[numBytes++] = (byte) note.velocity; 

       long delay = note.delay * 1000000; 

       midiInputPort.send(buffer, 0, numBytes, start + delay); 

       start = start + delay; 
      } 

    } 

    midiInputPort.flush(); 
} 

あなたは、私が(ちょうどしようと、すぐにすべてのデータを送信した後のフラッシュを呼び出すことがわかりますflush()を動作させるために)、効果はありません。私は一度もフラッシュしなかったかのように、データはまだミディポートに送られます。この関数については、ドキュメントはかなり明確でシンプルです。 「今後予定しているイベントをキャンセルしたい場合は、flush()を呼び出してください」というメッセージが表示されます。私が行方不明になっていることについて何かありますか?どんな助けもありがとうございます。

答えて

0

出力ストリームはまだ開いていますか?おそらく、フラッシュパケットを送信しているMIDIデバイスはそれをサポートしていませんか?

Googleのソースコードを見ると、flush()はMidiPortImpl.packFlush()を呼び出して、まだ開いている限り出力ストリームにbyte [1] = 0x02の1バイト配列を送ります。

public void onFlush() throws IOException { 
    synchronized (mBuffer) { 
     if (mOutputStream == null) { 
      throw new IOException("MidiInputPort is closed"); 
     } 
     int length = MidiPortImpl.packFlush(mBuffer); 
     mOutputStream.write(mBuffer, 0, length); 
    } 
} 

https://android.googlesource.com/platform/frameworks/base/+/master/media/java/android/media/midi/MidiInputPort.java

https://android.googlesource.com/platform/frameworks/base/+/master/media/java/android/media/midi/MidiPortImpl.java

関連する問題