2016-12-13 4 views
1

Je travaille sur un projet basé sur MIDI en Java et peine à rafraîchir la liste des périphériques Midi. Dans la mesure où je sais MidiSystem.getMidiDeviceInfo(); devrait me donner un tableau Info[]. Rien ne se passe pour moi cependant. Les objets à l'intérieur du tableau restent les mêmes lorsque de nouveaux périphériques sont branchés ou éteints et ainsi de suite.Mise à jour de la liste des périphériques Midi en Java

La recherche de Stackoverflow m'a amené à this 6 year old question. Un des commentaires suggère qu'être sur OSX/macOS pourrait être le problème. Je n'ai pas encore essayé mon programme sur Windows ou Linux, mais il devrait fonctionner sur OSX/macOS de toute façon.

Un autre commentaire suggère de régler le temps de cache à quelque chose de court avec com.sun.media.sound.JDK13Services.setCachingPeriod(1); manuellement pourrait résoudre ce problème. Pas sur OSX/macOS cependant.

Une autre recherche sur Google m'a amené à un openjdk bug report qui prétend que c'est un bug sur le côté des pommes dans OSX/macOS. Ci-dessous est une version abrégée de ma classe Devices pour la vérification, mais je suis sûr que ce devrait être correct.

private Info[] devices; 

public Devices() { 
    refreshDeviceList(); 
    printDeviceList(); 
} 

// DeviceList Functions 
public Info[] getDeviceList() { 
    return devices; 
} 

public void printDeviceList() { 
    for (int i = 0; i < devices.length; i++) { 
     System.out.println("Description: \t" + devices[i].getDescription()); 
     System.out.println("Name: \t\t" + devices[i].getName()); 
     System.out.println("Vendor: \t" + devices[i].getVendor()); 
     System.out.println("Version: \t" + devices[i].getVersion()); 
     System.out.println(); 
    } 
} 

public void refreshDeviceList() { 
    devices = MidiSystem.getMidiDeviceInfo(); 
} 

// DeviceFunctions 
public String getDeviceDescription(int i) { 
    return devices[i].getDescription(); 
} 

public String getDeviceName(int i) { 
    return devices[i].getName(); 
} 

public String getDeviceVendor(int i) { 
    return devices[i].getVendor(); 
} 

public String getDeviceVersion(int i) { 
    return devices[i].getVersion(); 
} 

Notez que l'appel refreshDevices() pour la première fois lors de la création d'un nouveau Devices œuvres d'objet et de l'impression me fait une liste des périphériques disponibles. Juste pas après. Redémarrer le programme après avoir branché ou débranché des périphériques renvoie cependant le bon nombre de nouveaux périphériques.

Quelqu'un peut-il fournir une solution à cela?

+0

Je ne peux pas répondre directement à votre question, mais l'extrait de code ne semble être correct et fonctionnel. Je vous recommande personnellement d'utiliser un setter pour 'devices' et un for-loop amélioré dans votre méthode' printDeviceList() 'qui répète sur les périphériques' Info [], au lieu de la méthode '.length'. Mais ce n'est que des préférences personnelles. –

+0

juste quelques idées hors de la manchette puisque je ne peux pas les tester dans la vie réelle, l'one-way est de mettre en place un système de serveur client qui est deux programmes dont on peut se terminer; on vérifie - se ferme si nécessaire - et transmet les données à l'autre – gpasch

Répondre

0

Une façon est de mettre en place un système comme suit:

shell script: 

start program with input 1 // that means it's the receiver 

while(true) { 
    start program with input 2 // that means it's the sender 
    wait for an amount of time 
} 

end shell script 

inside the program is the following: 

    if code==1: 
     while(true) { 
     do whatever you have to do 
     at specified point in time: 
      read file "myfile" 
      assemble the info 
     } 
     if code==2: 
     read the device info 
     write the info to "myfile" 
     exit