+ (when id
+ (squeeze-send-string "%s power ?" id)))
+
+(defun squeeze-control-volume-up (&optional id inc)
+ (interactive)
+ (unless inc (setq inc 5))
+ (unless id
+ (setq id (get-text-property (point) 'squeeze-playerid)))
+ (when id
+ (squeeze-send-string "%s mixer volume %+d" id inc)))
+
+(defun squeeze-control-volume-down (&optional id inc)
+ (interactive)
+ (unless inc (setq inc 5))
+ (unless id
+ (setq id (get-text-property (point) 'squeeze-playerid)))
+ (when id
+ (squeeze-send-string "%s mixer volume %+d" id (- inc))))
+
+(defun squeeze-control-volume-set (id val)
+ (interactive)
+ (squeeze-send-string "%s mixer volume %d" id val))
+
+(defun squeeze-control-query-mixer-volume (&optional id)
+ (interactive)
+ (unless id
+ (setq id (get-text-property (point) 'squeeze-playerid)))
+ (when id
+ (squeeze-send-string "%s mixer volume ?" id)))
+
+(defun squeeze-control-player-face (player)
+ (let ((power (squeeze-player-power player)))
+ (cond ((string= power "1") 'squeeze-player-on-face)
+ ((string= power "0") 'squeeze-player-off-face)
+ (t 'squeeze-player-face))))
+
+(defun squeeze-control-listen ()
+ (squeeze-send-string "listen 1"))
+
+(defun squeeze-accept-process-output ()
+ (while (accept-process-output (get-buffer-process "*squeeze*") 0.1 nil t)))
+
+(defun squeeze-control-refresh ()
+ (interactive)
+ (let ((squeeze-control-inhibit-display t))
+ (squeeze-control-query-players)
+ (squeeze-accept-process-output)
+ (squeeze-control-query-syncgroups)
+ (dolist (player squeeze-players)
+ (squeeze-control-query-power (squeeze-player-playerid player))
+ (squeeze-control-query-mixer-volume (squeeze-player-playerid player))))
+ (squeeze-accept-process-output)
+ (squeeze-control-display-players))
+
+(defvar squeeze-control-mixer-map
+ (let ((map (make-sparse-keymap)))
+ (define-key map (kbd "RET") 'squeeze-control-mixer-set-volume)
+ (define-key map [mouse-1] 'squeeze-control-mixer-mouse-1)
+ map))
+
+(defun squeeze-control-compute-volume (pos)
+ (let* ((end (next-single-property-change pos 'keymap))
+ (start (previous-single-property-change end 'keymap)))
+ (/ (* 100 (- (point) start)) (- end start 1))))
+
+(defun squeeze-control-mixer-mouse-1 (event)
+ (interactive "e")
+ (let* ((pos (cadadr event))
+ (val (squeeze-control-compute-volume pos))
+ (id (get-text-property pos 'squeeze-playerid)))
+ (squeeze-control-volume-set id val)))
+
+(defun squeeze-control-mixer-set-volume ()
+ (interactive)
+ (let* ((val (squeeze-control-compute-volume (point)))
+ (id (get-text-property (point) 'squeeze-playerid)))
+ (squeeze-control-volume-set id val)))
+
+(defvar squeeze-control-display-syncgroups nil)
+
+(defun squeeze-control-toggle-syncgroup-display ()
+ (interactive)
+ (setf squeeze-control-display-syncgroups
+ (not squeeze-control-display-syncgroups))
+ (squeeze-control-display-players))
+
+(defun squeeze-control-insert-player (player)
+ (insert (propertize (format "%20s" (squeeze-player-name player))
+ 'face (squeeze-control-player-face player)
+ 'squeeze-playerid (squeeze-player-playerid player)))
+ (when (squeeze-player-volume player)
+ (insert (propertize
+ (squeeze-mixer-make-bar (squeeze-player-volume player) 28)
+ 'squeeze-playerid (squeeze-player-playerid player)
+ 'keymap squeeze-control-mixer-map
+ 'pointer 'hdrag
+ 'rear-nonsticky '(keymap))))
+ (insert (propertize "\n" 'intangible t)))