오디오 장치의 이름을 일관되게 지정하려면 어떻게 해야 합니까?

오디오 장치의 이름을 일관되게 지정하려면 어떻게 해야 합니까?

USB를 통해 Linux 컴퓨터에 연결하는 두 개의 아마추어 라디오가 있습니다. 라디오는 사운드 카드로 표시되며 다음과 같이 표시됩니다.

$ aplay -l
[...]
card 1: CODEC [USB Audio CODEC], device 0: USB Audio [USB Audio]
  Subdevices: 1/1
  Subdevice #0: subdevice #0
card 2: CODEC_1 [USB Audio CODEC], device 0: USB Audio [USB Audio]
  Subdevices: 1/1
  Subdevice #0: subdevice #0

$ arecord -l
**** List of CAPTURE Hardware Devices ****
card 1: CODEC [USB Audio CODEC], device 0: USB Audio [USB Audio]
  Subdevices: 1/1
  Subdevice #0: subdevice #0
card 2: CODEC_1 [USB Audio CODEC], device 0: USB Audio [USB Audio]
  Subdevices: 0/1
  Subdevice #0: subdevice #0

USB에 다음과 같이 표시됩니다.

$ lsusb | grep Audio
$ lsusb | grep Aud
Bus 001 Device 102: ID 08bb:2901 Texas Instruments PCM2901 Audio Codec
Bus 001 Device 099: ID 08bb:2901 Texas Instruments PCM2901 Audio Codec

여기서 문제는 그들 중 하나와 대화하고 싶은 소프트웨어가 있지만 어느 것인지 모른다는 것입니다. 소프트웨어(js8call 및 wsjtx)를 사용하면 드롭다운에서 이름을 선택할 수 있고 선택한 이름을 기억할 수 있습니다.

이 드롭다운의 이름은 다음과 같습니다.

alsa_input.usb-Burr-Brown_from_TI_USB_Audio_CODEC-00.analog-stereo
alsa_input.usb-Burr-Brown_from_TI_USB_Audio_CODEC-00.analog-stereo.2

다른 소프트웨어(예: direwolf)는 "plughw:2,0" 형식의 장치를 원하며, 여기서 다른 라디오는 "plughw:1,0"입니다.

그러나 어느 것이 어느 것인지는 일관성이 없습니다. Linux가 언제 이를 감지했는지에 따라 다르며, 가장 좋은 경우는 내가 연결한 순서이며, 일반적인 경우에는 경쟁 조건입니다. 둘 다 연결되어 있고 동일한 전원 공급 장치를 사용하므로 다음과 같이 부팅됩니다. 전원을 켜는 것과 동시에.

그렇다면 Linux에서 이 두 사운드 장치의 이름을 일관된 방식으로 지정하여 구성 파일을 편집하고 다른 순서로 감지될 때마다 UI에서 설정을 변경할 필요가 없도록 하려면 어떻게 해야 할까요?

답변1

드롭다운의 이름은 PulseAudio 소스 이름과 유사합니다. 을 참조하세요 pacmd dump. 여기에는 표준 USB 장치 설명자에 있는 USB 사운드 장치의 일련 번호가 포함됩니다(참조 lsusb -d 08bb:2901 -v | grep iSerial). 라디오에 Linux에서 감지할 수 있는 고유 식별자가 없는 경우 일관되게 이름을 지정하는 것이 까다로울 수 있습니다.

PulseAudio 이름은 속성을 기반으로 생성된 것 같습니다 . 문제의 사운드 장치 번호가 어디에 있는지 ID_ID확인하세요 ( 에서 시작 ).udevadm info -q property -p /sys/class/sound/card<N><N>card0

ID_PATH예를 들어 속성을 사용하여 연결된 물리적 USB 포트에 따라 라디오를 식별하고 ENV{ID_ID}이를 기반으로 속성을 조정하여 각 라디오의 인터페이스를 고유하게 식별할 수 있도록 하는 사용자 정의 udev 규칙을 만들 수 있습니다 .


plughw:N,0이름은 ALSA // 장치 이름입니다 .asoundrc. /etc/alsa/conf.d( arecord -L참고대문자엘). 숫자 N는 udev 속성과 동일하며 ATTR{number}로 볼 수 있습니다 udevadm info -q all -a -p /sys/class/sound/card<N>.

plughw:CARD=<name>,DEV=0OS 버전이 너무 오래되지 않은 경우 대신 같은 이름을 사용할 수 있습니다 . 부품은 <name>udev 속성을 기반으로 하며 ATTR{id}로 표시됩니다 udevadm info -q all -a -p /sys/class/sound/card<N>.

ATTR{number}udev 규칙에 따라 또는 속성을 수정할 수 있는지 여부는 ATTR{id}시스템에 있는 udev 버전에 따라 달라지는 것 같습니다. 최신 버전의 udev가 이전 버전보다 더 엄격한 것처럼 보이거나, 최신 시스템에 더 복잡한 udev 규칙 세트가 있어서 저는 그냥 올바른 설정 방법을 찾지 못했습니다.

