From 60e841e1dd91d89be4168774c77fdbda2118e469 Mon Sep 17 00:00:00 2001 From: forcer Date: Mon, 12 Sep 2005 12:31:00 +0000 Subject: Add pause and seek support to emms.el. This factors out the mplayer support into emms-player-mplayer.el, and removes emms-player-extensions.el. darcs-hash:20050912123151-2189f-8ead830f8f4e50f883325f308423b6f7677ea8d9.gz --- emms.el | 80 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 80 insertions(+) (limited to 'emms.el') diff --git a/emms.el b/emms.el index 95da141..6986022 100644 --- a/emms.el +++ b/emms.el @@ -168,9 +168,25 @@ the latter, only when the player actually finishes playing a track." :type 'hook :options '(emms-next-noerror)) +(defcustom emms-player-paused-hook nil + "*Hook run when a player is paused or resumed. +Use `emms-player-paused-p' to find the current state." + :group 'emms + :type 'hook) + +(defcustom emms-player-seeked-functions nil + "*Functions called when a player is seeking. +The functions are called with a single argument, the amount of +seconds the player did seek." + :group 'emms + :type 'hook) + (defvar emms-player-playing-p nil "The currently playing EMMS player, or nil.") +(defvar emms-player-paused-p nil + "Whether the current player is paused or not.") + ;;; User Interface @@ -224,6 +240,33 @@ This is a good function to put in `emms-player-finished-hook'." (emms-playlist-select-previous) (emms-start)) +(defun emms-pause () + "Pause the current player." + (interactive) + (when emms-player-playing-p + (emms-player-pause))) + +(defun emms-seek (seconds) + "Seek the current player SECONDS seconds. +This can be a floating point number for sub-second fractions. +It can also be negative to seek backwards." + (interactive "nSeconds to seek: ") + (if emms-player-playing-p + (emms-player-seek seconds) + (error "Nothing playing right now"))) + +(defun emms-seek-forward () + "Seek ten seconds forward." + (interactive) + (when emms-player-playing-p + (emms-player-seek 10))) + +(defun emms-seek-backward () + "Seek ten seconds backward." + (interactive) + (when emms-player-playing-p + (emms-player-seek -10))) + (defun emms-show (&optional insertp) "Describe the current EMMS track in the minibuffer. If INSERTP is non-nil, insert the description into the current buffer instead. @@ -706,6 +749,43 @@ This should only be done by the current player itself." (sleep-for emms-player-delay) (run-hooks 'emms-player-finished-hook))) +(defun emms-player-pause () + "Pause the current EMMS player." + (cond + ((not emms-player-playing-p) + (error "Can't pause player, nothing is playing")) + (emms-player-paused-p + (let ((resume (emms-player-get emms-player-playing-p 'resume)) + (pause (emms-player-get emms-player-playing-p 'pause))) + (cond + (resume + (funcall resume)) + (pause + (funcall pause)) + (t + (error "Player does not know how to pause")))) + (setq emms-player-paused-p nil) + (run-hooks emms-player-paused-hook)) + (t + (let ((pause (emms-player-get emms-player-playing-p 'pause))) + (if pause + (funcall pause) + (error "Player does not know how to pause"))) + (setq emms-player-paused-p t) + (run-hooks emms-player-paused-hook)))) + +(defun emms-player-seek (seconds) + "Seek the current player by SECONDS seconds. +This can be a floating point number for fractions of a second, +or negative to seek backwards." + (if (not emms-player-playing-p) + (error "Can't seek player, nothing playing right now") + (let ((seek (emms-player-get emms-player-playing-p 'seek))) + (if (not seek) + (error "Player does not know how to seek") + (funcall seek) + (run-hook-with-args emms-player-seeked-functions seconds))))) + ;;; Dictionaries -- cgit v1.2.3