emms-help
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[emms-help] a workaround for pause, seek, etc.


From: William Xu
Subject: [emms-help] a workaround for pause, seek, etc.
Date: Thu, 14 Jul 2005 20:57:05 +0800
User-agent: Gnus/5.1007 (Gnus v5.10.7) Emacs/21.4 (gnu/linux)

If you are like me, who rely on mplayer to play almost everything, then
this's good for you. :-)

I'd love emms someday would support pause, seek, repeat, etc, especially
pause, which I think is quite useful. Currently i found mplayer has a
'-slave' mode, with which to implement pause becomes quite easy. Hope
it'll be useful for some.

And, do you plan to add more user-level control functions? like repeat
current track, repeat all tracks ? These implementations would be quite 
straightforward. I've written some myself.

Codes:

---------------------------------8<-----------------------------------

(setq emms-player-mplayer-command-name "mplayer"
      emms-player-mplayer-parameters '("-slave") ; slave mode
      emms-player-mpg321-command-name "mpg123"
      emms-player-list
      '(emms-player-mplayer
        emms-player-mplayer-playlist
        emms-player-mpg321
        emms-player-ogg123))

;; mplayer: pause, seek
(defun my-emms-pause ()
  "Depends on mplayer's -slave mode."
  (interactive)
  (if (equal emms-player-playing-p
             'emms-player-mplayer)
      (process-send-string
       emms-player-simple-process-name "pause\n")
    (message "Pause is only available for mplayer.")))

(defun my-emms-seek (second)
  "Depends on mplayer's -slave mode."
  (interactive)
  (if (equal emms-player-playing-p
             'emms-player-mplayer)
      (process-send-string
       emms-player-simple-process-name
       (concat "seek " second "\n"))
    (message "Seek is only available for mplayer.")))

;; repeat
(setq my-emms-repeat-curr-p nil)

; redefine this function
(defun emms-next-noerror ()
  "Start playing the next track in the EMMS playlist.
Unlike `emms-next', this function doesn't signal an error when called
at the end of the playlist.
This function should only be called when no player is playing.
This is a good function to put in `emms-player-finished-hook'."
  (interactive)
  (when emms-player-playing-p
    (error "A track is already being played"))
  (cond (my-emms-repeat-curr-p          ; repeat current track only.
         (emms-start))
        ((emms-playlist-next)
         (emms-start))
        (emms-repeat-playlist
         (setq emms-playlist-current 0)
         (emms-start))
        (t
         (message "No next track in playlist"))))

(defun my-emms-repeat-curr ()
  (interactive)
  (setq my-emms-repeat-curr-p t)
  (message "Repeat current track."))

(defun my-emms-unrepeat-curr ()
  (interactive)
  (setq my-emms-repeat-curr-p nil)
  (message "Stop repeating current track."))

(setq emms-repeat-playlist nil)

(defun my-emms-repeat-all ()
  (interactive)
  (setq my-emms-repeat-curr-p nil
        emms-repeat-playlist t)
  (message "Repeat all tracks."))

(defun my-emms-unrepeat-all ()
  (interactive)
  (setq my-emms-repeat-curr-p nil
        emms-repeat-playlist nil)
  (message "Stop Repeating all tracks."))

;; keys
(global-set-key (kbd "C-c e SPC") 'my-emms-pause)
(global-set-key (kbd "C-c e r")   'my-emms-repeat-curr)
(global-set-key (kbd "C-c e R")   'my-emms-unrepeat-curr)

(global-set-key (kbd "C-c e <left>")  (lambda () (interactive) (my-emms-seek 
"-10")))
(global-set-key (kbd "C-c e <right>") (lambda () (interactive) (my-emms-seek 
"+10")))
(global-set-key (kbd "C-c e <up>")    (lambda () (interactive) (my-emms-seek 
"-60")))
(global-set-key (kbd "C-c e <down>")  (lambda () (interactive) (my-emms-seek 
"+60")))

---------------------------------8<------------------------------------- 

-- 
William




reply via email to

[Prev in Thread] Current Thread [Next in Thread]