{"id":16698870,"url":"https://github.com/teascade/pipeswitch","last_synced_at":"2025-04-10T03:41:00.253Z","repository":{"id":65326053,"uuid":"457549557","full_name":"Teascade/pipeswitch","owner":"Teascade","description":"Daemon for PipeWire that automatically links audio inputs and outputs based on regular expressions, similar to patchbay.","archived":false,"fork":false,"pushed_at":"2023-08-20T16:50:54.000Z","size":253,"stargazers_count":14,"open_issues_count":11,"forks_count":4,"subscribers_count":2,"default_branch":"main","last_synced_at":"2025-03-24T04:51:40.787Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"","language":"Rust","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"gpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/Teascade.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2022-02-09T22:29:24.000Z","updated_at":"2025-02-02T07:38:03.000Z","dependencies_parsed_at":"2025-02-16T11:32:37.745Z","dependency_job_id":"9507ef30-c219-4165-b105-cad9fc82c13a","html_url":"https://github.com/Teascade/pipeswitch","commit_stats":null,"previous_names":[],"tags_count":2,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Teascade%2Fpipeswitch","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Teascade%2Fpipeswitch/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Teascade%2Fpipeswitch/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Teascade%2Fpipeswitch/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Teascade","download_url":"https://codeload.github.com/Teascade/pipeswitch/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":248154963,"owners_count":21056541,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-10-12T18:04:23.830Z","updated_at":"2025-04-10T03:41:00.231Z","avatar_url":"https://github.com/Teascade.png","language":"Rust","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Pipeswitch\n[![dev](https://github.com/Teascade/pipeswitch/actions/workflows/dev.yml/badge.svg)](https://github.com/Teascade/pipeswitch/actions/workflows/dev.yml)\n\nDaemon for [PipeWire][pipewire] that automatically links audio inputs and\noutputs based on regex for similarly to how [QjackCtl][qjackctl]'s patchbay\nworks on Jack.\n\nWritten entirely in Rust using [official pipewire-bindings][pipewire-bindings],\nby implementing listeners similar to those provided by `pw-link`.\n\nIf you're looking for an interactive albeit non-automatic graph GUI for\nPipeWire, you might want to check out [Helvum][helvum]\n\n## Installation\n\n### Not ArchLinux\nUnfortunately there are no other packages available right away, but luckily\nPipeswitch is a simple binary, so you should be able to just grab the\n`.zip` from the release and boot the binary right up.\n\nOn top of that if you place the binary in `~/.local/bin/pipeswitchd`, you should be\nable to use the service provided as well right away, for example by placing it\nin `~/.config/systemd/user/pipeswitchd.service`.\n\n### ArchLinux\nArch users can simply install `pipeswitchd` or `pipeswitchd-bin` from\n[AUR][aur-search], and then enable the `pipeswitchd`-service, ie. by running \n```\nsystemctl --user enable pipeswitchd\n```\n\n## Features\n- Works as a single service running in the system background\n- Lightning fast\n- Is able to hot-reload configuration\n    - Optionally destroys links that are no longer configured and\n    - Creates new links\n- Accepts RegEx for matching inputs and outputs. Able to match client-name,\n  node-name and port-names seperately. (Node-name is usually the one you want,\n  and the one listed ie. in Helvum)\n    - If port-name is not specified, has an option to link ports according to\n      their channel (so left-ear matches left-ear)\n    - RegEx always expects to match the whole client/node/port-name. (Node-name,\n      if in/out is simply a string)\n\n## Config\nConfiguration is done with a `toml` file that is located at\n`$XDG_CONFIG_HOME/pipeswitch.toml`\n\nThe format is following:\n```toml\n# Comments made here should persist through automatic edits.\n[general]\n# keep links that dont exist in the config anymore\nlinger_links = false\n# inotify listen config and reload when it changes\nhotreload_config = true\n\n[log]\n# trace / debug / info / warn / error\n# Not updated with hotreload\nlevel = \"info\"\n\n# In and out share the same syntax, both can be expressed as objects or strings.\n# Client, Node and Port are technical terms in Pipewire.  \n# Always always you're interested in only the Node.\n[link.some_default_link]\n\n# Objects have client, node and port -fields, all of which are optional\nsource = { client = \"client_1\", node = \"node_1\" }\n\n# Strings always refer to only the node-name.\nsink = \"Hello there!\"\n\n# Optional per-link config  \n# if true (default), and ports are not specified in the object-notation, ports\n# are connected if they are in the same channel. Left goes into Left, Right into\n# Right. Mono only connects to mono even in this special case.\nspecial_empty_ports = true\n\n# A second link for the sake of demonstration\n[link.second_link]\nsource = \"Hello there!\"\nsink = \"Some sink\"\n```\n\nYou can preview what inputs/outputs are currently available with `pw-link -o`\nand `pw-link -i` or using Helvum. Note: `pw-link` lists both node-names and port-names.\n\nAnother tool you might find useful is `pw-dump`, where the relevant fields are\n`node.name`, `application.name` and `port.name` respectively.\n\n**note**: When naming headers (such as `[link.second_link]`), it is important to\nremember TOML semantics. `link.` at the beginning is important (it has a\nsemantic meaning), the part after that simply signifies the name of the link,\nwhich can contain alphanumeric characters, such as some characters supported by\nTOML like `_`, or `-`. Refer to [the TOML spec](https://toml.io/en/) on which\ncharacters are good to go.\n\n## License\nThis project is licensed under the [GNU General Public License v3](./LICENSE)\n\n[pipewire]: https://pipewire.org/\n[qjackctl]: https://qjackctl.sourceforge.io/\n[helvum]: https://gitlab.freedesktop.org/pipewire/helvum\n[pipewire-bindings]: https://crates.io/crates/pipewire\n[aur-search]: https://aur.archlinux.org/packages?K=pipeswitchd\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fteascade%2Fpipeswitch","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fteascade%2Fpipeswitch","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fteascade%2Fpipeswitch/lists"}