Я читаю / пишу с / на устройство 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 есть что-то простое, чтобы найти устройство ….
Спасибо
Арьен
Взгляни на путь /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);
}
MIDI-устройства перечислены с их именами, когда вы обращаетесь к ним через соответствующий API (ALSA RawMIDI или секвенсор):
$ amidi -l Имя устройства Dir IO hw: 2,0 Xonar D2 MIDI IO hw: 6,0,0 SC-8820 Часть A IO hw: 6,0,1 SC-8820 Часть B IO hw: 6,0,2 SC-8820 MIDI $ aplaymidi -l Порт Имя клиента Имя порта 14: 0 Миди Через Миди Через Порт-0 24: 0 Xonar D2 Xonar D2 MIDI 40: 0 SC-8820 SC-8820 Часть A 40: 1 SC-8820 SC-8820 Часть B 40: 2 SC-8820 SC-8820 MIDI
Аудиоустройства USB получают записи в /dev/snd/by-id/
, которые указывают на устройство управления каждой карты:
$ ls -l / dev / snd / by-id / lrwxrwxrwx 1 root root 12 сен. 23 12:51 usb-0582_0007-00 -> ../controlC6 lrwxrwxrwx 1 корневой корень 12 сентября 23 12:51 usb-Roland_EDIROL_UA-1A-00 -> ../controlC5
Соответствующий узел устройства MIDI имеет тот же номер карты после буквы C
:
$ ls -l / dev / snd / midiC6 * crw-rw ---- 1 root audio 116, 12 сен. 23 12:51 / dev / snd / midiC6D0
Другой способ найти номер карты — поиск в /proc/asound/card*/usbid
файлы для идентификатора вашего устройства:
$ cat / proc / asound / card6 / usbid 0582: 0007
В качестве альтернативы, проанализируйте содержимое /proc/asound/cards
:
$ cat / proc / asound / cards 2 [D2]: AV200 - Xonar D2 Asus Virtuoso 200 в 0xe800, IRQ 20 5 [UA1A]: USB-аудио - EDIROL UA-1A Roland EDIROL UA-1A на usb-0000: 00: 12.2-4.2, на полной скорости 6 [SC8820]: USB-аудио - SC-8820 Roland SC-8820 на usb-0000: 00: 12.0-3, на полной скорости ^ номер карты