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-player-extensions.el | 119 ---------------------------------------------- emms-player-mplayer.el | 62 ++++++++++++++++++++++++ emms-player-simple.el | 4 -- emms.el | 80 +++++++++++++++++++++++++++++++ 4 files changed, 142 insertions(+), 123 deletions(-) delete mode 100644 emms-player-extensions.el create mode 100644 emms-player-mplayer.el diff --git a/emms-player-extensions.el b/emms-player-extensions.el deleted file mode 100644 index 2956edf..0000000 --- a/emms-player-extensions.el +++ /dev/null @@ -1,119 +0,0 @@ -;;; emms-player-extensions.el - Add more user control functions for EMMS - -;; Copyright (C) 2005 William XWL - -;; Author: William XWL - -;; This program is free software; you can redistribute it and/or modify -;; it under the terms of the GNU General Public License as published by -;; the Free Software Foundation; either version 2, or (at your option) -;; any later version. -;; -;; This program is distributed in the hope that it will be useful, -;; but WITHOUT ANY WARRANTY; without even the implied warranty of -;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -;; GNU General Public License for more details. -;; -;; You should have received a copy of the GNU General Public License -;; along with this program; if not, write to the Free Software -;; Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA -;; 02110-1301 USA - -;;; Commentary: - -;; This package adds pause and seek support for EMMS. While pause and -;; seek are only available for special players. - -;; Specically, here we add pause and seek support for -;; `emms-player-mplayer' with mplayer's slave mode enabled. Put -;; something like this to your .emacs first: -;; -;; (setq emms-player-mplayer-command-name "mplayer" -;; emms-player-mplayer-parameters '("-slave") -;; emms-player-list -;; '(emms-player-mplayer -;; emms-player-mplayer-playlist -;; emms-player-mpg321 -;; emms-player-ogg123)) - -;; To use, put this file to your load-path and the following to your -;; .emacs: -;; -;; (require 'emms-player-extensions) - -;;; Change Log - -;; v 0.21 [2005/07/18 16:42:51] In function `emms-seek', add a call for -;; `emms-lyric-seek' (defined in `emms-lyric.el'). - -;; v 0.2 [2005/07/17 20:22:53] And `emms-player-paused-p', -;; `emms-player-player-paused-hook', and some modifications to -;; cooperate with another package(`emms-lyric.el'). Rename this -;; file from emms-patch.el to emms-player-extensions.el. - -;; v 0.1 The initial version. Add `emms-pause', `emms-seek', -;; `emms-repeat-curr', `emms-unrepeat-curr', `emms-repeat-all', -;; `emms-unrepeat-all'. - -;;; Codes: - -;; Version control -(defvar emms-player-extensions-version "0.3 $Revision: 1.7 $" - "EMMS player extensions version string.") -;; $Id: emms-player-extensions.el,v 1.7 2005/08/17 14:10:11 xwl Exp $ - -(require 'emms) - -;;; Variables: - -(defvar emms-player-paused-p nil - "The EMMS player paused.") - -(defvar emms-player-paused-hook nil - "*Hook run when an EMMS player pauses playing.") - -(defvar emms-player-seeked-hook nil - "*Hook run when an EMMS player seeks forward or backward.") - -;;; User Interfaces: - -(defun emms-pause () - "Pause the current player." - (interactive) - (when emms-player-playing-p - (funcall (emms-player-get emms-player-playing-p 'pause)) - (setq emms-player-paused-p (not emms-player-paused-p)) - (run-hooks 'emms-player-paused-hook))) - -(defun emms-seek (&optional sec) - "Seek forward/backward SEC(default is 10) seconds." - (interactive) - (unless sec (setq sec 10)) - (when emms-player-playing-p - (funcall (emms-player-get emms-player-playing-p 'seek) sec) - (run-hook-with-args 'emms-player-seeked-hook sec))) - -;;; mplayer: pause, seek -(emms-player-set emms-player-mplayer - 'pause - 'emms-player-mplayer-pause) - -(emms-player-set emms-player-mplayer - 'seek - 'emms-player-mplayer-seek) - -(defun emms-player-mplayer-pause () - "Depends on mplayer's -slave mode." - (process-send-string - emms-player-simple-process-name "pause\n")) - -(defun emms-player-mplayer-seek (sec) - "Depends on mplayer's -slave mode." - (process-send-string - emms-player-simple-process-name - (format "seek %d\n" sec))) - - -(provide 'emms-player-extensions) - -;;; emms-player-extensions.el ends here diff --git a/emms-player-mplayer.el b/emms-player-mplayer.el new file mode 100644 index 0000000..a7286b2 --- /dev/null +++ b/emms-player-mplayer.el @@ -0,0 +1,62 @@ +;;; emms-player-mplayer.el --- mplayer support for EMMS + +;; Copyright (C) 2005 William XWL +;; Copyright (C) 2005 Jorgen Schaefer + +;; Authors: William XWL +;; Jorgen Schaefer + +;; This program is free software; you can redistribute it and/or +;; modify it under the terms of the GNU General Public License +;; as published by the Free Software Foundation; either version 2 +;; of the License, or (at your option) any later version. + +;; This program is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; GNU General Public License for more details. + +;; You should have received a copy of the GNU General Public License +;; along with this program; if not, write to the Free Software +;; Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +;; 02110-1301 USA + +;;; Commentary: + +;; This provides a player that uses mplayer. It supports pause and +;; seeking. + +;;; Code: + +(require 'emms-player-simple) + +(define-emms-simple-player mplayer '(file url) + (regexp-opt '(".ogg" ".mp3" ".wav" ".mpg" ".mpeg" ".wmv" ".wma" + ".mov" ".avi" ".divx" ".ogm" ".asf" ".mkv" "http://")) + "mplayer") + +(define-emms-simple-player mplayer-playlist '(playlist) + "http://" + "mplayer" "-playlist") + +(emms-player-set emms-player-mplayer + 'pause + 'emms-player-mplayer-pause) + +(emms-player-set emms-player-mplayer + 'seek + 'emms-player-mplayer-seek) + +(defun emms-player-mplayer-pause () + "Depends on mplayer's -slave mode." + (process-send-string + emms-player-simple-process-name "pause\n")) + +(defun emms-player-mplayer-seek (sec) + "Depends on mplayer's -slave mode." + (process-send-string + emms-player-simple-process-name + (format "seek %d\n" sec))) + +(provide 'emms-player-mplayer) +;;; emms-player-mplayer.el ends here diff --git a/emms-player-simple.el b/emms-player-simple.el index 35ff2de..1d27652 100644 --- a/emms-player-simple.el +++ b/emms-player-simple.el @@ -125,10 +125,6 @@ the specified PARAMS." (define-emms-simple-player mpg321 '(file url) "\\.[mM][pP][23]$" "mpg321") (define-emms-simple-player ogg123 '(file) (regexp-opt '(".ogg" ".OGG" ".FLAC" ".flac" )) "ogg123") -(define-emms-simple-player mplayer-playlist '(playlist) "http://" "mplayer" "-playlist") -(define-emms-simple-player mplayer '(file url) - (regexp-opt '(".ogg" ".mp3" ".wav" ".mpg" ".mpeg" ".wmv" ".wma" ".mov" ".avi" ".divx" ".ogm" ".asf" ".mkv" "http://")) "mplayer") - (provide 'emms-player-simple) ;;; emms-player-simple.el ends here 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