2017-09-22 8 views
1

Je lis/j'écris depuis/vers un périphérique MIDI. L'appareil est (en partie) répertorié comme "ME-50" dans par ex. un lsusb. Quelle commande puis-je utiliser pour reconnaître le périphérique exact auquel le "ME-50" est lié? Dans mon PC principal, par exemple il est lié à/dev/snd/midiC0D0, mais il peut aussi être/dev/snd/midiC2D0 en fonction de ce qui est branché en premier.

quelque chose comme:

for all devices in /dev/snd/midi* { 
    if substring in the device = "ME-50" 
     return device (/dev/snd/midiC0D0 or midiC1D0 or midiC2D0....) 
} 

une commande bash ferait, mais je suis la programmation en PHP, donc si PHP a quelque chose de simple à trouver le périphérique ....

Merci Arjen

Répondre

1

Jetez un oeil dans le chemin /dev/snd/by-id si vous avez de la chance votre appareil apparaîtra avec un nom reconnaissable.

Ensuite, utilisez scandir ou similaire pour itérer le chemin.

Si vous souhaitez obtenir le chemin direct à partir du lien, vous pouvez utiliser readlink.

Edit:

Si udevadm est disponible, la commande retourne un grand nombre d'informations sur les appareils, qui peuvent contenir des bits identifiables. L'extrait suivant itère les périphériques midi disponibles et stocke toutes les informations dans un tableau ($result), par ex. toutes les lignes de udevadm info -q all /dev/snd/midiC0D0. La tâche restante sera de reconnaître les informations utiles.

<?php 

if ($handle = opendir('/dev/snd')) { 
    while (false !== ($entry = readdir($handle))) { 
     // detect all entries starting with "midi" 
     if (strpos($entry, "midi") === 0) { 
      exec(escapeshellcmd("udevadm info -q all /dev/snd/$entry"), $result); 
      // $result contains the lines from the udevadm call 
      print_r($result); 
      print "\n"; 
     } 
    } 

    closedir($handle); 
} 
+0

Bon indice, il apparaît en effet avec un nom reconnaissable. Cependant il pointe (lien) vers/dev/snd/controlC1 et non vers ../midiC0D1. Je vais essayer avec Control1, mais pourquoi y a-t-il plusieurs périphériques pour le midi et vont-ils réagir de la même manière à une opération de lecture/écriture? – Arjen

+0

Il y a une différence apparemment. Un simple fopen()/fwrite()/fread() fonctionne avec/dev/snd/midiC0D0, mais pas avec ../ controlC1 ....Donc, la question d'origine reste ouverte à moins qu'il y ait un lien entre control1 <--> midiC0D0? Peut-être que control1 est un canal audio? Mon appareil est à la fois un midi en tant que périphérique audio. – Arjen

+0

Apparemment, ces appareils sont différents. Je n'ai pas d'appareils midi, mais j'ajouterai une autre approche que j'ai trouvée à la réponse. – c11o

1

périphériques MIDI sont répertoriés avec leur nom lorsque vous les accès via l'API appropriée (ALSA RawMIDI ou séquenceur):

 
$ amidi -l 
Dir Device Name 
IO hw:2,0 Xonar D2 MIDI 
IO hw:6,0,0 SC-8820 Part A 
IO hw:6,0,1 SC-8820 Part B 
IO hw:6,0,2 SC-8820 MIDI 
$ aplaymidi -l 
Port Client name      Port name 
14:0 Midi Through      Midi Through Port-0 
24:0 Xonar D2       Xonar D2 MIDI 
40:0 SC-8820       SC-8820 Part A 
40:1 SC-8820       SC-8820 Part B 
40:2 SC-8820       SC-8820 MIDI 

périphériques audio USB obtenir des entrées dans /dev/snd/by-id/, qui pointent vers le dispositif de contrôle de chaque carte:

 
$ ls -l /dev/snd/by-id/ 
lrwxrwxrwx 1 root root 12 Sep 23 12:51 usb-0582_0007-00 -> ../controlC6 
lrwxrwxrwx 1 root root 12 Sep 23 12:51 usb-Roland_EDIROL_UA-1A-00 -> ../controlC5 

Le nœud de périphérique MIDI correspondant a le même numéro de carte après la lettre C:

 
$ ls -l /dev/snd/midiC6* 
crw-rw---- 1 root audio 116, 12 Sep 23 12:51 /dev/snd/midiC6D0 

Une autre façon de trouver le numéro de la carte est de rechercher dans les /proc/asound/card*/usbid fichiers pour l'ID de votre appareil:

 
$ cat /proc/asound/card6/usbid 
0582:0007 

Alternativement, analyser le contenu de /proc/asound/cards:

 
$ cat /proc/asound/cards 
2 [D2    ]: AV200 - Xonar D2 
         Asus Virtuoso 200 at 0xe800, irq 20 
5 [UA1A   ]: USB-Audio - EDIROL UA-1A 
         Roland EDIROL UA-1A at usb-0000:00:12.2-4.2, full speed 
6 [SC8820   ]: USB-Audio - SC-8820 
         Roland SC-8820 at usb-0000:00:12.0-3, full speed 
^ 
card number