# Support for Alsaplayer music player
# Written by: Dominique Michel <dominique.michel@citycable.ch>

# Alsaplayer normal speed
SetEnv speed "1"

# Decimal point in use
PipeRead 'echo SetEnv dec_point `locale decimal_point`'

# Where are stored Alsaplayer playlists
Piperead 'echo SetEnv Alsaplayer-Playlists "/home/`id -un`/Alsaplayer-playlists"'
# Some commands for playlist operation
#SetEnv Load_Pl_Command "exec alsaplayer -e"
#SetEnv Remove_Pl_Command "rm -f"

# Styles for Alsaplayer windows
Style AlsaPlayer StaysOnTop, NoIcon, Sticky, WindowListSkip

#-------------------------
# Multimedia keys keybinding, see 
# http:///gentoo-wiki.com/HOWTO_Use_Multimedia_Keys
# to setup xmodmap

Key XF86AudioLowerVolume A C Music-Speed-Down
Key XF86AudioRaiseVolume A C Music-Speed-Up
Key XF86AudioMute A $[Mod0] Exec exec alsaplayer --volume 0
key XF86AudioMute A C Exec exec alsaplayer --volume 1
key XF86AudioPlay A $[Mod0] Music-PlayPause
key XF86AudioPlay A $[Mod1] Music-Speed normal
key XF86AudioPlay A C Music-Pause
key XF86AudioStop A $[Mod0] Music-Stop
key XF86AudioStop A C Music-Pause
key XF86AudioStop A $[Mod1] Music-Play
Key XF86AudioNext A $[Mod] Music-Next
Key XF86AudioPrev A $[Mod] Music-Prev
Key XF86AudioMedia A $[Mod] Music-GUI


# ---------------------------------------------------------------------------
# Basic control functions

DestroyFunc Music-Start
AddToFunc Music-Start
+ I Exec exec $0

DestroyFunc Music-Kill
AddToFunc Music-Kill
+ I Exec exec alsaplayer --quit

DestroyFunc Music-GUI
AddToFunc Music-GUI
+ I All (alsaplayer) Iconify toggle

DestroyFunc Music-QJackGUI
AddToFunc Music-QJackGUI
+ I All (qjackctl) Iconify toggle

DestroyFunc Music-Stop
AddToFunc Music-Stop
+ I Exec exec alsaplayer --stop

DestroyFunc Music-Play
AddToFunc Music-Play
+ I Exec exec alsaplayer --start

DestroyFunc Music-Pause
AddToFunc Music-Pause
+ I Exec exec alsaplayer --speed 0

DestroyFunc Music-PlayPause
AddToFunc Music-PlayPause 
+ I Exec exec alsaplayer --speed $[speed] > /dev/null

DestroyFunc Music-Next
AddToFunc Music-Next
+ I Exec exec alsaplayer --next

DestroyFunc Music-Prev
AddToFunc Music-Prev
+ I Exec exec alsaplayer --prev

DestroyFunc Music-VolumeFr
AddToFunc Music-VolumeFr
+ I Exec exec alsaplayer --volume $0

DestroyFunc Music-VolumeEn
AddToFunc Music-VolumeEn
+ I Exec exec alsaplayer --volume $0

DestroyFunc Music-Speed
AddToFunc Music-Speed
+ I PipeRead 'echo SetEnv speed `$[FVWM_USERDIR]/scripts/speed_value $0`'
+ I Exec exec alsaplayer --speed $[speed] > /dev/null

DestroyFunc Music-Speed-Up
AddToFunc Music-Speed-Up
+ I PipeRead 'echo SetEnv speed `$[FVWM_USERDIR]/scripts/speed_value +1comma`'
+ I Exec exec alsaplayer --speed $[speed] > /dev/null

DestroyFunc Music-Speed-Down
AddToFunc Music-Speed-Down
+ I PipeRead 'echo SetEnv speed `$[FVWM_USERDIR]/scripts/speed_value -1comma`'
+ I Exec exec alsaplayer --speed $[speed] > /dev/null

