web-dev-qa-db-ja.com

AlsaUSB-オーディオホットプラグ

私の新しいUSBオーディオスピーカーは、Alsaの2番目のデバイスとして登場しました。私はそれを主要なものにすることができました:

$ cat /proc/asound/modules 
 0 snd_usb_audio
 1 snd_hda_intel
$ cat /proc/asound/cards
 0 [Speaker        ]: USB-Audio - uBoom Q Speaker
                      uBoom Q Speaker at usb-0000:00:1d.1-1, full speed
 1 [Intel          ]: HDA-Intel - HDA Intel
                      HDA Intel at 0x80000000 irq 16

これらの行を/etc/modprobe.d/alsa-base.confに追加することによって:

options snd_hda_intel index=1
options snd_usb_audio index=0

これで、USBを起動すると、オーディオはデフォルトでどこでも機能します。問題は—それを切断する(またはそれなしで起動する)と、

$ cat /proc/asound/modules 
 1 snd_hda_intel

0番目のデバイスがないため、何も機能しません。

$ aplay
ALSA lib confmisc.c:768:(parse_card) cannot find card '0'

私が欲しいのは、デバイスインデックスを再割り当てする方法です。解決策がスクリプトの場合—それを使用してudevルールを作成します。

現在、「index =?」を変更していますデフォルトの「0,1」に戻し、alsa force-reloadを呼び出すと役立ちます。より良い方法はありますか?

注:私のディストリビューションにはasoundconfはありません(KUbuntu Lucid):(

2
kolypto

まず、Alsaデバイスのインデックスを扱いましょう。 USBスピーカーを接続し、Sudo alsa force-reloadを呼び出すと、Alsaがそれを見つけます。

カードインデックスとそのドライバーを一覧表示します。

$ cat /proc/asound/modules 
 0 snd_hda_intel
 1 snd_usb_audio

より詳細な情報を表示する:

$ cat /proc/asound/cards
 0 [Intel          ]: HDA-Intel - HDA Intel
                      HDA Intel at 0x80000000 irq 16
 1 [Speaker        ]: USB-Audio - uBoom Q Speaker
                      uBoom Q Speaker at usb-0000:00:1d.0-1, full speed

Index = 0の「Speaker」が必要です。

これらの行を/etc/modprobe.d/alsa-base.confに追加して、USBスピーカーが存在する場合はデフォルトのデバイスにします。

options snd_hda_intel index=-2
options snd_usb_audio index=-1

これにより、内蔵カードよりもUSBスピーカーの方が適しています。発行Sudo alsa force-reload、出来上がり!これで、cat /proc/asound/cardsを使用して、USBスピーカーを接続/切断したときにカードがどのように表示および非表示になるかを確認できます。


次に起動するアプリケーションで使用する2枚のカードのどちらを選択するかを選択する別の領収書があります。

次の行を/etc/asound.confに追加します。

$ cat /etc/asound.conf.switch 
# CARD DEFINITIONS
#=== CARD 'card0'
pcm.card0-hw { type hw ; card 0 ; }
ctl.card0-hw { type hw ; card 0 ; }

pcm.card0 { type dmix ;
    ipc_key 4109 ; ipc_perm 0660 ;
    slave { pcm "hw:0,0"
        channels 2 ; period_size 1024 ; buffer_size 4096 ; rate 44100 ; period_time 0 ;
        }
    bindings { 0 0 ; 1 1 ; }
    }

#=== CARD 'card1'
pcm.card1-hw { type hw ; card 1 ; }
ctl.card1-hw { type hw ; card 1 ; }

pcm.card1 { type dmix ;
    ipc_key 1949 ; ipc_perm 0660 ;
    slave { pcm "hw:1,0"
        channels 2 ; period_size 1024 ; buffer_size 4096 ; rate 44100 ; period_time 0 ;
        }
    bindings { 0 0 ; 1 1 ; }
    }

これにより、「card0」と「card1」の2つの「dmix」再生デバイスが作成されます。彼らはあなたが問題なくそれらを切り替えることを可能にします。

さて、これを〜/ .asoundrcに入れてください:

# Define new virtual devices
pcm.this                { type plug ; slave.pcm "card1" ; }
ctl.this                ctl.card1-hw
# Set default device
pcm.!default    pcm.this
ctl.!default    ctl.this

2枚目のカードに切り替えます。元に戻すには、すべての「1」を「0」に置き換えます。小さなスクリプトが便利です:)

注:このマニュアルでは、いくつかの新しいAlsaデバイスを作成しました:「this」、「card0-hw」、「card0」、「card1-hw」、「card1」。あなたはそれらを参照することができます:

$ amixer -D 'this' scontrols
Simple mixer control 'PCM',0

P.S.私はAlsaが実際にどのように機能するかと共通しておらず、ひどい間違いを犯した可能性があります:)もっと良い方法があれば、私を訂正してください。しかし、それでも、これは機能します:)

1
kolypto

asoundconf-gtkをインストールしてみてくださいが、気を付けてください https://bugs.launchpad.net/ubuntu/+source/asoundconf-gtk/+bug/575058

2
user47877

同じ問題を解決しようとしています。USBサウンドカードがシステムに接続されたときにオーディオストリームを自動的に再ルーティングするため、udevの新しいルールを作成することにしました。

/etc/udev/rules.d/50-alsa.rules:

SUBSYSTEMS=="usb", ATTRS{idVendor}=="****", ATTRS{idProduct}=="****", RUN+="/usr/local/bin/alsa-switch.sh"

もちろん、デバイスに応じて「*」を数字に置き換える必要があります(lsusbを使用してどれを確認するか)

alsa-switch.shスクリプトは非常に単純です:

#!/bin/sh
ln -sf /path/to/custom/asoundrc /home/<user>/.asoundrc

別のルールを追加して、デバイスが取り外されたときに構成を元に戻すことができます(申し訳ありませんが、まだ作業中です)

0
Daniele

オンボードを-2に、USBを-1に設定してalsa-base.confを簡単に編集しようとしましたが、これは機能しませんでした。

ただし、両方を-1に設定すると(オンボードが最初にリストされている場合)、前後に切り替えることができます。

ただし、変更のたびにアルサフォースリロードを実行する必要があります。

0
Steve Rinsler