2013年4月21日日曜日

【Ubuntu】FlashをALSA経由でUSB-DACと直結する方法のメモ

先日、調子の悪かったテキスト書き用のネットブックを触ってたらなんとなく直ったのでOSのインストールついでにベッドサイドの音楽鑑賞用にしてしまおうかなーと環境を再構築しました。

最近はMusic Unlimitedで音楽を聴くこともありFlash経由でストリーミングするのでFlashでALSAが認識したUSB-DACが使えるといいのになー、と考えました。

なにがどういいのかはよくわかりませんが、その方法と手順をメモとして残します。

環境はこんな感じです。

OS
ubuntu 12.04 LTS

音楽プレイヤー
Audacious
DeaDBeef
Music Unlimited用(Flash)にFirefox

さて、ご存知の方もいるでしょう。

ubuntuでは
システム設定→サウンドの設定
から接続しているサウンドカードを選択すればFlash経由でも音は鳴ります。

これはpluse audioというドライバを経由しています。


つまり、
サウンドカード→OS→ALSA→pulse-audio→ソフトウェア
という状態です。

ALSAは元々OSに組み込まれているため、切り離しようも無いのですがpulseがなんとも邪魔です。

なので
サウンドカード→OS→ALSA→ソフトウェア
こんな感じにします。


通常、音楽プレイヤーなら設定画面でデバイスを設定すれば音を鳴らすことが出来ます。

自分はAudaciousやDeaDBeefあたりをよく使いますが、これらプレイヤーも同様の設定があります。

普通に聴いているには差支えありませんし、こんな苦行をやる必要もありません。
ところが、web経由でFlashを使うサービスではこの設定が出来ません。

ではどうしようか?という話を含めてこの辺りから始まります。

やったことは次の内容です。
  1. realtime kernel(以降RT)の導入
  2. 高精度タイマーに変更
  3. pulse-audioの削除
  4. Flashのインストール
  5. ALSAで認識するデバイスの順を入れ替え

RTの導入?高精度タイマーに変更?
ん?何言ってんの?

勘の鋭い人はこの辺りで背景にある本題に気付きます。
趣味なので気にしないで下さい。

今回RTは必要不可欠では無いので入れなくてもいいです。
後でjackdを使って動かした時に色々遊べるので入れてるだけです。

<余談>
RTは音が良いと言われてますが同じ機器に同じ設定して聴き比べとかしてないのでよくわかりません。
変わるか変わらないかだと多分変わると思います。

RTではアプリケーションからの処理をある程度早い終了期限を設けることで、実行遅延を減らしています。

デバイスからの入力に対して遅延を減らして反応させるということを目的にしているため、ubuntu studio等のDTM向けディストリビューションでも採用されていました。

が、利用できないドライバや、デスクトップ向けに作られたkernelでは起こらない不具合の例が報告されています。

特殊なカーネルなので周囲をそれにあわせて環境を作る必要があります。
面倒なので普通に使う場合は入れないほうがいいです。

デスクトップ向けのkernelが3.0になる時に、過去のRTで培われたパッチが取り込まれて有効になっているようですので、特別に構築された(RTのような)kernelではなくても相応な恩恵を得ることが出来るはずです。


jackdでフレームやバッファの設定をした上で低遅延を求めるには必要になるレベルですが今回はjackdに触れません。

</余談>

高精度タイマーは内部クロックの精度を切り替えてます。
これについては過去に書いたのでこの辺りを参照してみてください。
【Linux】今更感漂うUbuntu11.10高音質化計画

pulse-audioの削除はそのままの意味です。

synapticやubuntuソフトウェアセンター辺りで検索して削除します。

どうも巷の噂では、常に停止させておいて必要なとき、例えばwebでFlash使って何かを見るとかそういう時にonにするとかそういう方法があるらしいです。

もう既に主題のタイトルから外れて、簡単にできそうなので心が折れそうです。

ちなみにいきなり削除すると
ボリュームコントロールや設定が無くなるので注意
してください。

アプリケーションごとに音量を設定するといった便利な機能も使えなくなります。

削除後の音量コントロールはalsamixerを端末(Terminal)からたたきます。(後述)
基本的にはUSB-DACの音量は最大にして、音は外部のアンプ側で調整します。


FlashのインストールはAdobeのサイトからtar.gzでダウンロードしてくるところから始まります。
http://www.adobe.com/go/getflashplayer_jp

今回は
ubuntu 32bit
tar.gz形式 
でダウロードしてきます。
32bitか64bitかは利用状況にあったもの選択してください。

で、このファイルを解凍して
$ sudo cp libflashplayer.so /usr/lib/firefox-addons/plugins/
こんな感じでコピーします。
その他、格納されているusrも同じように
$ sudo cp -r usr/* /usr
こんな感じでコピーします。

詳しい手順はアーカイブの中にあるreadme.txtに詳しく書かれていますので参照してみてください。

この後、ブラウザを再起動してプラグインにShockwave Flashがあれば多分上手く動いてます。


最後にALSAで認識するデバイスの順を入れ替えます。

単に/etc/modprobe.d/alsa-base.confを書き換えれば終わりかなーと、、、

私もその時は思ってました。
それがまさかこんな事態になろうとは知る由もなかったのです。
、、、はいはい小芝居小芝居。

単に
/etc/modprobe.d/alsa-base.conf
に書かれてる
options snd-usb-audio index=-2
のindex部分を上位に来る様に書き換えれば完了だろうと思ってましたがどうもうまく行かない。


結論を先に書くと、
設定ファイルの内容と認識されたデバイスの名前が違ってます。
なので単純にindexを変えるだけでは動かないどころかデバイスを認識すらしなくなります。

設定ファイルには
snd-usb-audio
とあるのですが、確認してみたところ実際に認識しているのは
snd_usb_audio
でした。

そりゃまあ、動かないですね。
なので、これを含めて書き換える必要があります。

# 厳密には同じ行がファイルの最後の方にもあって、また-2にされているので、この辺りも含めて修正する必要があるかもしれません。名前違うんで関係ないとおもいますけど。

## 修正する前はバックアップを取るようにしてください。結構アレな場所にあるコアな設定ファイルなので変な修正してしまうと簡単にOSが起動しなくなったりします。

ここを正しく書き直してUSB-DACを刺しっぱなしで再起動します。
RTで起動する場合は、grubが起動する前にshiftキーを押しっぱなしにして起動するkernelをrtにして上がり切るのを待ちましょう。

上がったらTerminalを開いて、
aplay -l
で機器のリストを表示してみましょう。
カード1が先頭、続いてカード0になっていると準備完了です。


では、Firefoxを起動してYoutubeを開き動作テストをしてみましょう。

動画が動き、本体のスピーカーから音が鳴らなければ目的の状態です。


USB-DAC(+アンプ)に繋いだヘッドホンから音が聴こえない?

大丈夫。落ち着いて下さい。
先ずは記憶を辿るのです。
先日、部屋を掃除した時これらの周りを拭いたり位置をずらしていませんか?
この機材達は今回のために新しく設置されましたか?
配線、外れてませんよね?

動作が確認出来たあとは内蔵音源のmaster、PCM、speaker、headphone辺りをミュートします。

これらはalsamixerから操作します。
$ alsamixer
で起動します。

カーソルキーで選択してmを押すとミュートの入切を操作出来ます。
設定例ではなく表示例

ぐりむはボリュームも絞ってますがこれはまかり間違って夜中に内蔵スピーカーから大音量が鳴らないよう、保険的な意味です。

0 件のコメント :

コメントを投稿