DestroyFunc Music-SongChange
AddToFunc Music-SongChange
+ I Exec exec alsaplayer --jump $0

DestroyFunc Music-Jump
AddToFunc Music-Jump
+ I Exec exec alsaplayer --seek $0

DestroyFunc Music-Seek
AddToFunc Music-Seek
+ I Exec exec alsaplayer --relative $0

#------------------------------------------------------------------
# Basic menus

DestroyMenu /Music/Start
AddToMenu /Music/Start
+ "Alsa%" Music-Start "alsaplayer -o alsa -s alsa"
+ "Jack%" Music-Start "alsaplayer -o jack -F 48000 -s Alsaplayer"

DestroyMenu /Music/Volume
AddToMenu /Music/Volume
+ '$[gt.Player volume]'
+ "" Nop
Test (EnvMatch dec_point ",") + " 0 db%" Music-VolumeFr '1,0'
Test (EnvMatch dec_point ",") + "-3 db%" Music-VolumeFr '0,707'
Test (EnvMatch dec_point ",") + "-6 db%" Music-VolumeFr '0,5'
Test (EnvMatch dec_point ",") + "-12 dB%" Music-VolumeFr '0,25'
Test (EnvMatch dec_point ",") + "-18 db%" Music-VolumeFr '0,125'
Test (EnvMatch dec_point ",") + "-24 db%" Music-VolumeFr '0,0625'
Test (EnvMatch dec_point ",") + "-30 db%" Music-VolumeFr '0,03125'
Test (EnvMatch dec_point ",") + "-36 db%" Music-VolumeFr '0,015625'
Test (EnvMatch dec_point ",") + " 0%" Music-VolumeFr '0,0'
Test (EnvMatch dec_point ".") + " 0 db%" Music-VolumeEn '1.0'
Test (EnvMatch dec_point ".") + "-3 db%" Music-VolumeEn '0.707'
Test (EnvMatch dec_point ".") + "-6 db%" Music-VolumeEn '0.5'
Test (EnvMatch dec_point ".") + "-12 dB%" Music-VolumeEn '0.25'
Test (EnvMatch dec_point ".") + "-18 db%" Music-VolumeEn '0.125'
Test (EnvMatch dec_point ".") + "-24 db%" Music-VolumeEn '0.0625'
Test (EnvMatch dec_point ".") + "-30 db%" Music-VolumeEn '0.03125'
Test (EnvMatch dec_point ".") + "-36 db%" Music-VolumeEn '0.015625'
Test (EnvMatch dec_point ".") + " 0%" Music-VolumeEn '0.0'

DestroyMenu /Speed
AddToMenu /Speed
+ '$[gt.Speed control]'
+ "" Nop
+ "Max%" Music-Speed 'max'
+ "+ 1 octave%" Music-Speed '+1octave'
+ '$[gt.+1 seventh]' Music-Speed '+1septieme'
+ '$[gt.+1 sixth]' Music-Speed '+1sixte'
+ '$[gt.+1 fifth]' Music-Speed '+1quinte'
+ '$[gt.+1 fourth]' Music-Speed '+1quarte'
+ '$[gt.+1 third]' Music-Speed '+1tierce'
+ '$[gt.+1 tone]' Music-Speed '+1ton'
+ '$[gt.+1/2 tone]' Music-Speed '+1/2ton'
+ "" Nop
+ '$[gt.-1/2 tone]' Music-Speed '-1/2ton'
+ '$[gt.-1 tone]' Music-Speed '-1ton'
+ '$[gt.-1 third]' Music-Speed '-1tierce'
+ '$[gt.-1 fourth]' Music-Speed '-1quarte'
+ '$[gt.-1 fifth]' Music-Speed '-1quinte'
+ '$[gt.-1 sixth]' Music-Speed '-1sixte'
+ '$[gt.-1 seventh]' Music-Speed '-1septieme'
+ "-1 octave%" Music-Speed '-1octave'
+ '$[gt.Max back]' Music-Speed 'min'
+ "" Nop
+ '$[gt.Normal backward]' Music-Speed 'back'
+ "Pause%" Music-Speed 'pause'
+ "+ 1 comma%" Music-Speed '+1comma'
+ "Normal%" Music-Speed 'normal'
+ "-1 comma%" Music-Speed '-1comma'

