From 6e8566762909551b5e9d2ec92ba5b8a929344046 Mon Sep 17 00:00:00 2001 From: plugd Date: Wed, 10 Aug 2022 10:46:10 +1000 Subject: [PATCH] Added track progress to status. --- emus.el | 48 ++++++++++++++++++++++++++++++++++++++---------- 1 file changed, 38 insertions(+), 10 deletions(-) diff --git a/emus.el b/emus.el index 9d17b2a..bd50a44 100644 --- a/emus.el +++ b/emus.el @@ -100,6 +100,9 @@ Used to prevent commands from interfering with library construction.") (defvar emus-current-volume 100 "The current playback volume.") +(defvar emus-current-progress "" + "String describing the progress through the current track.") + ;;; mpg123 process ;; @@ -119,7 +122,7 @@ Used to prevent commands from interfering with library construction.") (make-process :name "emus-process" :command `(,emus-mpg123-program "-R")))) (set-process-query-on-exit-flag proc nil) - (process-send-string proc "silence\n") + ;; (process-send-string proc "silence\n") proc)))) (defun emus--send-cmd-raw (cmd &rest args) @@ -305,13 +308,13 @@ by the filesystem." (defun emus--resume-cp () "Resume continuous playback." - (setq emus-continuous-playback t) - (set-process-filter (emus-get-process) - (lambda (_proc string) - (and emus-continuous-playback - (eq emus-state 'playing) - (string-suffix-p "@P 0\n" string) - (emus-play-next))))) + (setq emus-continuous-playback t)) + +(defun emus--timestamp (seconds-total) + "Produce a timestamp string representation of SECONDS-TOTAL." + (let* ((seconds (truncate (mod seconds-total 60))) + (minutes (truncate (/ seconds-total 60)))) + (format "%02d:%02d" minutes seconds))) (defun emus-play-track (track) "Set TRACK as current and start playing." @@ -320,6 +323,31 @@ by the filesystem." (emus-send-cmd "l" (emus-track-file track)) (setq emus-state 'playing) (setq emus-current-track track) + (setq emus-current-progress "") + (set-process-filter + (emus-get-process) + (lambda (_proc string) + (pcase string + ((and "@P 0\n" + (guard emus-continuous-playback) + (guard (eq emus-state 'playing))) + (emus-play-next)) + ((rx (: string-start + "@F " + (+ digit) + " " + (+ digit) + " " + (let left-str (+ (not " "))) + " " + (let right-str (+ any)))) + (let* ((left (string-to-number left-str)) + (right (string-to-number right-str)) + (total (+ left right))) + (setq emus-current-progress + (format " %s/%s" + (emus--timestamp left) + (emus--timestamp total)))))))) (emus--update-track old-track) (emus--update-track track) (emus--resume-cp) @@ -461,8 +489,8 @@ If PREV is non-nil, plays the last track of the previous album." (concat "Emus: Volume %d%%" (pcase emus-state ('stopped " [Stopped]") - ('paused " [Paused]") - ('playing " [Playing]") + ('paused (format " [Paused%s]" emus-current-progress)) + ('playing (format " [Playing%s]" emus-current-progress)) (_ "")) " %s") emus-current-volume -- 2.20.1