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

# We must start mplayer in slave mode and send command via a pipe
# Create the pipe if it doesn't exist:
Piperead 'echo SetEnv USERDIR `id -un`'
Test (!F /home/$[USERDIR]/.mplayer/pipe) PipeRead 'mkfifo /home/$[USERDIR]/.mplayer/pipe'

# MPlayer normal speed
SetEnv speed "1"

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

# Where are stored MPlayer playlists and movies
SetEnv MPlayerPlaylists "/home/$[USERDIR]/Alsaplayer-playlists"
# The 2 following variables are used by FvwmMenuDirectory; be aware at it doesn't follow symlinks but it follow sub-directories.
#SetEnv fvwm_video_path "/mnt/usbdisk/dom/movies"
SetEnv fvwm_video_path "/home/$[USERDIR]/movies"
SetEnv fvwm_dvd_path "/media/hdc"

# Command line for FvwmMenuDirectory media browser
SetEnv fvwm_video_exec "fvwm-crystal.mplayer-wrapper file $USERDIR"

#-------------------------
# 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] Music-VolumeUp
key XF86AudioMute A C Music-VolumeDown
key XF86AudioPlay A $[Mod0] Music-FrameStep
key XF86AudioPlay A $[Mod1] Music-Speed normal mplayer
key XF86AudioPlay A C Music-Pause
# key XF86AudioStop A $[Mod0] Music-Stop
key XF86AudioStop A C Music-Pause
key XF86AudioStop A $[Mod1] Music-Speed normal mplayer
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 echo "quit" > /home/$[USERDIR]/.mplayer/pipe

# OSD menu
DestroyFunc Music-GUI
AddToFunc Music-GUI
+ I Exec exec echo "menu up" > /home/$[USERDIR]/.mplayer/pipe

DestroyFunc Music-Pause
AddToFunc Music-Pause
+ I Exec exec echo "pause" > /home/$[USERDIR]/.mplayer/pipe

DestroyFunc Music-PlayPause
AddToFunc Music-PlayPause
+ I Exec exec echo "frame_step" > /home/$[USERDIR]/.mplayer/pipe

# next in playlist
DestroyFunc Music-Next
AddToFunc Music-Next
+ I Exec exec echo "pt_step 1" > /home/$[USERDIR]/.mplayer/pipe

# prev in playlist
DestroyFunc Music-Prev
AddToFunc Music-Prev
+ I Exec exec echo "pt_step -1" > /home/$[USERDIR]/.mplayer/pipe

DestroyFunc Music-Volume
AddToFunc Music-Volume
+ I Exec exec echo "volume $0 1" > /home/$[USERDIR]/.mplayer/pipe

DestroyFunc Music-VolumeUp
AddToFunc Music-VolumeUp
+ I Exec exec echo "volume 10 0" > /home/$[USERDIR]/.mplayer/pipe

DestroyFunc Music-VolumeDown
AddToFunc Music-VolumeDown
+ I Exec exec echo "volume -10 0" > /home/$[USERDIR]/.mplayer/pipe

DestroyFunc Music-Speed
AddToFunc Music-Speed
+ I PipeRead 'echo SetEnv speed `$[FVWM_SYSTEMDIR]/scripts/speed_value $0 mplayer`'
+ I Exec exec echo "speed_set $[speed]" > /home/$[USERDIR]/.mplayer/pipe

DestroyFunc Music-Speed-Up
AddToFunc Music-Speed-Up
+ I PipeRead 'echo SetEnv speed `$[FVWM_SYSTEMDIR]/scripts/speed_value +1comma mplayer`'
+ I Exec exec echo "speed_set $[speed]" > /home/$[USERDIR]/.mplayer/pipe

DestroyFunc Music-Speed-Down
AddToFunc Music-Speed-Down
+ I PipeRead 'echo SetEnv speed `$[FVWM_SYSTEMDIR]/scripts/speed_value -1comma mplayer`'
+ I Exec exec echo "speed_set $[speed]" > /home/$[USERDIR]/.mplayer/pipe

