Awesome wm でボリュームコントロール

Gnome Shell や XFce4 などでは NotePC の音量コントロールボタンで音量のUp/Down 及びミュートが操作出来ましたが， Awesome ではそのままでは動作しないようです．ということで設定してみました．

(以下の時の設定では unmute がうまく行っていなかった & 解りやすく修正．)

awesome wm を久々に使おうとしたら設定ファイルが使えなくなっていたので再設定 | matoken's meme

キーコードを調べる

まずはボタンのキーコードを調べました．xev コマンドを実行しながら該当ボタンを押して調べます．手元のマシンでは以下のようになりました．

ThinkPad X201s のボリュームキー情報(xev で確認)

VolUp

KeyRelease event, serial 33, synthetic NO, window 0x1800001,

root 0x98, subw 0x0, time 74266491, (715,471), root:(717,492),

state 0x0, keycode 123 (keysym 0x1008ff13, XF86AudioRaiseVolume), same_screen YES,

XLookupString gives 0 bytes:

XFilterEvent returns: False

VolDown

KeyRelease event, serial 33, synthetic NO, window 0x1800001,

root 0x98, subw 0x0, time 74268735, (715,471), root:(717,492),

state 0x0, keycode 122 (keysym 0x1008ff11, XF86AudioLowerVolume), same_screen YES,

XLookupString gives 0 bytes:

XFilterEvent returns: False

ミュート

KeyPress event, serial 30, synthetic NO, window 0x3e00001,

root 0x98, subw 0x0, time 107269062, (0,480), root:(212,630),

state 0x0, keycode 121 (keysym 0x1008ff12, XF86AudioMute), same_screen YES,

XLookupString gives 0 bytes:

XmbLookupString gives 0 bytes:

XFilterEvent returns: False

ということでこうなりました．

ミュートボタン -> XF86AudioMute

音量Upボタン -> XF86AudioRaiseVolume

音量Downボタン -> XF86AudioLowerVolume

音量の操作コマンドを調べる

alsa の操作をコマンドで実行できる amixer で操作するサウンドカードなどを確認します．amixer でサウンドカードを確認して，amixer -c 0 などとしてサウンドカードの内訳を確認したり出来ます．-c 0 は0番目のカードという意味になります．2枚目のカードは，-c 1 というオプションで指定できます．

今回は sound card 0 の Master を操作します．以下のコマンドで情報の表示や操作ができます．

sound card 0 の Master の状態確認

% amixer -c 0 get Master

Simple mixer control 'Master',0

Capabilities: pvolume pvolume-joined pswitch pswitch-joined

Playback channels: Mono

Limits: Playback 0 - 74

Mono: Playback 58 [78%] [-16.00dB] [off]

sound card 0 の Master を無音に

% amixer -c 0 set Master mute

Simple mixer control 'Master',0

Capabilities: pvolume pvolume-joined pswitch pswitch-joined

Playback channels: Mono

Limits: Playback 0 - 74

Mono: Playback 58 [78%] [-16.00dB] [off]

sound card 0 の Master の音を有効に

% amixer -c 0 set Master unmute

Simple mixer control 'Master',0

Capabilities: pvolume pvolume-joined pswitch pswitch-joined

Playback channels: Mono

Limits: Playback 0 - 74

Mono: Playback 58 [78%] [-16.00dB] [on]

Master の unmute だけだとスピーカーがミュートになったままなのでスピーカーも unmute します．

sound card 0 の Speaker の音を有効に

% amixer -c 0 set Speaker unmute

Simple mixer control 'Speaker',0

Capabilities: pvolume pswitch

Playback channels: Front Left - Front Right

Limits: Playback 0 - 74

Mono:

Front Left: Playback 74 [100%] [0.00dB] [on]

Front Right: Playback 74 [100%] [0.00dB] [on]

sound card 0 の Master の音量を 2dB 上げる

% amixer -c 0 set Master 2dB+

Simple mixer control 'Master',0

Capabilities: pvolume pvolume-joined pswitch pswitch-joined

