「音が出ない」色々なケース
|
同じ「音が出ない」と言う症状でも原因は何種類もあることが判りました。
No. |
症状 |
備考 |
1 |
USB機器として認識していない。 |
lsusbしてもエントリが無い |
2 |
ALSAのデバイスとして認識していない。 |
/proc/asoundにエントリが無い |
3 |
mpdの出力デバイスと一致していない。 |
card0以外で認識されている |
4 |
mpdの再生時に出力エラーとなり、音が出ない。 |
デバイスがroot権限のみrw可能 |
5 |
なぜかデバイスのmuteがOnとなっていて音が出ない。 |
1回だけ発生した。 |
それぞれについて、原因と対策を述べます。
1.USBの認識問題 |
当初、USB機器としての認識不良の問題はPiの電力的に貧弱な事が原因ではないかと考えていましたが、
電力的なもの以外にも要因があることが大分判ってきました。
udevadm monitorでhotplugの状態をモニターしてみたところ、
PHA-2の変わった動きが確認できました。
PHA-2は、電源OFFでもONでもUSB機器として認識されます。
但し、
No. |
PHA-2電源 |
ベンダコード |
機器コード |
SUBSYSTEM |
1 |
ON |
054C |
088C |
sound |
2 |
OFF |
054C |
088D |
hid |
PHA-2は電源がOFFの場合、HIDデバイスだと振る舞うと同時に、機器コードも違う値に変わります。
別の機械のフリをするんですね。
PHA-2の電源をOFF/ONすると、下記のイベントが発生します。
No. |
Pi 電源遷移 |
PHA-2電源遷移 |
発生するイベント |
備考 |
1 | | OFF->ON |
088D remove |
観測者無し? |
2 | OFF->ON | |
088C の存在 |
eventでは無く状態確認か? |
3 | | ON->OFF |
088C remove |
sound取り外しevent発生 |
4 | | |
088D add |
HID取り付けevent発生 |
5 | | OFF->ON |
088D remove |
HID取り外しevent発生 |
6 | | |
088C add |
sound取り付けevent発生 |
7 | | ON->OFF |
088C remove |
sound取り外しevent発生 |
8 | | |
088D add |
HID取り付けevent発生 |
この様に、PHA-2のOFF/ONに合わせてダイナミックに状態が切り替わります。
但し、No.1,2に関してはPiとPHA-2の起動タイミングにより発生有無は不定です。
OS起動時のネゴシエーションの流れまでは確認できていません。
ホスト(Pi)から見ると、PHA-2の電源がONにされると、
HID(マウスとかキーボード等の)デバイスがUSBポートから抜かれ、
代わりに別のサウンドデバイスがUSBポートに差されたと認識することになります。
電源OFF時にはHIDデバイスのフリをしてUSBポートから充電させるための仕組みでしょう。
結構トリッキーな気がしますが、今時の機器ってそんなもんなんでしょうか。
しかし、この動作に問題がありました。
USB機器としてすら認識されていないケースでは、No.6が発生していません。
つまりNo.5のHID取り外しイベントは発生しますが、sound機器が差されたイベントがありません。
当然、lsusbで確認してもSony製品は差されていない状態です。
OSであるRaspyfi(もしくはlinuxそのもの?)やudevの問題なのか。
もしくはハードウェアであるRaspberry Piそのものの問題なのか、
それともPHA-2のファーム制御の問題なのか....。
それでも何が起きているかは解ったので、リカバリすればなんとかなりそうです。
USB機器として認識してない場合でも、PHA-2のOFF/ONをすれば認識されますので、
正しくaudio機器として認識されさえすれば、次のステップに進めます。
|
2.ALSAのデバイスとして認識していない問題 |
現時点ではPHA-2が正しくsoundデバイスとしてhotplug検出されれば、この問題はクリアされた可能性があります。
でもまだ安心はできませんが。
2013年12月2日追記
やっぱり安心できませんでした。
起動中にPHA-2をOFF/ONするのであれば問題無い様です。
しかしpi起動後にPHA-2をONにした場合、ALSAのデバイスとして認識されないケースがあります。
その場合は/usr/sbin/alsa reloadで認識可能な事を確認しました。
起動時のチェックで認識していなければreload入れてリカバリすることにしました。
|
3.mpdの出力デバイスと一致していない問題 |
ALSAのオーディオデバイスは、下記の様にcard0, card1,...と名前が振られます。
# ls -l /proc/asound
上記はオリジナルとは違い、敢えて内蔵音源を認識させていない状態です。
オリジナルでは、Raspberry Piの内蔵音源であるbcm2835もcard1として検出されます。
問題は、card0,card1は認識された順番により振られる番号だと言う事です。
これは、PHA-2の電源投入が遅れるとPHA-2がcard1になることがあるということです。実際あります。
それ自体はALSA的には仕様通りですが、問題はRaspyFiのmpdがデフォルトではcard0しか認識しない事です。
その結果、PHA-2がcard0以外でALSAに登録されると、そのままでは音が出ない状況に陥ります。
/etc/mpd.confでは以下の様に出力デバイスを指定しています。
ここでdeviceを"hw:0,0"と指定しているため、mpdはcard0しか使えません。
RaspyFiのWeb-UIのソースをみると、deviceを変更する為のUIロジックも入っている様ですが、card番号が変わる度に設定変更が必要では困ります。
card番号を0に固定する為の方法は、以下の様に色々考えられます。
mpd.confのaudio_outputにplghwを指定する方法 |
mpd側で回避する方法としては出力デバイスを"plghw:Amplifier,0"と記述する手もあります。
plghwはcard番号のindexではなく、デバイス名称で指定できるので、この問題は回避できます。
"Amplifier"と言うのは、PHA-2のデバイス名です。#もうちょっとなんとかならんかったのか。
しかし、調べてみると"plghw"で指定した場合、ALSAの再生ロジックにも違いが出る様です。
どこまで違うか確かめてはいませんが、plghwは積極的に使いたい方法ではなさそうです。
|
mpd.confのaudio_outputを複数個書く方法 |
別解として、audio_outputを2つ書き、"hw:0,0" "hw:1,0"の両方に出力させる事も可能です。
でもスマートじゃないので没。
|
強制的にUSBデバイスをcard0にする方法 |
/etc/modprobe.d/alsa-base.confに
options snd-usb-audio index=0
を追加する。と言うのが一番シンプル。
|
この問題自体が無くなる様に、内蔵音源デバイス自体をOSに認識させない方法 |
/etc/modulesのsnd-bcm2835をコメントアウトします。
|
この問題自体が無くなる様に、内蔵音源デバイス自体をALSAに認識させない方法 |
/etc/modprobe.d/alsa-base-blacklist.confに追加する。
|
当初は、内蔵音源デバイス自体をOSに認識させない方法を使っていました。
しかしUSB認識に失敗したケースで/proc/asound自体が生成されない場合があったので、現時点ではUSBをcard0に強制するシンプルな方法
/etc/modprobe.d/alsa-base.confにoptions snd-usb-audio index=0を記述する方法でtrial中です。
でもUSB認識されないロジックが判明する前の処置だったので、どちらも違いは無いかもしれません。
2013年12月2日追記
これは後述するudevdが殺されている事が原因だった可能性と、ALSA自体が認識に失敗していた場合に発生した可能性がありそうです。
このどちらかが原因だと考えられますので、方法はどちらでも問題無い気がします。
|
4.mpdの再生時に出力エラーとなる問題 |
次のステップは、hotplugの問題です。
USBとして認識しなかった場合や、使用中にPHA-2の電源をOFFにした場合、電源をONにして正しくaudioデバイスとして認識されても、mpdからの音楽再生時にエラーとなり、音は出ません。
hotplugの仕組みにより、自動的に/dev/sndにdeviceが作成される所までは問題ありません。
しかし、このdeviceのaccess権がroot onlyで作成されてしまいます。
これが原因でmpd(group audioに所属)はPHA-2に出力する権限がありません。
これはALSAのバグですね。
2013年12月2日追記
ALSAのバグじゃなかった。詳細はこの項目の末尾へ記載
この問題はhotplug動作後にdevice nodeのaccess権を変更すれば対処可能です。
/etc/udev/rules.d/又は/lib/udev/rules.d/にルールを作成します。
/etc/udev/rules.d/に39-usb-alsa.rulesを作る場合
/lib/udev/rules.d/78-sound-card.rulesを改造する場合
どちらも下のようなスクリプトを用意しておけば、PHA-2電源ONの際に呼び出されました。
/root/bin/udev-hotplug.sh
service udev restartとかしたらちゃんと動き出しました。
まぁ、デバイス決め打ちしちゃってるので、もう少し細かくフィルタすべきかもしれません。
2013年12月2日追記
原因は、udevdをraspyfiが殺している事と判明。
確かにhotplugが不安定な気はしていましたが、起動時には動作しているudevdがいつの間にか死んでいます。
調査の結果、raspyfiの独自追加部分である/var/www/command/orion_optimize.shでkillしている事が判明。
killallで皆殺しにしてます...。
起動してしまえばhotplug不要!と言うことなんでしょうか。
それとも音楽再生以外は全てを犠牲にすると言う事でしょうか。
ちょっとストイックすぎる気もします。
udevが動作することで音楽再生に何か問題が発生するのかもしれません...。
何れにしても原因は解ったので、現時点ではudevdを活かしてみる事にしました。
副次効果として、この変更を加える事でhotplug時のroot permission問題も無くなりました。
つまりhotplug時に/dev/snd/以下のノードは期待通りaudio groupで生成されます。
従ってudevのルールに変更を加える事も一切必要なくなりました。
/var/www/command/orion_optimize.shに下記の変更を加えました。
|
5.全チャネルmute問題 |
レアだと思われるけど全チャネルにmuteが勝手に掛かるケースへの対処はこんな感じです
起動時のステータスチェックの最後辺りに入れてます。
発生頻度が高いようだったら、hotplug時にも対処要かもしれません。
|
|
PHA-2とUSBの関係 電力編
|
PHA-2側も認識問題の原因の一つなのかもしれません。充電仕様が結構特殊。
今のところ下記が分かっています。
1 |
充電には必ず付属のUSBケーブルを使えと取説に書いてある。結線は普通のUSBケーブルだった。
|
2 |
USB-ACアダプタから充電するには、D+とD-がショートしていないケーブルではダメっぽい。
|
3 |
PCに接続した状態で、PHA-2の電源をOFFにしないと充電されない。
|
4 |
取説には、PCがスタンバイ状態だと充電されないと書いてある。
|
5 |
Piが起動中にPHA-2の電源をOFFにすると充電される。仕様通りか。
|
6 |
5の状態でPiをshutdownすると充電が止まる。仕様通り?っぽい。
|
PHA-2にはチャージ状態を示すLEDがありますので、充電可否はLEDで判断しました。
つまり起動したPCにPHA-2の電源をOFFにして繋げと言うことらしい。
もしくは普通のスマホ同様の充電専用ケーブルでUSB用ACアダプタやモバイルバッテリから充電しろと。
ちなみにバッテリに付属のSONYのUSB-ACアダプタは、アダプタ内部でD+とD-がショートしていました。
これは、東芝のREGZAでも同様でしたが、この仕組みならケーブルは通常の結線のまま行けますね。
ちょっと面倒くさい仕様みたいです。つまり使いながらの充電はできないらしい。
というか、充電できないのは構わないのですが、ACアダプタで連続駆動できない?と言うことでしょうか?
でもそれじゃ、パソコンのUSB-Audioアダプタとしては使えなくなるのでそんなはず無いか?
そんなはずないだろうと、調べてみました。
No. |
供給元 |
ケーブル |
状態 |
PHA-2 の電源 |
CHG LED |
電流値 |
1 |
Pi ON |
付属(普通のUSB) |
使用中 |
ON |
OFF |
285mA〜300mA |
2 |
Pi ON |
付属(普通のUSB) |
PHA-2だけOFF |
OFF |
ON |
400mA |
3 |
Pi OFF |
付属(普通のUSB) |
shutdown後 |
ON |
OFF |
0mA |
4 |
Pi OFF |
付属(普通のUSB) |
shutdown後 |
OFF |
OFF |
OFF |
5 |
USB-AC |
D+D-ショート |
充電専用 |
ON |
OFF |
0mA |
6 |
USB-AC |
D+D-ショート |
充電専用 |
OFF |
ON |
800mA |
7 |
USB-AC |
付属(普通のUSB) |
---- |
ON |
OFF |
0mA |
8 |
USB-AC |
付属(普通のUSB) |
---- |
OFF |
BLINK |
N/A |
やはりUSB-Audioアダプタとして使用する場合も、300mA程度の電流が流れます。
300mAがPiの供給限界?でもNo.2の結果では400mA出せていますので、そうではなさそうです。
PHA-2の動作に必要な電流は300mA程度と考えられるのでしょうか。
どうやら、USB-Audioアダプタとして連続使用は可能な様です。
そして同時に、この事実はPHA-2がホスト機器の電力を吸い取って動作している事も示しています。
|
PHA-2とUSBの関係 認識編
|
#lsusbの出力です。
Device 004がPHA-2です。
というか、HI-DISCのUSBメモリって、実はKingstonだったのか。
|
PHA-2とUSBの関係 認識編 さらに詳細
|
lsusb -vで取得した詳細情報です。500行以上あります。
lsusb -vの結果
これはPHA-2の入力セレクタSWを「PC接続モード」にした場合の結果です。
間違って「walkman接続モード」になってると、電源をOFFにした時と同様にHIDデバイスとして認識されます。
Audio deviceとして認識されないので、壊れたかと結構アセります。
当然、音も出ません。
ここで、
と言う行から、USB Audioとして使ってる時はSelf Powered扱いであることが判ります。
でも0mAだよと言いつつ、電力吸い取っていることは、前述の通りです。
ちなみに入力セレクタ間違ったときは、HIDデバイス且つ、MaxPower 500mAでした。
|
PHA-2とALSA(mpd)の関係 volume編
|
volumeをコントロールするmpdのパラメータmixer_typeにはdisabled, software, hardwareが指定できます。
デフォルトではdisabled。つまりmpdからは音量の操作ができないので不便。
softwareは音のデータを変えることになるので論外。
hardwareでコントロール出来ることがベストだが、そのままだと上手く動かない。
下記の方法でDSD以外はコントロールできる事を確認。
この設定でalsamixerの'Sony Clock Selector'とリアルタイムに連動する。
PHA-2には3つのvolume control interfaceがあるようだ。
そのうち2つが'Sony Clock Selector'と連動し、もう一つは'Sony Clock Selector 1'に振られている。
使い分けはamixerコマンドによると前者がfront left,rightで、後者はMONOらしい...?
この設定によりwavファイルの音量は調整できたが、dsfファイルは1目盛絞っただけで音が消える。
これでは音量調整ではなくてON/OFFだ。DSDだけダメとは。
もう一つのvolume(MONO)でも同じ状態だった。
asound.stateの変更等で調整可能なのか要調査。
/etc/mpd.conf
mixer_controlに入れるべきデバイス名は、amixer -c 0 で確認した。
使えるコントロールは前述の通り2組,3つのvolumeチャネル
# amixer -c 0
alsamixerの出力結果は下記。
# alsamixer
|
RaspyFiとmpdの事 USBメモリ編
|
RaspyFiではデフォルトで10個のUSBメモリが差されても使えるようになっています。
そしてそれらは実際に差されている時だけ、自動的にマウントされる仕組みです。
とても便利なのですが、mpd側は実際にUSBメモリが存在すると思って参照してしまいエラーを吐きます。
/var/log/mpd/mpd.log
mpd.logには再生したファイル名なども記録されている様ですが、起動の度に上記ログが出て鬱陶しい。
/etc/auto.usbを下記の様に修正した。
まぁ、2個もマウントできれば十分でしょう。
|