web-dev-qa-db-ja.com

コマンドラインからpulseaudioボリュームを読みますか? (私が欲しい: "pactl GET-sink-volume")

設定できる音量レベルを読みたい

pactl set-sink-volume $SINK $VOLUME

それを行う簡単な方法はありますか?仮説と同じくらい簡単

pactl get-sink-volume $SINK

(私がやろうとしていることは?pactlを使用して音量を設定すると、音量を100%より高く設定できるため、これは悪い考えです(音質が低下します)。そのため、次のような小さなスクリプトを書くことを考えています。 100%を超えないようにします。読み取ります。しきい値を超えますか?100%に設定します。1%を追加します。それを行う別の方法がある場合は、教えてください!最もクリーンな解決策は、Pulseに停止するように指示することでしょう100%です。しかし、元の質問は残っています。何らかの方法があるはずです。)

それが何か違いがあるなら私はDebianを使っています。

26
Higemaru
pactl list sinks | grep '^[[:space:]]Volume:' | \
    head -n $(( $SINK + 1 )) | tail -n 1 | sed -e 's,.* \([0-9][0-9]*\)%.*,\1,'

それは私が持っているものです。すっきりしていませんが、私の使用には十分でした。 方法が見つかりませんでした。 pactlには、1つのシンクのみのリストを取得する手段がないようですが、昇順で出力されます。つまり、tailheadを使用してn番目の行を選択します。ボリュームラインには右チャネルと左チャネルに別々のボリュームがある場合があり、sed置換は最初のボリュームのみを選択することに注意してください。

記録のために、私はpactl list sinks shortアクティブシンク番号を取得するには:

pactl list short | grep RUNNING | sed -e 's,^\([0-9][0-9]*\)[^0-9].*,\1,'

編集2017-10-05:PulseAudioの変更により、これらを少し調整する必要がありました。これが私が今持っているものです:

SINK=$( pactl list short sinks | sed -e 's,^\([0-9][0-9]*\)[^0-9].*,\1,' | head -n 1 )
NOW=$( pactl list sinks | grep '^[[:space:]]Volume:' | head -n $(( $SINK + 1 )) | tail -n 1 | sed -e 's,.* \([0-9][0-9]*\)%.*,\1,' )

私はMODを+10または-10に設定し、いくつかの境界チェックを行い、最後に:

pactl set-sink-volume $SINK ${MOD}%
20
Tommi Kyntola

別のプログラムを使用する制限がない場合は、 pamixer があります。

次の方法でボリュームを取得できます。

$ pamixer --get-volume
11
yudi-matsuzake

Tommi Kyntolaの回答は、実際にシンク番号を取得できるように、使用中のシンクに依存していることに注意してください。

また、名前付きシンクインデックスがcountedインデックスと同じであることに依存していることにも注意してください。たとえば、3つのシンク1、2、3があり、その3が選択されたシンクである場合、番号2を切断し、1と3を残します。ここで、Tommi Kyntolaのソリューションでシンク3を数えることはできません。 pactl list sinks | grep "^[[:space:]]Volume:"は2つのボリュームフィールドのみを出力するため、$SINK + 1番目の行を取得するためのヘッド/テールへのパイプは機能しません。(私はこのirlを経験しました、私は単なるつまみではありません)

私のソリューションは、pacmdが常に特定の順序でシンクをリストするという前提に基づいて機能します。より信頼性の高いソリューションが必要な場合は、出力を解析する必要があります。

#!/bin/sh

# Get the index of the selected sink:
getsink() {
    pacmd list-sinks |
        awk '/index:/{i++} /* index:/{print i; exit}'
}

# Get the selected sink volume
getvolume() {
    pacmd list-sinks |
        awk '/^\svolume:/{i++} i=='$(getsink)'{print $5; exit}'
}

getvolume

注:ボリュームフィールドが異なるかどうかはわかりませんが、次のようになります(pacmd list-sinksから):

volume: front-left: 42706 /  65% / -11.16 dB,   front-right: 42706 /  65% / -11.16 dB