DestroyMenu /Music/SongChange
AddToMenu /Music/SongChange
+ " 1%" Music-SongChange '1'
+ " 2%" Music-SongChange '2'
+ " 3%" Music-SongChange '3'
+ " 4%" Music-SongChange '4'
+ " 5%" Music-SongChange '5'
+ " 6%" Music-SongChange '6'
+ " 7%" Music-SongChange '7'
+ " 8%" Music-SongChange '8'
+ " 9%" Music-SongChange '9'
+ "10%" Music-SongChange '10'
+ "11%" Music-SongChange '11'
+ "12%" Music-SongChange '12'
+ "13%" Music-SongChange '13'
+ "14%" Music-SongChange '14'
+ "15%" Music-SongChange '15'
+ "16%" Music-SongChange '16'
+ "17%" Music-SongChange '17'
+ "18%" Music-SongChange '18'
+ "19%" Music-SongChange '19'
+ "20%" Music-SongChange '20'

DestroyMenu /Music/Jump
AddToMenu /Music/Jump
+ " 15 min" Music-Jump '900'
+ " 10 min" Music-Jump '600'
+ "  5 min" Music-Jump '300'
+ "  3 min" Music-Jump '180'
+ "  2 min" Music-Jump '120'
+ "1 min 30" Music-Jump '90'
+ "  1 min" Music-Jump '60'
+ " 30 sec" Music-Jump '30'

DestroyMenu /Music/Seek
AddToMenu /Music/Seek
+ " 10 min" Music-Seek '600'
+ "  5 min" Music-Seek '300'
+ "  3 min" Music-Seek '180'
+ "  2 min" Music-Seek '120'
+ "1 min 30" Music-Seek '90'
+ "  1 min" Music-Seek '60'
+ " 45 sec" Music-Seek '45'
+ " 30 sec" Music-Seek '30'
+ " 20 sec" Music-Seek '20'
+ " 10 sec" Music-Seek '10'
+ "-10 sec" Music-Seek '-10'
+ "-20 sec" Music-Seek '-20'
+ "-30 sec" Music-Seek '-30'
+ "-45 sec" Music-Seek '-45'
+ " -1 min" Music-Seek '-60'
+ "-1 min 30" Music-Seek '-90'
+ " -2 min" Music-Seek '-120'
+ " -3 min" Music-Seek '-180'
+ " -5 min" Music-Seek '-300'
+ "-10 min" Music-Seek '-600'

# ---------------------------------------------------------------------------
# Playlist functions and menus

DestroyFunc Music-LoadPlaylist-generator
AddToFunc Music-LoadPlaylist-generator
+ I DestroyMenu recreate /Music/LoadPlaylist
+ I AddToMenu /Music/LoadPlaylist
+ I PipeRead 'for i in $[Alsaplayer-Playlists]/*.m3u $[Alsaplayer-Playlists]/*.pls; do \
  name=$(basename "$i"); \
  sname=${name%%.m3u}; \
  sname=${sname%%.pls}; \
  echo \"AddToMenu /Music/LoadPlaylist \'$sname\' Exec exec alsaplayer -e \'$i\'\"; done'

#DestroyFunc Music-RemovePlaylist-generator
#AddToFunc Music-RemovePlaylist-generator
#+ I DestroyMenu recreate /Music/RemovePlaylist
#+ I AddToMenu /Music/RemovePlaylist
#+ I PipeRead 'for i in $[Alsaplayer-Playlists]/*.m3u $[Alsaplayer-Playlists]/*.pls; do \
#  name=$(basename "$i"); \
#  sname=${name%%.m3u}; \
#  sname=${sname%%.pls}; \
#  echo \"AddToMenu /Music/RemovePlaylist \'$sname\' Exec rm -f \'$i\'\"; done'

