Menguji apakah perangkat audio / kartu suara sedang diputar?

9

Apakah ada program default di mana saya dapat memeriksa apakah perangkat audio saya diam?

Sunting: Diam, maksud saya jika ada sesuatu yang diputar pada itu (tidak hanya diaktifkan atau dibuka)

Sesuatu seperti ini:

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

Sunting 2: Apa yang saya coba capai adalah skrip yang memutar radio dan dapat terus bermain ketika pemain gagal, misalnya jika koneksi internet turun dan pemain tidak pulih, saya akan membunuh pemain dan memulai lagi

RSFalcon7
sumber
Apakah maksud Anda alat untuk memeriksa level volume?
Eddy_Em
tidak, periksa apakah ada sesuatu yang diputar atau tidak
RSFalcon7
1
maka satu-satunya waspada yang saya kira adalah untuk memeriksa "Mix" di alsamixer dan mencoba untuk merekam sedikit dari soundcard, kemudian menganalisa volume dalam file yang direkam. Jika lebih besar dari treshold, Anda bisa berarti tidak ada yang bermain. Coba misalnya sox. Dalam kasus lain, Anda dapat mencoba lsof|grep snd. Jika tidak ada yang bisa Anda menghidupkan radio.
Eddy_Em
Juga ditanya tentang Superuser
glenn jackman

Jawaban:

4

Jika Anda menggunakan PulseAudio (distribusi Linux berbasis Gnome cenderung menggunakan PulseAudio, Anda dapat memeriksa apakah ada yang berjalan dengan ps -C pulseaudio) dan Anda ingin tahu apakah beberapa aplikasi mengirim data apa pun ke "wastafel", Anda dapat melakukan:

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

Masih dengan PulseAudio, jika Anda ingin memeriksa apakah output suara Anda dibisukan, mungkin ada yang lebih sederhana tetapi Anda bisa mendapatkan status "bisu" dari "wastafel" default menggunakan:

pacmd dump | awk '
  $1 == "set-sink-mute" {m[$2] = $3}
  $1 == "set-default-sink" {s = $2}
  END {print m[s]}'
Stéphane Chazelas
sumber
Saya tidak yakin apa yang saya gunakan, tetapi skrip ini tidak berfungsi untuk saya. (Ini "kembali" nodalam situasi apa pun, bermain atau tidak)
RSFalcon7
Maaf, saya melewatkan bagian itu. Saya masih berpikir ini tidak melakukan apa yang diminta: jika suatu aplikasi membuka perangkat tetapi tidak memberi makan data apa pun, bukankah akan memberikan hasil positif palsu?
Gilles 'SANGAT berhenti menjadi jahat'
1
@Gilles, dalam pengujian saya (berhenti mplayer), itu memberi State: CORKEDbukannya State: RUNNINGdalam kasus itu sehingga masih akan bekerja Jika aplikasi memberi makan data keheningan (sedang bermain diam), maka saya kira itu masih akan ditampilkan RUNNING, tetapi dalam kasus itu, saya tidak melihat alternatif lain selain menggunakan pamon pada perangkat monitor dari semua wastafel dan memeriksa kesunyian.
Stéphane Chazelas
Saya diuji dan berhasil. Terima kasih @Sthane, saya akan memberikan Anda semua upvotes saya jika saya bisa!
RSFalcon7
3

Jika saya mengerti Anda dengan benar, berikut ini sebuah contoh:

Diam:

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

Saya mengaktifkan keberanian:

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

Untuk OSS chande /dev/snd/timerke /dev/dsp.

Ini adalah metode yang sangat tergantung.

Eddy_Em
sumber
Dari pekerjaan rumah saya di sini ( linux.amazingdev.com/blog/archives/000909.html ) tampaknya mungkin suatu proses memegang perangkat tetapi tidak benar-benar memainkan apa pun. Benarkah? (Jika demikian, itu tidak berguna)
RSFalcon7
Ya itu benar. Jika Anda menekan "jeda" atau "bisu" itu akan menjadi begitu. Tetapi dalam hal ini Anda tidak dapat benar-benar yakin bahwa setelah beberapa detik, pemain tidak akan bermain lagi. Atau Anda dapat menggabungkan metode ini & menulis dari kartu suara.
Eddy_Em
Dalam hal ini saya sedang mencari cara untuk mengatasi kegagalan pemain, jadi sayangnya ini tidak akan berhasil
RSFalcon7
1

Dengan asumsi Anda menggunakan mixer ALSA untuk suara Anda, Anda dapat menggunakannya amixeruntuk menanyakan informasi tentang perangkat audio. Perangkat audio biasanya memiliki beberapa saluran audio - atau kontrol - masing-masing yang dapat dibisukan dan dibisukan. Misalnya untuk memeriksa apakah Masterkontrol dibisukan Anda akan melakukan sesuatu seperti:

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

Gunakan setopsi untuk melakukan hal-hal pada kontrol. Lihat man amixeruntuk bantuan lebih lanjut.


sumber
Mungkin ada sedikit ambiguitas pada pertanyaan itu, saya edit. Sayangnya amixertidak berhasil, saya menguji lebih dari 15 menit dengan benar-benar tidak ada pemain yang dibuka, dan masih melaporkan "tidak
bersuara
Ini memeriksa apakah saluran suara dimatikan, bukan apakah ada sesuatu yang diputar.
Gilles 'SANGAT berhenti menjadi jahat'
1

jawaban htor mungkin akan bekerja, tetapi sangat mungkin bahwa "off" akan muncul di tempat lain di output, menyebabkan hasil yang salah. Berikut ini adalah pemeriksaan yang lebih ketat menggunakan awk GNU:

if amixer get Master | gawk 'END{ if ( $NF != "[off]" ) { exit 1 } }'; then
    # muted
else
    # unmuted
fi
Chris Down
sumber
Saya amixer's baris terakhir tidak punya $6: ‘Mono: Playback [pada]’. ( amixerversi 1.0.26) Mungkin $NFakan lebih portabel.
manatwork
@manatwork Terima kasih atas catatannya, outputnya terlihat portabel, tapi saya rasa saya mudah dipimpin ;-)
Chris Down
Ini memeriksa apakah saluran suara dimatikan, bukan apakah ada sesuatu yang diputar.
Gilles 'SANGAT berhenti menjadi jahat'
@Gilles - Ketika saya memposting jawaban ini, pertanyaannya tidak menjelaskan masalah itu.
Chris Down