2016-09-07 3 views
0

Я работаю с android.media.midi и я посылаю кучу миди данных в MidiInputPort со значением задержки, как это:Почему 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()), но это не влияет. Данные по-прежнему отправляются в порт Midi, как будто я никогда не называл flush. Для этой функции документация довольно понятна и проста. В нем говорится: «Если вы хотите отменить события, которые вы запланировали в будущем, тогда вызовите flush()». Есть ли что-то в этом, что мне не хватает? Любая помощь приветствуется.

ответ

0

Разве выходной поток все еще открыт? Может быть, MIDI-устройство, отправленное флеш-пакетом, не поддерживает его?

Глядя на исходный код google, flush() вызывает MidiPortImpl.packFlush(), который отправляет единственный байтовый массив байта [1] = 0x02 в выходной поток, пока он все еще открыт.

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