DestroyFunc Music-Jump
AddToFunc Music-Jump
+ I Exec exec echo "seek $0 1" > /home/$[USERDIR]/.mplayer/pipe

DestroyFunc Music-Seek
AddToFunc Music-Seek
+ I Exec exec echo "seek $0 0" > /home/$[USERDIR]/.mplayer/pipe

DestroyFunc Load-DVD
AddToFunc Load-DVD
+ I Exec exec fvwm-crystal.mplayer-wrapper dvd $[USERDIR]

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

# Start Mplayer, "-ao jack," tell mplayer to first try jack, and if not found, it will try the other sound servers. 
DestroyMenu /Player
AddToMenu /Player
+ '$[gt.Start MPlayer]' Music-Start "mplayer -ao jack, -menu -fs -fixed-vo -slave -idle -input file=/home/$[USERDIR]/.mplayer/pipe"
+ '$[gt.Stop MPlayer]' Music-Kill
# + '$[gt.Show/hide player]' Music-GUI

DestroyMenu /Music/Volume
AddToMenu /Music/Volume
+ "MPlayer volume" Nop
+ " 0 db%" Music-Volume "100"
+ "-3 db%" Music-Volume "70.7"
+ "-6 db%" Music-Volume "50"
+ "-12 dB%" Music-Volume "25"
+ "-18 db%" Music-Volume "12.5"
+ "-24 db%" Music-Volume "6.25"
+ "-30 db%" Music-Volume "3.125"
+ "-36 db%" Music-Volume "1.5625"
+ " 0%" Music-Volume "0"

# speed_set <0.01 to 100>
DestroyMenu /Speed
AddToMenu /Speed
+ '$[gt.Speed control]' Nop
+ "" Nop
+ "Max%" Music-Speed 'maxmplayer mplayer'
+ "+ 6 octave%" Music-Speed '+6octave mplayer'
+ "+ 5 octave%" Music-Speed '+5octave mplayer'
+ "+ 4 octave%" Music-Speed '+4octave mplayer'
+ "+ 3 octave%" Music-Speed '+3octave mplayer'
+ "+ 2 octave%" Music-Speed '+2octave mplayer'
+ "+ 1 octave%" Music-Speed '+1octave mplayer'
+ '$[gt.+1 seventh]' Music-Speed '+1septieme mplayer'
+ '$[gt.+1 sixth]' Music-Speed '+1sixte mplayer'
+ '$[gt.+1 fifth]' Music-Speed '+1quinte mplayer'
+ '$[gt.+1 fourth]' Music-Speed '+1quarte mplayer'
+ '$[gt.+1 third]' Music-Speed '+1tierce mplayer'
+ '$[gt.+1 tone]' Music-Speed '+1ton mplayer'
+ '$[gt.+1/2 tone]' Music-Speed '+1/2ton mplayer'
+ "" Nop
+ '$[gt.-1/2 tone]' Music-Speed '-1/2ton mplayer'
+ '$[gt.-1 tone]' Music-Speed '-1ton mplayer'
+ '$[gt.-1 third]' Music-Speed '-1tierce mplayer'
+ '$[gt.-1 fourth]' Music-Speed '-1quarte mplayer'
+ '$[gt.-1 fifth]' Music-Speed '-1quinte mplayer'
+ '$[gt.-1 sixth]' Music-Speed '-1sixte mplayer'
+ '$[gt.-1 seventh]' Music-Speed '-1septieme mplayer'
+ "-1 octave%" Music-Speed '-1octave mplayer'
+ "-2 octave%" Music-Speed '-2octave mplayer'
+ "-3 octave%" Music-Speed '-3octave mplayer'
+ "-4 octave%" Music-Speed '-4octave mplayer'
+ "-5 octave%" Music-Speed '-5octave mplayer'
+ "-6 octave%" Music-Speed '-6octave mplayer'
+ "Min%" Music-Speed 'minmplayer mplayer'
+ "" Nop
+ "Normal%" Music-Speed 'normal mplayer'
+ "+ 1 comma%" Music-Speed '+1comma mplayer'
+ "Pause%" Music-Pause
+ "-1 comma%" Music-Speed '-1comma mplayer'

