# **🎵 Pipewire Soundpad (PWSP)**

**PipeWire Soundpad (PWSP)** is a simple yet powerful **soundboard application** written in **Rust**. It provides a
user-friendly graphical interface for **managing and playing audio files, directing their output directly to the virtual
microphone.** This makes it an ideal tool for gamers, streamers, and anyone looking to inject sound effects into voice
chats on platforms like **Discord, Zoom, or Teamspeak**.

![screenshot.png](assets/screenshot.png)

# **🌟 Key Features**

* **Multi-Format Support**: Play audio files in popular formats, including _**mp3**_, _**wav**_, _**ogg**_, _**flac**_,
  _**mp4**_, and _**aac**_.
* **Virtual Microphone Output**: The application routes audio through a virtual device created by PipeWire, allowing
  other users to hear the sounds as if you were speaking into your microphone.
* **Modern and Clean GUI**: The interface is built with the [egui](https://egui.rs) library, ensuring an intuitive and
  responsive user experience.
* **Sound Collection Management**: Easily add and remove directories containing your audio files. The application scans
  these folders and displays all supported files for quick access.
* **Quick Search**: Use the built-in search bar to instantly find any sound file within your library.
* **Detailed Playback Controls**:
    * **Play/Pause button**.
    * **Volume slider** for individual sound adjustment.
    * **Position slider** to fast-forward or rewind the audio.
* **Persistent Configuration**: The list of added directories and your selected audio output device are saved
  automatically, so you won't need to reconfigure them every time you launch the application.
* **Collapsible Audio Tracks**: You can collapse every audio track to save space.
* **Drag and Drop Directories**: Reorder your sound directories easily using drag and drop.
* **Automatic Device Detection**: PWSP automatically detects when an input device is connected or disconnected and handles linking/unlinking.

# **⚙️ How It Works**

PWSP is designed with a clear separation of concerns, operating through a client-server architecture. It consists of
three main components:

* **pwsp-daemon**: This is the core of the application. It runs silently in the background, managing all the
  heavy-lifting tasks. The daemon is responsible for:
    * Creating and managing virtual audio devices.
    * Linking these devices within the PipeWire graph.
    * Handling all audio playback.
* **pwsp-gui**: This is the graphical user interface. It acts as a client that communicates with pwsp-daemon via a
  **UnixSocket**. This is how you interact with your sound collection, control playback, and configure settings.
* **pwsp-cli**: This is the command-line interface, also acting as a client. It provides a way to control the daemon
  without a GUI, allowing for scripting or quick command-based actions.

# **🚀 Installation**

## **Pre-built Packages**

You can download pre-built binaries and .deb packages from
the [releases page](https://github.com/arabianq/pipewire-soundpad/releases).

## **Fedora Linux (and derivatives)**

If you're using Fedora, you can install PWSP from a dedicated repository using DNF.

Add the repository:

```bash
sudo dnf copr enable arabianq/pwsp
```

Update cache:

```bash
sudo dnf makecache
```

Install PWSP:

```bash
sudo dnf install pwsp
```

## **Arch Linux**
There is pwsp package in AUR.
You can install it using yay, paru or any other AUR helper.
```bash
paru pwsp-bin # or paru pwsp to build it locally
```

## **Installing using cargo**

```bash
cargo install pwsp
```

## **Building from source**

#### **Requirements**

* **Rust**: Install [Rust](https://www.rust-lang.org/tools/install) (using rustup is recommended).
* **PipeWire**: Ensure that [PipeWire](https://pipewire.org/) is installed and running on your system.

#### **Build Instructions**

Clone the repository:

```bash
git clone https://github.com/arabianq/pipewire-soundpad.git  
cd pipewire-soundpad
```

Build the project:

```bash
cargo build --release
```

Now you have three binary files inside ./target/release/:

- **pwsp-gui**
- **pwsp-cli**
- **pwsp-daemon**

# **🎮 Usage**

Before using pwsp-gui or pwsp-cli, you **must** first run the pwsp-daemon in the background.

### **Running the Daemon**

You can start the daemon from the terminal or enable the systemd service for automatic startup.

* **Manual Start:**

```bash
/path/to/your/pwsp-daemon &
```

* **Using systemd (recommended):**  
  If you installed PWSP using prebuilt packages, the systemd service is added automatically.
    1. **Start the service:**
        ```bash  
        systemctl --user start pwsp-daemon
        ```
    2. **Enable autostart (starts on login):**
        ```bash
       systemctl --user enable --now pwsp-daemon
        ```

### **Using the GUI**

1. **Add Sounds**: Click the **"+"** button and select a folder containing your audio files. The application
   will automatically list all supported files.
2. **Select Microphone**: In the main application window, select your microphone. PWSP will automatically
   create a virtual microphone and feed it sound from two sources: **your microphone** and the **audio files**.
3. **Playback**: Click on a file in the list to load it, then use the **"Play"** and **"Pause"** buttons to control
   playback. You can also play single file once using **"Play File"** button.

### **Using the CLI**

The pwsp-cli tool allows you to control the daemon from the command line.

* **General Help**: To see a list of all available commands, run:

```bash
pwsp-cli --help
```

* **Example Commands**:
    * **Play a file**:

      ```bash
      pwsp-cli action play <file_path>
      ```

    * **Get the current volume**:

      ```bash
      pwsp-cli get volume
      ```

    * **Set playback position to 20 seconds**:

      ```bash 
      pwsp-cli set position 20
      ```

### **Hotkeys & Controls**

#### **Keyboard Shortcuts**

| Key                      | Action                                               |
| :----------------------- | :--------------------------------------------------- |
| **Space**                | Pause / Resume audio                                 |
| **Backspace**            | Stop all audio tracks                                |
| **Enter**                | Play selected file (stops all other tracks)          |
| **Ctrl + Enter**         | Add selected file to playback (plays simultaneously) |
| **Shift + Enter**        | Replace the last added track with the selected one   |
| **I**                    | Open / Close settings                                |
| **/**                    | Focus search field                                   |
| **Ctrl + ↑ / ↓**         | Navigate through files                               |
| **Ctrl + Shift + ↑ / ↓** | Navigate through directories                         |

#### **Mouse Controls**

* **Left Click**: Play track (stops all other tracks).
* **Ctrl + Left Click**: Add track (plays simultaneously with current tracks).
* **Shift + Left Click**: Replace the last added track with the selected one.

# **🤝 Contributing**

Contributions are welcome\! If you have ideas for improvements or find a bug, feel free to create
an [issue](https://github.com/arabianq/pipewire-soundpad/issues) or submit
a [pull request](https://github.com/arabianq/pipewire-soundpad/pulls).

# **📜 License**

This project is licensed under
the [MIT License](https://github.com/arabianq/pipewire-soundpad/blob/main/LICENSE).

# **🤖 AI Wiki**
[![Ask DeepWiki](https://deepwiki.com/badge.svg)](https://deepwiki.com/arabianq/pipewire-soundpad)
