Skip to content

marcomorosi06/WiFiAudioStreaming-Desktop

Repository files navigation

WiFi Audio Streaming (Desktop)

Available on GitHub Available on GitLab AUR version

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.

ko-fi


πŸ“Έ Overview

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 Mode Client Mode Settings

✨ Key Features

  • 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 Support

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.


🐧 Linux: Virtual Audio Cable

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.


πŸš€ Getting Started

Send Audio (Server Mode)

  1. Open the app and select Send (Server).
  2. On Linux, the virtual sink is created automatically. On Windows and macOS, the native engine captures system audio directly with no extra setup.
  3. Select Multicast (multiple clients) or Unicast (single client).
  4. Click Start Server.

Receive Audio (Client Mode)

  1. Open the app and select Receive (Client).
  2. Choose your physical output device (headphones, speakers).
  3. The app will automatically list active servers on the network.
  4. Select one to connect.

If the server does not appear automatically, enter its local IP address manually.


πŸŽ™οΈ Microphone Routing

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.


πŸ“± Android Version

Turn your smartphone into a portable audio receiver or transmitter.


πŸ› οΈ Building from Source

Requires JDK 17 or newer.

git clone https://github.com/marcomorosi06/WiFiAudioStreaming-Desktop.git
cd WiFiAudioStreaming-Desktop

The 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).

Run for testing

./gradlew run
# Windows:
gradlew.bat run

Create distributable packages

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/


πŸ’» Tech Stack

  • 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)

β˜• Support the Project

This project is completely free and open-source. If it helped you, consider buying me a coffee.

ko-fi


πŸ“„ License

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.


🧩 Third-Party Software & Licenses

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.

About

A desktop application for streaming audio over a local network. It allows you to stream your computer's internal audio to any device on the network. Developed in Kotlin and Jetpack Compose.

Resources

License

Stars

Watchers

Forks

Packages

 
 
 

Contributors