Kiểm tra nếu thiết bị âm thanh / card âm thanh hiện đang phát?


9

Có chương trình mặc định nào để tôi có thể kiểm tra xem các thiết bị âm thanh của mình có ở chế độ im lặng không?

Chỉnh sửa: Bằng cách im lặng, ý tôi là nếu có thứ gì đó phát trên đó (không chỉ kích hoạt hoặc mở)

Một cái gì đó như thế này:

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

Chỉnh sửa 2: Điều tôi đang cố gắng đạt được là một kịch bản phát radio và có thể tiếp tục phát khi trình phát bị lỗi, ví dụ: nếu kết nối internet bị hỏng và trình phát không phục hồi, tôi sẽ giết người chơi và bắt đầu lại


Bạn có nghĩa là một công cụ để kiểm tra mức âm lượng?
Eddy_Em

không, kiểm tra xem có thứ gì chơi hay không
RSFalcon7

1
sau đó, chiến tranh duy nhất tôi đoán là kiểm tra "Mix" trong alsamixer và cố gắng ghi lại một chút từ soundcard, sau đó phân tích âm lượng trong tệp đã ghi. Nếu nó lớn hơn một ngưỡng, bạn có thể có nghĩa là không có gì chơi. Hãy thử ví dụ sox. Trong trường hợp khác bạn có thể thử lsof|grep snd. Nếu không có gì bạn có thể bật radio.
Eddy_Em

Cũng được hỏi về Superuser
glenn jackman

Câu trả lời:


4

Nếu bạn đang sử dụng PulseAudio (bản phân phối Linux dựa trên Gnome có xu hướng sử dụng PulseAudio, bạn có thể kiểm tra ps -C pulseaudioxem có ứng dụng nào đang chạy không ) và bạn muốn biết liệu một số ứng dụng có gửi bất kỳ dữ liệu nào tới bất kỳ "chìm" nào không, bạn có thể làm:

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

Vẫn với PulseAudio, nếu bạn muốn kiểm tra xem đầu ra âm thanh của bạn có bị tắt tiếng hay không, có thể đơn giản hơn nhưng bạn có thể nhận trạng thái "tắt tiếng" của "chìm" mặc định bằng cách sử dụng:

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

Tôi không chắc chắn những gì tôi đang sử dụng, nhưng kịch bản này đã không làm việc cho tôi. (Nó "trở lại" notrong mọi tình huống, chơi hay không)
RSFalcon7

Xin lỗi, tôi đã bỏ lỡ phần đó. Tôi vẫn không nghĩ rằng đây là những gì được yêu cầu: nếu một ứng dụng mở thiết bị nhưng không cung cấp cho nó bất kỳ dữ liệu nào, liệu nó có cho kết quả dương tính giả không?
Gilles 'SO- ngừng trở nên xấu xa'

1
@Gilles, trong các thử nghiệm của tôi (tạm dừng mplayer), nó đưa ra State: CORKEDthay vì State: RUNNINGtrong trường hợp đó để nó vẫn hoạt động. Nếu ứng dụng cung cấp dữ liệu im lặng (đang phát chế độ im lặng), thì tôi cho rằng nó vẫn hiển thị RUNNING, nhưng trong trường hợp đó, tôi không thấy cách nào khác ngoài việc sử dụng pamon trên thiết bị giám sát của tất cả các bồn rửa và kiểm tra im lặng.
Stéphane Chazelas

Tôi đã thử nghiệm và nó hoạt động. Cảm ơn @Stephane tôi sẽ cung cấp cho bạn tất cả các upvote của tôi nếu tôi có thể!
RSFalcon7

3

Nếu tôi hiểu bạn đúng, đây là một ví dụ:

Im lặng:

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

Tôi bật táo bạo:

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

Đối với OSS chande /dev/snd/timerđến /dev/dsp.

Đây là một phương pháp rất phụ thuộc.


Từ bài tập về nhà của tôi ở đây ( linux.amazeddev.com/blog/archives/000909.html ) có vẻ như một quá trình đang giữ thiết bị nhưng không thực sự chơi bất cứ thứ gì. Điều đó có đúng không? (Nếu vậy, nó không hữu ích)
RSFalcon7

Vâng đúng vậy. Nếu bạn nhấn "tạm dừng" hoặc "tắt tiếng" thì sẽ như vậy. Nhưng trong trường hợp này, bạn không thể hoàn toàn chắc chắn rằng sau một vài giây, người chơi sẽ không chơi lại. Hoặc bạn có thể kết hợp phương pháp này và viết từ soundcard.
Eddy_Em

Trong trường hợp này, tôi đang tìm cách khắc phục những thất bại của người chơi, thật không may, điều này sẽ không hiệu quả
RSFalcon7

1

Giả sử bạn đang sử dụng bộ trộn ALSA cho âm thanh của mình, bạn có thể sử dụng amixerđể truy vấn thông tin về các thiết bị âm thanh. Một thiết bị âm thanh thường có một số kênh âm thanh - hoặc điều khiển - mỗi kênh có thể bị tắt tiếng và không bị tắt tiếng. Ví dụ: để kiểm tra xem Masterđiều khiển có bị tắt tiếng không, bạn sẽ làm một cái gì đó như:

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

Sử dụng settùy chọn để thực hiện mọi thứ trên các điều khiển. Xem man amixerđể được giúp đỡ thêm.


Có lẽ có một chút mơ hồ về câu hỏi, tôi đã chỉnh sửa. Đáng tiếc amixerđã không hoạt động, tôi đã thử nghiệm hơn 15 phút mà hoàn toàn không có người chơi nào mở và nó vẫn báo cáo "không được bật"
RSFalcon7

Điều này kiểm tra xem kênh âm thanh có bị tắt tiếng không, có phát ra thứ gì không.
Gilles 'SO- ngừng trở nên xấu xa'

1

Câu trả lời của htor có thể sẽ hoạt động, nhưng hoàn toàn có khả năng "tắt" sẽ xuất hiện ở một nơi khác trong đầu ra, gây ra kết quả không chính xác. Đây là một kiểm tra nghiêm ngặt hơn bằng cách sử dụng GNU awk:

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

amixerDòng cuối cùng của tôi không có $6: Mon Mono: Phát lại [trên]. ( amixerphiên bản 1.0.26) Có lẽ $NFsẽ dễ mang theo hơn.
thao tác

@manatwork Cảm ơn bạn đã lưu ý, đầu ra trông có vẻ di động, nhưng tôi đoán tôi dễ dàng bị dẫn dắt ;-)
Chris Down

Điều này kiểm tra xem kênh âm thanh có bị tắt tiếng không, có phát ra thứ gì không.
Gilles 'SO- ngừng trở nên xấu xa'

@Gilles - Khi tôi đăng câu trả lời này, câu hỏi không mô tả vấn đề đó.
Chris Xuống
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.