Compare commits

..
130 Commits
Author SHA1 Message Date
arabianq c2be0fdd81 deploy: 4555a002ef 2026-09-17 17:13:31 +00:00
arabianq e94aa19886 deploy: 4555a002ef 2026-09-17 17:10:25 +00:00
arabianq 417bcccb03 deploy: e2168421bb 2026-09-10 19:06:06 +00:00
arabianq 5e4ff7679f deploy: e2168421bb 2026-09-09 19:26:51 +00:00
arabianq 26aad57538 deploy: e2168421bb 2026-09-09 18:50:10 +00:00
arabianq ef6193f220 deploy: e2168421bb 2026-09-09 18:47:02 +00:00
arabianq 738664ee01 deploy: 5c3f20e153 2026-09-09 18:34:09 +00:00
arabianq a22864d591 deploy: 5c3f20e153 2026-09-09 18:30:18 +00:00
arabianq 3ca6ba8f48 deploy: 6eff8b2c6d 2026-09-09 10:23:21 +00:00
arabianq 3194b66143 deploy: 6eff8b2c6d 2026-09-09 10:18:40 +00:00
arabianq f992d57b88 deploy: dd13eee0df 2026-09-09 08:42:12 +00:00
arabianq 6cae1ef10c deploy: dd13eee0df 2026-09-09 08:40:03 +00:00
arabianq 0b1ec82b8d deploy: 3d1bc24c21 2026-09-09 08:36:19 +00:00
arabianq 5278cd5662 deploy: 3d1bc24c21 2026-09-09 08:33:56 +00:00
arabianq 0467c14f1f deploy: 53fabcee75 2026-09-01 18:13:35 +00:00
arabianq f19cef451e deploy: 53fabcee75 2026-09-01 18:09:10 +00:00
arabianq dc25fe9a2d deploy: 53fabcee75 2026-08-31 16:24:51 +00:00
arabianq 04c5b8d6be deploy: 53fabcee75 2026-08-31 16:19:24 +00:00
arabianq 089d0ce17e deploy: 17146d2ce6 2026-08-31 01:45:05 +00:00
arabianq 34ba3aff6b deploy: 17146d2ce6 2026-08-31 01:39:40 +00:00
arabianq 97a058bd23 deploy: 7ad69243cc 2026-08-30 21:11:08 +00:00
arabianq d9bc79733e deploy: 7ad69243cc 2026-08-30 21:09:24 +00:00
arabianq 74007651a6 deploy: a1184588a0 2026-08-29 10:50:17 +00:00
arabianq 7331da1cb1 deploy: a1184588a0 2026-08-29 10:48:38 +00:00
arabianq 25b0b1ef1e deploy: 9b65384cfd 2026-08-10 13:49:23 +00:00
arabianq 5a525ffe7d deploy: 9b65384cfd 2026-08-10 13:46:25 +00:00
arabianq 4c3c670d41 deploy: 59c7f25a38 2026-08-10 13:42:39 +00:00
arabianq 6444b3b1a9 deploy: 2b544d2e63 2026-08-10 13:41:01 +00:00
arabianq 9f1122842f deploy: b939709047 2026-08-05 12:07:33 +00:00
arabianq 0c106a2316 deploy: b939709047 2026-08-05 12:03:33 +00:00
arabianq a45c20d6a0 deploy: c75e073774 2026-07-30 18:10:16 +00:00
arabianq e393e71c34 deploy: c75e073774 2026-07-30 18:07:12 +00:00
arabianq 6fc85a3178 deploy: c75e073774 2026-07-30 08:31:09 +00:00
arabianq 8d8e2de0a5 deploy: 051e81d9f7 2026-07-30 08:28:24 +00:00
arabianq 738ce8f76d deploy: c75e073774 2026-07-30 08:25:16 +00:00
arabianq 3f53ee31cf deploy: 051e81d9f7 2026-07-30 08:20:35 +00:00
arabianq fb6ab8e751 deploy: 8854c401a9 2026-07-30 07:46:17 +00:00
arabianq ef7803c9eb deploy: 8854c401a9 2026-07-30 07:41:58 +00:00
arabianq 331b44231b deploy: c9f30e09d7 2026-07-30 07:40:38 +00:00
arabianq ea003ce24d deploy: c9f30e09d7 2026-07-30 07:33:48 +00:00
arabianq 3ed7f155c7 deploy: 0d0b5f9f29 2026-07-26 19:41:37 +00:00
arabianq ace9dafeec deploy: 0d0b5f9f29 2026-07-26 19:37:52 +00:00
arabianq f5e4b3a145 deploy: 0d0b5f9f29 2026-07-26 19:34:30 +00:00
arabianq 8a2175d0ea deploy: 0d0b5f9f29 2026-07-26 19:32:32 +00:00
arabianq 8166cd9d20 deploy: 425c1df61e 2026-07-26 19:25:08 +00:00
arabianq 5052bf787b deploy: 425c1df61e 2026-07-26 19:22:01 +00:00
arabianq e18cf9607e deploy: 425c1df61e 2026-07-26 19:00:36 +00:00
arabianq 90a7a5a2d5 deploy: 425c1df61e 2026-07-26 18:54:12 +00:00
arabianq 6f523b7a6b deploy: cfa31200d4 2026-07-26 18:45:38 +00:00
arabianq 34973cd4ad deploy: cfa31200d4 2026-07-26 18:39:19 +00:00
arabianq a5a605bfc8 deploy: 389640ee0a 2026-07-26 18:34:24 +00:00
arabianq a61dc9f8be deploy: 389640ee0a 2026-07-26 18:28:07 +00:00
arabianq 6e3554e403 deploy: 7b87dc02dd 2026-07-26 18:04:43 +00:00
arabianq bcb6f1f92a deploy: 7b87dc02dd 2026-07-26 17:58:41 +00:00
arabianq 69b1a5860b deploy: 785b835237 2026-07-26 17:45:04 +00:00
arabianq 929199b981 deploy: 785b835237 2026-07-26 17:39:17 +00:00
arabianq b781f03484 deploy: 1616d80ee9 2026-07-24 21:11:25 +00:00
arabianq d2e8de422a deploy: 1616d80ee9 2026-07-24 21:07:47 +00:00
arabianq 69e9a4b5b6 deploy: 1616d80ee9 2026-07-24 21:03:07 +00:00
arabianq d780985d15 deploy: 0c3d7cbd35 2026-07-24 20:58:33 +00:00
arabianq 992e5bf8d8 deploy: 0c3d7cbd35 2026-07-24 20:52:01 +00:00
arabianq 7c3cad6e6e deploy: 6d7abdbf53 2026-07-24 03:10:48 +00:00
arabianq 10fc6d84c9 deploy: 6d7abdbf53 2026-07-24 03:08:13 +00:00
arabianq 5d262ba412 deploy: 6d7abdbf53 2026-07-24 03:06:52 +00:00
arabianq 7ff3cd3a0e deploy: 6d7abdbf53 2026-07-24 03:01:29 +00:00
arabianq 6409e041ff deploy: 41bb035b2c 2026-07-24 03:00:13 +00:00
arabianq c3feb3fc06 deploy: 41bb035b2c 2026-07-24 02:56:41 +00:00
arabianq 8fa1d56fc4 deploy: 3873bf4270 2026-07-24 02:51:43 +00:00
arabianq 0611a22f83 deploy: 3873bf4270 2026-07-24 02:47:11 +00:00
arabianq b0640d7809 deploy: 2b60b47cce 2026-07-24 02:46:05 +00:00
arabianq 3d34ec6e98 deploy: 65ae8589db 2026-07-24 02:42:12 +00:00
arabianq 004ae0907d deploy: 65ae8589db 2026-07-24 02:36:17 +00:00
arabianq 7a19d79d08 deploy: a33d023950 2026-07-24 01:58:08 +00:00
arabianq a2aeab5a16 deploy: a33d023950 2026-07-24 01:52:04 +00:00
arabianq 5a87f06e16 deploy: 5c73bc1bea 2026-07-20 18:48:20 +00:00
arabianq b6d5cfcd0c deploy: 5c73bc1bea 2026-07-20 18:45:06 +00:00
arabianq 42e8723977 deploy: 5c73bc1bea 2026-07-20 18:34:07 +00:00
arabianq 26e5d8b02a deploy: 5c73bc1bea 2026-07-20 18:28:30 +00:00
arabianq af5a7851ed deploy: 42e305869a 2026-07-20 18:23:27 +00:00
arabianq 454ab9b3a6 deploy: 3a218283db 2026-07-20 18:07:57 +00:00
arabianq 4e92298873 deploy: 3a218283db 2026-07-20 18:04:54 +00:00
arabianq 437d7fdb4e deploy: 02fdfb6ca8 2026-07-20 16:43:14 +00:00
arabianq 39816a4dbe deploy: 02fdfb6ca8 2026-07-20 16:37:01 +00:00
arabianq 93f3460e2d deploy: a027838d0e 2026-07-20 16:33:24 +00:00
arabianq f1ac8b91d7 deploy: 1828d903a1 2026-07-20 16:30:49 +00:00
arabianq e1f12f5ce4 deploy: 83ca7a5e34 2026-07-20 16:27:02 +00:00
arabianq 6ca239ffc9 deploy: 1828d903a1 2026-07-20 16:24:35 +00:00
arabianq 0599e38625 deploy: 83ca7a5e34 2026-07-20 16:23:20 +00:00
arabianq ddaee8c1e9 deploy: f2aca5e34a 2026-07-20 16:22:07 +00:00
arabianq fcde9614e2 deploy: f2aca5e34a 2026-07-20 16:16:39 +00:00
arabianq b51f453ec3 deploy: 6130a99c4b 2026-07-20 16:12:28 +00:00
arabianq 758f685413 deploy: 6130a99c4b 2026-07-20 16:04:28 +00:00
arabianq 702acccb55 deploy: 322b93efa1 2026-07-19 14:32:27 +00:00
arabianq 9d4d5016fa deploy: 322b93efa1 2026-07-19 14:31:19 +00:00
arabianq 39b726f8c4 deploy: 683f4127a0 2026-07-15 13:30:06 +00:00
arabianq bb57bfb1a8 deploy: 683f4127a0 2026-07-15 13:24:13 +00:00
arabianq 183c961710 deploy: c873166e21 2026-07-14 13:53:40 +00:00
arabianq b985132ed7 deploy: c873166e21 2026-07-14 13:52:55 +00:00
arabianq f79614da75 deploy: ec4e873071 2026-07-07 18:35:37 +00:00
arabianq 12f986db1e deploy: ec4e873071 2026-07-07 18:31:45 +00:00
arabianq c826b7ae4d deploy: a91252d7fb 2026-07-07 17:45:16 +00:00
arabianq dc9fc64a16 deploy: a91252d7fb 2026-07-07 17:42:32 +00:00
arabianq c4776c43eb deploy: a91252d7fb 2026-07-07 16:37:31 +00:00
arabianq b091c65935 deploy: a91252d7fb 2026-07-07 16:35:19 +00:00
arabianq e08de17e64 deploy: 4f8f663f12 2026-07-07 16:34:40 +00:00
arabianq 868b6ce432 deploy: 4f8f663f12 2026-07-07 16:31:06 +00:00
arabianq 8b991d56a9 deploy: 6ccc55a1d0 2026-07-07 16:06:53 +00:00
arabianq e796a2248d deploy: d266a3f073 2026-07-07 16:04:53 +00:00
arabianq 406f9957f4 deploy: 6ccc55a1d0 2026-07-07 16:02:06 +00:00
arabianq 2d37280217 deploy: d266a3f073 2026-07-07 16:00:45 +00:00
arabianq 563aa1d90c deploy: d2993592be 2026-07-07 14:02:58 +00:00
arabianq 9a74eeb14b deploy: d2993592be 2026-07-07 13:58:23 +00:00
arabianq a672127081 deploy: 1a53ab62dc 2026-07-07 13:12:44 +00:00
arabianq 2b95b5040b deploy: 1a53ab62dc 2026-07-07 13:08:37 +00:00
arabianq 125dbd3f8f deploy: 51fcd94a61 2026-07-07 13:06:20 +00:00
arabianq dae190dd5f deploy: 51fcd94a61 2026-07-07 13:01:41 +00:00
arabianq 964205907a deploy: 7f6a122816 2026-07-07 12:57:44 +00:00
arabianq c1a7d050ab deploy: 7f6a122816 2026-07-07 12:51:58 +00:00
arabianq 8556b27f0d deploy: 7ca01ed8cb 2026-07-07 12:49:12 +00:00
arabianq 3c8722d1f6 deploy: 7ca01ed8cb 2026-07-07 12:43:21 +00:00
arabianq ebfb5d402c deploy: 07321afb60 2026-07-05 19:57:25 +00:00
arabianq 6d31f503b9 deploy: 07321afb60 2026-07-05 19:51:24 +00:00
arabianq bd0f1a941d deploy: 16ce233f79 2026-07-05 19:44:30 +00:00
arabianq 955a696cbc deploy: 16ce233f79 2026-07-05 19:38:16 +00:00
arabianq 1597cb67fd deploy: c2f4658871 2026-07-05 19:31:38 +00:00
arabianq 0cb31d6e89 deploy: c2f4658871 2026-07-05 19:24:48 +00:00
arabianq 8128036313 deploy: 701bdebc88 2026-07-05 18:57:09 +00:00
arabianq 0adf869d5c deploy: 701bdebc88 2026-07-05 18:53:41 +00:00
arabianq 1d1df22920 deploy: 701bdebc88 2026-07-05 18:25:59 +00:00
arabianq ed4bfa7d1b deploy: 701bdebc88 2026-07-05 18:20:44 +00:00
4413 changed files with 285 additions and 23630 deletions
-1
View File
@@ -1 +0,0 @@
custom: ['https://dalink.to/arabianq', 'https://boosty.to/arabian', 'https://sponsr.ru/notultranx/']
-29
View File
@@ -1,29 +0,0 @@
version: 2
updates:
- package-ecosystem: "github-actions"
directory: "/"
schedule:
interval: "weekly"
- package-ecosystem: "cargo"
directory: "/"
schedule:
interval: "weekly"
groups:
egui-stack:
patterns:
- "egui*"
- "eframe"
serde-stack:
patterns:
- "serde*"
tokio-stack:
patterns:
- "tokio*"
- "reqwest"
clap-stack:
patterns:
- "clap*"
-257
View File
@@ -1,257 +0,0 @@
name: Build
permissions:
contents: write
packages: write
on:
push:
branches: [main, master]
pull_request:
branches: [main, master]
workflow_dispatch:
jobs:
build-and-package:
strategy:
matrix:
include:
- arch: x64
runner: ubuntu-latest
- arch: arm64
runner: ubuntu-24.04-arm
fail-fast: false
runs-on: ${{ matrix.runner }}
steps:
- name: Install apt deps (jq/zip + dev-libs)
run: |
sudo apt-get update
sudo apt-get install -y \
zip jq \
libpipewire-0.3-dev \
libclang-dev \
libasound2-dev \
libdbus-1-dev \
libssl-dev \
pkg-config
- name: Checkout code
uses: actions/checkout@v7
with:
fetch-depth: 0
- name: Setup Rust toolchain
uses: actions-rust-lang/setup-rust-toolchain@v1
with:
toolchain: stable
cache: false
- name: Rust Cache
uses: swatinem/rust-cache@v2
with:
prefix-key: "v3-${{ matrix.runner }}"
- name: Run tests
run: cargo test --locked
- name: Build all binaries
run: cargo build --locked
- name: Extract all binary names
id: cargo-meta
run: |
set -euo pipefail
BIN_NAMES=$(cargo metadata --no-deps --format-version 1 \
| jq -r '.packages[].targets[] | select(.kind[] | contains("bin")) | .name')
echo "bin_names<<EOF" >> $GITHUB_OUTPUT
echo "$BIN_NAMES" >> $GITHUB_OUTPUT
echo "EOF" >> $GITHUB_OUTPUT
- name: Package ZIP archive
shell: bash
run: |
set -euo pipefail
COMMIT_SHA="${{ github.sha }}"
ARCHIVE_NAME="pwsp-${COMMIT_SHA}-linux-${{ matrix.arch }}.zip"
echo "Creating archive: $ARCHIVE_NAME"
FILES=()
while IFS= read -r BIN; do
[ -z "$BIN" ] && continue
FILES+=("target/debug/$BIN")
done <<< "${{ steps.cargo-meta.outputs.bin_names }}"
if [ "${#FILES[@]}" -eq 0 ]; then
echo "Error: no binaries were discovered via cargo metadata." >&2
exit 1
fi
zip -j "$ARCHIVE_NAME" "${FILES[@]}"
- name: Upload ZIP artifact
uses: actions/upload-artifact@v7
with:
name: archive-${{ matrix.arch }}
path: pwsp-*.zip
retention-days: 7
- name: Cache cargo-deb
id: cache-cargo-deb
uses: actions/cache@v6
with:
path: ~/.cargo/bin/cargo-deb
key: ${{ runner.os }}-${{ runner.arch }}-cargo-deb-v1
- name: Install cargo-deb
if: steps.cache-cargo-deb.outputs.cache-hit != 'true'
run: cargo install --locked cargo-deb
- name: Create .deb package
shell: bash
run: |
set -euo pipefail
export PATH="$HOME/.cargo/bin:$PATH"
if [ "${{ github.event_name }}" == "push" ] && [ "${{ github.ref }}" == "refs/heads/main" ]; then
BASE_VERSION=$(grep '^version =' Cargo.toml | head -1 | cut -d'"' -f2)
GIT_REV=$(git rev-parse --short HEAD)
DATE=$(date +%Y%m%d)
DEB_VER="${BASE_VERSION}+git${DATE}.${GIT_REV}"
echo "Building nightly deb version: $DEB_VER"
cargo-deb -p pwsp-gui --no-build --no-strip --profile dev --deb-version "$DEB_VER"
else
cargo-deb -p pwsp-gui --no-build --no-strip --profile dev
fi
- name: Upload .deb artifact
uses: actions/upload-artifact@v7
with:
name: deb-packages-${{ matrix.arch }}
path: target/debian/*.deb
retention-days: 7
deploy-nightly-apt:
needs: build-and-package
if: github.event_name == 'push' && github.ref == 'refs/heads/main'
runs-on: ubuntu-latest
concurrency: gh-pages-deploy
permissions:
contents: write
steps:
- name: Checkout code
uses: actions/checkout@v7
- name: Setup GPG
id: gpg
uses: crazy-max/ghaction-import-gpg@v7
with:
gpg_private_key: ${{ secrets.GPG_PRIVATE_KEY }}
passphrase: ${{ secrets.GPG_PASSPHRASE }}
- name: Download DEB artifacts
uses: actions/download-artifact@v8
with:
pattern: deb-packages-*
path: debs
merge-multiple: true
- name: Checkout existing gh-pages
uses: actions/checkout@v7
with:
ref: gh-pages
path: gh-pages-branch
continue-on-error: true
- name: Generate Nightly APT Repository
run: |
sudo apt-get update
sudo apt-get install -y reprepro
mkdir -p apt-repo
if [ -d "gh-pages-branch/apt" ]; then
cp -r gh-pages-branch/apt/* apt-repo/ || true
fi
mkdir -p apt-repo/conf
cat <<EOF > apt-repo/conf/distributions
Origin: arabianq
Label: PipeWire Soundpad
Codename: stable
Architectures: amd64 arm64
Components: main
Description: APT Repository for PWSP
SignWith: ${{ steps.gpg.outputs.fingerprint }}
Origin: arabianq
Label: PipeWire Soundpad
Codename: nightly
Architectures: amd64 arm64
Components: main
Description: Nightly APT Repository for PWSP
SignWith: ${{ steps.gpg.outputs.fingerprint }}
EOF
gpg --armor --export ${{ steps.gpg.outputs.fingerprint }} > apt-repo/pubkey.gpg
cd apt-repo
for deb in ../debs/*.deb; do
if [ -f "$deb" ]; then
echo "Adding $deb to nightly APT repository..."
reprepro includedeb nightly "$deb"
fi
done
- name: Deploy APT Repo to GitHub Pages
uses: peaceiris/actions-gh-pages@v4
with:
github_token: ${{ secrets.GITHUB_TOKEN }}
publish_dir: ./apt-repo
destination_dir: apt
keep_files: true
flatpak-build:
if: github.event_name == 'pull_request' || github.event_name == 'workflow_dispatch'
strategy:
matrix:
include:
- arch: x86_64
runner: ubuntu-latest
- arch: aarch64
runner: ubuntu-24.04-arm
fail-fast: false
runs-on: ${{ matrix.runner }}
container:
image: ghcr.io/flathub-infra/flatpak-github-actions:freedesktop-25.08
options: --privileged
steps:
- uses: actions/checkout@v7
- name: Build Flatpak
uses: flatpak/flatpak-github-actions/flatpak-builder@v6
with:
bundle: ru.arabianq.pwsp_${{ matrix.arch }}.flatpak
manifest-path: packages/flatpak/ru.arabianq.pwsp.yaml
cache: true
branch: master
build-bundle: true
arch: ${{ matrix.arch }}
trigger-copr-nightly:
if: github.event_name == 'push' && github.ref == 'refs/heads/main'
runs-on: ubuntu-latest
steps:
- name: Install copr-cli
run: pip install copr-cli
- name: Trigger Copr Build
env:
COPR_CONFIG: ${{ secrets.COPR_CONFIG }}
run: |
mkdir -p ~/.config
echo "$COPR_CONFIG" > ~/.config/copr
copr-cli buildscm --nowait \
--clone-url https://github.com/arabianq/pipewire-soundpad.git \
--commit ${{ github.sha }} \
--spec packages/rpm/pwsp-git.spec \
arabianq/pwsp
-36
View File
@@ -1,36 +0,0 @@
name: Dependabot Flatpak Cargo Sources
on:
pull_request:
types: [opened, synchronize, reopened]
paths:
- "Cargo.lock"
jobs:
update-cargo-sources:
if: github.actor == 'dependabot[bot]'
runs-on: ubuntu-latest
permissions:
contents: write # Needed to push back to the branch
steps:
- name: Checkout code
uses: actions/checkout@v7
with:
ref: ${{ github.head_ref }}
- name: Setup Python
uses: actions/setup-python@v7
with:
python-version: "3.x"
- name: Install dependencies
run: pip install aiohttp tomlkit
- name: Generate cargo-sources.json
run: bash ./scripts/generate-sources.sh
- name: Commit and push changes
uses: stefanzweifel/git-auto-commit-action@v7
with:
commit_message: "chore(flatpak): automatically update cargo-sources.json"
file_pattern: "packages/flatpak/cargo-sources.json"
-186
View File
@@ -1,186 +0,0 @@
name: Flatter
on:
push:
branches: [main, master]
release:
types: [published]
workflow_dispatch:
inputs:
tag_name:
description: "TAG (empty to build from current branch)"
required: false
type: string
build_branch:
description: "Flatpak branch to build (stable/nightly)"
required: true
type: choice
options:
- stable
- nightly
default: "stable"
jobs:
build-flatpak:
name: Build Flatpak (${{ matrix.arch }})
strategy:
matrix:
include:
- arch: x86_64
runner: ubuntu-latest
- arch: aarch64
runner: ubuntu-24.04-arm
fail-fast: false
runs-on: ${{ matrix.runner }}
permissions:
contents: read
container:
image: ghcr.io/andyholmes/flatter/freedesktop:25.08
options: --privileged
steps:
- name: Checkout
uses: actions/checkout@v7
with:
ref: ${{ inputs.tag_name || github.ref }}
- name: Setup GPG
id: gpg
uses: crazy-max/ghaction-import-gpg@v7
with:
gpg_private_key: ${{ secrets.GPG_PRIVATE_KEY }}
passphrase: ${{ secrets.GPG_PASSPHRASE }}
- name: Set Default Branch
id: set_branch
run: |
if [ "${{ github.event_name }}" == "release" ]; then
echo "branch=stable" >> $GITHUB_OUTPUT
elif [ "${{ github.event_name }}" == "workflow_dispatch" ]; then
echo "branch=${{ inputs.build_branch }}" >> $GITHUB_OUTPUT
else
echo "branch=nightly" >> $GITHUB_OUTPUT
fi
- name: Modify Manifest
run: |
sed -i '/^branch:/d' packages/flatpak/ru.arabianq.pwsp.yaml
sed -i '/^default-branch:/d' packages/flatpak/ru.arabianq.pwsp.yaml
echo "branch: ${{ steps.set_branch.outputs.branch }}" >> packages/flatpak/ru.arabianq.pwsp.yaml
echo "default-branch: ${{ steps.set_branch.outputs.branch }}" >> packages/flatpak/ru.arabianq.pwsp.yaml
- name: Install SDK Extensions
run: |
flatpak install -y flathub org.freedesktop.Sdk.Extension.rust-stable//25.08
flatpak install -y flathub org.freedesktop.Sdk.Extension.llvm20//25.08
- name: Build Flatpak
uses: andyholmes/flatter@main
with:
files: packages/flatpak/ru.arabianq.pwsp.yaml
gpg-sign: ${{ steps.gpg.outputs.fingerprint }}
upload-bundles: true
upload-pages-artifact: false
arch: ${{ matrix.arch }}
cache: true
prepare-repo:
name: Prepare OSTree Repo
needs: build-flatpak
runs-on: ubuntu-latest
concurrency: gh-pages-deploy
container:
image: ghcr.io/andyholmes/flatter/freedesktop:25.08
options: --privileged
permissions:
contents: write # Needed to upload files to GitHub Release
steps:
- name: Download Flatpak Bundles
uses: actions/download-artifact@v8
with:
path: bundles
pattern: ru.arabianq.pwsp-*
- name: Checkout existing gh-pages
uses: actions/checkout@v7
with:
ref: gh-pages
path: gh-pages-branch
continue-on-error: true
- name: Setup GPG
id: gpg
uses: crazy-max/ghaction-import-gpg@v7
with:
gpg_private_key: ${{ secrets.GPG_PRIVATE_KEY }}
passphrase: ${{ secrets.GPG_PASSPHRASE }}
- name: Update OSTree Repo and Prepare Release Bundles
run: |
mkdir -p release-bundles
# Inherit existing OSTree repository to preserve previous branches (e.g. stable vs nightly)
# Only inherit if objects/ exists, otherwise it's a corrupted/empty repo due to Git ignoring empty folders
if [ -d "gh-pages-branch/objects" ]; then
echo "Found existing OSTree repository. Copying..."
cp -r gh-pages-branch pages-repo
# Clean up the .git folder so it doesn't interfere
rm -rf pages-repo/.git
# Recreate empty OSTree directories that Git ignored when pushing previously
mkdir -p pages-repo/refs/heads pages-repo/refs/mirrors pages-repo/refs/remotes \
pages-repo/objects pages-repo/state pages-repo/extensions pages-repo/tmp
else
echo "Initializing new OSTree repository..."
mkdir -p pages-repo
ostree init --mode=archive-z2 --repo=pages-repo
fi
shopt -s nullglob
for dir in bundles/ru.arabianq.pwsp-*; do
arch=$(basename "$dir" | sed 's/ru.arabianq.pwsp-//')
# Find the flatpak file inside the dir
bundle=$(find "$dir" -name "*.flatpak" | head -n 1)
if [ -n "$bundle" ]; then
echo "Importing $bundle for architecture $arch..."
flatpak build-import-bundle pages-repo "$bundle"
# Copy with a unique name for GitHub Release
cp "$bundle" "release-bundles/ru.arabianq.pwsp-${arch}.flatpak"
fi
done
# Update summary and sign the repository
flatpak build-update-repo --generate-static-deltas --gpg-sign=${{ steps.gpg.outputs.fingerprint }} pages-repo
# Export GPG public key for manual import
gpg --export ${{ steps.gpg.outputs.fingerprint }} > pages-repo/pwsp.gpg
# Generate a .flatpakrepo file for easy installation
GPG_BASE64=$(gpg --export ${{ steps.gpg.outputs.fingerprint }} | base64 -w 0)
cat <<EOF | sed 's/^ *//' > pages-repo/pwsp.flatpakrepo
[Flatpak Repo]
Title=PipeWire Soundpad
Url=https://arabianq.github.io/pipewire-soundpad/
Homepage=https://github.com/arabianq/pipewire-soundpad
Comment=PipeWire Soundpad Flatpak Repository
Description=Official repository for PWSP
GPGKey=${GPG_BASE64}
EOF
- name: Deploy Flatpak Repo to GitHub Pages
uses: peaceiris/actions-gh-pages@v4
with:
github_token: ${{ secrets.GITHUB_TOKEN }}
publish_dir: ./pages-repo
destination_dir: .
keep_files: true
- name: Upload bundles to GitHub Release
if: github.event_name == 'release'
uses: softprops/action-gh-release@v3
with:
files: release-bundles/*.flatpak
tag_name: ${{ github.event.release.tag_name }}
-272
View File
@@ -1,272 +0,0 @@
name: Release
permissions:
contents: write
packages: write
on:
release:
types: [created]
workflow_dispatch:
inputs:
tag:
description: "Tag to attach assets to (e.g. v1.0.0)"
required: false
jobs:
prepare:
runs-on: ubuntu-latest
outputs:
tag: ${{ steps.tag.outputs.tag }}
steps:
- name: Determine tag to use
id: tag
run: |
set -euo pipefail
INPUT_TAG="${{ github.event.inputs.tag || '' }}"
EVENT_TAG="${{ github.event.release.tag_name || '' }}"
if [ -n "$INPUT_TAG" ]; then
echo "tag=$INPUT_TAG" >> $GITHUB_OUTPUT
elif [ -n "$EVENT_TAG" ]; then
echo "tag=$EVENT_TAG" >> $GITHUB_OUTPUT
elif [[ "${GITHUB_REF:-}" =~ ^refs/tags/(.+)$ ]]; then
echo "tag=${BASH_REMATCH[1]}" >> $GITHUB_OUTPUT
else
LATEST_JSON=$(curl -sSf -H "Authorization: Bearer ${{ secrets.GITHUB_TOKEN }}" -H "Accept: application/vnd.github+json" "https://api.github.com/repos/${{ github.repository }}/releases/latest" || true)
TAG_NAME=$(echo "$LATEST_JSON" | jq -r '.tag_name // empty')
if [ -n "$TAG_NAME" ]; then
echo "tag=$TAG_NAME" >> $GITHUB_OUTPUT
else
echo "tag=" >> $GITHUB_OUTPUT
fi
fi
- name: Fail if no tag determined
if: ${{ steps.tag.outputs.tag == '' }}
run: |
echo "ERROR: No tag determined."
exit 1
build-release:
needs: prepare
strategy:
matrix:
include:
- arch: x64
runner: ubuntu-latest
- arch: arm64
runner: ubuntu-24.04-arm
fail-fast: false
runs-on: ${{ matrix.runner }}
steps:
- name: Install apt deps
run: |
sudo apt-get update
sudo apt-get install -y \
zip jq \
libpipewire-0.3-dev \
libclang-dev \
libasound2-dev \
libdbus-1-dev \
libssl-dev \
pkg-config
- name: Checkout code at tag
uses: actions/checkout@v7
with:
ref: ${{ needs.prepare.outputs.tag }}
fetch-depth: 0
- name: Setup Rust toolchain
uses: actions-rust-lang/setup-rust-toolchain@v1
with:
toolchain: stable
cache: false
- name: Rust Cache
uses: swatinem/rust-cache@v2
with:
prefix-key: "v3-${{ matrix.runner }}"
- name: Extract all binary names
id: cargo-meta
run: |
set -euo pipefail
BIN_NAMES=$(cargo metadata --no-deps --format-version 1 \
| jq -r '.packages[].targets[] | select(.kind[] | contains("bin")) | .name')
echo "bin_names<<EOF" >> $GITHUB_OUTPUT
echo "$BIN_NAMES" >> $GITHUB_OUTPUT
echo "EOF" >> $GITHUB_OUTPUT
- name: Build all release binaries
run: cargo build --release --locked
- name: Package ZIP archive
shell: bash
run: |
set -euo pipefail
TAG="${{ needs.prepare.outputs.tag }}"
ARCHIVE_NAME="pwsp-${TAG}-linux-${{ matrix.arch }}.zip"
FILES=()
while IFS= read -r BIN; do
[ -z "$BIN" ] && continue
FILES+=("target/release/$BIN")
done <<< "${{ steps.cargo-meta.outputs.bin_names }}"
zip -j "$ARCHIVE_NAME" "${FILES[@]}"
- name: Upload ZIP artifact
uses: actions/upload-artifact@v7
with:
name: zip-archive-${{ matrix.arch }}
path: pwsp-*.zip
retention-days: 1
- name: Cache cargo-deb
id: cache-cargo-deb
uses: actions/cache@v6
with:
path: ~/.cargo/bin/cargo-deb
key: ${{ runner.os }}-${{ runner.arch }}-cargo-deb-v1
- name: Install cargo-deb
if: steps.cache-cargo-deb.outputs.cache-hit != 'true'
run: cargo install --locked cargo-deb
- name: Create .deb package
shell: bash
run: |
set -euo pipefail
export PATH="$HOME/.cargo/bin:$PATH"
cargo-deb -p pwsp-gui --no-build
- name: Upload DEB artifact
uses: actions/upload-artifact@v7
with:
name: deb-package-${{ matrix.arch }}
path: target/debian/*.deb
retention-days: 1
publish-release:
needs: [prepare, build-release]
runs-on: ubuntu-latest
steps:
- name: Download all artifacts
uses: actions/download-artifact@v8
with:
path: ./dist
merge-multiple: true
- name: Upload artifacts to Release
uses: softprops/action-gh-release@v3
with:
token: ${{ secrets.GITHUB_TOKEN }}
tag_name: ${{ needs.prepare.outputs.tag }}
files: |
./dist/pwsp-*.zip
./dist/*.deb
trigger-copr:
needs: prepare
runs-on: ubuntu-latest
steps:
- name: Install copr-cli
run: pip install copr-cli
- name: Trigger Copr Build
env:
COPR_CONFIG: ${{ secrets.COPR_CONFIG }}
run: |
mkdir -p ~/.config
echo "$COPR_CONFIG" > ~/.config/copr
copr-cli buildscm --nowait \
--clone-url https://github.com/arabianq/pipewire-soundpad.git \
--commit ${{ needs.prepare.outputs.tag }} \
--spec packages/rpm/pwsp.spec \
arabianq/pwsp
build-apt-repo:
needs: [prepare, build-release]
runs-on: ubuntu-latest
concurrency: gh-pages-deploy
permissions:
contents: write
steps:
- name: Checkout code
uses: actions/checkout@v7
- name: Setup GPG
id: gpg
uses: crazy-max/ghaction-import-gpg@v7
with:
gpg_private_key: ${{ secrets.GPG_PRIVATE_KEY }}
passphrase: ${{ secrets.GPG_PASSPHRASE }}
- name: Download DEB artifacts
uses: actions/download-artifact@v8
with:
pattern: deb-package-*
path: debs
merge-multiple: true
- name: Checkout existing gh-pages
uses: actions/checkout@v7
with:
ref: gh-pages
path: gh-pages-branch
continue-on-error: true
- name: Generate APT Repository
run: |
sudo apt-get update
sudo apt-get install -y reprepro
mkdir -p apt-repo
# Restore existing repository first so we don't lose old packages
if [ -d "gh-pages-branch/apt" ]; then
cp -r gh-pages-branch/apt/* apt-repo/ || true
fi
# Always rewrite the config and public key to ensure they are up-to-date
mkdir -p apt-repo/conf
cat <<EOF > apt-repo/conf/distributions
Origin: arabianq
Label: PipeWire Soundpad
Codename: stable
Architectures: amd64 arm64
Components: main
Description: APT Repository for PWSP
SignWith: ${{ steps.gpg.outputs.fingerprint }}
Origin: arabianq
Label: PipeWire Soundpad
Codename: nightly
Architectures: amd64 arm64
Components: main
Description: Nightly APT Repository for PWSP
SignWith: ${{ steps.gpg.outputs.fingerprint }}
EOF
gpg --armor --export ${{ steps.gpg.outputs.fingerprint }} > apt-repo/pubkey.gpg
cd apt-repo
for deb in ../debs/*.deb; do
if [ -f "$deb" ]; then
echo "Adding $deb to APT repository..."
reprepro includedeb stable "$deb"
fi
done
- name: Deploy APT Repo to GitHub Pages
uses: peaceiris/actions-gh-pages@v4
with:
github_token: ${{ secrets.GITHUB_TOKEN }}
publish_dir: ./apt-repo
destination_dir: apt
keep_files: true
-4
View File
@@ -1,4 +0,0 @@
/target
.idea
packages/aur/bin/.git
packages/aur/standart/.git
View File
View File
Generated
-5802
View File
File diff suppressed because it is too large Load Diff
-90
View File
@@ -1,90 +0,0 @@
[workspace]
members = [
"pwsp-lib",
"pwsp-daemon",
"pwsp-cli",
"pwsp-gui"
]
resolver = "2"
[workspace.package]
version = "1.15.0"
edition = "2024"
authors = ["arabian"]
homepage = "https://pwsp.arabianq.ru"
repository = "https://github.com/arabianq/pipewire-soundpad"
license = "MIT"
description = "PWSP lets you play audio files through your microphone. Has both CLI and GUI clients."
keywords = ["soundpad", "pipewire", "linux", "cli", "gui"]
[workspace.dependencies]
pwsp-lib = { path = "pwsp-lib" }
pwsp-daemon = { path = "pwsp-daemon" }
pwsp-cli = { path = "pwsp-cli" }
pwsp-gui = { path = "pwsp-gui" }
tokio = { version = "1.52.3", features = ["full"] }
async-trait = "0.1.89"
serde = { version = "1.0.228", features = ["derive"] }
serde_json = "1.0.149"
clap = { version = "4.6.1", default-features = false, features = [
"std",
"suggestions",
"help",
"usage",
"error-context",
"derive",
] }
dirs = "6.0.0"
itertools = "0.15.0"
evdev = { version = "0.13.2", features = ["tokio"] }
rfd = { version = "0.17.2", default-features = false, features = [
"xdg-portal",
] }
opener = { version = "0.8.4", features = ["reveal"] }
system-fonts = "0.1.1"
anyhow = "1.0.102"
rustix = { version = "1.1.4", features = ["process"] }
rust-i18n = "4.0.0"
sys-locale = "0.3.2"
rodio = { git = "https://github.com/RustAudio/rodio.git", rev = "c5f1e94290922fe4ee963ce6f85754ea6ba36243", default-features = false, features = [
"symphonia-all",
"symphonia-libopus",
"playback",
] }
pipewire = "0.10.0"
egui = { version = "0.35.0", default-features = false, features = [
"default_fonts",
"rayon",
] }
eframe = { version = "0.35.0", default-features = false, features = [
"default_fonts",
"glow",
"x11",
"wayland",
] }
egui_extras = "0.35.0"
egui_material_icons = "0.7.0"
egui_dnd = "0.16.0"
reqwest = { version = "0.13.4", default-features = false, features = ["native-tls"] }
percent-encoding = "2.3.2"
[profile.dev]
[profile.dev.package."*"]
opt-level = 3
debug = false
[profile.release]
strip = true
lto = true
codegen-units = 1
opt-level = "z"
panic = "abort"
-21
View File
@@ -1,21 +0,0 @@
MIT License
Copyright (c) 2026 arabianq
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
-219
View File
@@ -1,219 +0,0 @@
# PipeWire Soundpad (PWSP) 🎵
<table border="0">
<tr>
<td colspan="2" align="center">
<h3>Main Screen</h3>
<img src="./pwsp-gui/assets/screenshots/main.png" alt="Main UI">
</td>
</tr>
<tr>
<td width="50%" align="center">
<h3>Settings</h3>
<img src="./pwsp-gui/assets/screenshots/settings.png" alt="Settings">
</td>
<td width="50%" align="center">
<h3>Hotkeys</h3>
<img src="./pwsp-gui/assets/screenshots/hotkeys.png" alt="Hotkeys">
</td>
</tr>
</table>
[🇷🇺 Читать на русском](README.ru.md) | 🇬🇧 English (you are here)
[![GitHub Actions Build Status](https://img.shields.io/github/actions/workflow/status/arabianq/pipewire-soundpad/build.yml?branch=main&style=flat-square)](https://github.com/arabianq/pipewire-soundpad/actions)
[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg?style=flat-square)](https://opensource.org/licenses/MIT)
[![GitHub Release](https://img.shields.io/github/v/release/arabianq/pipewire-soundpad?style=flat-square)](https://github.com/arabianq/pipewire-soundpad/releases/latest)
[![Platform](https://img.shields.io/badge/Platform-Linux%20%7C%20PipeWire-blue?style=flat-square)](https://pipewire.org/)
**PipeWire Soundpad (PWSP)** is a modern application that lets you play audio files directly through your microphone. Designed specifically for Linux, it talks to PipeWire natively: it creates its own virtual microphone and wires everything up itself, so you never have to build a routing setup by hand.
---
## ✨ Features
- **Native PipeWire Integration:** PWSP creates its own virtual microphone and manages the graph through the PipeWire API — no manual `pw-link` juggling, no PulseAudio modules to load.
- **Separate Monitoring and Microphone Volumes:** Two independent streams, so you can amplify what your friends hear without deafening yourself, and pick which device the monitoring plays on.
- **Modular Architecture:** Consists of a background `daemon`, a command-line interface (`cli`), and a graphical user interface (`gui`).
- **Modern GUI:** Built with `egui`, supporting both Wayland and X11 seamlessly.
- **Localized:** Ships in 9 languages, following your system locale or one you pick yourself in the settings.
- **Global Hotkeys:** Powered by `evdev`, allowing you to play sounds from anywhere.
- **Broad Audio Support:** Powered by `rodio` and `symphonia` to support a wide range of audio formats, including Opus.
---
## 🚀 Installation
We provide multiple ways to install PWSP, including stable releases and rolling "nightly" builds directly from the `main` branch.
### 📦 Flatpak (Recommended)
Add our official OSTree repository and install the application:
```bash
# Add the repository
flatpak remote-add --if-not-exists pwsp https://arabianq.github.io/pipewire-soundpad/pwsp.flatpakrepo
# Install the Stable version
flatpak install pwsp ru.arabianq.pwsp//stable
# OR Install the Nightly version (rolling updates)
flatpak install pwsp ru.arabianq.pwsp//nightly
```
### 🟠 Debian / Ubuntu (APT Repository)
We maintain an official APT repository for seamless updates via `apt`:
```bash
# 1. Download the public GPG key
sudo mkdir -p /etc/apt/keyrings
wget -O- https://arabianq.github.io/pipewire-soundpad/apt/pubkey.gpg | sudo gpg --dearmor -o /etc/apt/keyrings/pwsp.gpg
# 2. Add the repository (Choose STABLE or NIGHTLY)
# For Stable:
echo "deb [signed-by=/etc/apt/keyrings/pwsp.gpg] https://arabianq.github.io/pipewire-soundpad/apt/ stable main" | sudo tee /etc/apt/sources.list.d/pwsp.list
# For Nightly:
# echo "deb [signed-by=/etc/apt/keyrings/pwsp.gpg] https://arabianq.github.io/pipewire-soundpad/apt/ nightly main" | sudo tee /etc/apt/sources.list.d/pwsp.list
# 3. Update and install
sudo apt update
sudo apt install pwsp
```
### 🐧 Fedora / RHEL (COPR)
Available via the Fedora COPR repository:
```bash
sudo dnf copr enable arabianq/pwsp
sudo dnf install pwsp
```
### 🐦 Arch Linux (AUR)
Two packages are available: `pwsp` builds from source, `pwsp-bin` installs the prebuilt binaries.
```bash
# Using your preferred AUR helper
paru -S pwsp # or: pwsp-bin
```
### ⚙️ Manual / Standalone
You can manually download `.deb` packages or standalone `.zip` binaries from the [Releases page](https://github.com/arabianq/pipewire-soundpad/releases).
### 🦀 Build from Source
Make sure you have Rust and Cargo installed, along with the build dependencies. On Debian/Ubuntu:
```bash
sudo apt install libpipewire-0.3-dev libclang-dev libasound2-dev libdbus-1-dev libssl-dev pkg-config
```
```bash
git clone https://github.com/arabianq/pipewire-soundpad.git
cd pipewire-soundpad
cargo build --release --locked
```
The binaries will be located in `target/release/`.
---
## 🎮 Usage
### 1. Start the Daemon
PWSP operates via a background daemon that handles the audio routing.
```bash
# Run the daemon
pwsp-daemon
```
_(Tip: If installed via package managers, a systemd user service is provided. You can enable it with `systemctl --user enable --now pwsp-daemon.service`)_
### 2. Launch the GUI
Simply run the graphical interface to manage and play your sounds:
```bash
pwsp-gui
```
### 3. Use the CLI
You can also interact with the daemon directly via the command line. Every command is grouped under `action`, `get` or `set`:
```bash
pwsp-cli action play /path/to/sound.mp3
pwsp-cli action stop
pwsp-cli get state
# Separate volumes for what you hear and what is sent to the microphone.
# Values above 1.0 amplify.
pwsp-cli set monitoring-volume 0.3
pwsp-cli set mic-volume 1.5
# Devices
pwsp-cli get inputs
pwsp-cli set input <name>
```
Run `pwsp-cli <group> --help` for the full list.
### 🔑 Enabling Global Hotkeys
Hotkeys are read straight from the kernel via `evdev`, which means the daemon needs access to `/dev/input/event*`. On most distributions that means adding yourself to the `input` group:
```bash
sudo usermod -aG input $USER
```
Log out and back in for it to take effect. Without this, everything else works — only the global hotkeys stay silent.
### 📦 A Note for Flatpak Users
The Flatpak ships a single entry point, so the commands above are reached through `flatpak run`:
```bash
# No arguments: starts the daemon and the GUI together
flatpak run ru.arabianq.pwsp
# The daemon on its own
flatpak run ru.arabianq.pwsp daemon --start
flatpak run ru.arabianq.pwsp daemon --kill
# Anything after "cli" is passed to pwsp-cli
flatpak run ru.arabianq.pwsp cli action play /path/to/sound.mp3
```
---
## 📚 Documentation & DeepWiki
DeepWiki generates a browsable overview of the architecture from the source, and lets you ask questions about it. It is generated automatically rather than written by hand, so treat it as a map, not as a specification:
[![Ask DeepWiki](https://deepwiki.com/badge.svg)](https://deepwiki.com/arabianq/pipewire-soundpad)
---
## 🤝 Contributing
Contributions, issues, and feature requests are welcome!
1. Fork the project.
2. Create your feature branch (`git checkout -b feat/amazing-feature`).
3. Commit your changes (`git commit -m 'Add some amazing feature'`).
4. Push to the branch (`git push origin feat/amazing-feature`).
5. Open a Pull Request.
---
## 📝 License
Distributed under the MIT License. See `LICENSE` for more information.
_Built with ❤️ for the Linux community._
-219
View File
@@ -1,219 +0,0 @@
# PipeWire Soundpad (PWSP) 🎵
<table border="0">
<tr>
<td colspan="2" align="center">
<h3>Главная страница</h3>
<img src="./pwsp-gui/assets/screenshots/main.png" alt="Main UI">
</td>
</tr>
<tr>
<td width="50%" align="center">
<h3>Настройки</h3>
<img src="./pwsp-gui/assets/screenshots/settings.png" alt="Settings">
</td>
<td width="50%" align="center">
<h3>Горячие клавиши</h3>
<img src="./pwsp-gui/assets/screenshots/hotkeys.png" alt="Hotkeys">
</td>
</tr>
</table>
🇷🇺 Русский (вы здесь) | [🇬🇧 Read in English](README.md)
[![GitHub Actions Build Status](https://img.shields.io/github/actions/workflow/status/arabianq/pipewire-soundpad/build.yml?branch=main&style=flat-square)](https://github.com/arabianq/pipewire-soundpad/actions)
[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg?style=flat-square)](https://opensource.org/licenses/MIT)
[![GitHub Release](https://img.shields.io/github/v/release/arabianq/pipewire-soundpad?style=flat-square)](https://github.com/arabianq/pipewire-soundpad/releases/latest)
[![Platform](https://img.shields.io/badge/Platform-Linux%20%7C%20PipeWire-blue?style=flat-square)](https://pipewire.org/)
**PipeWire Soundpad (PWSP)** — приложение, которое позволяет воспроизводить аудиофайлы прямо в ваш микрофон. Разработано специально для Linux и работает с PipeWire напрямую: создаёт собственный виртуальный микрофон и само выстраивает маршрутизацию, так что настраивать её руками не придётся.
---
## ✨ Возможности
- **Нативная интеграция с PipeWire:** PWSP создаёт собственный виртуальный микрофон и управляет графом через PipeWire API — без ручного `pw-link` и без подгрузки модулей PulseAudio.
- **Раздельная громкость мониторинга и микрофона:** Два независимых потока: можно усилить то, что слышат собеседники, не оглушив себя, и выбрать устройство для мониторинга.
- **Модульная архитектура:** Состоит из фонового демона (`daemon`), интерфейса командной строки (`cli`) и графического интерфейса (`gui`).
- **Современный GUI:** Построен на `egui`, плавно работает как на Wayland, так и на X11.
- **Локализация:** 9 языков; используется системный или выбранный вручную в настройках.
- **Глобальные горячие клавиши:** Работают через `evdev`, позволяя воспроизводить звуки из любого окна.
- **Широкая поддержка форматов:** Использует `rodio` и `symphonia` и поддерживает большинство аудиоформатов, включая Opus.
---
## 🚀 Установка
Мы предоставляем несколько способов установки PWSP, включая стабильные релизы и постоянно обновляемые "nightly" сборки напрямую из ветки `main`.
### 📦 Flatpak (Рекомендуется)
Добавьте наш официальный OSTree репозиторий и установите приложение:
```bash
# Добавьте репозиторий
flatpak remote-add --if-not-exists pwsp https://arabianq.github.io/pipewire-soundpad/pwsp.flatpakrepo
# Установите стабильную (Stable) версию
flatpak install pwsp ru.arabianq.pwsp//stable
# ИЛИ установите Nightly версию (самые свежие обновления)
flatpak install pwsp ru.arabianq.pwsp//nightly
```
### 🟠 Debian / Ubuntu (APT Репозиторий)
Мы поддерживаем официальный APT-репозиторий для бесшовных обновлений через `apt`:
```bash
# 1. Скачайте публичный GPG ключ
sudo mkdir -p /etc/apt/keyrings
wget -O- https://arabianq.github.io/pipewire-soundpad/apt/pubkey.gpg | sudo gpg --dearmor -o /etc/apt/keyrings/pwsp.gpg
# 2. Добавьте репозиторий (Выберите STABLE или NIGHTLY)
# Для Stable:
echo "deb [signed-by=/etc/apt/keyrings/pwsp.gpg] https://arabianq.github.io/pipewire-soundpad/apt/ stable main" | sudo tee /etc/apt/sources.list.d/pwsp.list
# Для Nightly:
# echo "deb [signed-by=/etc/apt/keyrings/pwsp.gpg] https://arabianq.github.io/pipewire-soundpad/apt/ nightly main" | sudo tee /etc/apt/sources.list.d/pwsp.list
# 3. Обновите индексы и установите
sudo apt update
sudo apt install pwsp
```
### 🐧 Fedora / RHEL (COPR)
Доступно через репозиторий Fedora COPR:
```bash
sudo dnf copr enable arabianq/pwsp
sudo dnf install pwsp
```
### 🐦 Arch Linux (AUR)
Доступны два пакета: `pwsp` собирается из исходников, `pwsp-bin` ставит готовые бинарники.
```bash
# Через любой удобный AUR-хелпер
paru -S pwsp # или: pwsp-bin
```
### ⚙️ Ручная установка
Вы можете вручную скачать пакеты `.deb` или готовые бинарники `.zip` на [странице релизов](https://github.com/arabianq/pipewire-soundpad/releases).
### 🦀 Сборка из исходников
Убедитесь, что у вас установлены Rust и Cargo, а также зависимости для сборки. Для Debian/Ubuntu:
```bash
sudo apt install libpipewire-0.3-dev libclang-dev libasound2-dev libdbus-1-dev libssl-dev pkg-config
```
```bash
git clone https://github.com/arabianq/pipewire-soundpad.git
cd pipewire-soundpad
cargo build --release --locked
```
Собранные бинарники будут находиться в папке `target/release/`.
---
## 🎮 Использование
### 1. Запуск демона
PWSP работает через фоновый демон, который маршрутизирует аудио.
```bash
# Запуск демона
pwsp-daemon
```
_(Подсказка: Если вы установили программу через пакетный менеджер, она включает пользовательский systemd-сервис. Вы можете включить его командой: `systemctl --user enable --now pwsp-daemon.service`)_
### 2. Запуск GUI
Просто запустите графический интерфейс для управления и воспроизведения звуков:
```bash
pwsp-gui
```
### 3. Использование CLI
Вы также можете взаимодействовать с демоном напрямую через командную строку. Все команды сгруппированы в `action`, `get` и `set`:
```bash
pwsp-cli action play /path/to/sound.mp3
pwsp-cli action stop
pwsp-cli get state
# Раздельная громкость: что слышите вы и что уходит в микрофон.
# Значения выше 1.0 усиливают.
pwsp-cli set monitoring-volume 0.3
pwsp-cli set mic-volume 1.5
# Устройства
pwsp-cli get inputs
pwsp-cli set input <имя>
```
Полный список — `pwsp-cli <группа> --help`.
### 🔑 Включение глобальных горячих клавиш
Горячие клавиши читаются напрямую из ядра через `evdev`, поэтому демону нужен доступ к `/dev/input/event*`. В большинстве дистрибутивов для этого достаточно добавить себя в группу `input`:
```bash
sudo usermod -aG input $USER
```
Изменение вступит в силу после перезахода в систему. Без него всё остальное работает — молчат только глобальные горячие клавиши.
### 📦 Замечание для пользователей Flatpak
У Flatpak-версии одна точка входа, поэтому команды выше вызываются через `flatpak run`:
```bash
# Без аргументов: запускает демон и GUI вместе
flatpak run ru.arabianq.pwsp
# Отдельно демон
flatpak run ru.arabianq.pwsp daemon --start
flatpak run ru.arabianq.pwsp daemon --kill
# Всё после "cli" передаётся в pwsp-cli
flatpak run ru.arabianq.pwsp cli action play /path/to/sound.mp3
```
---
## 📚 Документация и DeepWiki
DeepWiki автоматически строит по исходникам обзор архитектуры и позволяет задавать по нему вопросы. Он генерируется, а не пишется руками, поэтому воспринимайте его как карту, а не как спецификацию:
[![Ask DeepWiki](https://deepwiki.com/badge.svg)](https://deepwiki.com/arabianq/pipewire-soundpad)
---
## 🤝 Вклад в проект (Contributing)
Будем рады вашей помощи, баг-репортам и идеям!
1. Сделайте Fork проекта.
2. Создайте свою ветку (`git checkout -b feat/amazing-feature`).
3. Закоммитьте изменения (`git commit -m 'Add some amazing feature'`).
4. Запушьте ветку (`git push origin feat/amazing-feature`).
5. Откройте Pull Request.
---
## 📝 Лицензия
Распространяется под лицензией MIT. Подробнее см. в файле `LICENSE`.
_Сделано с ❤️ для сообщества Linux._
+15
View File
@@ -0,0 +1,15 @@
Origin: arabianq
Label: PipeWire Soundpad
Codename: stable
Architectures: amd64 arm64
Components: main
Description: APT Repository for PWSP
SignWith: AAE3C56B1E2D3677108CF28083C9B0DB2C8F9D16
Origin: arabianq
Label: PipeWire Soundpad
Codename: nightly
Architectures: amd64 arm64
Components: main
Description: Nightly APT Repository for PWSP
SignWith: AAE3C56B1E2D3677108CF28083C9B0DB2C8F9D16
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
+4
View File
@@ -0,0 +1,4 @@
5.3.1
3.3.0
bdb5.3.28
bdb5.3.0
+38
View File
@@ -0,0 +1,38 @@
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA512
Origin: arabianq
Label: PipeWire Soundpad
Codename: nightly
Date: Thu, 17 Sep 2026 17:12:28 UTC
Architectures: amd64 arm64
Components: main
Description: Nightly APT Repository for PWSP
MD5Sum:
2573ea873a663134f83fc60619324be0 650 main/binary-amd64/Packages
fed300c0c68048da760d3ed25a03a57c 455 main/binary-amd64/Packages.gz
facbb80485897bc6e0d67e37e5dd38e8 123 main/binary-amd64/Release
458010e320c71cc84d829dfdd5dd7cd6 677 main/binary-arm64/Packages
a17b2f5f73d74e6e186866398cd6b057 461 main/binary-arm64/Packages.gz
7418f9ee7493009aeaa4417f5d11ee62 123 main/binary-arm64/Release
SHA1:
4e1b775b6e33b200bef819e7e0e1f83bae7553d6 650 main/binary-amd64/Packages
ea93723f99086e28d3cf1c8277248eae919e5143 455 main/binary-amd64/Packages.gz
66d8024fbaf66bb3aa03e04c8784ffc2d45d5e92 123 main/binary-amd64/Release
13e16c14fcf186a267eb21c6f3c461013ff204bc 677 main/binary-arm64/Packages
6f9121c99c9c9e8a36e1f034ff70f16d0f359298 461 main/binary-arm64/Packages.gz
f7984ac62248818b3d8a2c59250042d426414d8c 123 main/binary-arm64/Release
SHA256:
370dad8c4a5c8fc66dc59de3f4132ee32255b05bc3876a7a42beb6bdcef29efd 650 main/binary-amd64/Packages
bd049657c0c2c5d9b4ae697211cc1a8c4b1fae0129c478f20e5027a90eb28bb9 455 main/binary-amd64/Packages.gz
b5a22f248703739051a84b584c2b0ea20a9b69b28e823c5a8b0aca5f33f90bba 123 main/binary-amd64/Release
28c087c2c91236767bcf2627696e05c819ccd2c204c0fa701c3829db236ba880 677 main/binary-arm64/Packages
d1a0573b9684f9ce415944f8b79e27ce1c8d7bb79d61b8906a6616a278fc643b 461 main/binary-arm64/Packages.gz
a5e6d2298cf4bded7fd380a4bb06d97be39e9ea1a0b42acd5190a44aad619c92 123 main/binary-arm64/Release
-----BEGIN PGP SIGNATURE-----
iHUEARYKAB0WIQSq48VrHi02dxCM8oCDybDbLI+dFgUCaqwffAAKCRCDybDbLI+d
FrUrAP4qI1Q4sqSxedRw1Cze6mfvO2K02mbAgO8si13d8duyiwEAht0FgL0sUmU5
HtmCCs++DIK4FOHnSO0Luo+S70BcVA0=
=5r1x
-----END PGP SIGNATURE-----
+28
View File
@@ -0,0 +1,28 @@
Origin: arabianq
Label: PipeWire Soundpad
Codename: nightly
Date: Thu, 17 Sep 2026 17:12:28 UTC
Architectures: amd64 arm64
Components: main
Description: Nightly APT Repository for PWSP
MD5Sum:
2573ea873a663134f83fc60619324be0 650 main/binary-amd64/Packages
fed300c0c68048da760d3ed25a03a57c 455 main/binary-amd64/Packages.gz
facbb80485897bc6e0d67e37e5dd38e8 123 main/binary-amd64/Release
458010e320c71cc84d829dfdd5dd7cd6 677 main/binary-arm64/Packages
a17b2f5f73d74e6e186866398cd6b057 461 main/binary-arm64/Packages.gz
7418f9ee7493009aeaa4417f5d11ee62 123 main/binary-arm64/Release
SHA1:
4e1b775b6e33b200bef819e7e0e1f83bae7553d6 650 main/binary-amd64/Packages
ea93723f99086e28d3cf1c8277248eae919e5143 455 main/binary-amd64/Packages.gz
66d8024fbaf66bb3aa03e04c8784ffc2d45d5e92 123 main/binary-amd64/Release
13e16c14fcf186a267eb21c6f3c461013ff204bc 677 main/binary-arm64/Packages
6f9121c99c9c9e8a36e1f034ff70f16d0f359298 461 main/binary-arm64/Packages.gz
f7984ac62248818b3d8a2c59250042d426414d8c 123 main/binary-arm64/Release
SHA256:
370dad8c4a5c8fc66dc59de3f4132ee32255b05bc3876a7a42beb6bdcef29efd 650 main/binary-amd64/Packages
bd049657c0c2c5d9b4ae697211cc1a8c4b1fae0129c478f20e5027a90eb28bb9 455 main/binary-amd64/Packages.gz
b5a22f248703739051a84b584c2b0ea20a9b69b28e823c5a8b0aca5f33f90bba 123 main/binary-amd64/Release
28c087c2c91236767bcf2627696e05c819ccd2c204c0fa701c3829db236ba880 677 main/binary-arm64/Packages
d1a0573b9684f9ce415944f8b79e27ce1c8d7bb79d61b8906a6616a278fc643b 461 main/binary-arm64/Packages.gz
a5e6d2298cf4bded7fd380a4bb06d97be39e9ea1a0b42acd5190a44aad619c92 123 main/binary-arm64/Release
+7
View File
@@ -0,0 +1,7 @@
-----BEGIN PGP SIGNATURE-----
iHUEABYKAB0WIQSq48VrHi02dxCM8oCDybDbLI+dFgUCaqwffAAKCRCDybDbLI+d
Fvn8AQC3oe1shqFigNoQJVaIjz1FeM1sVj2jgu1VCZoPv8D5iQD/ZNfn2HmDlN7d
qPilIyk/3hnu60LsLNZWKdCeCNpX4QU=
=R3Qx
-----END PGP SIGNATURE-----
@@ -0,0 +1,17 @@
Package: pwsp
Version: 1.16.2+git20260917.4555a00
Architecture: amd64
Homepage: https://pwsp.arabianq.ru
Maintainer: arabian
Installed-Size: 40221
Depends: libasound2t64 (>= 1.1.0), libc6 (>= 2.34), libc6 (>= 2.39), libpipewire-0.3-0t64 (>= 0.3.1), libssl3t64 (>= 3.0.0)
Priority: optional
Section: sound
Filename: pool/main/p/pwsp/pwsp_1.16.2+git20260917.4555a00_amd64.deb
Size: 8894584
SHA256: d82469c29503d07cf12b3855e604fb90612a4c87bcd78f59a65fe3e166577b32
SHA1: 94abb72275ffbde5f194cbc6d3dd54e8cc06e4c1
MD5sum: 7b1dbd6a122a7fb0f90e1c17e11b4f46
Description: PWSP lets you play audio files through your microphone. Has both CLI and GUI
clients.
Binary file not shown.
@@ -0,0 +1,5 @@
Component: main
Origin: arabianq
Label: PipeWire Soundpad
Architecture: amd64
Description: Nightly APT Repository for PWSP
@@ -0,0 +1,17 @@
Package: pwsp
Version: 1.16.2+git20260917.4555a00
Architecture: arm64
Homepage: https://pwsp.arabianq.ru
Maintainer: arabian
Installed-Size: 37776
Depends: libasound2t64 (>= 1.0.16), libasound2t64 (>= 1.1.0), libc6 (>= 2.34), libc6 (>= 2.39), libpipewire-0.3-0t64 (>= 0.3.1), libssl3t64 (>= 3.0.0)
Priority: optional
Section: sound
Filename: pool/main/p/pwsp/pwsp_1.16.2+git20260917.4555a00_arm64.deb
Size: 7862964
SHA256: 4ed88cb5980e539ed6933395abbbcbd7229fef778752ab523b80437e5c562085
SHA1: a01b183eb4efcb6d909af35df42f45f95459cabe
MD5sum: 6fcf6d0455edfd0d97203656e5a40353
Description: PWSP lets you play audio files through your microphone. Has both CLI and GUI
clients.
Binary file not shown.
@@ -0,0 +1,5 @@
Component: main
Origin: arabianq
Label: PipeWire Soundpad
Architecture: arm64
Description: Nightly APT Repository for PWSP
+38
View File
@@ -0,0 +1,38 @@
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA512
Origin: arabianq
Label: PipeWire Soundpad
Codename: stable
Date: Wed, 09 Sep 2026 19:25:48 UTC
Architectures: amd64 arm64
Components: main
Description: APT Repository for PWSP
MD5Sum:
e79ec5acf5678eb2f658f67626b8ddb6 614 main/binary-amd64/Packages
4eaaa5452431abe5bdae6744ed00f2ba 440 main/binary-amd64/Packages.gz
f82d685802fbb32fec3c9ba8e11e55b9 115 main/binary-amd64/Release
f563a833397c3d4d278a4b08204e8db9 614 main/binary-arm64/Packages
b5d20fded73b9fb2596768d0884705c9 438 main/binary-arm64/Packages.gz
113dd4f621500874592b2a2f1eeb45ae 115 main/binary-arm64/Release
SHA1:
8db6fa456696d34f85101ff0b573c31d3b03da6a 614 main/binary-amd64/Packages
493c85716944ca8559542aa3faa6625d37a2664b 440 main/binary-amd64/Packages.gz
1ff55a261c49c41f38e6da56f1f5d7136d38b08f 115 main/binary-amd64/Release
02080e7eaecdf46b2b37a776a41418b7bc48b239 614 main/binary-arm64/Packages
90bdce0d525450e7809165d143810c600ae5d42f 438 main/binary-arm64/Packages.gz
be63fa980d70857efdc424c837cd54ab986a40cd 115 main/binary-arm64/Release
SHA256:
8d1d26b55a0c96e1500a9c6276e210f8950fdb99364bdd9f611777beed80355f 614 main/binary-amd64/Packages
45fc0d2d2b12ba5bc382df8b821fc38d8f3ebbc18f1ca8e8ebd7ad3bdd8e9d71 440 main/binary-amd64/Packages.gz
c670ad086ec5b85d17211cb15e8e4ac1fb49a6398d0c9672992c26a009229d8c 115 main/binary-amd64/Release
fd3a75e5351e602dbfc0ce79b1cdeb66346625fe62b11d973f2a5e114ee12d98 614 main/binary-arm64/Packages
d614049b3e0142cbb6878b0f89450e2350d5561fc19e934ad37990bc08008b17 438 main/binary-arm64/Packages.gz
4a90ce2395fbe57635b23de83540564c0917b2f419cd69ab2630fc1520bb5c11 115 main/binary-arm64/Release
-----BEGIN PGP SIGNATURE-----
iHUEARYKAB0WIQSq48VrHi02dxCM8oCDybDbLI+dFgUCaqGyvAAKCRCDybDbLI+d
Fi7FAPwLaXSo37W6cUCUAjnxupr40qvRertMHPm+BoEcmzkiCQEA+mUMtxSS2Sgv
an7pc6858dazFBddO9XuktYE+QV+IwY=
=CRJo
-----END PGP SIGNATURE-----
+28
View File
@@ -0,0 +1,28 @@
Origin: arabianq
Label: PipeWire Soundpad
Codename: stable
Date: Wed, 09 Sep 2026 19:25:48 UTC
Architectures: amd64 arm64
Components: main
Description: APT Repository for PWSP
MD5Sum:
e79ec5acf5678eb2f658f67626b8ddb6 614 main/binary-amd64/Packages
4eaaa5452431abe5bdae6744ed00f2ba 440 main/binary-amd64/Packages.gz
f82d685802fbb32fec3c9ba8e11e55b9 115 main/binary-amd64/Release
f563a833397c3d4d278a4b08204e8db9 614 main/binary-arm64/Packages
b5d20fded73b9fb2596768d0884705c9 438 main/binary-arm64/Packages.gz
113dd4f621500874592b2a2f1eeb45ae 115 main/binary-arm64/Release
SHA1:
8db6fa456696d34f85101ff0b573c31d3b03da6a 614 main/binary-amd64/Packages
493c85716944ca8559542aa3faa6625d37a2664b 440 main/binary-amd64/Packages.gz
1ff55a261c49c41f38e6da56f1f5d7136d38b08f 115 main/binary-amd64/Release
02080e7eaecdf46b2b37a776a41418b7bc48b239 614 main/binary-arm64/Packages
90bdce0d525450e7809165d143810c600ae5d42f 438 main/binary-arm64/Packages.gz
be63fa980d70857efdc424c837cd54ab986a40cd 115 main/binary-arm64/Release
SHA256:
8d1d26b55a0c96e1500a9c6276e210f8950fdb99364bdd9f611777beed80355f 614 main/binary-amd64/Packages
45fc0d2d2b12ba5bc382df8b821fc38d8f3ebbc18f1ca8e8ebd7ad3bdd8e9d71 440 main/binary-amd64/Packages.gz
c670ad086ec5b85d17211cb15e8e4ac1fb49a6398d0c9672992c26a009229d8c 115 main/binary-amd64/Release
fd3a75e5351e602dbfc0ce79b1cdeb66346625fe62b11d973f2a5e114ee12d98 614 main/binary-arm64/Packages
d614049b3e0142cbb6878b0f89450e2350d5561fc19e934ad37990bc08008b17 438 main/binary-arm64/Packages.gz
4a90ce2395fbe57635b23de83540564c0917b2f419cd69ab2630fc1520bb5c11 115 main/binary-arm64/Release
+7
View File
@@ -0,0 +1,7 @@
-----BEGIN PGP SIGNATURE-----
iHUEABYKAB0WIQSq48VrHi02dxCM8oCDybDbLI+dFgUCaqGyvAAKCRCDybDbLI+d
FvBpAQDPkQcCTHgvBtnRvP1TIv6ofOq3UAG0joDPBOUXPCDxsAEAo2nUt63XsNxF
d3H6UgcFl5w6IyQF0zzOo6/fovKZYAM=
=b6kV
-----END PGP SIGNATURE-----
@@ -0,0 +1,17 @@
Package: pwsp
Version: 1.16.2-1
Architecture: amd64
Homepage: https://pwsp.arabianq.ru
Maintainer: arabian
Installed-Size: 14326
Depends: libasound2t64 (>= 1.1.0), libc6 (>= 2.34), libc6 (>= 2.39), libpipewire-0.3-0t64 (>= 0.3.1), libssl3t64 (>= 3.0.0)
Priority: optional
Section: sound
Filename: pool/main/p/pwsp/pwsp_1.16.2-1_amd64.deb
Size: 4567768
SHA256: 0e585036cd3b0946fe8c1b07eb4cbe6a1fa76427f1d1abc7b5ca345b5c61ea5c
SHA1: 1e999b4c9f9ecd298faeb92cef9ad09faf5ae171
MD5sum: fc8c10736f323891236c31662811b578
Description: PWSP lets you play audio files through your microphone. Has both CLI and GUI
clients.
Binary file not shown.
@@ -0,0 +1,5 @@
Component: main
Origin: arabianq
Label: PipeWire Soundpad
Architecture: amd64
Description: APT Repository for PWSP
@@ -0,0 +1,17 @@
Package: pwsp
Version: 1.16.2-1
Architecture: arm64
Homepage: https://pwsp.arabianq.ru
Maintainer: arabian
Installed-Size: 11710
Depends: libasound2t64 (>= 1.1.0), libc6 (>= 2.34), libc6 (>= 2.39), libpipewire-0.3-0t64 (>= 0.3.1), libssl3t64 (>= 3.0.0)
Priority: optional
Section: sound
Filename: pool/main/p/pwsp/pwsp_1.16.2-1_arm64.deb
Size: 4042940
SHA256: fa26175c4ecfb7bd7a0b1e4419de7a0b3b265e06c73112754a0b601c3d8f6934
SHA1: 9388cbf33980562c6a09bd635f4be7f6dbf3d9e4
MD5sum: 22dfb74ba207d0d02877f19e7149c5f5
Description: PWSP lets you play audio files through your microphone. Has both CLI and GUI
clients.
Binary file not shown.
@@ -0,0 +1,5 @@
Component: main
Origin: arabianq
Label: PipeWire Soundpad
Architecture: arm64
Description: APT Repository for PWSP
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.

Some files were not shown because too many files have changed in this diff Show More