├── .gitignore ├── src ├── pasetup │ ├── README.md │ └── pasetup.iss ├── pasvc │ ├── README.md │ ├── pasvcfw.c │ └── pasvc.c ├── icon │ ├── README.md │ ├── pulseaudio-flat-simple.svg │ ├── pulseaudio-flat.svg │ └── pulseaudio.svg ├── pulseaudio │ ├── README.md │ ├── 0003-system.pa-Tweaks-for-custom-build-with-unix-sockets.patch │ ├── 0004-build-sys-meson-Fix-building-without-GIO.patch │ ├── 0002-system.pa-Tweaks-for-custom-build.patch │ ├── 0001-client-conf-Enable-auto-connect-localhost-by-default.patch │ └── mingw32-deps.sh └── Dockerfile ├── LICENSE ├── .github └── workflows │ ├── build.yml │ └── release.yml └── README.md /.gitignore: -------------------------------------------------------------------------------- 1 | build 2 | -------------------------------------------------------------------------------- /src/pasetup/README.md: -------------------------------------------------------------------------------- 1 | # pasetup 2 | 3 | An [Inno Setup 6](https://jrsoftware.org/isinfo.php) installer for 4 | pulseaudio-win32. 5 | -------------------------------------------------------------------------------- /src/pasvc/README.md: -------------------------------------------------------------------------------- 1 | # pasvc 2 | 3 | Helpers for managing the PulseAudio service and the firewall rules. 4 | 5 | Previously, this used to also wrap PulseAudio to allow it to run as a service, 6 | but I ended up integrating that into PA itself. 7 | -------------------------------------------------------------------------------- /src/icon/README.md: -------------------------------------------------------------------------------- 1 | # icon 2 | 3 | Modified PulseAudio icon. The shadow and a few gradients have been removed, and 4 | there is also a simplified version with brighter colors, solid border, and a 5 | more visible foreground for visibility at smaller sizes. 6 | 7 | | Original | Flat | Flat (simplified) | 8 | | --- | --- | --- | 9 | | ![](./pulseaudio.svg) | ![](./pulseaudio-flat.svg) | ![](./pulseaudio-flat-simple.svg) | 10 | -------------------------------------------------------------------------------- /src/pulseaudio/README.md: -------------------------------------------------------------------------------- 1 | # pulseaudio 2 | 3 | Files related to building PulseAudio for Windows with MinGW using Meson. 4 | 5 | This mainly consists of patches for fixing bugs or compiler warnings (which I am 6 | planning to upstream), but there a few pulseaudio-win32-specific patches for 7 | better integration (see [here](https://pgaskin.net/pulseaudio-win32#patches) for 8 | a list of patches). 9 | 10 | Also includes a script, [mingw32-deps.sh](./minw32-deps.sh), for recursively 11 | resolving and downloading MinGW DLLs which a binary depends on from the OpenSUSE 12 | MinGW 32-bit repository. 13 | -------------------------------------------------------------------------------- /src/pulseaudio/0003-system.pa-Tweaks-for-custom-build-with-unix-sockets.patch: -------------------------------------------------------------------------------- 1 | From eec511f76538a9e254f2b166898861eb75fa7e05 Mon Sep 17 00:00:00 2001 2 | From: Patrick Gaskin 3 | Date: Thu, 22 Apr 2021 08:11:11 -0400 4 | Subject: [PATCH] system.pa: Tweaks for custom build with unix sockets 5 | 6 | Use anonymous authentication for the system socket. 7 | --- 8 | src/daemon/system.pa.in | 2 +- 9 | 1 file changed, 1 insertion(+), 1 deletion(-) 10 | 11 | diff --git a/src/daemon/system.pa.in b/src/daemon/system.pa.in 12 | index d3512005a..c55df5bb2 100755 13 | --- a/src/daemon/system.pa.in 14 | +++ b/src/daemon/system.pa.in 15 | @@ -56,7 +56,7 @@ ifelse(@HAVE_AF_UNIX@, 1, [dnl 16 | .ifexists module-esound-protocol-unix@PA_SOEXT@ 17 | load-module module-esound-protocol-unix 18 | .endif 19 | -load-module module-native-protocol-unix 20 | +load-module module-native-protocol-unix auth-anonymous=1 21 | ])dnl 22 | load-module module-native-protocol-tcp auth-anonymous=1 23 | 24 | -- 25 | 2.31.1 26 | 27 | -------------------------------------------------------------------------------- /src/pulseaudio/0004-build-sys-meson-Fix-building-without-GIO.patch: -------------------------------------------------------------------------------- 1 | From 74469f4b25ad5d31be01b3c721da4a580f876de8 Mon Sep 17 00:00:00 2001 2 | From: Patrick Gaskin 3 | Date: Wed, 4 Aug 2021 04:44:23 -0400 4 | Subject: [PATCH] build-sys: meson: Fix building without GIO 5 | 6 | GIO is only needed for GSettings and GStreamer. 7 | 8 | Fixes a regression in 58052e0e04ee1b5fdb1027ebc19717e7766825ec. 9 | --- 10 | meson.build | 2 +- 11 | 1 file changed, 1 insertion(+), 1 deletion(-) 12 | 13 | diff --git a/meson.build b/meson.build 14 | index d7e468cab..dfc184679 100644 15 | --- a/meson.build 16 | +++ b/meson.build 17 | @@ -614,7 +614,7 @@ if dbus_dep.found() 18 | cdata.set('HAVE_DBUS', 1) 19 | endif 20 | 21 | -gio_dep = dependency('gio-2.0', version : '>= 2.26.0') 22 | +gio_dep = dependency('gio-2.0', version : '>= 2.26.0', required: false) # checked later on where needed by gsettings and gstreamer 23 | if get_option('gsettings').enabled() 24 | assert(gio_dep.found(), 'GSettings support needs glib I/O library (GIO)') 25 | cdata.set('HAVE_GSETTINGS', 1) 26 | -- 27 | 2.31.1 28 | 29 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2021 Patrick Gaskin 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /.github/workflows/build.yml: -------------------------------------------------------------------------------- 1 | name: Build 2 | on: [push, pull_request] 3 | 4 | jobs: 5 | build: 6 | name: Build 7 | runs-on: ubuntu-20.04 8 | steps: 9 | - name: Checkout 10 | uses: actions/checkout@v2 11 | with: 12 | fetch-depth: 0 13 | - name: Build 14 | run: | 15 | mkdir -p ./build && 16 | docker build --tag pulseaudio-win32 --build-arg "PAW32_VERSION=$(echo "$(git describe --always --tags)" | sed -e "s/^v//g")" ./src && 17 | docker save pulseaudio-win32 | 18 | tar -xOf - --wildcards '*/layer.tar' | 19 | tar -xvf - -C ./build 20 | - name: Upload (pasetup.exe) 21 | uses: actions/upload-artifact@v2 22 | with: 23 | name: Installer (pasetup.exe) 24 | path: build/pasetup.exe 25 | - name: Upload (pulseaudio.zip) 26 | uses: actions/upload-artifact@v2 27 | with: 28 | name: Binaries (pulseaudio.zip) 29 | path: build/pulseaudio.zip 30 | - name: Upload (pasvc.zip) 31 | uses: actions/upload-artifact@v2 32 | with: 33 | name: Binaries (pasvc.zip) 34 | path: build/pasvc.zip 35 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # pulseaudio-win32 2 | 3 | An up-to-date PulseAudio build for Windows with an installer, service, and other 4 | improvements. 5 | 6 | ### Features 7 | 8 | - Various fixes and improvements. 9 | - Standalone. 10 | - Optional installer. 11 | - Can run as a Windows Service. 12 | - Working `pactl`/`pacat`. 13 | - Working modules. 14 | - Working auto-connection to user and system instances. 15 | - Working unix sockets for both user and system instances on Windows 10. 16 | - HTML documentation. 17 | - Works on Windows 7 and later. 18 | 19 | ### Limitations 20 | 21 | - There are still some hard-coded paths which don't automatically relocate to 22 | the installation directory. This mainly affects the documentation. 23 | - Locale files aren't currently included. 24 | 25 | ### Building 26 | 27 | ```bash 28 | mkdir -p ./build && 29 | docker build --tag pulseaudio-win32 --build-arg "PAW32_VERSION=$(echo "$(git describe --always --tags --dirty || echo unknown)" | sed -e "s/^v//g")" ./src && 30 | docker save pulseaudio-win32 | 31 | tar -xOf - --wildcards '*/layer.tar' | 32 | tar -xvf - -C ./build 33 | ``` 34 | 35 | ### Usage 36 | 37 | See the [website](https://pgaskin.net/pulseaudio-win32/#readme). 38 | 39 | ### Notes 40 | 41 | While this repository is licensed under the MIT license, the icon and build 42 | output is licensed under the LGPL like PulseAudio itself (the PulseAudio build 43 | isn't linked to GPL libraries). 44 | -------------------------------------------------------------------------------- /src/icon/pulseaudio-flat-simple.svg: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | -------------------------------------------------------------------------------- /.github/workflows/release.yml: -------------------------------------------------------------------------------- 1 | name: Release 2 | on: 3 | push: 4 | tags: 5 | - 'v*' 6 | 7 | jobs: 8 | release: 9 | name: Release 10 | runs-on: ubuntu-20.04 11 | steps: 12 | - name: Checkout 13 | uses: actions/checkout@v2 14 | with: 15 | fetch-depth: 0 16 | - name: Build 17 | run: | 18 | mkdir -p ./build && 19 | docker build --tag pulseaudio-win32 --build-arg "PAW32_VERSION=$(echo "$(git describe --always --tags)" | sed -e "s/^v//g")" ./src && 20 | docker save pulseaudio-win32 | 21 | tar -xOf - --wildcards '*/layer.tar' | 22 | tar -xvf - -C ./build 23 | - name: Release 24 | id: release 25 | uses: actions/create-release@v1 26 | env: 27 | GITHUB_TOKEN: ${{secrets.GITHUB_TOKEN}} 28 | with: 29 | tag_name: ${{github.ref}} 30 | release_name: ${{github.ref}} 31 | draft: true 32 | prerelease: false 33 | - name: Release (pasetup.exe) 34 | uses: actions/upload-release-asset@v1 35 | env: 36 | GITHUB_TOKEN: ${{secrets.GITHUB_TOKEN}} 37 | with: 38 | upload_url: ${{steps.release.outputs.upload_url}} 39 | asset_name: pasetup.exe 40 | asset_path: build/pasetup.exe 41 | asset_content_type: application/vnd.microsoft.portable-executable 42 | - name: Release (pulseaudio.zip) 43 | uses: actions/upload-release-asset@v1 44 | env: 45 | GITHUB_TOKEN: ${{secrets.GITHUB_TOKEN}} 46 | with: 47 | upload_url: ${{steps.release.outputs.upload_url}} 48 | asset_name: pulseaudio.zip 49 | asset_path: build/pulseaudio.zip 50 | asset_content_type: application/zip 51 | -------------------------------------------------------------------------------- /src/pulseaudio/0002-system.pa-Tweaks-for-custom-build.patch: -------------------------------------------------------------------------------- 1 | From 784a2a9242a048f989b7db20ff527f53f008bde5 Mon Sep 17 00:00:00 2001 2 | From: Patrick Gaskin 3 | Date: Thu, 31 Dec 2020 20:43:42 -0500 4 | Subject: [PATCH] system.pa: Tweaks for custom build 5 | 6 | --- 7 | src/daemon/default.pa.in | 2 +- 8 | src/daemon/system.pa.in | 8 ++++++++ 9 | 2 files changed, 9 insertions(+), 1 deletion(-) 10 | 11 | diff --git a/src/daemon/default.pa.in b/src/daemon/default.pa.in 12 | index a3ddad9ff..e5f310233 100755 13 | --- a/src/daemon/default.pa.in 14 | +++ b/src/daemon/default.pa.in 15 | @@ -45,7 +45,7 @@ ifelse(@HAVE_OSS_OUTPUT@, 1, [dnl 16 | #load-module module-oss-mmap device="/dev/dsp" sink_name=output source_name=input 17 | ])dnl 18 | ifelse(@HAVE_WAVEOUT@, 1, [dnl 19 | -load-module module-waveout sink_name=output source_name=input 20 | +load-module module-waveout sink_name=waveout source_name=wavein 21 | ])dnl 22 | #load-module module-null-sink 23 | ifelse(@HAVE_MKFIFO@, 1, [dnl 24 | diff --git a/src/daemon/system.pa.in b/src/daemon/system.pa.in 25 | index 989fcb4f3..d3512005a 100755 26 | --- a/src/daemon/system.pa.in 27 | +++ b/src/daemon/system.pa.in 28 | @@ -24,6 +24,11 @@ load-module module-device-restore 29 | load-module module-stream-restore 30 | load-module module-card-restore 31 | 32 | +### Load audio drivers statically 33 | +ifelse(@HAVE_WAVEOUT@, 1, [dnl 34 | +load-module module-waveout sink_name=waveout source_name=wavein 35 | +])dnl 36 | + 37 | ### Automatically load driver modules depending on the hardware available 38 | ifelse(@HAVE_UDEV@, 1, [dnl 39 | .ifexists module-udev-detect@PA_SOEXT@ 40 | @@ -47,10 +52,13 @@ load-module module-devd-detect 41 | ])dnl 42 | 43 | ### Load several protocols 44 | +ifelse(@HAVE_AF_UNIX@, 1, [dnl 45 | .ifexists module-esound-protocol-unix@PA_SOEXT@ 46 | load-module module-esound-protocol-unix 47 | .endif 48 | load-module module-native-protocol-unix 49 | +])dnl 50 | +load-module module-native-protocol-tcp auth-anonymous=1 51 | 52 | ### Automatically restore the default sink/source when changed by the user 53 | ### during runtime 54 | -- 55 | 2.31.1 56 | 57 | -------------------------------------------------------------------------------- /src/pulseaudio/0001-client-conf-Enable-auto-connect-localhost-by-default.patch: -------------------------------------------------------------------------------- 1 | From 5115f7a2be212825f056a1f619ee5762730f2b9a Mon Sep 17 00:00:00 2001 2 | From: Patrick Gaskin 3 | Date: Thu, 31 Dec 2020 06:38:28 -0500 4 | Subject: [PATCH] client-conf: Enable auto-connect-localhost by default 5 | 6 | --- 7 | man/pulse-client.conf.5.xml.in | 4 +--- 8 | src/pulse/client-conf.c | 2 +- 9 | src/pulse/client.conf.in | 2 +- 10 | 3 files changed, 3 insertions(+), 5 deletions(-) 11 | 12 | diff --git a/man/pulse-client.conf.5.xml.in b/man/pulse-client.conf.5.xml.in 13 | index 5c0eff31b..0eadac228 100644 14 | --- a/man/pulse-client.conf.5.xml.in 15 | +++ b/man/pulse-client.conf.5.xml.in 16 | @@ -137,9 +137,7 @@ License along with PulseAudio; if not, see . 17 | connect to localhost via IP. Enabling this is a potential 18 | security hole since connections are only authenticated one-way 19 | and a rogue server might hence fool a client into sending it its 20 | - private (e.g. VoIP call) data. This was enabled by default on 21 | - PulseAudio version 0.9.21 and older. Defaults to 22 | - no.

23 | + private (e.g. VoIP call) data. Defaults to yes.

24 | 25 | 26 |