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
(참고수도엘). 이 숫자는 를 통해 사용할 수 있는 N
udev 속성과 동일합니다 .ATTR{number}
udevadm info -q all -a -p /sys/class/sound/card<N>
plughw:CARD=<name>,DEV=0
OS 버전이 너무 오래되지 않았다면 비슷한 이름을 사용할 수도 있습니다. 이 <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