udev 규칙의 순서는 중요합니다. 활성화하기 위해 자신만의 규칙을 설정해야 하는지 알아보려면 Linux 배포판의 기존 udev 규칙을 연구해야 할 수도 있습니다.~ 전에또는~ 후에규칙이 실제로 적용되도록 배포의 표준 규칙을 적용합니다. 이전 배포판에는 단일 디렉터리에 모든 udev 규칙이 있었습니다. 최신 배포판에는 /etc/udev/rules.d/로컬 사용자 정의가 있는 반면 시스템 표준 규칙은 [/usr]/lib/udev/rules.d/.

최신 배포판에서는 동일한 이름의 규칙 파일이 /etc/udev/rules.d/시스템 표준 규칙 디렉터리와 시스템 표준 규칙 디렉터리 모두에 존재하는 경우 해당 파일이 /etc/udev/rules.d/해당 표준 파일을 재정의하므로 표준 규칙 디렉터리의 파일을 수정할 필요가 없습니다. . 따라서 패키지 업데이트로 사용자 정의 내용을 덮어쓰는 일이 발생하지 않습니다.

ALSA에 대한 대체 솔루션으로, 필요한 udev 속성을 수정할 수 없는 경우 udev에서 시스템 전체 /etc/alsa/conf.d/*.conf파일을 생성하도록 할 수 있습니다. 이 파일은 적절한 udev 속성으로 식별한 후 라디오에 적합한 사용자 정의 ALSA 장치 이름을 정의합니다.


ALSA 문서에는 연결된 USB 포트를 통해 USB 장치에 ALSA 장치 번호를 할당하는 방법에 대한 오래된 예가 있습니다.
https://alsa.opensrc.org/Udev#A_working_example

이는 다소 복잡하고 udev 도우미 역할을 하는 작은 프로그램을 컴파일해야 하며 입력 장치가 아닌 오디오 출력을 처리하도록 설계되었지만 실행 가능한 시작점이 되어야 합니다. 또한 필요하지 않은 일부 기능(예: 연결된 모든 USB 사운드 장치를 포함하는 결합된 출력 장치 설정)도 포함되어 있습니다.

답변2

가장 쉬운 해결 방법은 idUSB 경로를 기반으로 속성을 덮어쓰는 것입니다.

간단한 해결책은 이것을 다음 위치에 배치하는 것 같습니다 /etc/udev/rules.d/99-myrules.conf.

SUBSYSTEM=="sound",KERNELS=="1-1.4.4:1.0",ATTR{id}="CODEC_7300"
SUBSYSTEM=="sound",KERNELS=="1-1.3.4:1.0",ATTR{id}="CODEC_9700"

KERNELS에서 오디오 카드의 인덱스를 udevadm info -ap /sys/class/sound/controlC2가져 옵니다 .2

위의 내용은 짧은 대답이며 ID를 노출하는 드롭다운이 있는 프로그램에 대해 해결합니다.

다른 스레드에 대한 좋은 질문과 답변:

이것이 일관된 ALSA 사운드 카드 번호를 설정하지는 않지만 어느 것이 어느 것인지 분명하게 만듭니다. 당 aplay -l:

**** List of PLAYBACK Hardware Devices ****
[...]
card 2: CODEC_7300 [USB Audio CODEC], device 0: USB Audio [USB Audio]
  Subdevices: 1/1
  Subdevice #0: subdevice #0
card 3: CODEC_9700 [USB Audio CODEC], device 0: USB Audio [USB Audio]
  Subdevices: 1/1
  Subdevice #0: subdevice #0

더 나아가 일관된 ALSA 번호를 얻으려면 일련의 심볼릭 링크를 만들 수 있습니다. 예:

KERNEL=="controlC[0-9]*", DRIVERS=="usb", PROGRAM="/usr/bin/alsa_name.sh %k", SYMLINK+="%c"
KERNEL=="hwC[D0-9]*", DRIVERS=="usb", PROGRAM="/usr/bin/alsa_name.sh %k", SYMLINK+="%c"
KERNEL=="midiC[D0-9]*", DRIVERS=="usb", PROGRAM="/usr/bin/alsa_name.sh %k", SYMLINK+="%c"
KERNEL=="pcmC[D0-9cp]*", DRIVERS=="usb", PROGRAM="/usr/bin/alsa_name.sh %k", SYMLINK+="%c"

그리고 경로를 확인하고 적절한 이름을 반환하는 스크립트가 있습니다. 예:

#!/bin/bash
NAME="$1"
if echo "$DEVPATH" | grep 1-1.4; then
    NAME="$(echo "$NAME" | sed -r 's/(.*)C([0-9]+)(.*)/\1C11\3/')"
fi
if echo "$DEVPATH" | grep 1-1.3; then
    NAME="$(echo "$NAME" | sed -r 's/(.*)C([0-9]+)(.*)/\1C12\3/')"
fi
exec echo "snd/$NAME"

그런 다음 다음과 같이 일관된 PulseAudio 장치를 만들 수 있습니다.

N=11
DEV="radio-7300"
pacmd load-module module-alsa-card \
      device_id="${N}" name="${DEV}" \
      card_name="alsa_card.platform-${DEV}_audio" \
      namereg_fail=false tsched=no fixed_latency_range=no \
      ignore_dB=no deferred_volume=yes use_ucm=yes \
      card_properties="module-udev-detect.discovered=1"
pacmd suspend-sink alsa_output.${DEV}.analog-stereo no
pacmd suspend-source alsa_input.${DEV}.analog-stereo no


관련 정보