オーディオデバイス/サウンドカードが現在再生されているかどうかをテストしていますか?


9

オーディオデバイスが無音かどうかを確認できるデフォルトのプログラムはありますか?

編集:沈黙とは、何かが再生されている場合(アクティブ化または開かれただけではない)

このようなもの:

if [[ device0 is silent ]] ; then
    radio $RANDOM
fi

編集2:私が達成しようとしているのは、ラジオを再生し、プレーヤーに障害が発生しても再生を続けることができるスクリプトです。たとえば、インターネット接続がダウンし、プレーヤーが回復しなかった場合、プレーヤーを殺してやり直します


音量レベルをチェックするツールですか?
Eddy_Em 2013年

いいえ、何か再生中かどうかを確認します
RSFalcon7

1
その後、私が推測する唯一の警告は、alsamixerで「Mix」を確認し、サウンドカードから少し録音して、録音されたファイルのボリュームを分析することです。しきい値よりも大きい場合は、何も再生されていないことを意味します。例えば試してくださいsox。他の場合では、試すことができますlsof|grep snd。何もない場合は、ラジオをオンにできます。
Eddy_Em 2013年

回答:


4

PulseAudioを使用していて(GnomeベースのLinuxディストリビューションはPulseAudioを使用する傾向があるため、1つがで実行されps -C pulseaudioているかどうかを確認できます)、一部のアプリケーションがデータを「シンク」に送信しているかどうかを知りたい場合は、次のようにします。

pacmd list-sink-inputs | grep -c 'state: RUNNING'

それでもPulseAudioを使用して、サウンド出力がミュートされているかどうかを確認したい場合は、もっと簡単な方法もありますが、次のコマンドを使用してデフォルトの「シンク」の「ミュート」ステータスを取得できます。

pacmd dump | awk '
  $1 == "set-sink-mute" {m[$2] = $3}
  $1 == "set-default-sink" {s = $2}
  END {print m[s]}'

何を使っているのかわかりませんが、このスクリプトではうまくいきませんでした。(no再生中かどうかに関係なく、「戻ります」)
RSFalcon7 2013年

すみません、その部分を逃しました。私はまだこれが要求されていることをしているとは思いません:アプリケーションがデバイスを開いているがデータを供給していない場合、それは誤検知を与えないでしょうか?
Gilles「SO-邪悪なことをやめなさい」

1
@Gilles、私のテストでは(一時停止mplayer)、その場合のState: CORKED代わりにそれを提供するState: RUNNINGため、引き続き機能します。アプリケーションが無音データをフィードする(無音を再生している)RUNNING場合、それはまだ表示されると思いますが、その場合、すべてのシンクのモニターデバイスでpamonを使用して無音を確認する以外に方法はありません。
ステファンChazelas

私はテストし、それは働いています。@Stephaneに感謝します。
RSFalcon7 2013年

3

私があなたを正しく理解しているなら、ここに例があります:

沈黙:

fuser /dev/snd/timer && echo "Something is playing" || echo "There's silence"
There's silence

私は大胆不敵です:

fuser /dev/snd/timer && echo "Something is playing" || echo "There's silence"
/dev/snd/timer:      47663
Something is playing

OSSについてchande /dev/snd/timer/dev/dsp

これは非常に依存する方法です。


ここの私の宿題(linux.amazingdev.com/blog/archives/000909.html)から、プロセスがデバイスを保持しているが実際には何も再生していない可能性があります。本当?(もしそうなら、それは役に立ちません)
RSFalcon7

はい、それは本当だ。「一時停止」または「ミュート」を押すとそうなります。しかし、この場合、数秒後にプレーヤーが再びプレイしないことを完全に確信することはできません。または、このメソッドを組み合わせて、サウンドカードから書き込むこともできます。
Eddy_Em 2013年

この場合、私はプレーヤーの失敗を克服する方法を探しているので、残念ながらこれは機能しません
RSFalcon7

1

サウンドにALSAミキサーを使用amixerしている場合、を使用して、オーディオデバイスに関する情報を照会できます。オーディオデバイスには通常、いくつかのオーディオチャネル(またはコントロール)があり、それぞれミュートおよびミュート解除できます。たとえば、Masterコントロールがミュートされているかどうかを確認するには、次のようにします。

if amixer get Master | grep -q off; then
    # action
fi

このsetオプションを使用して、コントロールに対して実行します。詳細についてman amixerは、を参照してください。


おそらく、質問に少しあいまいさがあったと私は編集しました。残念ながら動作amixerしませんでした。15分以上テストしたところ、プレーヤーはまったく開かれていません。それでも「
ミュート解除

これは、何かが再生されているかどうかではなく、サウンドチャネルがミュートされているかどうかをチェックします。
Gilles「SO-邪悪なことをやめなさい」

1

htorの答えはおそらく機能しますが、出力のどこかに "off"が表示され、誤った結果が生じる可能性は完全にあり得ます。以下は、GNU awkを使用したより厳密なチェックです。

if amixer get Master | gawk 'END{ if ( $NF != "[off]" ) { exit 1 } }'; then
    # muted
else
    # unmuted
fi

amixerの最後の行には$6「モノ:再生[オン]」がありません。(amixerバージョン1.0.26)たぶん$NFより移植性があります。
manatwork 2013年

@manatworkメモをありがとう、出力移植可能に見えましたが、私は簡単にリードできると思います;-)
Chris Down

これは、何かが再生されているかどうかではなく、サウンドチャネルがミュートされているかどうかをチェックします。
Gilles「SO-邪悪なことをやめなさい」

@ギレス-この回答を投稿したとき、質問はその問題を説明していませんでした。
Chris Down
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.