Turn your computer into a wireless audio transmitter or receiver.
This application allows you to send your PC's audio to any device on the same local network, or listen to audio from another device. It is designed to work seamlessly with the Android version.
Screenshots of the Material You interface. (Note: The screenshots show the Italian interface, but the app automatically switches to English if your OS language is not set to Italian.)
|
|
|
| Server Mode | Client Mode | Settings |
-
Server & Client Modes Use the app to send (Server) or receive (Client) audio.
-
Native Audio Engine (Windows & macOS) On Windows and macOS, audio is captured directly via a native C library loaded through JNI. No VB-Cable, no BlackHole, no third-party virtual drivers required. FFmpeg handles encoding only for the HTTP streaming protocols.
-
Microphone Routing The server can receive microphone audio from a connected client and route it in three ways: ignore it, expose it as a virtual microphone to other apps (Discord, Zoom, games), or mix it directly into the outgoing stream. There is also a real-time mute button.
-
System Tray The app lives in your system tray. Configure it to start minimized and close to tray so it runs silently in the background like AirPlay or Chromecast.
-
Automatic & Manual Discovery Clients automatically find available servers on the network via multicast beacon. If your router blocks it, you can manually enter the IP address.
-
Unicast & Multicast Support
- Unicast β direct streaming to a single device
- Multicast β simultaneous transmission to multiple clients
-
Multiple Streaming Protocols
- WFAS (native protocol, lowest latency)
- RTP (compatible with any RTP-capable receiver)
- HTTP/AAC (Safari, iOS)
- HTTP/Opus WebM (Chrome, Firefox, any browser)
-
Detailed Audio Configuration Customize sample rate, bit depth, channels, and buffer size.
-
Modern Interface A Material You interface built with Jetpack Compose for Desktop, with wallpaper-based dynamic theming.
-
Bilingual Support (EN/IT) Automatically adapts to your OS language.
| Platform | Architecture | Audio Capture | Tray |
|---|---|---|---|
| Windows 10/11 | x86_64 | β Native (no drivers needed) | β |
| macOS 13+ (Ventura) | x86_64, arm64 | β Native (no drivers needed) | β |
| Linux | x86_64 | FFmpeg + PulseAudio virtual sink (auto-managed) | β |
macOS note: ScreenCaptureKit (used by the native engine) requires macOS 12.3 or later. The app will ask for screen recording and audio permissions on first launch. Yes, there are quite a few permission dialogs. Grant them all and the audio quality is genuinely clean and crisp on the receiving end.
macOS legacy: If you are on macOS 12.2 or earlier, you can still use the FFmpeg + BlackHole path by disabling the native engine in Settings β Advanced.
On Linux, the application automatically creates and manages a PulseAudio virtual sink named VirtualCable at startup. When you start the server, your system audio is routed through it automatically and restored when you stop. No extra installation required.
If you use PipeWire with pipewire-pulse, this works identically.
- Open the app and select Send (Server).
- On Linux, the virtual sink is created automatically. On Windows and macOS, the native engine captures system audio directly with no extra setup.
- Select Multicast (multiple clients) or Unicast (single client).
- Click Start Server.
- Open the app and select Receive (Client).
- Choose your physical output device (headphones, speakers).
- The app will automatically list active servers on the network.
- Select one to connect.
If the server does not appear automatically, enter its local IP address manually.
If you are using the Android app as a microphone source, the desktop server can handle the incoming audio in three ways, selectable from the UI:
| Mode | What it does |
|---|---|
| Off | Ignores the incoming mic stream |
| Virtual Microphone | Exposes the mic as a virtual input device, visible in Discord, Zoom, games |
| Mix Into Stream | Blends the mic into the outgoing audio directly |
A mute button is available at any time during streaming.
Turn your smartphone into a portable audio receiver or transmitter.
Requires JDK 17 or newer.
git clone https://github.com/marcomorosi06/WiFiAudioStreaming-Desktop.git
cd WiFiAudioStreaming-DesktopThe native C library is compiled as part of the build. On the first build (or after changes to src/main/native/), Gradle will invoke CMake automatically. On Windows, it searches for cmake.exe in all known locations (Visual Studio, CLion, Scoop, Chocolatey, winget).
./gradlew run
# Windows:
gradlew.bat run| Format | Command |
|---|---|
| Portable app (all OS) | ./gradlew createDistributable |
| Windows installer | ./gradlew packageMsi |
| Debian / Ubuntu | ./gradlew packageDeb |
| Fedora / CentOS | ./gradlew packageRpm |
| macOS | ./gradlew packageDmg |
Output: build/compose/binaries/main/
- Language: Kotlin
- UI Framework: Jetpack Compose for Desktop
- Networking: Ktor (UDP/TCP sockets)
- Audio Capture: Native C library via JNI (Windows, macOS) / FFmpeg via JavaCV (Linux)
- Audio Encoding: FFmpeg via JavaCV (AAC, Opus for HTTP streaming)
This project is completely free and open-source. If it helped you, consider buying me a coffee.
This project is licensed under the European Union Public Licence v1.2 (EUPL v1.2).
It started as a personal script. Then it grew. Then I rewrote the audio engine during exam season, which is when I realized I had become genuinely invested in it, and that the license deserved a second thought. MIT lets anyone take the code and close it off. EUPL does not.
You are free to:
- Use, modify, and distribute the software
- Use it for commercial purposes
Key obligations:
- Copyleft: modified distributions must be released under the same EUPL license
- Network copyleft: if you run a modified version as a networked service, you must release the source
- Attribution: retain all copyright and trademark notices
For the full legal text, see LICENSE.md or visit the official EUPL website.
The app is EUPL, but the WFAS v2 wire protocol is not locked up: a C reference implementation is published separately under the permissive MIT License (wfas-protocol, Β© 2026 Marco Morosi), so anyone β including embedded/firmware projects β can implement WFAS v2 freely. The copyleft protects this application; the protocol stays open.
This application bundles and uses several open-source components, each under its
own licence. The complete attribution list is in
THIRD_PARTY_LICENSES.md, and is also available
inside the app (Settings β Open-source licenses) and from the command line via
wfas --licenses.
In particular, this software uses FFmpeg for AAC/Opus
audio encoding, distributed under the GNU LGPL v2.1 or later (some optional
components may be under the GPL). The FFmpeg native libraries are unmodified and
provided by the JavaCPP Presets
project; their source is available at https://ffmpeg.org/download.html. See
THIRD_PARTY_LICENSES.md for the full FFmpeg notice and relinking information.
Other bundled components include JavaCV/JavaCPP, JetBrains Compose Multiplatform, Kotlin and kotlinx.coroutines, Ktor, Bouncy Castle, dorkbox SystemTray, JNA and SLF4J β see the full list for versions, copyrights and licences.


