オーディオの不具合と戦った記録

さて、PCを現在の環境に新調してからずっと、オーディオの不具合には悩まされ続けて来ました。
言葉ではうまく表現できないんですが、音楽とか聞いてたら所々で直前の音に戻ってまた再生が続行される、みたいな。
プログラム風に言えば、サイクルバッファが壊れて継目を正しく処理できなかったみたいな。

結論から言うと、完全解決ではないかも知れませんがほぼその現象を抑えることに成功しました。
/etc/pulse/defaultt.paにて
### Automatically load driver modules depending on the hardware available
.ifexists module-udev-detect.so
load-module module-udev-detect tsched=0
.else
### Alternatively use the static hardware detection module (for systems that
### lack udev support)
load-module module-detect
.endif

と記述しておけばOKでした。tsched=0がミソ。タイマベースから割り込みベースに切り替えただのなんだのって書いてあったんだけど、まだ詳しくは理解しきれてません・・・。ちょっと調べないといけませんね。

以下、つらつらと紆余曲折をだらだらと。

音がうまく鳴ってくれない、ちとそれじゃ気にくわないってんでSoundBlaster AudigyLSのカードを挿して使ってたんですが、できたらオンボードだけで完結しちゃいたいなーってことで再度オンボードの方でチャレンジすることに。

まず、そもそもちゃんとデバイスが認識しているのかって話。これはこのPCに変えたときから一応調べてはいたんですが、使われているチップはALC889Aというチップ。現在のALSAではばっちりこれに該当するコーデックは入っていないらしく、ALC880だったかな、それのコーデックを使っているようです。まぁ互換性があるようなのでこれで問題ないらしい。動いてますよーって報告もちらほら。

ただ、ALC889Aで不具合がーみたいな報告もちらほら。私の場合、音が鳴るには鳴ってるけど再生状況が正常ではないっていう微妙な症状なので、なかなかうまい検索ワードも思いつかず、Webでは探しきれなかったんですよねぇ。

で、いろいろとdmesgのエラーメッセージを元に探して行ったところ、
Bug #329620 in linux (Ubuntu): “ALSA woke us up to write new data to the device, but there was actually nothing to write.”
のような記述が複数みつかりました。どうもtsched=0というのがキーワードになるようだ、と。

で、参考リンクとして提示されてた
Features/GlitchFreeAudio – FedoraProject
を見ると、どうもFedora10からは割り込みベースではなくタイマスケジュールベースにPulseAudioが変更されたらしい。ただ、tsched=0とすれば従来の割り込みベースに戻せるのだとか。

で、従来の割り込みベースにしたらちゃんと鳴るようになるよーって記述が多かったので試して見たところ、ほんとに鳴るようになっちゃったというわけ。意味が分からん・・・。PulseAudioの実装がまずいってことなんかしら・・・? それともALSAと相性が悪い?

で、そのまんま置いとけばよかったのに、さらに遊びで$HOME/.pulse/daemon.confにて
resample-method = trivial

とか書いてたもんだから原因到達に苦しんだ・・・。なんかこのオプションでもってリサンプルしたらPhonon経由で音を鳴らした途端にPulseAudioがクラッシュしてました。どうもこのリサンプル方法はPhononと相性が悪いらしい・・・。Phonon以外では普通に鳴ってたんだけどね。デフォルトだとsoeex-float-3とかだったかな? それよりは精度がいいらしいんだけど、まぁめっちゃ頑張って聴いてもプラシーボじゃねぇの?ってくらいしか違いを感じ取れなかったし、そもそも圧縮音源で聴いてる時点で、しかもオンボードで聴いてる時点で音質なんて(笑)って話なので潔くデフォルトに戻しました。

そのおかげで今は快調に音が鳴ってます。長時間のベンチ的なことをしていないのでひょっとしたらたまに音がおかしくなる可能性もありますが、まぁ前は10分に1度くらいの頻度で起きちゃってましたからそこからすれば格段に安定してます。

にしたって、タイマベースで動かせないのはどうなんだろう? タイマベースの方がモダンな実装らしいんだけどねぇ。よく分からんや。

今回は「ALSAドライバ」「PulseAudio」「Phonon」とそれぞれについて調べなくてはいけなかったのでなかなか大変でした・・・。ALSA一本の頃は楽やったなぁ・・・;;

広告

PulseAudioの設定について

PulseAudioについて、日本語の解説を見つけられなかったので自分なりにまとめてみた。

PulseAudioの設定 – Fedora備忘録

正直最後の方は投げやり…。そんなに細かく設定する人もそう多くはないと思うので、必要十分だとは思ってるんですが…。ま、PulseAudioの本家サイトに詳しく書いてるんですけれどね。daemon.confについては本家では触れられていないので、多少は参考になるかも。中身についてはファイルを見れば分かるでしょう。

あとは/etc/pulse/以下のファイルは$HOME/.pulse/以下にもってきてカスタムしたらいいってのも書いてない情報かな? まぁLinux触って長い人にとっては常識レベルではあるんですが。

