Added track progress to status.
authorplugd <plugd@thelambdalab.xyz>
Wed, 10 Aug 2022 00:46:10 +0000 (10:46 +1000)
committerplugd <plugd@thelambdalab.xyz>
Wed, 10 Aug 2022 00:46:25 +0000 (10:46 +1000)
emus.el

diff --git a/emus.el b/emus.el
index 9d17b2a..bd50a44 100644 (file)
--- 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