Go to file
Milan Zamazal 6fad0ba9f7 Use floating numbers for OSD frame position
If there are multiple monitors with different resolutions, integer
values may cause placing the OSD outside of the visible area.
Floating values are relative to the current monitor size and OSD
is always placed inside the visible area.
2022-06-17 19:30:38 +02:00
.gitignore Initial commit 2022-06-04 21:51:45 +02:00
LICENSE Initial commit 2022-06-04 21:51:45 +02:00
pw-access.el Move formatting list of properties to a separate function 2022-06-16 07:30:52 +02:00
pw-lib.el Add support for device profiles 2022-06-15 21:31:24 +02:00
pw-ui.el Use floating numbers for OSD frame position 2022-06-17 19:30:38 +02:00
README.org Add README 2022-06-05 11:43:04 +02:00
screenshot.jpg Add README 2022-06-05 11:43:04 +02:00

pipewire-0

pipewire-0 is an Emacs interface to PipeWire. It provides a library to access some PipeWire functionality and a simple user interface to handle audio devices. It allows displaying PipeWire devices and clients, changing volumes and muting and unmuting of PipeWire sinks and sources and setting default sinks and sources.

It is an experimental initial version that may be quite buggy. It works for me but may not work in other environments. Feel free to use it, fix it, fork it. Contact me if you want to discuss anything.

Usage

Installation

pipewire-0 currently requires presence of PipeWire command line tools, namely pw-cli and pw-metadata.

To install pipewire-0, put the *.el files to a site-lisp directory and add the following line to your Emacs configuration:

(require pw-ui)

Or if you use straight.el, you can install pipewire-0 as follows:

(straight-use-package
'(pipewire-0 :type git
           :repo "https://git.zamazal.org/pdm/pipewire-0"
           :local-repo "pipewire-0"))

User interface

M-x pipewire enters a buffer with PipeWire objects:

Emacs PipeWire buffer

Use C-h m to display basic help.

Most of the interactive functions can be used anywhere:

  • pipewire-increase-volume
  • pipewire-decrase-volume
  • pipewire-set-volume
  • pipewire-toggle-muted
  • pipewire-set-default

They can be bound to multimedia keys:

(global-set-key (kbd "<XF86AudioMute>") 'pipewire-toggle-muted)
(global-set-key (kbd "<XF86AudioLowerVolume>") 'pipewire-decrease-volume)
(global-set-key (kbd "<XF86AudioRaiseVolume>") 'pipewire-increase-volume)

Configuration

M-x customize-group RET pipewire RET

Library

pipewire-0 consists of the following source files:

pw-lib.el
PipeWire library to be used in Elisp programs.
pw-access.el
PipeWire communication interface, not supposed to be used outside pw-lib.
pw-ui.el
User commands and interface.

Look into pw-lib.el to see what public pw-lib-* functions are available there. For example, the following snippet can be used to display current volume level of the default audio sink:

(let ((object (pw-lib-default-audio-sink)))
(format "%s%s"
       (pw-lib-volume object t)
       (if (pw-lib-muted-p object) "(M)" "")))

Notes

PipeWire is currently accessed using pw-cli command line utility. Its output is apparently undocumented and changes between versions so this is not a reliable way to communicate with PipeWire. But I dont know about anything better currently. Nevertheless, its easy to replace pw-cli with something else in pw-access.el.

Why is it named pipewire-0?

I wrote pipewire-0 because I couldnt find any Emacs interface to PipeWire. I would name it simply pipewire or pipewire-el but I expect that someone will write a full-fledged PipeWire interface sooner or later. Id like to avoid confusion and reserve the plain name for the future interface, while having the basic above zero, pipewire-0, support for now.

Contact

pipewire-0 is available at git.zamazal.org. You can file issues there.

If you dont want to discuss things publicly or to bother registering at yet another web site, you can reach me at pdm@zamazal.org.