サウンドはLinuxにとってまだまだ問題の頻出するところですし、PulseAudioのことも知っておいて損はないかと。ぶっちゃけALSAのdmixでよかったじゃんとも思わなくもないけどさw

SkypeがPulseAudioに対応

Download Skype for Linux
β版という扱いのようですが、インストールして見たところ全く問題なく使えました。

いやぁ、これでSkypeが安心して使えますね! β版だからか、yumの更新に引っかかってきませんでしたが、普通にアップグレードでインストールできます。Fedoraユーザはぜひ試してみてはいかがでしょう?

GoogleTalkと音声チャットをしよう

Pidgin2.6.1より、XMPP/Jabberプロトコルのみ、音声/ビデオチャットに対応しました。
libpurpleに実装されているので、これを使用するEmpathyも同様に対応しています。

デバイスの選定についてはGstreamerの設定に従います。よって、gstreamer-propertiesで音声とビデオデバイスを設定しておきましょう。

ただ、現状はまだ実用一歩手前と言ったところ。これまでにVelnirやdaydreamerさんに手伝っていただいてテストした結果、片方がWinで、GoogleTalkクライアントかGmail(多分iGoogleでも可)を用いている場合のみ音声チャットができるみたいです。両方Linuxという場合はうまく通信ができませんでした。

とはいえ、これはそのうち解決するだろうとは思います。Winとは問題なく通話できているので。ただ、今でもSkypeなら安定して通話できるので、よく使うならしばらくはSkypeを使うことになるかと思います。

Skypeに対するアドバンテージとしては、Gstreamerを使用するのでPulseAudioと問題なく併用できる点でしょうか。Linux版のSkypeは更新が止まって久しいですし、Pidginの音声/ビデオチャット機能が成熟してくれると楽しみですね。

今のところ、Win版のPidginには音声/ビデオチャット機の鵜は実装されていないので悪しからず。これもそのうち実装されるかな…?

PulseAudio+Skype

Fedora11になってから、PulseAudio+Skypeという環境が非常に扱い辛くなってしまいました。

Fedora10までは、Skypeのサウンドデバイスの設定にて、サウンド出力をpulseにしておけばOKだったんですが、Fedora11になってからは音がぶちぶち切れます。

PulseAudioのnice値を変更したらましになるかも知れませんがそれはちょっと違うよなぁという気もしておりまして。仕方がないのでSkypeを使うときは

$ pulseaudio -k

で、PulseAudioを殺して、サウンド出力をALSAデバイス(実際に使用するデバイス名)に変えて通話しておりました。

この場合、もちろんPulseAudio経由のアプリは音が鳴らなくなりますが、そもそもSkypeで通話をするときは他の音が鳴ってくれると困るので特に問題ありませんでした。

ところが、最近になってPulseAudioに変更が加えられたのか、PulseAudioを殺してもすぐ復帰するようになってました。-kオプションで殺そうが、killで殺そうが即刻復活してます。-kオプションは何のためにあるんだw

そこで困ったわけです。PulseAudioを殺さなきゃSkypeは使えない。しかしkillしようと即刻復活するため、SkypeでALSAデバイスを占有できない。

ほとほと困り果てていたのですが、今日、親からSkype通話があったので知恵を振り絞って、とあることを思いつきました。

「あぁ、そういや録音デバイスをpadevchooserで他のに切り替えられたんだから、再生デバイスも切り替えちゃったらデバイスの占有状態は解けるんじゃね…?」

で、さっそくトライ。Sinkにはoutputしかありませんでしたが、ダメ元で「null」を指定したところドンピシャリ。特に不具合を起こすこともなく、ALSAデバイスを占有することができました。

ということで、一旦はこれで逃げようかと思います。あるいは私のPCはサウンドデバイスが2つあるので(オンボードの方はBIOSで殺しているので、現状は1つ)、オンボード側をSkypeの出力専用としてアンプに繋いでおくという手もありますね。

あぁ、その方が楽かもしれない…。今度試しておこうw アナログの入力端子は余ってたよな…?

gtk-recordMyDesktopでデスクトップの音をキャプチャする

PulseAudioになってからずっとやり方が分からず悩んでいたデスクトップの音のキャプチャですが、今回ようやく実現出来ました。

まず、下の画像にあるように、「Sources」のoutput.monitorという名前を覚えておきます。これが出力音声で、今回キャプチャしようとしている音です。

PulseAudioManager

次に、PulseAudioDeviceChooserにてDefaultSourceを上記のoutput.monitorに変更します。

PulseAudioDeviceChooser

そしてgtk-recordMyDesktopの設定で、音のデバイスに「pulse」を指定します。

recordMyDesktop

後は録画するだけ! これでデスクトップ上の音をキャプチャできます。スクリーンキャプチャでデスクトップ上の音を録音したい時に便利ですね。

もちろん、デスクトップの音をキャプチャせずとも、他のデバイスを選択することもできます。

私の環境では、サウンドカード以外にWebカメラ、キャプチャボードが入力デバイスとして認識されております(デフォルトはWebカメラにしてます)。それらを自由に切り替えて使うことができます。出力も同様です。