如何在PHP中找到具有特定$string的设备/开发人员
我正在读/写midi设备。设备(部分)在lsusb中被列为“ME-50”。我可以使用什么命令来识别“ME-50”链接到的确切设备?例如,在我的主PC中,它链接到/dev/snd/midiC0D0,但也可以是/dev/snd/midiC2D0,具体取决于首先插入的是什么 比如:如何在PHP中找到具有特定$string的设备/开发人员,php,linux,midi,Php,Linux,Midi,我正在读/写midi设备。设备(部分)在lsusb中被列为“ME-50”。我可以使用什么命令来识别“ME-50”链接到的确切设备?例如,在我的主PC中,它链接到/dev/snd/midiC0D0,但也可以是/dev/snd/midiC2D0,具体取决于首先插入的是什么 比如: for all devices in /dev/snd/midi* { if substring in the device = "ME-50" return device (/dev/snd/m
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有一些简单的东西来查找设备
谢谢
Arjen查看路径
/dev/snd/by id
,如果幸运的话,您的设备将显示一些可识别的名称
然后使用或类似的方法迭代路径
如果要从链接获取直接路径,可以使用
编辑:
如果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);
}
当您通过适当的API(ALSA RawMIDI或sequencer)访问MIDI设备时,MIDI设备会列出它们的名称:
相应的MIDI设备节点在字母C
后具有相同的卡号:
$ ls -l /dev/snd/midiC6*
crw-rw---- 1 root audio 116, 12 Sep 23 12:51 /dev/snd/midiC6D0
或者,解析/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
$cat/proc/asound/cards
2[D2]:AV200-Xonar D2
华硕Virtuoso 200,0xe800,irq 20
5[UA1A]:USB音频-EDIROL UA-1A
罗兰·埃迪罗尔UA-1A,usb-0000:00:12.2-4.2,全速
6[SC8820]:USB音频-SC-8820
罗兰SC-8820,usb-0000:00:12.0-3,全速
^
卡号
很好的提示,它确实显示了一个可识别的名称。但是,它指向(链接)到/dev/snd/controlC1,而不是../midiC0D1。我将尝试使用Control1,但为什么一个midi有多个设备,并且它们对读/写操作的反应相同?这显然是不同的。一个简单的fopen()/fwrite()/fread()可以与/dev/snd/midiC0D0一起使用,但不能与../controlC1一起使用。。。。因此,除非control1 midiC0D0之间存在某种联系,否则原始问题仍然悬而未决?也许control1是一个音频频道?我的设备既是midi设备又是音频设备。显然,这些设备是不同的。我没有任何midi设备,但我会添加我想出的另一种方法来回答这个问题。谢谢你的更新,我已经在这条轨道上了。“all”选项不显示名称,相反,我使用udevadm info--attribute walk--name/dev/snd/midiC1D0输出更多的输出和所需的子字符串。这可能有用。值得注意的是,没有更简单的命令。。。。。
$ ls -l /dev/snd/midiC6*
crw-rw---- 1 root audio 116, 12 Sep 23 12:51 /dev/snd/midiC6D0
$ cat /proc/asound/card6/usbid
0582:0007
$ 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