(require 'seq)
-;;; Global constants
-;;
-
-(defconst emus-version "1.0.0"
- "Current version of emus.")
-
-
;;; Customizations
;;
:type '(string))
(defface emus-artist
- '((t :inherit font-lock-keyword-face :background "#333"))
+ '((t :inherit font-lock-string-face :background "#333"))
"Face used for artist names in browser.")
(defface emus-album
- '((t :inherit font-lock-function-name-face :background "#222"))
+ '((t :inherit font-lock-constant-face :background "#222"))
"Face used for album names in browser.")
(defface emus-track
- '((t :inherit font-lock-string-face))
+ '((t :inherit font-lock-keyword-face))
"Face used for track titles in browser.")
(defface emus-track-current
- '((t :inherit font-lock-string-face :inverse-video t))
+ '((t :inherit font-lock-keyword-face :inverse-video t))
"Face used for track titles in browser.")
(defface emus-cursor
'((t :inherit bold))
"Face used for current track cursor")
+;;; mpg123 process
+;;
+
+(defvar emus--proc-in-use nil)
+
+(defun emus-get-process ()
+ "Return current or new mpg123 process."
+ (let* ((emus-process-raw (get-process "emus-process"))
+ (emus-process (if emus-process-raw
+ (if (process-live-p emus-process-raw)
+ emus-process-raw
+ (kill-process emus-process-raw)
+ nil))))
+ (if emus-process
+ emus-process
+ (let ((proc
+ (make-process :name "emus-process"
+ ;; :buffer (get-buffer-create "*emus-process*")
+ :command `(,emus-mpg123-program "-R"))))
+ (set-process-query-on-exit-flag proc nil)
+ (process-send-string proc "silence\n")
+ proc))))
+
+(defun emus--send-cmd-raw (cmd &rest args)
+ (process-send-string (emus-get-process)
+ (concat
+ (seq-reduce (lambda (s1 s2) (concat s1 " " s2)) args cmd)
+ "\n")))
+
+(defun emus-send-cmd (cmd &rest args)
+ (unless emus--proc-in-use
+ (apply #'emus--send-cmd-raw cmd args)))
+
+
;;; Library
;;
(aset track 4 pos))
(defun emus--load-library (then)
- (emus--suspend-cp)
- (setq emus-state 'stopped)
- (let ((proc (emus-get-process))
- (tagstr "")
- (filenames (emus-get-audio-files)))
- (setq emus-tracks nil)
- (set-process-filter proc (lambda (proc string)
- (setq tagstr (concat tagstr string))
- (when (string-suffix-p "@P 1\n" string)
- (add-to-list 'emus-tracks
- (emus--make-track-from-tagstr (car filenames
- tagstr)))
- (setq tagstr "")
- (setq filenames (cdr filenames))
- (if filenames
- (emus-send-cmd "lp" (car filenames))
- (set-process-filter proc nil)
- (setq emus-tracks (reverse emus-tracks))
- (emus--sort-tracks)
- (unless emus-current-track
- (setq emus-current-track (car emus-tracks)))
- (funcall then)
- ;; (emus-render-tracks)
- (emus--resume-cp)))))
- (emus-send-cmd "lp" (car filenames))))
+ (unless emus--proc-in-use
+ (setq emus--proc-in-use t)
+ (emus--suspend-cp)
+ (setq emus-state 'stopped)
+ (let ((proc (emus-get-process))
+ (tagstr "")
+ (filenames (emus-get-audio-files)))
+ (setq emus-tracks nil)
+ (set-process-filter proc (lambda (proc string)
+ (setq tagstr (concat tagstr string))
+ (when (string-suffix-p "@P 1\n" string)
+ (add-to-list 'emus-tracks
+ (emus--make-track-from-tagstr (car filenames)
+ tagstr))
+ (setq tagstr "")
+ (setq filenames (cdr filenames))
+ (if filenames
+ (emus--send-cmd-raw "lp" (car filenames))
+ (set-process-filter proc nil)
+ (setq emus-tracks (reverse emus-tracks))
+ (emus--sort-tracks)
+ (unless emus-current-track
+ (setq emus-current-track (car emus-tracks)))
+ (funcall then)
+ (emus--resume-cp)
+ (setq emus--proc-in-use nil)))))
+ (emus--send-cmd-raw "lp" (car filenames)))))
(defun emus--make-track-from-tagstr (filename tagstr)
(let ((artist "")
(emus--load-library
(lambda () ,@args))))
-;;; mpg123 process
-;;
-
-(defvar emus-proc-in-use nil)
-
-(defun emus-get-process ()
- "Return current or new mpg123 process."
- (let* ((emus-process-raw (get-process "emus-process"))
- (emus-process (if emus-process-raw
- (if (process-live-p emus-process-raw)
- emus-process-raw
- (kill-process emus-process-raw)
- nil))))
- (if emus-process
- emus-process
- (let ((proc
- (make-process :name "emus-process"
- ;; :buffer (get-buffer-create "*emus-process*")
- :command `(,emus-mpg123-program "-R"))))
- (set-process-query-on-exit-flag proc nil)
- (process-send-string proc "silence\n")
- proc))))
-
-
-(defun emus-send-cmd (cmd &rest args)
- (process-send-string (emus-get-process)
- (concat
- (seq-reduce (lambda (s1 s2) (concat s1 " " s2)) args cmd)
- "\n")))
-
-(defun emus-send-and-process (respfun predfun cmd &rest args)
- (let ((respstr ""))
- (set-process-filter (emus-get-process)
- (lambda (proc string)
- (setq respstr (concat respstr string))
- (when (funcall predfun respstr)
- (set-process-filter proc nil)
- (funcall respfun respstr))))
- (apply #'emus-send-cmd cmd args)))
-
;;; Playback
;;
(seq-subseq emus-tracks (+ idx 1))))
(current-album (emus-track-album emus-current-track))
(next-track (seq-some (lambda (r)
- (if (string= (emus-track-album r)
- current-album)
- nil
- r)
- search-list))))
+ (if (string= (emus-track-album r)
+ current-album)
+ nil
+ r))
+ search-list)))
(if next-track
(if (eq emus-state 'playing)
(emus-play-track next-track)
(with-current-buffer "*emus*"
(let ((inhibit-read-only t)
(old-point (point)))
- (goto-char track-pos)
- (search-forward "\n")
- (delete-region track-pos (point))
- (goto-char track-pos)
- (emus--insert-track track)
- (goto-char old-point))))))
+ (goto-char track-pos)
+ (search-forward "\n")
+ (delete-region track-pos (point))
+ (goto-char track-pos)
+ (emus--insert-track track)
+ (goto-char old-point))))))
(defun emus--render-tracks ()
(with-current-buffer "*emus*"
(defun emus-centre-current ()
(interactive)
(when (get-buffer "*emus*")
- (switch-to-buffer "*emus*")
(when emus-current-track
(goto-char (emus-track-browser-pos emus-current-track))
(recenter))))
(define-key map (kbd "c") 'emus-centre-current-status)
(when (fboundp 'evil-define-key*)
(evil-define-key* 'motion map
- (kbd "SPC") 'emus-playpause-status
- (kbd "o") 'emus-stop-status
- (kbd "+") 'emus-volume-up-status
- (kbd "=") 'emus-volume-up-status
- (kbd "-") 'emus-volume-down-status
- (kbd "R") 'emus-refresh-status
- (kbd "n") 'emus-play-next-status
- (kbd "p") 'emus-play-prev-status
- (kbd "N") 'emus-play-next-album-status
- (kbd "P") 'emus-play-prev-album-status
- (kbd ",") 'emus-jump-10s-backward-status
- (kbd ".") 'emus-jump-10s-forward-status
- (kbd "c") 'emus-centre-current-status))
+ (kbd "SPC") 'emus-playpause-status
+ (kbd "o") 'emus-stop-status
+ (kbd "+") 'emus-volume-up-status
+ (kbd "=") 'emus-volume-up-status
+ (kbd "-") 'emus-volume-down-status
+ (kbd "R") 'emus-refresh-status
+ (kbd "n") 'emus-play-next-status
+ (kbd "p") 'emus-play-prev-status
+ (kbd "N") 'emus-play-next-album-status
+ (kbd "P") 'emus-play-prev-album-status
+ (kbd ",") 'emus-jump-10s-backward-status
+ (kbd ".") 'emus-jump-10s-forward-status
+ (kbd "c") 'emus-centre-current-status))
map)
"Keymap for emus.")