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

IMGP0223_変更済み

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

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

キーコードを調べる

まずはボタンのキーコードを調べました.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 でデスクトップには以下のような通知が表示されます.

20150903_03:09:19-832020150903_03:09:04-964020150903_03:09:05-1036220150903_03:09:24-10606

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",falseend),
    awful.key({         }, "XF86AudioLowerVolume"function () awful.util.spawn("/home/mk/script/awesome-audio.bash XF86AudioLowerVolume",falseend),

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

>
メニュー -> awesome -> restart

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