2017-09-22 45 views
1

我正在從/向midi設備讀寫數據。該器件在(例如)部分被列爲「ME-50」。一個lsusb。我可以使用什麼命令來識別「ME-50」鏈接的確切設備?在我的主要電腦上它鏈接到/ dev/snd/midiC0D0,但它也可以是/ dev/snd/midiC2D0,具體取決於先插入的內容。

類似:

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

bash命令會做,但我在PHP編程,所以如果PHP有一些簡單的找到設備....

感謝 羅

回答

1

看看路徑/dev/snd/by-id如果你運氣好,你的設備會顯示一些可識別的名字。

然後使用scandir或類似來迭代路徑。

如果要從鏈接中獲取直接路徑,可以使用readlink

編輯:

如果udevadm可用的命令返回了大量的設備,其中可能包含識別位的信息。下面的片段迭代可用的midi設備並將所有信息存儲在數組($result)中,例如,來自udevadm info -q all /dev/snd/midiC0D0的所有行。 剩下的任務是識別有用的信息。

<?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

好的提示,它的確出現了一個可識別的名字。然而,它指向(鏈接)/ dev/snd/controlC1而不是../midiC0D1。我將嘗試使用Control1,但爲什麼有一個midi有多個設備,並且他們會對讀/寫操作做出相同的反應? – Arjen

+0

顯然是有區別的。一個簡單的fopen()/ fwrite()/ fread()可以與/ dev/snd/midiC0D0一起使用,但不能與../ controlC1 ....所以原來的問題保持開放,除非在控制1 <--> midiC0D0之間有一些聯繫? 也許control1是一個音頻通道?我的設備既是音頻設備,也是MIDI。 – Arjen

+0

顯然這些設備是不同的。我沒有任何MIDI設備,但我會添加另一種方法來解決問題。 – c11o

1

MIDI設備都列出了他們的名字,當您通過適當的API(ALSA RawMIDI或音序)訪問它們:

 
$ 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 

USB音頻設備獲得/dev/snd/by-id/條目,這點每個卡的控制設備:

 
$ 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 

對應的MIDI設備節點具有相同的信C後,卡號:

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

另一種方式找到卡號是在/proc/asound/card*/usbid文件中搜索您的設備ID:

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

另外,解析內容/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 
相關問題