Playback channels: Mono

Limits: Playback 0 - 74

Mono: Playback 60 [81%] [-14.00dB] [off]

sound card 0 の Master の音量を 2dB 下げる

% amixer -c 0 set Master 2dB-

Simple mixer control 'Master',0

Capabilities: pvolume pvolume-joined pswitch pswitch-joined

Playback channels: Mono

Limits: Playback 0 - 74

Mono: Playback 58 [78%] [-16.00dB] [off]

Script にする

~/script/awesome-audio.bash という名前のscript にしました．引数にキーコードを渡して実行すると，ミュートボタンを押すとミュート状態ならミュートを解除，そうでないならミュートに，音量ボタンで 2dB ずつUp/Down するようになっています．
それだけだと状態がわかりにくかったので，notify-send コマンドでアイコンとメッセージを表示するようにしました．

メッセージの表示は awesome 的には naughty.notify で行うのが正しいと思うのですが，使い方がよく解らずorz
まあ notify-send なら awesome 以外の環境でも動くのでいいかなと．

#!/bin/bash

case "$1" in

"XF86AudioMute" )

MUTE=`amixer -c 0 get Master|tail -1|cut -d '[' -f 4|sed s/\]//`

if [ $MUTE = "on" ] ; then

amixer -q -c 0 set Master mute

echo -e "🔊☓\nmute!"

notify-send -u low -t 500 -i '/usr/share/icons/ContrastHigh/scalable/status/audio-volume-muted.svg' mute "☓"

else

amixer -q -c 0 set Master unmute

amixer -q -c 0 set Speaker unmute

echo -e "🔊\nunmute!"

amixer -c 0 get Master | tail -1 | cut -d '[' -f 2 | sed s/\]// | xargs notify-send -u low -t 500 -i '/usr/share/icons/ContrastHigh/scalable/status/audio-volume-high.svg' numute

fi

;;

"XF86AudioRaiseVolume" )

amixer -c 0 set Master 2dB+ | tail -1 | cut -d '[' -f 2 | sed s/\]// | xargs notify-send -u low -t 500 -i '/usr/share/icons/ContrastHigh/scalable/status/audio-volume-medium.svg' Vol

;;

"XF86AudioLowerVolume" )

amixer -c 0 set Master 2dB- | tail -1 | cut -d '[' -f 2 | sed s/\]// | xargs notify-send -u low -t 500 -i '/usr/share/icons/ContrastHigh/scalable/status/audio-volume-medium.svg' Vol

;;

esac

amixer -c 0 get Master | tail -1 | cut -d '[' -f 2 | sed s/\]//

以下のように実行して動作確認しておきます．

% ~/script/awesome-audio.bash XF86AudioMute

🔊☓

mute!

70%

% ~/script/awesome-audio.bash XF86AudioMute

🔊

unmute!

70%

% ~/script/awesome-audio.bash XF86AudioRaiseVolume

73%

% ~/script/awesome-audio.bash XF86AudioLowerVolume

70%

notify-send でデスクトップには以下のような通知が表示されます．

awesome の設定を行う

音量コントロールボタンで script を呼ぶように awesome の設定ファイル ~/.config/awesome/rc.lua に以下の設定を追記します．追記場所は `-- Standard program の後ろ辺りでok です．

-- Audio Controle

awful.key({         }, "XF86AudioMute", function () awful.util.spawn("/home/mk/script/awesome-audio.bash XF86AudioMute",false)       end),

awful.key({         }, "XF86AudioRaiseVolume", function () awful.util.spawn("/home/mk/script/awesome-audio.bash XF86AudioRaiseVolume",false) end),

awful.key({         }, "XF86AudioLowerVolume", function () awful.util.spawn("/home/mk/script/awesome-audio.bash XF86AudioLowerVolume",false) end),

ここまで設定できたら awesome を restart します．

>
メニュー -> awesome -> restart

音量コントロールボタンで操作ができるようになったら出来上がりです :)

Linux/WindowManager/awesome/3.5 – matoken's wiki.