diff --git a/DSPVolumeSynchronizer/Android.bp b/DSPVolumeSynchronizer/Android.bp
new file mode 100644
index 0000000..facae14
--- /dev/null
+++ b/DSPVolumeSynchronizer/Android.bp
@@ -0,0 +1,39 @@
+//
+// Copyright (C) 2024-2025 The LineageOS Project
+//
+// SPDX-License-Identifier: Apache-2.0
+//
+
+android_app {
+ name: "DSPVolumeSynchronizer",
+ certificate: "platform",
+ srcs: ["src/**/*.java"],
+ platform_apis: true,
+ privileged: true,
+ system_ext_specific: true,
+ static_libs: [
+ "androidx.core_core",
+ "SettingsLib",
+ ],
+
+ required: [
+ "privapp-permissions-dspvolume",
+ "config-dspvolume",
+ ],
+}
+
+prebuilt_etc {
+ name: "privapp-permissions-dspvolume",
+ relative_install_path: "permissions",
+ src: "privapp-permissions-dspvolume.xml",
+ system_ext_specific: true,
+ filename_from_src: true,
+}
+
+prebuilt_etc {
+ name: "config-dspvolume",
+ relative_install_path: "sysconfig",
+ src: "config-dspvolume.xml",
+ system_ext_specific: true,
+ filename_from_src: true,
+}
diff --git a/DSPVolumeSynchronizer/AndroidManifest.xml b/DSPVolumeSynchronizer/AndroidManifest.xml
new file mode 100644
index 0000000..38e3f03
--- /dev/null
+++ b/DSPVolumeSynchronizer/AndroidManifest.xml
@@ -0,0 +1,30 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/DSPVolumeSynchronizer/config-dspvolume.xml b/DSPVolumeSynchronizer/config-dspvolume.xml
new file mode 100644
index 0000000..b67b705
--- /dev/null
+++ b/DSPVolumeSynchronizer/config-dspvolume.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/DSPVolumeSynchronizer/privapp-permissions-dspvolume.xml b/DSPVolumeSynchronizer/privapp-permissions-dspvolume.xml
new file mode 100644
index 0000000..4e837bf
--- /dev/null
+++ b/DSPVolumeSynchronizer/privapp-permissions-dspvolume.xml
@@ -0,0 +1,9 @@
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/DSPVolumeSynchronizer/res/values/strings.xml b/DSPVolumeSynchronizer/res/values/strings.xml
new file mode 100644
index 0000000..af528cd
--- /dev/null
+++ b/DSPVolumeSynchronizer/res/values/strings.xml
@@ -0,0 +1,5 @@
+
+
+
+ DSP Volume Synchronizer
+
diff --git a/DSPVolumeSynchronizer/src/org/lineageos/dspvolume/xiaomi/BootReceiver.java b/DSPVolumeSynchronizer/src/org/lineageos/dspvolume/xiaomi/BootReceiver.java
new file mode 100644
index 0000000..589d3ed
--- /dev/null
+++ b/DSPVolumeSynchronizer/src/org/lineageos/dspvolume/xiaomi/BootReceiver.java
@@ -0,0 +1,16 @@
+package org.lineageos.dspvolume.xiaomi;
+
+import android.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.Intent;
+
+
+public class BootReceiver extends BroadcastReceiver {
+ @Override
+ public void onReceive(final Context context, Intent intent) {
+ if (context == null) {
+ return;
+ }
+ context.startService(new Intent(context, VolumeListenerService.class));
+ }
+}
diff --git a/DSPVolumeSynchronizer/src/org/lineageos/dspvolume/xiaomi/VolumeListenerReceiver.java b/DSPVolumeSynchronizer/src/org/lineageos/dspvolume/xiaomi/VolumeListenerReceiver.java
new file mode 100644
index 0000000..e21a3ab
--- /dev/null
+++ b/DSPVolumeSynchronizer/src/org/lineageos/dspvolume/xiaomi/VolumeListenerReceiver.java
@@ -0,0 +1,28 @@
+package org.lineageos.dspvolume.xiaomi;
+
+import android.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.Intent;
+import android.media.AudioManager;
+import android.util.Log;
+
+import android.os.Bundle;
+
+public class VolumeListenerReceiver extends BroadcastReceiver {
+
+ @Override
+ public void onReceive(Context context, Intent intent) {
+ if (context == null) {
+ return;
+ }
+
+ if(intent.getIntExtra("android.media.EXTRA_VOLUME_STREAM_TYPE", 0) == AudioManager.STREAM_MUSIC) {
+ AudioManager audioManager = context.getSystemService(AudioManager.class);
+ int current = intent.getIntExtra(
+ "android.media.EXTRA_VOLUME_STREAM_VALUE",
+ 0
+ );
+ audioManager.setParameters("volume_change=" + current + ";flags=8");
+ }
+ }
+}
diff --git a/DSPVolumeSynchronizer/src/org/lineageos/dspvolume/xiaomi/VolumeListenerService.java b/DSPVolumeSynchronizer/src/org/lineageos/dspvolume/xiaomi/VolumeListenerService.java
new file mode 100644
index 0000000..c7a237a
--- /dev/null
+++ b/DSPVolumeSynchronizer/src/org/lineageos/dspvolume/xiaomi/VolumeListenerService.java
@@ -0,0 +1,30 @@
+package org.lineageos.dspvolume.xiaomi;
+
+import android.app.Service;
+import android.content.Intent;
+import android.content.IntentFilter;
+import android.media.AudioManager;
+import android.os.IBinder;
+
+import androidx.annotation.Nullable;
+
+public class VolumeListenerService extends Service {
+ @Nullable
+ @Override
+ public IBinder onBind(Intent intent) {
+ return null;
+ }
+
+ @Override
+ public int onStartCommand(Intent intent, int flags, int startId) {
+ IntentFilter intentFilter = new IntentFilter();
+ intentFilter.addAction("android.media.VOLUME_CHANGED_ACTION");
+ registerReceiver(new VolumeListenerReceiver(), intentFilter);
+
+ AudioManager audioManager = getSystemService(AudioManager.class);
+ int current = audioManager.getStreamVolume(AudioManager.STREAM_MUSIC);
+ audioManager.setParameters("volume_change=" + current + ";flags=8");
+
+ return super.onStartCommand(intent, flags, startId);
+ }
+}
diff --git a/dolby.mk b/dolby.mk
index 98db4d1..8d1c4bd 100644
--- a/dolby.mk
+++ b/dolby.mk
@@ -85,6 +85,10 @@ PRODUCT_VENDOR_PROPERTIES += \
PRODUCT_PACKAGES += \
RemovePackagesDolby
+# DSP Volume Synchronizer
+PRODUCT_PACKAGES += \
+ DSPVolumeSynchronizer
+
# XiaomiDolby
PRODUCT_PACKAGES += \
XiaomiDolby \