DestroyMenu /Music/Jump
AddToMenu /Music/Jump
+ " 99 %" Music-Jump '99'
+ " 80 %" Music-Jump '80'
+ " 60 %" Music-Jump '60'
+ " 40 %" Music-Jump '40'
+ " 20 %" Music-Jump '20'
+ " 10 %" Music-Jump '10'
+ "  5 %" Music-Jump '5'
+ "  2 %" Music-Jump '2'
+ "  1 %" Music-Jump '1'
+ "Start" Music-Jump '0'

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 $[MPlayerPlaylists]/*.{m3u,pls}; do \
  name=$(basename "$i"); \
  sname=${name%%.m3u}; \
  sname=${sname%%.pls}; \
  echo "AddToMenu /Music/LoadPlaylist \'$sname\' Exec exec fvwm-crystal.mplayer-wrapper list $USERDIR \'$i\'"; done'

# From Taviso's configuration
# 22x22/categories/Audio-Video.png will be used for all the files that doesn't have a .media.png inside their directory
# 22x22/categories/directory.png will be used for all the directories that doesn't have a .icontitle.png file
DestroyFunc FuncFvwmMenuDirectory
AddToFunc FuncFvwmMenuDirectory
+ I PipeRead 'case "$0" in \
	"$[fvwm_video_path]"*) myexec="$[fvwm_video_exec]";; \
	"$[fvwm_dvd_path]"*) myexec="$[fvwm_video_exec]";; \
    esac; \
    test -f "$0"/.icontitle.png && mytitle="$0"/.icontitle.png; \
    test -f "$0"/.media.png && mypng="$0"/.media.png; \
    fvwm-menu-directory --icon-title "${mytitle:-22x22/categories/directory.png}" --icon-file "${mypng:-22x22/categories/Audio-Video.png}" \
    --icon-dir 22x22/categories/directory.png --dir "$0" --exec-t="mc *" \
    --exec-file "^${myexec}"'

DestroyMenu /Music/LoadMovie
AddToMenu /Music/LoadMovie
+ MissingSubmenuFunction FuncFvwmMenuDirectory
+ '%video_movies_view.png%$[gt.Browse Medias]' Popup $[fvwm_video_path]
+ '%video_movies_view.png%$[gt.Browse DVD]' Popup $[fvwm_dvd_path]

#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

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

DestroyFunc /Playback-generator
AddToFunc /Playback-generator
+ I DestroyMenu recreate /Playback
+ I AddToMenu /Playback '$[gt.Pause]' Music-Pause
+ I AddToMenu /Playback '$[gt.Frame step]' Music-FrameStep
+ I AddToMenu /Playback "" Nop
+ I AddToMenu /Playback '$[gt.Next]' Music-Next
+ I AddToMenu /Playback '$[gt.Prev]' Music-Prev
+ 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.Play DVD]' Load-DVD
+ I AddToMenu /Playlist '$[gt.Load media file]' Popup /Music/LoadMovie
+ I AddToMenu /Playlist '$[gt.Load playlist]' Popup /Music/LoadPlaylist
#+ I AddToMenu /Playlist '$[gt.Clear playlist]' Music-ClearPlaylist
#+ 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.Load media file]' Popup /Music/LoadMovie
+ I AddToMenu /Playlist-bot '$[gt.Play DVD]' Load-DVD
#+ I AddToMenu /Playlist-bot '$[gt.Clear playlist]' Music-ClearPlaylist

# 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.Mixer]' Popup /Mixer
+ I AddToMenu /Music '$[gt.Speed]' Popup /Speed
+ I AddToMenu /Music '$[gt.show/hide QJackCtl]' Music-QJackGUI

# vim:ft=fvwm