DestroyFunc Music-ClearPlaylist
AddToFunc Music-ClearPlaylist
+ I Exec exec alsaplayer --clear

DestroyMenu /Music/LoadPlaylist
AddToMenu /Music/LoadPlaylist
+ DynamicPopupAction Function Music-LoadPlaylist-generator

#DestroyMenu /Music/RemovePlaylist
#AddToMenu /Music/RemovePlaylist
#+ DynamicPopupAction Function Music-RemovePlaylist-generator

DestroyMenu /Playback
AddToMenu /Playback
+ DynamicPopupAction Function /Playback-generator

DestroyMenu /Playlist
AddToMenu /Playlist
+ DynamicPopupAction Function /Playlist-generator

DestroyMenu /Playlist-bot
AddToMenu /Playlist-bot
+ DynamicPopupAction Function /Playlist-generator-bot

DestroyMenu /Player
AddToMenu /Player
+ DynamicPopupAction Function /Player-generator

#-----------------------------------------------------------------------------------
# Main functions and menus

DestroyFunc /Playback-generator
AddToFunc /Playback-generator
+ I DestroyMenu recreate /Playback
+ I AddToMenu /Playback '$[gt.Stop playback]' Music-Stop
+ I AddToMenu /Playback '$[gt.Play]' Music-Play
+ I AddToMenu /Playback '$[gt.Pause]' Music-Pause
+ I AddToMenu /Playback '$[gt.Play/Pause]' Music-PlayPause
+ I AddToMenu /Playback "" Nop
+ I AddToMenu /Playback '$[gt.Next]' Music-Next
+ I AddToMenu /Playback '$[gt.Prev]' Music-Prev
+ I AddToMenu /Playback '$[gt.Song change]' Popup /Music/SongChange
+ I AddToMenu /Playback '$[gt.Jump]' Popup /Music/Jump
+ I AddToMenu /Playback '$[gt.Seek]' Popup /Music/Seek

DestroyFunc /Playlist-generator
AddToFunc /Playlist-generator
+ I DestroyMenu recreate /Playlist
+ I AddToMenu /Playlist '$[gt.Clear playlist]' Music-ClearPlaylist
+ I AddToMenu /Playlist '$[gt.Load playlist]' Popup /Music/LoadPlaylist
#+ I AddToMenu /Playlist '$[gt.Remove playlist]' Popup /Music/RemovePlaylist

DestroyFunc /Playlist-generator-bot
AddToFunc /Playlist-generator-bot
+ I DestroyMenu recreate /Playlist-bot
+ I AddToMenu /Playlist-bot '$[gt.Load playlist]' Popup /Music/LoadPlaylist
+ I AddToMenu /Playlist-bot '$[gt.Clear playlist]' Music-ClearPlaylist

DestroyFunc /Player-generator
AddToFunc /Player-generator
+ I DestroyMenu recreate /Player
+ I AddToMenu /Player '$[gt.Start player]' Popup /Music/Start
+ I AddToMenu /Player '$[gt.Stop player]' Music-Kill
+ I AddToMenu /Player '$[gt.Show/hide player]' Music-GUI

# Recipe without audio buttons use the following:
DestroyMenu /Music
AddToMenu /Music
+ DynamicPopupAction Function /Music-generator

DestroyFunc /Music-generator
AddToFunc /Music-generator
+ I DestroyMenu recreate /Music
+ I AddToMenu /Music '$[gt.Player]' Popup /Player
+ I AddToMenu /Music '$[gt.show/hide GUI]' Music-GUI
+ I AddToMenu /Music '$[gt.Playback]' Popup /Playback
+ I AddToMenu /Music '$[gt.Control]' Popup /Music/Volume
+ I AddToMenu /Music '$[gt.Speed]' Popup /Speed
+ I AddToMenu /Music '$[gt.show/hide QJackCtl]' Music-QJackGUI

# vim:ft=fvwm