また、最初のチャンネル(左前)の音量をパーセント形式(つまり、フィールド5)で取得していますが、チャンネルのレベルが異なる場合があります。


編集:

考え直してみると、おそらく実際にはpacmd statからデフォルトのシンク名を取得して、複雑度の低いソリューションにする必要があります。

#/bin/sh
getdefaultsinkname() {
    pacmd stat | awk -F": " '/^Default sink name: /{print $2}'
}

getdefaultsinkvol() {
    pacmd list-sinks |
        awk '/^\s+name: /{indefault = $2 == "<'$(getdefaultsinkname)'>"}
            /^\s+volume: / && indefault {print $5; exit}'

}

setdefaulsinkvol() {
    pactl $(getdefaultsinkname) $1
}
8
jgr

多言語バリアント:

pactl list sink-inputs | \
grep -A15 -P "(\#|№)$SINK" | \
grep -P "\d+\s*\/\s*\d+\%" | \
head -1 | \
awk "{print \$5}"

Pactl 5.0でテスト済み

4
Peter

ボリュームを取得するために私はこれを試しています:

echo `(pactl list sinks | grep "Volume: 0:")| awk '{print $3}'`
4
kairo

私はまだコメントできません(@jgrの回答を改善するために特別にサインアップしました)ので、デフォルトのシンクがプラグイン(任意の数のladspaプラグインのような)である場合、編集ソリューションはXX%を返します(末尾のコンマに注意してください) )、これはそれよりも少しうまく機能します。申し訳ありませんが、私のawk-fuは非常に基本的なものです。これを行うためのより良い方法があると確信しています。

修正されたソリューションでは、 '%'も省略されています。これを維持する意味がわからないため、数値のみを返す場合は、数学で使用できます。また、私のケースでは特定の指示が必要なsetvolケースを修正しました。

#/bin/sh
getdefaultsinkname() {
    pacmd stat | awk -F": " '/^Default sink name: /{print $2}'
}

getdefaultsinkvol() {
    pacmd list-sinks |
        awk '/^\s+name: /{indefault = $2 == "<'$(getdefaultsinkname)'>"}
            /^\s+volume: / && indefault {print $5; exit}' |
        awk -F"%" '{print $1}'
}

setdefaultsinkvol() {
    pactl -- set-sink-volume $(getdefaultsinkname) $1
}
4
Ng Oon-Ee

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:]]+%
2
Ashhar Hasan

特に複数のシンクがある場合は、ここでいくつかの回答が制限されていることがわかりました。だから私は私が見つけたものを共有したいと思います。

pulseaudio-ctl のソースにPulseAudioステータスを「取得」して設定するための優れたスクリプトがたくさんあります ここ を表示できます。

彼らは、pactlに似たpacmdというツールを使用することを選択しました。これもPulseAudioに付属しています。 man pacmdを見ると、 "実行時に実行中のPulseAudioサウンドサーバーをイントロスペクトまたは再構成するために使用できる"pacmd manページ )。この「内省」は私たちがここで求めているものです。

現在のボリュームを取得

pacmd list-sinks|grep -A 15 '* index'| awk '/volume: front/{ print $5 }' | sed 's/[%|,]//g'

リポジトリからの関数は、環境に応じて少し冗長です: get current volume

ミュート状態を取得する

mutedステータスを取得することもできます:

pacmd list-sinks|grep -A 15 '* index'|awk '/muted:/{ print $2 }'

ここに表示: ミュート状態を取得


台本離れて!

これにより、(ライブラリのように)libnotifyを使用してスクリプトを記述し、新しいボリュームレベルを出力したり、ボリュームを変更したときにサウンドを再生するなど、他のフックを使用して実装する機能がたくさん開きます。

change-volume.sh

SINK=$(pacmd list-sinks|awk '/\* index:/{ print $3 }') || "@DEFAULT_SINK@"
pactl set-sink-volume "$SINK" "$@"
canberra-gtk-play -i audio-volume-change -d "$(basename "$0")"

。 change-volume.sh + 5%

1
brettinternet