오디오 장치의 이름을 일관되게 지정하는 방법은 무엇입니까?

오디오 장치의 이름을 일관되게 지정하는 방법은 무엇입니까?

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 포트를 기반으로 라디오를 식별하는 속성을 사용하는 사용자 정의 udev 규칙을 만들고 ENV{ID_ID}이를 기반으로 속성을 조정하여 각 라디오의 인터페이스를 고유하게 식별할 수 있습니다.


plughw:N,0.asoundrc// 이름은 ALSA /etc/alsa/conf.d장치 이름입니다. arecord -L(참고수도엘). 이 숫자는 를 통해 사용할 수 있는 Nudev 속성과 동일합니다 .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>.

udev 규칙을 통해 속성을 수정할 수 있는지 ATTR{number}여부 ATTR{id}는 시스템에 있는 udev 버전에 따라 달라지는 것 같습니다. 최신 버전의 udev는 이전 버전보다 더 제한적인 것처럼 보이거나 최신 시스템에는 더 복잡한 udev 규칙 세트가 있을 수 있습니다. 올바른 설정 방법을 찾을 수 없습니다.

udev 규칙의 순서는 중요합니다. Linux 배포판의 기존 udev 규칙을 연구하여 활성화하기 위해 자신만의 규칙을 설정해야 하는지 확인할 수 있습니다.앞으로또는뒤쪽에Distro의 표준 규칙을 사용하면 규칙이 실제로 적용됩니다. 모든 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적절한 ALSA 장치 이름을 통해 라디오를 식별한 후 적절한 사용자 정의를 정의하는 시스템 전체 파일을 생성하도록 할 수 있습니다.


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

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

답변2

id가장 간단한 해결책은 USB 경로를 기반으로 이 속성을 재정의하는 것입니다.

간단한 해결책은 이것을 다음과 같이 넣는 것 같습니다 /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


관련 정보