Compare commits

...

3 Commits

3 changed files with 47 additions and 18 deletions

View File

@ -172,9 +172,13 @@ Note this interface may not work with all PipeWire versions.")
(pw-cli--parse-properties))) (pw-cli--parse-properties)))
(defun pw-cli--format-property-value (value) (defun pw-cli--format-property-value (value)
(if (consp value) (cond
(concat "[ " (mapconcat #'pw-cli--format-property-value value ", ") " ]") ((consp value)
value)) (concat "[ " (mapconcat #'pw-cli--format-property-value value ", ") " ]"))
((numberp value)
(number-to-string value))
(t
value)))
(defun pw-cli--format-property (property) (defun pw-cli--format-property (property)
(format "%s: %s" (car property) (pw-cli--format-property-value (cdr property)))) (format "%s: %s" (car property) (pw-cli--format-property-value (cdr property))))

View File

@ -198,9 +198,11 @@ rather than using cached data to obtain the result."
(cdr (assoc "volume" parameters)) (cdr (assoc "volume" parameters))
(nth port-id (cdr (assoc (if monitor-p "monitorVolumes" "channelVolumes") parameters))))))) (nth port-id (cdr (assoc (if monitor-p "monitorVolumes" "channelVolumes") parameters)))))))
(defun pw-lib-set-volume (volume object) (defun pw-lib-set-volume (volume object &optional single-p)
"Set the volume of PipeWire OBJECT to VOLUME. "Set the volume of PipeWire OBJECT to VOLUME.
VOLUME must be an integer in the range 0-100." VOLUME must be an integer in the range 0-100.
If SINGLE-P is non-nil, set the volume only for a single channel,
otherwise set the volume to the same value for all the related channels."
(cl-destructuring-bind (node-p parameters monitor-p node-id port-id) (cl-destructuring-bind (node-p parameters monitor-p node-id port-id)
(pw-lib--object-parameters object) (pw-lib--object-parameters object)
(let* ((property (cond (let* ((property (cond
@ -211,8 +213,10 @@ VOLUME must be an integer in the range 0-100."
(value (if node-p (value (if node-p
float-volume float-volume
(let ((orig-value (cdr (assoc property parameters)))) (let ((orig-value (cdr (assoc property parameters))))
(cl-substitute float-volume nil orig-value (if single-p
:test #'always :start port-id :count 1))))) (cl-substitute float-volume nil orig-value
:test #'always :start port-id :count 1)
(make-list (length orig-value) float-volume))))))
(pw-access-set-properties pw-lib--accessor node-id (list (cons property value)))))) (pw-access-set-properties pw-lib--accessor node-id (list (cons property value))))))
(defun pw-lib-set-default (object stored-p) (defun pw-lib-set-default (object stored-p)

View File

@ -150,7 +150,7 @@ object. Otherwise apply it on the default audio sink."
(pw-ui--update (format "%s %s" (pw-ui--object-name object) (if muted-p "muted" "unmuted"))))) (pw-ui--update (format "%s %s" (pw-ui--object-name object) (if muted-p "muted" "unmuted")))))
;;;###autoload ;;;###autoload
(defun pipewire-set-volume (volume &optional object) (defun pipewire-set-volume (volume &optional object single-p)
"Set volume of an audio output or input. "Set volume of an audio output or input.
VOLUME must be a number in the range 0-100. VOLUME must be a number in the range 0-100.
If OBJECT is given (only Nodes and Ports are allowed) or if on a Node If OBJECT is given (only Nodes and Ports are allowed) or if on a Node
@ -160,32 +160,52 @@ Otherwise apply it on the default audio sink."
(setq volume (max 0 (min 100 volume))) (setq volume (max 0 (min 100 volume)))
(unless object (unless object
(setq object (pw-ui--current-object t '("Node" "Port")))) (setq object (pw-ui--current-object t '("Node" "Port"))))
(pw-lib-set-volume volume object) (pw-lib-set-volume volume object single-p)
(pw-ui--update (format "Volume %s for %s" volume (pw-ui--object-name object)))) (pw-ui--update (format "Volume %s for %s" volume (pw-ui--object-name object))))
(defun pw-ui--change-volume (step) (defun pw-ui--change-volume (step &optional single-p)
(let* ((object (pw-ui--current-object t '("Node" "Port"))) (let* ((object (pw-ui--current-object t '("Node" "Port")))
(volume (pw-lib-volume object)) (volume (pw-lib-volume object))
(new-volume (max 0 (min 100 (+ volume step))))) (new-volume (max 0 (min 100 (+ volume step)))))
(pipewire-set-volume new-volume object))) (pipewire-set-volume new-volume object single-p)))
;;;###autoload ;;;###autoload
(defun pipewire-increase-volume () (defun pipewire-increase-volume (&optional single-p)
"Increase volume of an audio output or input.
The volume is increased by `pipewire-volume-step'.
If on a Node or Port in a PipeWire buffer, apply it on all the
channels of the given object. Otherwise apply it on the default audio
sink."
(interactive)
(pw-ui--change-volume pipewire-volume-step single-p))
;;;###autoload
(defun pipewire-increase-volume-single ()
"Increase volume of an audio output or input. "Increase volume of an audio output or input.
The volume is increased by `pipewire-volume-step'. The volume is increased by `pipewire-volume-step'.
If on a Node or Port in a PipeWire buffer, apply it on the given If on a Node or Port in a PipeWire buffer, apply it on the given
object. Otherwise apply it on the default audio sink." object. Otherwise apply it on the default audio sink."
(interactive) (interactive)
(pw-ui--change-volume pipewire-volume-step)) (pipewire-increase-volume t))
;;;###autoload ;;;###autoload
(defun pipewire-decrease-volume () (defun pipewire-decrease-volume (&optional single-p)
"Decrease volume of an audio output or input. "Decrease volume of an audio output or input.
The volume is Decreased by `pipewire-volume-step'. The volume is decreased by `pipewire-volume-step'.
If on a Node or Port in a PipeWire buffer, apply it on all the
channels of the given object. Otherwise apply it on the default audio
sink."
(interactive)
(pw-ui--change-volume (- pipewire-volume-step) single-p))
;;;###autoload
(defun pipewire-decrease-volume-single ()
"Decrease volume of an audio output or input.
The volume is decreased by `pipewire-volume-step'.
If on a Node or Port in a PipeWire buffer, apply it on the given If on a Node or Port in a PipeWire buffer, apply it on the given
object. Otherwise apply it on the default audio sink." object. Otherwise apply it on the default audio sink."
(interactive) (interactive)
(pw-ui--change-volume (- pipewire-volume-step))) (pipewire-decrease-volume t))
;;;###autoload ;;;###autoload
(defun pipewire-set-default () (defun pipewire-set-default ()
@ -212,9 +232,10 @@ Otherwise ask for the Node to set as the default Node."
(define-key map "d" 'pipewire-set-default) (define-key map "d" 'pipewire-set-default)
(define-key map "m" 'pipewire-toggle-muted) (define-key map "m" 'pipewire-toggle-muted)
(define-key map "v" 'pipewire-set-volume) (define-key map "v" 'pipewire-set-volume)
(define-key map "+" 'pipewire-increase-volume)
(define-key map "=" 'pipewire-increase-volume) (define-key map "=" 'pipewire-increase-volume)
(define-key map "-" 'pipewire-decrease-volume) (define-key map "-" 'pipewire-decrease-volume)
(define-key map "+" 'pipewire-increase-volume-single)
(define-key map "_" 'pipewire-decrease-volume-single)
map)) map))
(define-derived-mode pipewire-mode special-mode "PW" (define-derived-mode pipewire-mode special-mode "PW"