Различать несколько звуковых карт USB по USB-порту, к которому они подключены

Для этого можно использовать " символы привязки ".

grep "[[:print:]]*_P$" file.txt

или, проще говоря, (согласно комментарию @JeffSchaller)

grep "_P$" file.txt

должен достичь того, чего вы хотите.

1
10.12.2020, 21:38
2 ответа

Основываясь на ответе @meuh, мне удалось заставить его работать, хотя и немного иначе, чем я изначально планировал.

Запись в файл >/sys/devices/.../sound/card0/idдействительно была правильным решением, поэтому для этой цели я написал небольшой bash-скрипт

#!/bin/bash
for file in $(find /sys/devices/ -name id | grep sound | grep usb)
do
    for fragment in $(echo $file | tr "/" "\n")
    do
        if [[ $fragment == *"1.2.1"* ]]
        then
            printf "%s" "EXT_B1" > "$file"
        fi
        if [[ $fragment == *"1.2.2"* ]]
        then
            printf "%s" "EXT_B2" > "$file"
        fi
        # etc
    done
done 

Эту часть-for fragment in $(echo $file | tr "/" "\n")-возможно можно было бы сделать более изящно, но я не могу просто использовать полный путь к файлу, т.к. хочу использовать любую звуковую карту и идентифицировать их только через порт USB, но на данный момент У меня только одна звуковая карта, поэтому я не могу проверить, меняется ли этот путь для разных моделей или поставщиков. Отсюда поиск шаблона 1.2.1и т. д., описывающего конкретный порт USB-концентратора, подключенного к конкретному USB-порту моего устройства.

Мне не удалось запустить его с помощью правил udev -очевидно, вам нужен root-доступ для записи в /sys/devices/...(, что имеет смысл ), но, несмотря на просмотр нескольких ответов,Я не смог это сделать -, может быть, потому что я использую Raspbian Jessie на Raspberry Pi, может быть, потому что я мало знаю о Linux.

Однако мой вариант использования не обязательно требует, чтобы скрипт запускался при подключении устройства -достаточно просто запустить его при загрузке, поэтому последнее, что нужно было сделать, это отредактировать crontab с помощью sudo crontab -eи добавить строку

@reboot /path/to/my/script.sh

И вуаля , я могу получить доступ к определенной звуковой карте USB в коде Java, используя AudioSystem.getMixerInfo(), и воспроизвести звук, используяAudioSystem.getClip(mixerInfo)

1
18.03.2021, 22:43

Вы на правильном пути. Есть много вещей, которые могут пойти не так с udev. Причина, по которой правила udev с NAME="..."больше не работают, заключается в том, что ядро ​​больше не позволяет вам переименовывать устройства таким образом. Создание символических ссылок с SYMLINK+=в целом работает, но я не знаю, заинтересованы ли они в alsa.

Таким образом, я думаю, что наиболее правильным решением является совет, данный в вашей связанной статье в разделе под названием Идентифицировать два идентичных аудиоустройства . Используйте правило с DEVPATH==, чтобы сопоставить устройство, и ATTR{id}="ABC", чтобы дать уникальное имя этому устройству, которое вы затем найдете в aplay -lили cat /proc/asound/cards.

Сначала попробуйте сделать то же самое вручную. У меня нет звуковых USB-карт, а есть только встроенное -устройство, так что если у меня есть:

find /sys/devices/ -name id | grep sound

в нем перечислены многие элементы с именем "id", но некоторые из них являются каталогами, и единственный файл, представляющий интерес, это /sys/devices/.../sound/card0/id. Если я catэтот файл, он содержит имя устройства ("PCH" ).Если я запишу строку в этот псевдо-файл -, он изменит свое имя :

.
sudo sh -c 'printf "%s" MYCARD >/sys/devices/.../sound/card0/id'

и это видно в выводе aplay -l. Это то, что вы пытаетесь сделать с помощью udev; псевдофайл sysfs -idявляется атрибутом из card0. Таким образом, в udev ATTR{id}=работает только в том случае, если вы сопоставили правильный каталог /sys, то есть /sys/devices/.../sound/card0в моем случае. Вот почему правило udev гласит DEVPATH=="/sys/devices/.../sound/card?"(, что номер карты может измениться, поэтому он заменяется подстановочным -символом карты "?" ).

Более полный пример см. в упомянутом выше -разделе ссылки, в котором содержится полный файл правил 85-my-usb-audio.rules.

1
18.03.2021, 22:43

Теги

Похожие вопросы