X-Git-Url: https://thelambdalab.xyz/gitweb/index.cgi?a=blobdiff_plain;f=emus.el;h=898b403aa8c77949302a40964af77894530c4e83;hb=7d8c6c7f428894a986852fb13681f444e92d9324;hp=ad7a5bd22234839deddc9caea3ab141a71e8233f;hpb=4c17fed4d674659349b4bf2e57750e99ee41e7e3;p=emus.git diff --git a/emus.el b/emus.el index ad7a5bd..898b403 100644 --- a/emus.el +++ b/emus.el @@ -191,6 +191,7 @@ (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)))) @@ -292,24 +293,70 @@ (interactive) (emus-volume-increase-by -10)) -(defun emus-play-nearby (offset) - (let ((idx (seq-position emus-records emus-current-record))) - (if idx - (let ((next-record (elt emus-records (+ idx offset)))) - (if next-record - (if (eq emus-state 'playing) - (emus-play-record next-record) - (emus-select-record next-record)) - (error "Track does not exist"))) - (error "No track is currently selected")))) +(defun emus--play-adjacent-track (&optional prev) + (emus--with-library + (let ((idx (seq-position emus-records emus-current-record)) + (offset (if prev -1 +1))) + (if idx + (let ((next-record (elt emus-records (+ idx offset)))) + (if next-record + (if (eq emus-state 'playing) + (emus-play-record next-record) + (emus-select-record next-record)) + (error "Track does not exist"))) + (error "No track selected"))))) + +(defun emus--play-adjacent-album (&optional prev) + (emus--with-library + (let ((idx (seq-position emus-records emus-current-record))) + (if idx + (let* ((search-list (if prev + (reverse (seq-subseq emus-records 0 idx)) + (seq-subseq emus-records (+ idx 1)))) + (current-album (emus-record-album emus-current-record)) + (next-record (seq-some (lambda (r) + (if (string= (emus-record-album r) + current-album) + nil + r)) + search-list))) + (if next-record + (if (eq emus-state 'playing) + (emus-play-record next-record) + (emus-select-record next-record)) + (error "Track does not exist"))) + (error "No track selected"))))) (defun emus-play-next () (interactive) - (emus-play-nearby 1)) + (emus--play-adjacent-track)) (defun emus-play-prev () (interactive) - (emus-play-nearby -1)) + (emus--play-adjacent-track t)) + +(defun emus-play-next-album () + (interactive) + (emus--play-adjacent-album)) + +(defun emus-play-prev-album () + (interactive) + (emus--play-adjacent-album t)) + +(defun emus-jump (seconds) + "Jump forward in current track by SECONDS seconds." + (emus--with-library + (emus-send-cmd "jump" (format "%+ds" seconds)))) + +(defun emus-jump-10s-forward () + "Jump 10 seconds forward in current track." + (interactive) + (emus-jump 10)) + +(defun emus-jump-10s-backward () + "Jump 10 seconds backward in current track." + (interactive) + (emus-jump -10)) (defun emus-display-status () (interactive) @@ -439,6 +486,10 @@ (defun emus-refresh-status () (interactive) (emus-refresh) (emus-display-status)) (defun emus-play-next-status () (interactive) (emus-play-next) (emus-display-status)) (defun emus-play-prev-status () (interactive) (emus-play-prev) (emus-display-status)) +(defun emus-play-next-album-status () (interactive) (emus-play-next-album) (emus-display-status)) +(defun emus-play-prev-album-status () (interactive) (emus-play-prev-album) (emus-display-status)) +(defun emus-jump-10s-forward-status () (interactive) (emus-jump-10s-forward) (emus-display-status)) +(defun emus-jump-10s-backward-status () (interactive) (emus-jump-10s-backward) (emus-display-status)) (defun emus-centre-current-status () (interactive) (emus-centre-current) (emus-display-status)) (defvar emus-browser-mode-map @@ -451,6 +502,10 @@ (define-key map (kbd "R") 'emus-refresh-status) (define-key map (kbd "n") 'emus-play-next-status) (define-key map (kbd "p") 'emus-play-prev-status) + (define-key map (kbd "N") 'emus-play-next-album-status) + (define-key map (kbd "P") 'emus-play-prev-album-status) + (define-key map (kbd ",") 'emus-jump-10s-backward-status) + (define-key map (kbd ".") 'emus-jump-10s-forward-status) (define-key map (kbd "c") 'emus-centre-current-status) (when (fboundp 'evil-define-key*) (evil-define-key* 'motion map @@ -462,6 +517,10 @@ (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.")