PulseAudioシンクボリュームを確認する


6

PulseAudioシンクボリュームを確認するコマンドはありますか。特定のシンクのPulseAudioボリュームを%で表示することを意味します

すなわち50%

pactl set-sinks-volume 1 50%コマンドを使用してすでにボリュームを設定しました。しかし、今私はそれが50%かどうかを確認したいです。

どうすればこれを行うことができますか?

回答:


8

を使用pactl list sinksして、シンクの現在の状態に関する情報を取得できます。これは、ボリュームを含む多くの情報を返します。したがって、シンク1のボリュームのみを取得するには、次を使用できます。

pactl list sinks | perl -000ne 'if(/#1/){/(Volume:.*)/; print "$1\n"}'

これは次のようなものを返します:

Volume: 0:  50% 1:  50%

上記のperlコマンドは、の詳細を出力しsink 1ます。別のシンクを使用するには、など#1を別の番号に変更し#0ます。

この2つが何を50%意味するのかわかりませんが、それらが左右のスピーカーの音量だと思います。そのため、それらが特定の値の上または下にあるかどうかを確認するために(バランスが「中央」に設定され、左右のボリュームが同一であるため、一方だけをチェックする必要があると仮定して)、次のことができます:

pactl list sinks | perl -000lne 'if(/#1/){/Volume:.*?(\d+)%/; $1 >= 50 ? (print "y\n") : (print "n\n")}'

上記はy、ボリュームが50以上の場合にaを出力し、それ以外の場合にa を出力しnます。ただし、これは少し複雑になっているので、スクリプトを作成して単純化します。

#!/usr/bin/env perl 

## The sink we are interested in should be given as the 
## 1st argument to the script.
die("Need a sink number as the first argument\n") if @ARGV < 1;
my $sink=$ARGV[0];

## If the script has been run with a second argument,
## that argument will be the volume threshold we are checking
my $volume_limit=$ARGV[1]||undef;

## Run the pactl command and save the output in 
## ther filehandle $fh
open(my $fh, '-|', 'pactl list sinks');

## Set the record separator to consecutive newlines (same as -000)
## this means we read the info for each sink as a single "line".
$/="\n\n";

## Go through the pactl output
while (<$fh>) {
    ## If this is the sink we are interested in
    if (/#$sink/) {
        ## Extract the current colume of this sink
        /Volume:.*?(\d+)%/;
        my $volume=$1;
        ## If the script has been run with a second argument,
        ## check whether the volume is above or below that
        if ($volume_limit) {
            ## If the volume os greater than or equal to the
            ## value passed, print "y"
            if ($volume >= $volume_limit) {
               print "y\n";
                exit 0;
            }
            else {
                print "n\n";
                exit 1;
            }
        }   
        ## Else, if the script has been run with just one argument,
        ## print the current volume.
        else {
            print "$volume%\n";
        }
    }

}

上記のスクリプトを(たとえば)のcheck_volume.plディレクトリに保存し、実行可能にしてから、実行して最初の引数として目的のシンクを指定します。$PATH/usr/local/binchmod +x check_volume.pl

$ check_volume.pl 1
50%

ボリュームが所定のしきい値を超えているかどうかを確認するには、2番目の引数としてしきい値を指定します。

$ check_volume.pl 1 50
y
$ check_volume.pl 1 70
n

これは、システムの言語が英語であることを前提としていることに注意してください。変更されたロケールでスクリプトを実行しない場合:

LC_ALL=C check_volume.pl 1 50

どのように私は、ボリュームが> =条件の場合で50%で確認することができます
プラカシュV Holkar

@PrakashVHolkarは更新された答えを見て、もっと複雑なスクリプトを作成しました。
テルドン

3
pactlロケール依存の文字列を出力するため、英語以外のシステムではこの回答のコマンドが失敗します。常に接頭辞を付けるか、LC_ALL=C 1回入力しexport LC_ALL=Cて、シェル(およびそこから実行されるすべてのコマンド)をデフォルトのロケールに設定します。その後pactl | perl ...動作します。
ステファングーリチョン

@StéphaneGourichon良い点、回答の編集、ありがとう。
テルドン

2

amixerこのようなミキサーオプションを使用して、pulseaudioボリュームを読み取ることができます。

$ amixer -c $CARD -M -D $MIXER get $SCONTROL
# CARD is your sound card number, mixer is either alsa or pulse and scontrol is the alsa device name, Master if you want to use pulse.
$ amixer -c 1 -M -D pulse get Master

Simple mixer control 'Master',0
  Capabilities: pvolume pswitch pswitch-joined
  Playback channels: Front Left - Front Right
  Limits: Playback 0 - 65536
  Mono:
  Front Left: Playback 27662 [42%] [on]
  Front Right: Playback 27662 [42%] [on]

これで、grepまたはsedまたはを使用して解析できますperl

$ amixer -c 1 -M -D pulse get Master | grep -o -E [[:digit:]]+%
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.