2016-09-07 4 views
0

Je travaille avec android.media.midi et je vous envoie un tas de données midi à un MidiInputPort avec une valeur de retard comme celui-ci:Pourquoi le MidiInputPort.flush() efface-t-il le tampon dans 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(); 
} 

Vous remarquerez que j'appelle rincer immédiatement après l'envoi de toutes les données (juste essayer pour obtenir flush() au travail) mais cela n'a aucun effet. Les données sont toujours envoyées au port Midi comme si je n'avais jamais appelé flush. La documentation est assez claire et simple pour cette fonction. Il est dit "Si vous voulez annuler les événements que vous avez planifiés dans le futur, appelez flush()". Y a-t-il quelque chose à ce sujet qui me manque? Toute aide est appréciée.

Répondre

0

Le flux de sortie est-il toujours ouvert? Peut-être que l'appareil MIDI auquel vous envoyez le paquet de vidage ne le supporte pas?

En regardant le code source de google, flush() appelle MidiPortImpl.packFlush() qui envoie un tableau d'octets simple de byte [1] = 0x02 dans le flux de sortie tant qu'il est encore ouvert.

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