Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/267.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在PHP中找到具有特定$string的设备/开发人员_Php_Linux_Midi - Fatal编程技术网

如何在PHP中找到具有特定$string的设备/开发人员

如何在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

我正在读/写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/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