dolby: Implement DSPVolumeSynchronizer
Some Xiaomi devices have a speaker that needs a framework to cooperate with DSP to synchronize volume so that the DSP can limit bass when the volume is high to prevent distortion. Change-Id: I750803d94161e1e7482552d2a39566f42e82fc0a Signed-off-by: Pranav Vashi <neobuddy89@gmail.com>
This commit is contained in:
parent
65d7336949
commit
23662b74ac
9 changed files with 166 additions and 0 deletions
39
DSPVolumeSynchronizer/Android.bp
Normal file
39
DSPVolumeSynchronizer/Android.bp
Normal file
|
|
@ -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,
|
||||||
|
}
|
||||||
30
DSPVolumeSynchronizer/AndroidManifest.xml
Normal file
30
DSPVolumeSynchronizer/AndroidManifest.xml
Normal file
|
|
@ -0,0 +1,30 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
package="org.lineageos.dspvolume.xiaomi"
|
||||||
|
android:versionCode="1"
|
||||||
|
android:versionName="1.0"
|
||||||
|
android:sharedUserId="android.uid.system">
|
||||||
|
|
||||||
|
<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />
|
||||||
|
|
||||||
|
<application
|
||||||
|
android:label="@string/app_name"
|
||||||
|
android:persistent="true"
|
||||||
|
android:defaultToDeviceProtectedStorage="true"
|
||||||
|
android:directBootAware="true">
|
||||||
|
|
||||||
|
<receiver
|
||||||
|
android:name=".BootReceiver"
|
||||||
|
android:exported="true"
|
||||||
|
android:permission="android.permission.RECEIVE_BOOT_COMPLETED">
|
||||||
|
<intent-filter android:priority="999">
|
||||||
|
<action android:name="android.intent.action.BOOT_COMPLETED" />
|
||||||
|
<category android:name="android.intent.category.DEFAULT" />
|
||||||
|
</intent-filter>
|
||||||
|
</receiver>
|
||||||
|
|
||||||
|
<service
|
||||||
|
android:name=".VolumeListenerService" />
|
||||||
|
</application>
|
||||||
|
</manifest>
|
||||||
|
|
||||||
5
DSPVolumeSynchronizer/config-dspvolume.xml
Normal file
5
DSPVolumeSynchronizer/config-dspvolume.xml
Normal file
|
|
@ -0,0 +1,5 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
|
||||||
|
<config>
|
||||||
|
<allow-in-power-save package="org.lineageos.dspvolume.xiaomi" />
|
||||||
|
<hidden-api-whitelisted-app package="org.lineageos.dspvolume.xiaomi" />
|
||||||
|
</config>
|
||||||
9
DSPVolumeSynchronizer/privapp-permissions-dspvolume.xml
Normal file
9
DSPVolumeSynchronizer/privapp-permissions-dspvolume.xml
Normal file
|
|
@ -0,0 +1,9 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<permissions>
|
||||||
|
<privapp-permissions package="org.lineageos.dspvolume.xiaomi">
|
||||||
|
<permission name="android.permission.INTERACT_ACROSS_USERS" />
|
||||||
|
<permission name="android.permission.INTERACT_ACROSS_USERS_FULL" />
|
||||||
|
<permission name="android.permission.MODIFY_AUDIO_SETTINGS" />
|
||||||
|
<permission name="android.permission.RECEIVE_BOOT_COMPLETED" />
|
||||||
|
</privapp-permissions>
|
||||||
|
</permissions>
|
||||||
5
DSPVolumeSynchronizer/res/values/strings.xml
Normal file
5
DSPVolumeSynchronizer/res/values/strings.xml
Normal file
|
|
@ -0,0 +1,5 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<resources>
|
||||||
|
<!-- App Name -->
|
||||||
|
<string name="app_name">DSP Volume Synchronizer</string>
|
||||||
|
</resources>
|
||||||
|
|
@ -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));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -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");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -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);
|
||||||
|
}
|
||||||
|
}
|
||||||
4
dolby.mk
4
dolby.mk
|
|
@ -85,6 +85,10 @@ PRODUCT_VENDOR_PROPERTIES += \
|
||||||
PRODUCT_PACKAGES += \
|
PRODUCT_PACKAGES += \
|
||||||
RemovePackagesDolby
|
RemovePackagesDolby
|
||||||
|
|
||||||
|
# DSP Volume Synchronizer
|
||||||
|
PRODUCT_PACKAGES += \
|
||||||
|
DSPVolumeSynchronizer
|
||||||
|
|
||||||
# XiaomiDolby
|
# XiaomiDolby
|
||||||
PRODUCT_PACKAGES += \
|
PRODUCT_PACKAGES += \
|
||||||
XiaomiDolby \
|
XiaomiDolby \
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue