オーディオデバイスの名前を一貫して指定する方法は?

オーディオデバイスの名前を一貫して指定する方法は?

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

ここでの問題は、それらのうちの1つと話したいソフトウェアがありますが、どちらがわからないということです。ソフトウェア(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でこれら2つのサウンドデバイスの名前を一貫した方法で指定し、異なる順序で検出するたびに設定ファイルを編集して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ルールを1つのディレクトリに配置するために使用される古いディストリビューション:最新のディストリビューションは/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


関連情報