From ae6180f2cc3e3a6d6539255382a89f92ea0d8ec8 Mon Sep 17 00:00:00 2001 From: Joshua Tam <297250+joshuatam@users.noreply.github.com> Date: Tue, 19 May 2026 16:14:24 +0800 Subject: [PATCH 1/2] fix: pulseaudio sample rate by detecting optimal system value The pulseaudio sample rate is now dynamically detected from the Android AudioManager, ensuring the use of the optimal output sample rate for the device. This improves audio compatibility and quality compared to using a fixed rate. The bundled pulseaudio binary (`pulseaudio-gamenative.tzst`) has also been updated, removed exclusive stream config for better compatibility. --- .../main/assets/pulseaudio-gamenative.tzst | Bin 76227 -> 76229 bytes .../components/PulseAudioComponent.java | 20 ++++++++++++------ 2 files changed, 14 insertions(+), 6 deletions(-) diff --git a/app/src/main/assets/pulseaudio-gamenative.tzst b/app/src/main/assets/pulseaudio-gamenative.tzst index 23a183b1093283790e2970837580cede2e3ea310..219be9b4a470dec948284a443a6916ff129b29a0 100644 GIT binary patch delta 21201 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Ⓢ{yw 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 diff --git a/app/src/main/java/com/winlator/xenvironment/components/PulseAudioComponent.java b/app/src/main/java/com/winlator/xenvironment/components/PulseAudioComponent.java index 5982e839f1..54474e564a 100644 --- a/app/src/main/java/com/winlator/xenvironment/components/PulseAudioComponent.java +++ b/app/src/main/java/com/winlator/xenvironment/components/PulseAudioComponent.java @@ -1,6 +1,7 @@ package com.winlator.xenvironment.components; import android.content.Context; +import android.media.AudioManager; import android.os.Handler; import android.os.Looper; import android.os.Process; @@ -27,13 +28,19 @@ public class PulseAudioComponent extends EnvironmentComponent { private final Object lock = new Object(); private float volume = 1.0f; private byte performanceMode = 1; - private int sampleRate = 48000; private boolean isPaused = false; public PulseAudioComponent(UnixSocketConfig socketConfig) { this.socketConfig = socketConfig; } + // Add this method to detect optimal sample rate + private int getOptimalSampleRate() { + AudioManager audioManager = (AudioManager) environment.getContext().getSystemService(Context.AUDIO_SERVICE); + String rate = audioManager.getProperty(AudioManager.PROPERTY_OUTPUT_SAMPLE_RATE); + return rate != null ? Integer.parseInt(rate) : 44100; // fallback to 44.1kHz + } + @Override public void start() { Log.d("PulseAudioComponent", "Starting..."); @@ -137,11 +144,9 @@ public void setPerformanceMode(int performanceMode) { this.performanceMode = (byte) performanceMode; } - public void setSampleRate(int sampleRate) { - this.sampleRate = sampleRate; - } - private java.lang.Process execPulseAudio() { + final int bitRate = getOptimalSampleRate(); + Context context = environment.getContext(); String nativeLibraryDir = context.getApplicationInfo().nativeLibraryDir; // nativeLibraryDir = nativeLibraryDir.replace("arm64", "arm64-v8a"); @@ -154,7 +159,7 @@ private java.lang.Process execPulseAudio() { File configFile = new File(workingDir, "default.pa"); FileUtils.writeString(configFile, String.join("\n", "load-module module-native-protocol-unix auth-anonymous=1 auth-cookie-enabled=0 socket=\""+socketConfig.path+"\"", - "load-module module-aaudio-sink volume=" + this.volume + " performance_mode=" + ((int) this.performanceMode) + " rate=" + this.sampleRate, + "load-module module-aaudio-sink volume=" + this.volume + " performance_mode=" + ((int) this.performanceMode) + " rate=" + bitRate, "set-default-sink AAudioSink" )); @@ -176,6 +181,9 @@ private java.lang.Process execPulseAudio() { command += " --use-pid-file=false"; command += " --exit-idle-time=-1"; + // Uncomment to enable verbose log in pulseaudio + //command += " -vvv"; + return ProcessHelper.startProcess(command, envVars.toStringArray(), workingDir); } From 6c3213428232a3ceedfaf4f3225e206da83fa7a0 Mon Sep 17 00:00:00 2001 From: Joshua Tam <297250+joshuatam@users.noreply.github.com> Date: Tue, 19 May 2026 16:29:52 +0800 Subject: [PATCH 2/2] ai comments --- .../components/PulseAudioComponent.java | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/com/winlator/xenvironment/components/PulseAudioComponent.java b/app/src/main/java/com/winlator/xenvironment/components/PulseAudioComponent.java index 54474e564a..8a4befc879 100644 --- a/app/src/main/java/com/winlator/xenvironment/components/PulseAudioComponent.java +++ b/app/src/main/java/com/winlator/xenvironment/components/PulseAudioComponent.java @@ -36,9 +36,23 @@ public PulseAudioComponent(UnixSocketConfig socketConfig) { // Add this method to detect optimal sample rate private int getOptimalSampleRate() { + final int fallbackSampleRate = 44100; AudioManager audioManager = (AudioManager) environment.getContext().getSystemService(Context.AUDIO_SERVICE); + if (audioManager == null) { + return fallbackSampleRate; + } + String rate = audioManager.getProperty(AudioManager.PROPERTY_OUTPUT_SAMPLE_RATE); - return rate != null ? Integer.parseInt(rate) : 44100; // fallback to 44.1kHz + if (rate == null) { + return fallbackSampleRate; + } + + try { + int parsed = Integer.parseInt(rate.trim()); + return parsed > 0 ? parsed : fallbackSampleRate; + } catch (NumberFormatException ignored) { + return fallbackSampleRate; + } } @Override