65 Commits

Author SHA1 Message Date
Bruno Martins
11dff39159 dolby: Apply Expressive theme
Change-Id: I03c814b97c8401428f2b358d065a99503df9d1cc
2026-01-20 09:22:03 +09:00
Bruno Martins
3246c3ae3b dolby: Convert for M3E support
Change-Id: Ib4d1088f5be3fc2b5c2ff90d5cd1b86603551037
2026-01-20 09:22:03 +09:00
Bruno Martins
3b8938cda5 dolby: Use new method to listen for preference changes
Usage of addOnSwitchChangeListener(OnCheckedChangeListener) is
deprecated. The Javadoc explicitly says:

  Use setOnPreferenceChangeListener(OnPreferenceChangeListener) instead.

Change-Id: I71e0e3f86ff339a312cac1e09106f6d5d15b7e43
Signed-off-by: basamaryan <basam.aryan@gmail.com>
2026-01-20 09:22:03 +09:00
9e7a9b9d59 dolby: Move to PreferenceFragmentCompat
PreferenceFragment was deprecated in API level 28.

https://developer.android.com/jetpack/androidx/releases/preference#1.1.0

Change-Id: Ie8a4b04bd588afbbbc5882349ddbc05f988f80bf
Signed-off-by: AnierinB <anierin@evolution-x.org>
Signed-off-by: basamaryan <basam.aryan@gmail.com>
2026-01-20 09:22:03 +09:00
pabloescobar-reborn
a030a000a5 dolby: kang dax-defualt from aospa
* Based on Paranoid Android Vauxite (7) [03/08/2025]
2026-01-12 15:12:04 +00:00
Ghosuto
0e03fffcdb dolby: add missing software codec Attribute
Signed-off-by: Ghosuto <clash.raja10@gmail.com>
2026-01-02 08:16:52 +05:30
Yogesh
fe94e80ffa Merge pull request #1 from DqrKnzx/16
dolby: fix attributes and tags in dax_default.xml
2025-11-29 00:41:08 +05:30
DqrKnzx
944a468640 dolby: fix attributes and tags in dax_default.xml
- Typos prevented some audio settings from being applied (gain_left, virtual bass).

Signed-off-by: DqrKnzx <DavidYonatan9@hotmail.com>
2025-11-28 19:00:59 +00:00
chaitanya
63bcd895df dolby: fixup voice profile 2025-09-07 15:55:34 +00:00
chaitanyakm
de23ccc185 dolby: update dax-default.xml 2025-09-07 15:55:25 +00:00
Adithya R
088743af43 dolby: Do not conditionally disable prefs on speaker
We have separate toggles for speaker and headphone virtualizer so
this doesn't really make sense.

Change-Id: I95406f2bb1815146aa52fb49541ffd60541ca05f
2025-09-02 02:26:10 +00:00
Adithya R
0353d1e21f dolby: Allow force disabling volume leveler
Change-Id: Ib70e1f27d8280c8b4ec456e4feaa30522fdc5121
2025-09-02 02:26:10 +00:00
Adithya R
fbb15cb28b dolby: Avoid hardcoded strings for custom preset
Change-Id: I6a2b16cb67bc0bf4def9fbe17aac30664e62f4d7
2025-09-02 02:26:10 +00:00
Adithya R
67eed6a82c dolby: Move to device encrypted storage
Change-Id: I9135755bb79acb2a9f74b040403973b056941827
2025-09-02 02:26:10 +00:00
Adithya R
40fe6856d7 dolby: Move effect strength settings to sliders
Stereo widening and dialogue enhancer.

Change-Id: I3f2eb7d01c11f90e9080d22f8f390f8adddcba14
2025-09-02 02:26:10 +00:00
Adithya R
60ed7e0863 dolby: Hide advanced settings in dynamic profile
This is in line with DaxUI.

Change-Id: I6ea2657c86e5c4cfb1aa6f78d651b330f56ae921
2025-09-02 02:26:10 +00:00
Adithya R
858790df5d dolby: Add a menu button to reset all profiles
Change-Id: I16c4f7e06279bdcb1a1f2977ce48d2487caecac3
2025-09-02 02:26:10 +00:00
Adithya R
31d7175068 fixup! dolby: Add intelligent equalizer setting 2025-09-02 02:26:10 +00:00
Adithya R
d40e763990 fixup! dolby: Use index of value for selecting ieq icon 2025-09-02 02:26:10 +00:00
Pranav Vashi
4920046dbe dolby: Fix compilation error in TooltipIconButton
Fixes: TooltipIconButton.kt:30:44: error: unresolved reference: rememberPlainTooltipPositionProvider

Change-Id: I7554622a406f4a56dc8471a39cbd4ad73c0daede
Signed-off-by: Pranav Vashi <neobuddy89@gmail.com>
2025-09-02 02:26:10 +00:00
Adithya R
c3f3a11aeb dolby: Use index of value for selecting ieq icon
Otherwise if we alter value ids (dolby_ieq_values) via overlay,
the wrong icon is displayed since the value differs from index.

Change-Id: I4ec55719a31cb22777069b62fa550eadd3d946fb
2025-09-02 02:26:10 +00:00
Adithya R
753b34ec59 dolby: Allow disabling stereo widening levels
On newer dolby tunings, this is unsupported. It can only be turned
on/off (headphone virtualization).

Change-Id: Iffbffd81bb22510fa10418f9247ce89c0513b09e
2025-09-02 02:26:10 +00:00
Adithya R
05ca7c6837 dolby: Enable bass enhancer on loudspeaker too
It is a subtle but noticeable effect.

Change-Id: I385c8474f2423c7496423716448f7480cd6acbf3
2025-09-02 02:26:10 +00:00
Adithya R
a4cd52a83c dolby: Properly update profile preference summary
When profile is changed to known from unknown, the preference didn't
get updated.

Change-Id: Ic5e41f8c853187272d00178c7de02551f16350f9
2025-09-02 02:26:10 +00:00
Adithya R
b8e001e5eb dolby: Add support for Custom profile
This appears to be present in all devices' dolby configurations.

Change-Id: I651a5f0f64144bbda6de863989043f9daf40b213
2025-09-02 02:26:10 +00:00
Fabian Leutenegger
440bb655d2 dolby: Update EqualizerScreen background color for 15
Switch to MaterialTheme settingsBackground for EqualizerScreen background color

Change-Id: I546e3528814276eb857a650cb6c173d914550fb5
2025-09-02 02:26:10 +00:00
Pranav Vashi
b27a259975 dolby: Remove deprecated PlainTooltipBox
Change-Id: I70ffff5ba30c5eeaff431e46c82eaf05d46e4cb0
2025-09-02 02:26:10 +00:00
basamaryan
d43556f426 dolby: Fix build with kotlinc 1.9.0
Change-Id: I4f9fdc9d25eb57240612cff1b3bef3663014f9a8
Signed-off-by: Adithya R <gh0strider.2k18.reborn@gmail.com>
2025-09-02 02:26:10 +00:00
Michael Bestas
939088422f dolby: Convert to SwitchPreferenceCompat
Change-Id: Ic1cbaba37d499da1855af9c3930f2df426e2d3af
2025-09-02 02:26:10 +00:00
Chaohui Wang
600851e820 dolby: Migrate to CompoundButton.OnCheckedChangeListener
Switch and SwitchCompat are both CompoundButton.

Using CompoundButton in Java will helps migration in the future.

Bug: 306658427 | AOSP | AOSP
Test: manual - check Settings pages
Test: m RunSettingsLibRoboTests
Change-Id: I85a70d4c504d8584030ea4a058f30d74206ab835
2025-09-02 02:26:10 +00:00
Fabian Leutenegger
ca33c4dd78 dolby: Replace widget.R with collapsingtoolbar.R
Change-Id: I725a3bdb06f2a697791b882c5709f59b6089ba15
2025-09-02 02:26:10 +00:00
Adithya R
6db983af3e dolby: Make sure to persist value after toggling QS tile
Toggling the switch pref automatically sets the shared pref for us, but
toggling the QS tile does no such thing so we gotta do it ourselves.

Change-Id: Iac881ed654bf4eb76b111fc87667f16476d11522
2025-09-02 02:26:10 +00:00
Adithya R
318f0ea617 dolby: Add intelligent equalizer setting
Move preference-related classes to a new package while we're at it,
to reduce code clutter.

Change-Id: I2430e8ab9b6758503ce1777ec985a3e400b55b8e
2025-09-02 02:26:10 +00:00
Adithya R
b44187ef8f dolby: Introduce graphical equalizer
Squashed:

dolby: Refresh preset name on main screen

Change-Id: I96783e2a03c384f031787f4cc9140f7d64dadb2f
Signed-off-by: Pranav Vashi <neobuddy89@gmail.com>

Change-Id: I38ee6ce594e5671af42afc3d4bf0f004329482b9
2025-09-02 02:26:10 +00:00
Pranav Vashi
14efd187f8 dolby: Add launcher icon
Change-Id: I4d36842ca96048f9b55604d66cc7741759d657f3
Signed-off-by: Pranav Vashi <neobuddy89@gmail.com>
[adithya2306: Add monochrome icon as well]
Signed-off-by: Adithya R <gh0strider.2k18.reborn@gmail.com>
2025-09-02 02:26:10 +00:00
Adithya R
4f1393f337 fixup! dolby: Restore all settings upon bootup
Stereo widening dependency on virtualizer was accidentally removed.

Change-Id: I9b1e35aef5037935af3dc18a303408e2a81ca635
2025-09-02 02:26:10 +00:00
Adithya R
4774c82a5b dolby: Restore current profile _after_ resetting profiles
Ensure to end the onBootCompleted routine with the correct profile set.

Change-Id: I2d5f74a7c0145af2f9d064cd98fa2dc70e5a7acd
2025-09-02 02:26:10 +00:00
Adithya R
7a1ef573d6 dolby: Do not set volume leveler amount
This value is set to zero in almost every known dax-default.xml,
including ours.
DaxService also doesn't mess with this value, instead only sets
VolumeLevelerEnabled.

Change-Id: Ib944728d478cff58aebc4f47128bcd5fe32ff9f6
2025-09-02 02:26:10 +00:00
Adithya R
e92669bd12 dolby: Restore all settings upon bootup
Dolby often messes up restoring profile-specific settings after a reboot.
"Fine. I'll do it myself."

Change-Id: Ic255c6922eabae0b522c05110f87e2c10a97fb6c
2025-09-02 02:26:10 +00:00
Adithya R
586755d10b dolby: Rewrite in Kotlin
Some cleanup and restructuring while we're at it.

Change-Id: I2f1fc53c202d91421c7b6af68c814c25398a62e4
2025-09-02 02:26:10 +00:00
Adithya R
863fce3d24 dolby: Revert "Re-enable speaker virtualization after bootup"
No longer necessary

Change-Id: Iac820eafa71ea3e4ccaad2bfa0fb76c37279a22a
2025-09-02 02:26:10 +00:00
Adithya R
5ab1d968be dolby: Introduce Dolby Atmos
Moved from marble/sm8450-common

History:

commit 82fe03168c0402e4cb10d25859c3b398c0ef654a
Author: Adithya R <gh0strider.2k18.reborn@gmail.com>
Date:   Thu Mar 21 21:35:36 2024 +0530

    marble: parts: Restore dolby profile on audio changes

    Something keeps resetting back at random times, from what I observed,
    after resuming media or on a device change, lets workaround that.

    Change-Id: Id065f2482636194655c2399f0c35ad56b8e7a29d

commit c4400bd1326f65aeac1d0f26bb830ce7fd079773
Author: Adithya R <gh0strider.2k18.reborn@gmail.com>
Date:   Fri Feb 2 09:29:08 2024 +0530

    marble: parts/keyhandler: Guard debug logging

    Change-Id: I246941f26cd1f71b696eb3c996794c9baa5dbc00

commit f11b70a98a11d0b89673d73002996aed9f11fbd7
Author: Adithya R <gh0strider.2k18.reborn@gmail.com>
Date:   Sun Dec 31 20:36:52 2023 +0530

    marble: parts: Re-enable speaker virtualization after bootup

    For whatever reason, speaker virtualization isn't automatically
    restored at bootup unlike the other parameters. It was reported to be
    fixed by connecting and disconnecting headphones or disabling and
    enabling the toggle, so let's just automate that at bootup.

commit abcff4fb947c89b69c1d25bd290fd91b7873af6a
Author: Adithya R <gh0strider.2k18.reborn@gmail.com>
Date:   Fri Oct 20 06:49:19 2023 +0530

    marble: parts: Implement profile-specific Dolby settings

    Some refactoring and cleanup while we're at it.

commit dc54f9ddeff212d017b0cba16e56516e99335bb3
Author: Adithya R <gh0strider.2k18.reborn@gmail.com>
Date:   Mon Oct 9 21:58:58 2023 +0530

    marble: parts: Remove play/pause hack while toggling Dolby

    Not required with/fixed by:
    35217: audioflinger: Do not allow DAP effect to be suspended | https://gerrit.aospa.co/c/AOSPA/android_frameworks_av/+/35217

commit dd2acc8e0c10d05f86ff229412cc9f72ea242b44
Author: Adithya R <gh0strider.2k18.reborn@gmail.com>
Date:   Wed Sep 13 21:41:20 2023 +0530

    marble: parts: Set proper summary for dolby settings

    Show the current status in Settings > Sound as well as the QS tile.

commit 92d341ba3d22f323eded525487db4289d6edc0fe
Author: Fabian Leutenegger <fabian.leutenegger@bluewin.ch>
Date:   Fri Aug 25 10:26:53 2023 +0200

    marble: parts: Always refresh playback if status changed

     * otherwise dolby would stay active even if you disable its setting

    Change-Id: If59d8081fa12da2aa67e5149db97965c0805d76e

commit b1944744649b6fddcb7bc3864b92f298b6e78821
Author: Adithya R <gh0strider.2k18.reborn@gmail.com>
Date:   Mon Aug 21 13:21:18 2023 +0530

    marble: parts: Introduce Dolby Atmos

    Based on existing dirac implementation and observing stock
    sound effects app and daxservice.

    Thanks to jhenrique09 for the hack from old dirac parts
    "Pause/play music stream to get effects applied".

    TODO: bring back misound (same as stock)

    Co-authored-by: Henrique Silva <jhenrique09.mcz@hotmail.com>

Change-Id: I79841c045fe7b92c438177916f756faab72ff0e9
2025-09-02 02:26:10 +00:00
swiitchOFF
1d06c0bd9d dolby: Yeet Motorola Dolby Interface 2025-09-02 02:25:32 +00:00
swiitchOFF
708a47bda4 dolby: Update readme 2025-08-31 04:31:31 +00:00
New Author Name
892caadbe7 dolby: Switch to AOSPA Dolby Atmos
* Based on Paranoid Android Vauxite (7) [03/08/2025]

Co-Authored-By: Adithya R <gh0strider.2k18.reborn@gmail.com>
Signed-off-by: swiitchOFF <120115258+swiitchOFF@users.noreply.github.com>
2025-08-31 04:31:06 +00:00
swiitchOFF
e7dbf443a2 dolby: Update readme 2025-08-31 08:49:41 +05:30
someone5678
6b1bb6b1e8 dolby: Create missing dolby related directory 2025-08-31 08:49:41 +05:30
keosh
0475f7ef37 FCM: moved to dt to fix kernel target issue 2025-08-29 20:27:43 +05:30
pabloescobar-reborn
0e837f8e94 Revert "dolby: Implement DSPVolumeSynchronizer"
This reverts commit 23662b74ac.
2025-08-28 15:52:17 +00:00
Pabloescobar-reborn
263ba11385 dolby: Rework on dax-default 2025-08-28 21:12:21 +05:30
swiitchOFF
54da022d03 dolby: configs: Rework on dax-default
* It's 😍 on my device and I'm use too with it xD
* From e8daa705f0c0cc3e59da9242e84d15cec8cd1d7d
2025-08-28 09:41:03 +00:00
swiitchOFF
4f911ddffa dolby: Update MotoDolbyDax3.apk [White icon] 2025-08-28 09:41:03 +00:00
swiitchOFF
a4f8660263 dolby: Patch vendor.dolby.media.c2@1.0-service with libshim_dolby
08-25 13:26:29.598  1006  1006 F libc    : Fatal signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 0x0 in tid 1006 (vendor.dolby.me), pid 1006 (vendor.dolby.me)
08-25 13:26:29.731  3084  3084 F DEBUG   : *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
08-25 13:26:29.731  3084  3084 F DEBUG   : crDroid Version: '11.8'
08-25 13:26:29.731  3084  3084 F DEBUG   : Build fingerprint: 'Xiaomi/vili/vili:14/UKQ1.231207.002/V816.0.10.0.UKDMIXM:user/release-keys'
08-25 13:26:29.731  3084  3084 F DEBUG   : Revision: '0'
08-25 13:26:29.731  3084  3084 F DEBUG   : ABI: 'arm64'
08-25 13:26:29.731  3084  3084 F DEBUG   : Timestamp: 2025-08-25 13:26:29.665897496+0530
08-25 13:26:29.731  3084  3084 F DEBUG   : Process uptime: 10s
08-25 13:26:29.731  3084  3084 F DEBUG   : Cmdline: /vendor/bin/hw/vendor.dolby.media.c2@1.0-service
08-25 13:26:29.731  3084  3084 F DEBUG   : pid: 1006, tid: 1006, name: vendor.dolby.me  >>> /vendor/bin/hw/vendor.dolby.media.c2@1.0-service <<<
08-25 13:26:29.731  3084  3084 F DEBUG   : uid: 1046
08-25 13:26:29.731  3084  3084 F DEBUG   : signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 0x0000000000000000
08-25 13:26:29.731  3084  3084 F DEBUG   : Cause: null pointer dereference
08-25 13:26:29.731  3084  3084 F DEBUG   :     x0  b400006f05b52fc0  x1  0000007fc905ed10  x2  0000006f45b59a90  x3  0000007fc905ecd8
08-25 13:26:29.731  3084  3084 F DEBUG   :     x4  0000000000000028  x5  0200006ef5b52470  x6  0000000000000000  x7  0000000000000000
08-25 13:26:29.731  3084  3084 F DEBUG   :     x8  00000000ffffffff  x9  00000000eff00000  x10 0000006fe69e4fa4  x11 0000000012b97fad
08-25 13:26:29.731  3084  3084 F DEBUG   :     x12 0000000000028003  x13 b400006ef5b528e0  x14 0000000000000024  x15 000000000000005f
08-25 13:26:29.731  3084  3084 F DEBUG   :     x16 0000006fe5ebd230  x17 0000006fede1ca84  x18 0000006fef730000  x19 0000000000000000
08-25 13:26:29.731  3084  3084 F DEBUG   :     x20 b400006f05b52eb0  x21 0000006d55852090  x22 0000006fef2fff00  x23 0000000000000000
08-25 13:26:29.731  3084  3084 F DEBUG   :     x24 0000006fef2fff00  x25 b400006d55b59140  x26 0000000000000001  x27 0000000000000000
08-25 13:26:29.731  3084  3084 F DEBUG   :     x28 0000000000000000  x29 0000007fc905ece0
08-25 13:26:29.731  3084  3084 F DEBUG   :     lr  0000006fe5e915f4  sp  0000007fc905ece0  pc  0000006fede1caa0  pst 0000000080001000
08-25 13:26:29.731  3084  3084 F DEBUG   : 7 total frames
08-25 13:26:29.731  3084  3084 F DEBUG   : backtrace:
08-25 13:26:29.731  3084  3084 F DEBUG   :       #00 pc 0000000000010aa0  /vendor/lib64/libutils.so (android::RefBase::decStrong(void const*) const+28) (BuildId: 2fd112063e39cb6f651b185f9e6234f2)
08-25 13:26:29.731  3084  3084 F DEBUG   :       #01 pc 00000000000515f0  /vendor/lib64/android.hardware.media.c2@1.0.so (android::hardware::media::c2::V1_0::BnHwComponentStore::_hidl_createInterface(android::hidl::base::V1_0::BnHwBase*, android::hardware::Parcel const&, android::hardware::Parcel*, std::__1::function<void (android::hardware::Parcel&)>)+376) (BuildId: f0d25f49428387d313920490e7ec7c8c)
08-25 13:26:29.731  3084  3084 F DEBUG   :       #02 pc 00000000000525f0  /vendor/lib64/android.hardware.media.c2@1.0.so (android::hardware::media::c2::V1_0::BnHwComponentStore::onTransact(unsigned int, android::hardware::Parcel const&, android::hardware::Parcel*, unsigned int, std::__1::function<void (android::hardware::Parcel&)>)+1004) (BuildId: f0d25f49428387d313920490e7ec7c8c)
08-25 13:26:29.731  3084  3084 F DEBUG   :       #03 pc 000000000008ab7c  /vendor/lib64/libhidlbase.so (android::hardware::BHwBinder::transact(unsigned int, android::hardware::Parcel const&, android::hardware::Parcel*, unsigned int, std::__1::function<void (android::hardware::Parcel&)>)+92) (BuildId: 1d845c84de7e27fc2c78f04ee8f4aae0)
08-25 13:26:29.731  3084  3084 F DEBUG   :       #04 pc 0000000000042eac  /vendor/lib64/libhidlbase.so (android::hardware::IPCThreadState::joinThreadPool(bool)+1344) (BuildId: 1d845c84de7e27fc2c78f04ee8f4aae0)
08-25 13:26:29.731  3084  3084 F DEBUG   :       #05 pc 000000000000124c  /vendor/bin/hw/vendor.dolby.media.c2@1.0-service (main+500) (BuildId: 394e52c5b5064b9f64c91bd2d615f078)
08-25 13:26:29.731  3084  3084 F DEBUG   :       #06 pc 0000000000055160  /apex/com.android.runtime/lib64/bionic/libc.so (__libc_init+116) (BuildId: b310372d5ddccd24fca9f3a465bff80c)

Co-Authored-By: ZiadTamer <ziadtamer150@gmail.com>
Signed-off-by: swiitchOFF <120115258+swiitchOFF@users.noreply.github.com>
2025-08-28 09:41:03 +00:00
swiitchOFF
187c0074e1 dolby: configs: Enable ac4
* Sony Dolby Atmos have working ac4 on Tidal/Hotstar
2025-08-28 09:41:03 +00:00
swiitchOFF
6b8b7bcae4 dolby: Update readme 2025-08-28 09:41:03 +00:00
swiitchOFF
e2df31f5b8 dolby: Enable ELF checks for libspatialaudio 2025-08-28 09:41:03 +00:00
New Author Name
10d3ac30f4 dolby: Link dolby blobs against v33 libstagefright_foundation
* fixes crashes and absurdly high CPU usage while using dolby

Co-authored-by: Woomymy <woomy@woomy.be>
2025-08-28 09:41:03 +00:00
swiitchOFF
0ea2536cf8 dolby: configs: Kang dax-default from https://github.com/reiryuki/Dolby-Atmos-Spatial-Sound-Moto-Edge-30-Ultra-Magisk-Module 2025-08-28 09:41:03 +00:00
swiitchOFF
8995c02d2d dolby: Kang daxService.apk and MotoDolbyDax3.apk
* From https://t.me/AMRGAMAL_STORE/5508
2025-08-28 09:41:02 +00:00
New Author Name
1c967d1859 dolby: permissions: Kang privapp-com.motorola.dolby.dolbyui.xml 2025-08-28 09:41:02 +00:00
swiitchOFF
82e51d2309 dolby: Switch to Motorola Dolby Interface
* kang from https://github.com/swiitch-OFF-Lab/hardware_dolby/tree/A14-moto
2025-08-28 09:41:02 +00:00
swiitchOFF
ee2f65b964 dolby: Enable elf checks
* Properly link dolby libs against v33 libstagefright_foundation
2025-03-26 06:33:10 +05:30
New Author Name
3c550064a0 dolby: configs: Kang dax-default from https://github.com/reiryuki/Dolby-Atmos-Sony-Xperia-5-V-Magisk-Module 2025-03-25 20:00:04 +05:30
swiitchOFF
56dc82a0a8 dolby: Switch to Sony Dolby Interface
* Taken from https://github.com/reiryuki/Dolby-Atmos-Sony-Xperia-5-V-Magisk-Module
2025-03-12 18:46:39 +05:30
swiitchOFF
496446c564 dolby: Kill XiaomiDolby 2025-03-12 18:44:55 +05:30
98 changed files with 1308 additions and 1042 deletions

1
.gitignore vendored Normal file
View File

@@ -0,0 +1 @@
.vscode/

View File

@@ -14,3 +14,300 @@
soong_namespace {
}
cc_prebuilt_library_shared {
name: "libdapparamstorage",
owner: "xiaomi",
strip: {
none: true,
},
target: {
android_arm64: {
srcs: ["proprietary/vendor/lib64/libdapparamstorage.so"],
shared_libs: ["libcutils", "libutils", "liblog", "libc++", "libc", "libm", "libdl", ],
},
},
compile_multilib: "64",
prefer: true,
soc_specific: true,
}
cc_prebuilt_library_shared {
name: "libdlbdsservice",
owner: "xiaomi",
strip: {
none: true,
},
target: {
android_arm64: {
srcs: ["proprietary/vendor/lib64/libdlbdsservice.so"],
shared_libs: ["libutils", "libcutils", "libstagefright_foundation-v33", "liblog", "libxml2", "libcrypto", "libdapparamstorage", "libsqlite", "libhidlbase", "vendor.dolby.hardware.dms@2.0", "libc++", "libc", "libm", "libdl", ],
},
},
compile_multilib: "64",
prefer: true,
soc_specific: true,
}
cc_prebuilt_library_shared {
name: "libdlbpreg",
owner: "xiaomi",
strip: {
none: true,
},
target: {
android_arm64: {
srcs: ["proprietary/vendor/lib64/libdlbpreg.so"],
shared_libs: ["liblog", "libutils", "libcutils", "libaudioutils", "libstagefright_foundation-v33", "libc++", "libc", "libm", "libdl", ],
},
},
compile_multilib: "64",
prefer: true,
soc_specific: true,
}
cc_prebuilt_library_shared {
name: "libspatializerparamstorage",
owner: "xiaomi",
strip: {
none: true,
},
target: {
android_arm64: {
srcs: ["proprietary/vendor/lib64/libspatializerparamstorage.so"],
shared_libs: ["libcutils", "libutils", "liblog", "libxml2", "libdapparamstorage", "libc++", "libc", "libm", "libdl", ],
},
},
compile_multilib: "64",
prefer: true,
soc_specific: true,
}
cc_prebuilt_library_shared {
name: "vendor.dolby.hardware.dms@2.0-impl",
owner: "xiaomi",
strip: {
none: true,
},
target: {
android_arm64: {
srcs: ["proprietary/vendor/lib64/vendor.dolby.hardware.dms@2.0-impl.so"],
shared_libs: ["libhidlbase", "libutils", "liblog", "libdapparamstorage", "libdlbdsservice", "vendor.dolby.hardware.dms@2.0", "libc++", "libc", "libm", "libdl", ],
},
},
compile_multilib: "64",
prefer: true,
soc_specific: true,
}
cc_prebuilt_library_shared {
name: "vendor.dolby.hardware.dms@2.0",
owner: "xiaomi",
strip: {
none: true,
},
target: {
android_arm64: {
srcs: ["proprietary/vendor/lib64/vendor.dolby.hardware.dms@2.0.so"],
shared_libs: ["libhidlbase", "liblog", "libutils", "libcutils", "libc++", "libc", "libm", "libdl", ],
},
},
compile_multilib: "64",
prefer: true,
soc_specific: true,
}
cc_prebuilt_binary {
name: "vendor.dolby.hardware.dms@2.0-service",
owner: "xiaomi",
target: {
android_arm64: {
srcs: ["proprietary/vendor/bin/hw/vendor.dolby.hardware.dms@2.0-service"],
shared_libs: ["liblog", "libutils", "libhidlbase", "libdapparamstorage", "libdlbdsservice", "vendor.dolby.hardware.dms@2.0", "vendor.dolby.hardware.dms@2.0-impl", "libc++", "libc", "libm", "libdl", ],
},
},
compile_multilib: "64",
strip: {
none: true,
},
prefer: true,
relative_install_path: "hw",
soc_specific: true,
}
cc_prebuilt_library_shared {
name: "libcodec2_soft_ac4dec",
owner: "xiaomi",
strip: {
none: true,
},
target: {
android_arm64: {
srcs: ["proprietary/vendor/lib64/libcodec2_soft_ac4dec.so"],
shared_libs: ["libhidlbase", "vendor.dolby.hardware.dms@2.0", "libdeccfg", "libbase", "libcodec2", "libcodec2_vndk", "libutils", "libcodec2_soft_common", "libcutils", "liblog", "libsfplugin_ccodec_utils", "libstagefright_foundation-v33", "libcodec2_store_dolby", "libc++", "libc", "libm", "libdl", ],
},
},
compile_multilib: "64",
prefer: true,
soc_specific: true,
}
cc_prebuilt_library_shared {
name: "libcodec2_soft_ddpdec",
owner: "xiaomi",
strip: {
none: true,
},
target: {
android_arm64: {
srcs: ["proprietary/vendor/lib64/libcodec2_soft_ddpdec.so"],
shared_libs: ["libhidlbase", "vendor.dolby.hardware.dms@2.0", "libdeccfg", "libbase", "libcodec2", "libcodec2_vndk", "libutils", "libcodec2_soft_common", "libcutils", "liblog", "libsfplugin_ccodec_utils", "libstagefright_foundation-v33", "libcodec2_store_dolby", "libc++", "libc", "libm", "libdl", ],
},
},
compile_multilib: "64",
prefer: true,
soc_specific: true,
}
cc_prebuilt_library_shared {
name: "libcodec2_store_dolby",
owner: "xiaomi",
strip: {
none: true,
},
target: {
android_arm64: {
srcs: ["proprietary/vendor/lib64/libcodec2_store_dolby.so"],
shared_libs: ["libdmabufheap", "libbase", "liblog", "libcodec2", "libcodec2_vndk", "libutils", "libc++", "libc", "libm", "libdl", ],
},
},
compile_multilib: "64",
prefer: true,
soc_specific: true,
}
cc_prebuilt_library_shared {
name: "libdeccfg",
owner: "xiaomi",
strip: {
none: true,
},
target: {
android_arm64: {
srcs: ["proprietary/vendor/lib64/libdeccfg.so"],
shared_libs: ["libhidlbase", "vendor.dolby.hardware.dms@2.0", "libdapparamstorage", "libcutils", "libutils", "liblog", "libc++", "libc", "libm", "libdl", ],
},
},
compile_multilib: "64",
prefer: true,
soc_specific: true,
}
cc_prebuilt_binary {
name: "vendor.dolby.media.c2@1.0-service",
owner: "xiaomi",
target: {
android_arm64: {
srcs: ["proprietary/vendor/bin/hw/vendor.dolby.media.c2@1.0-service"],
shared_libs: ["libbase", "liblog", "libcodec2", "libutils", "android.hardware.media.c2@1.0", "android.hardware.media.c2@1.1", "android.hardware.media.c2@1.2", "libcodec2_hidl@1.0", "libcodec2_hidl@1.1", "libcodec2_hidl@1.2", "libcodec2_vndk", "libhidlbase", "libavservices_minijail", "libbinder", "libcodec2_store_dolby", "libc++", "libc", "libm", "libdl", ],
},
},
compile_multilib: "64",
strip: {
none: true,
},
prefer: true,
relative_install_path: "hw",
soc_specific: true,
}
cc_prebuilt_library_shared {
name: "libdlbvol",
owner: "xiaomi",
strip: {
none: true,
},
target: {
android_arm64: {
srcs: ["proprietary/vendor/lib64/soundfx/libdlbvol.so"],
shared_libs: ["liblog", "libutils", "libcutils", "libaudioutils", "libstagefright_foundation-v33", "libdlbpreg", "vendor.dolby.hardware.dms@2.0", "libc++", "libc", "libm", "libdl", ],
},
},
compile_multilib: "64",
relative_install_path: "soundfx",
prefer: true,
soc_specific: true,
}
cc_prebuilt_library_shared {
name: "libhwdap",
owner: "xiaomi",
strip: {
none: true,
},
target: {
android_arm64: {
srcs: ["proprietary/vendor/lib64/soundfx/libhwdap.so"],
shared_libs: ["libspatializerparamstorage", "liblog", "libutils", "libcutils", "libaudioutils", "libdapparamstorage", "libhidlbase", "libdlbpreg", "vendor.dolby.hardware.dms@2.0", "libstagefright_foundation-v33", "libc++", "libc", "libm", "libdl", ],
},
},
compile_multilib: "64",
relative_install_path: "soundfx",
prefer: true,
soc_specific: true,
}
cc_prebuilt_library_shared {
name: "libswgamedap",
owner: "xiaomi",
strip: {
none: true,
},
target: {
android_arm64: {
srcs: ["proprietary/vendor/lib64/soundfx/libswgamedap.so"],
shared_libs: ["libspatializerparamstorage", "liblog", "libutils", "libcutils", "libaudioutils", "libdapparamstorage", "libhidlbase", "vendor.dolby.hardware.dms@2.0", "libc++", "libc", "libm", "libdl", ],
},
},
compile_multilib: "64",
relative_install_path: "soundfx",
prefer: true,
soc_specific: true,
}
cc_prebuilt_library_shared {
name: "libswspatializer",
owner: "xiaomi",
strip: {
none: true,
},
target: {
android_arm64: {
srcs: ["proprietary/vendor/lib64/soundfx/libswspatializer.so"],
shared_libs: ["liblog", "libutils", "libcutils", "libaudioutils", "libdapparamstorage", "libspatializerparamstorage", "libhidlbase", "libstagefright_foundation-v33", "libdlbpreg", "vendor.dolby.hardware.dms@2.0", "libc++", "libc", "libm", "libdl", ],
},
},
compile_multilib: "64",
relative_install_path: "soundfx",
prefer: true,
soc_specific: true,
}
cc_prebuilt_library_shared {
name: "libswvqe",
owner: "xiaomi",
strip: {
none: true,
},
target: {
android_arm64: {
srcs: ["proprietary/vendor/lib64/soundfx/libswvqe.so"],
shared_libs: ["libspatializerparamstorage", "liblog", "libutils", "libcutils", "libaudioutils", "libdapparamstorage", "libhidlbase", "vendor.dolby.hardware.dms@2.0", "libc++", "libc", "libm", "libdl", ],
},
},
compile_multilib: "64",
relative_install_path: "soundfx",
prefer: true,
soc_specific: true,
}

View File

@@ -1,39 +0,0 @@
//
// 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,
}

View File

@@ -1,30 +0,0 @@
<?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>

View File

@@ -1,5 +0,0 @@
<?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>

View File

@@ -1,9 +0,0 @@
<?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>

View File

@@ -1,5 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<!-- App Name -->
<string name="app_name">DSP Volume Synchronizer</string>
</resources>

View File

@@ -1,16 +0,0 @@
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));
}
}

View File

@@ -1,28 +0,0 @@
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");
}
}
}

View File

@@ -1,30 +0,0 @@
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);
}
}

View File

@@ -1,4 +1,4 @@
Xiaomi Dolby
AOSPA Dolby
==============
Getting Started
@@ -43,18 +43,19 @@ The only change done above is changing := symbol to += so that manifest can't be
At the end an example commit to properly implement it in your device tree could be :-
[**1**] https://github.com/Spanish-or-Vanish/android_device_xiaomi_sm8350-common/commit/2295d515b2d24cb94cc0545b0f80c20ca93af761
[**1**] https://github.com/Spanish-or-Vanish/android_device_xiaomi_sm8350-common/commit/8ece9a976087ed03f1adb447d0ac2a3f5f1a0d3c
[**2**] https://github.com/Spanish-or-Vanish/android_device_xiaomi_sm8350-common/commit/acbc197257083339b9d1b738c5b613f4a0feec7f
[**3**] https://github.com/Spanish-or-Vanish/android_device_xiaomi_sm8350-common/commit/0182c5b44f0984845b8fb71a6006ecd4abffc9d3
[**4**] https://github.com/Spanish-or-Vanish/android_device_xiaomi_sm8350-common/commit/e64cfcc3382ac6915d7d513ef7a69a64eb00659c
[**5**] https://github.com/Spanish-or-Vanish/android_device_xiaomi_sm8350-common/commit/463cd46921e1451c9b8315334f8cf01998469b6d
[**2**] https://github.com/Spanish-or-Vanish/android_device_xiaomi_sm8350-common/commit/2bdd047bfb5f23bd02e6d4db601a97c27e1506f9
#### Tip pick anyone for Reference:
https://dumps.tadiphone.dev/dumps/xiaomi/vili/-/blob/missi_phone_global-user-14-UKQ1.231207.002-V816.0.5.0.UKDMIXM-release-keys/aosp-device-tree/proprietary-files.txt#L2072
https://github.com/Spanish-or-Vanish/android_device_xiaomi_sm8350-common/commit/6a8f6aae347f9f864f17f2dfa5d541f83ab5b170
https://github.com/Spanish-or-Vanish/android_device_xiaomi_sm8350-common/commit/5c593cbd2c19d571b7e62ea4bd6b8c864a4e1d9e
# Credits:
* [**HELLBOY017**](https://github.com/HELLBOY017)
* [**adithya2306**](https://github.com/adithya2306)
* [**johnmart19**](https://github.com/johnmart19)
* [**userariii**](https://github.com/userariii)
* [**saku-bruh**](https://github.com/saku-bruh)
* [**ahnet-69 · he/him**](https://github.com/ahnet-69)

View File

@@ -1,26 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
Copyright (C) 2024 crDroid Android Project
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->
<config>
<!-- Dolby -->
<install-in-user-type package="co.aospa.dolby.xiaomi">
<install-in user-type="FULL" />
<install-in user-type="PROFILE" />
<do-not-install-in user-type="android.os.usertype.profile.CLONE" />
<do-not-install-in user-type="android.os.usertype.profile.PRIVATE" />
</install-in-user-type>
</config>

View File

@@ -1,23 +0,0 @@
/*
* Copyright (C) 2023-24 Paranoid Android
*
* SPDX-License-Identifier: Apache-2.0
*/
package co.aospa.dolby.xiaomi
import android.os.Bundle
import co.aospa.dolby.xiaomi.preference.DolbySettingsFragment
import com.android.settingslib.collapsingtoolbar.CollapsingToolbarBaseActivity
private const val TAG = "DolbyActivity"
class DolbyActivity : CollapsingToolbarBaseActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
fragmentManager.beginTransaction()
.replace(com.android.settingslib.collapsingtoolbar.R.id.content_frame, DolbySettingsFragment(), TAG)
.commit()
}
}

File diff suppressed because it is too large Load Diff

View File

@@ -1,30 +1,14 @@
<?xml version="1.0" encoding="utf-8" ?>
<!-- Copyright 2016 The Android Open Source Project
<!--
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
This file was modified by Dolby Laboratories, Inc. The portions of the
code that are surrounded by "DOLBY..." are copyrighted and
licensed separately, as follows:
(C) 2018 Dolby Laboratories, Inc.
All rights reserved.
This program is protected under international and U.S. Copyright laws as
This program is protected under international and U.S. copyright laws as
an unpublished work. This program is confidential and proprietary to the
copyright owners. Reproduction or disclosure, in whole or in part, or the
production of derivative works therefrom without the express permission of
the copyright owners is prohibited.
Copyright (C) 2020-2021 by Dolby Laboratories,
All rights reserved.
-->
<Included>
@@ -49,7 +33,16 @@
<Limit name="sample-rate" ranges="48000" />
<Limit name="bitrate" range="32000-6144000" />
</Type>
<Attribute name="software-codec" />
</MediaCodec>
<!-- DOLBY_UDC END -->
<!-- DOLBY_AC4 -->
<!-- <MediaCodec name="c2.dolby.ac4.decoder" type="audio/ac4">
<Alias name="OMX.dolby.ac4.decoder" />
<Limit name="channel-count" max="16" />
<Limit name="sample-rate" ranges="48000" />
<Limit name="bitrate" range="16000-2688000" />
</MediaCodec> -->
<!-- DOLBY_AC4 END -->
</Decoders>
</Included>

View File

@@ -26,11 +26,6 @@ AUDIO_FEATURE_ENABLED_DS2_DOLBY_DAP := true
# SEPolicy
BOARD_VENDOR_SEPOLICY_DIRS += $(DOLBY_PATH)/sepolicy/vendor
# HIDL
DEVICE_FRAMEWORK_COMPATIBILITY_MATRIX_FILE += $(DOLBY_PATH)/dolby_framework_matrix.xml
DEVICE_MANIFEST_FILE += $(DOLBY_PATH)/vendor.dolby.hardware.dms@2.0-service.xml
DEVICE_MANIFEST_FILE += $(DOLBY_PATH)/vendor.dolby.media.c2.xml
# Configs
PRODUCT_COPY_FILES += \
@@ -38,33 +33,40 @@ PRODUCT_COPY_FILES += \
$(DOLBY_PATH)/configs/media_codecs_dolby_audio.xml:$(TARGET_COPY_OUT_VENDOR)/etc/media_codecs_dolby_audio.xml
# Dolby VNDK libs
PRODUCT_COPY_FILES += \
prebuilts/vndk/v33/arm/arch-arm-armv7-a-neon/shared/vndk-core/libstagefright_foundation.so:$(TARGET_COPY_OUT_VENDOR)/lib/libstagefright_foundation-v33.so \
prebuilts/vndk/v33/arm64/arch-arm64-armv8-a/shared/vndk-core/libstagefright_foundation.so:$(TARGET_COPY_OUT_VENDOR)/lib64/libstagefright_foundation-v33.so
PRODUCT_PACKAGES += \
libstagefright_foundation-v33
PRODUCT_PACKAGES += \
libshim_dolby
# Init
PRODUCT_PACKAGES += \
init.dolby.rc
# Overlays
PRODUCT_PACKAGES += \
DolbyFrameworksResCommon
# Spatial Audio
# Dolby Spatial Audio
PRODUCT_COPY_FILES += \
$(DOLBY_PATH)/configs/android.hardware.sensor.dynamic.head_tracker.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.sensor.dynamic.head_tracker.xml \
# Spatial Audio: optimize spatializer effect
# Dolby Spatial Audio: optimize spatializer effect
PRODUCT_PROPERTY_OVERRIDES += \
audio.spatializer.effect.util_clamp_min=300
# Spatial Audio: declare use of spatial audio
# Dolby Spatial Audio: declare use of spatial audio
PRODUCT_PROPERTY_OVERRIDES += \
ro.audio.spatializer_enabled=true \
ro.audio.headtracking_enabled=true \
ro.audio.spatializer_transaural_enabled_default=false \
persist.vendor.audio.spatializer.speaker_enabled=true \
# Spatial Audio Proprietary blobs
PRODUCT_COPY_FILES += \
$(DOLBY_PATH)/proprietary/vendor/lib/soundfx/libspatialaudio.so:$(TARGET_COPY_OUT_VENDOR)/lib/soundfx/libspatialaudio.so \
$(DOLBY_PATH)/proprietary/vendor/lib64/soundfx/libspatialaudio.so:$(TARGET_COPY_OUT_VENDOR)/lib64/soundfx/libspatialaudio.so \
# Dolby Spatial Audio Proprietary blobs
PRODUCT_PACKAGES += \
libspatializerparamstorage \
libswspatializer
# Media (C2)
PRODUCT_PACKAGES += \
@@ -92,51 +94,38 @@ PRODUCT_VENDOR_PROPERTIES += \
PRODUCT_PACKAGES += \
RemovePackagesDolby
# DSP Volume Synchronizer
PRODUCT_PACKAGES += \
DSPVolumeSynchronizer
# XiaomiDolby
PRODUCT_PACKAGES += \
XiaomiDolby \
XiaomiDolby
# Dolby Proprietary blobs
PRODUCT_COPY_FILES += \
$(DOLBY_PATH)/proprietary/vendor/bin/hw/vendor.dolby.hardware.dms@2.0-service:$(TARGET_COPY_OUT_VENDOR)/bin/hw/vendor.dolby.hardware.dms@2.0-service \
$(DOLBY_PATH)/proprietary/vendor/etc/init/vendor.dolby.hardware.dms@2.0-service.rc:$(TARGET_COPY_OUT_VENDOR)/etc/init/vendor.dolby.hardware.dms@2.0-service.rc \
$(DOLBY_PATH)/proprietary/vendor/lib/libdapparamstorage.so:$(TARGET_COPY_OUT_VENDOR)/lib/libdapparamstorage.so \
$(DOLBY_PATH)/proprietary/vendor/lib/soundfx/libswgamedap.so:$(TARGET_COPY_OUT_VENDOR)/lib/soundfx/libswgamedap.so \
$(DOLBY_PATH)/proprietary/vendor/lib/soundfx/libswvqe.so:$(TARGET_COPY_OUT_VENDOR)/lib/soundfx/libswvqe.so \
$(DOLBY_PATH)/proprietary/vendor/lib/vendor.dolby.hardware.dms@2.0.so:$(TARGET_COPY_OUT_VENDOR)/lib/vendor.dolby.hardware.dms@2.0.so \
$(DOLBY_PATH)/proprietary/vendor/lib64/libdapparamstorage.so:$(TARGET_COPY_OUT_VENDOR)/lib64/libdapparamstorage.so \
$(DOLBY_PATH)/proprietary/vendor/lib64/libdeccfg.so:$(TARGET_COPY_OUT_VENDOR)/lib64/libdeccfg.so \
$(DOLBY_PATH)/proprietary/vendor/lib64/soundfx/libswgamedap.so:$(TARGET_COPY_OUT_VENDOR)/lib64/soundfx/libswgamedap.so \
$(DOLBY_PATH)/proprietary/vendor/lib64/soundfx/libswvqe.so:$(TARGET_COPY_OUT_VENDOR)/lib64/soundfx/libswvqe.so \
$(DOLBY_PATH)/proprietary/vendor/lib64/vendor.dolby.hardware.dms@2.0-impl.so:$(TARGET_COPY_OUT_VENDOR)/lib64/vendor.dolby.hardware.dms@2.0-impl.so \
$(DOLBY_PATH)/proprietary/vendor/lib64/vendor.dolby.hardware.dms@2.0.so:$(TARGET_COPY_OUT_VENDOR)/lib64/vendor.dolby.hardware.dms@2.0.so \
$(DOLBY_PATH)/proprietary/vendor/etc/init/vendor.dolby.hardware.dms@2.0-service.rc:$(TARGET_COPY_OUT_VENDOR)/etc/init/vendor.dolby.hardware.dms@2.0-service.rc
PRODUCT_COPY_FILES += \
$(DOLBY_PATH)/proprietary/vendor/lib/libdlbpreg.so:$(TARGET_COPY_OUT_VENDOR)/lib/libdlbpreg.so \
$(DOLBY_PATH)/proprietary/vendor/lib/soundfx/libswdap.so:$(TARGET_COPY_OUT_VENDOR)/lib/soundfx/libswdap.so \
$(DOLBY_PATH)/proprietary/vendor/lib64/libdlbpreg.so:$(TARGET_COPY_OUT_VENDOR)/lib64/libdlbpreg.so \
$(DOLBY_PATH)/proprietary/vendor/lib64/liboem_specific.so:$(TARGET_COPY_OUT_VENDOR)/lib64/liboem_specific.so \
$(DOLBY_PATH)/proprietary/vendor/lib64/soundfx/libswdap.so:$(TARGET_COPY_OUT_VENDOR)/lib64/soundfx/libswdap.so \
PRODUCT_PACKAGES += \
libdapparamstorage \
libdlbdsservice \
libdlbpreg \
vendor.dolby.hardware.dms@2.0-impl \
vendor.dolby.hardware.dms@2.0 \
vendor.dolby.hardware.dms@2.0-service
# Codec2 (Dolby)
PRODUCT_COPY_FILES += \
$(DOLBY_PATH)/proprietary/vendor/bin/hw/vendor.dolby.media.c2@1.0-service:$(TARGET_COPY_OUT_VENDOR)/bin/hw/vendor.dolby.media.c2@1.0-service \
$(DOLBY_PATH)/proprietary/vendor/etc/init/vendor.dolby.media.c2@1.0-service.rc:$(TARGET_COPY_OUT_VENDOR)/etc/init/vendor.dolby.media.c2@1.0-service.rc \
$(DOLBY_PATH)/proprietary/vendor/lib64/libcodec2_soft_ac4dec.so:$(TARGET_COPY_OUT_VENDOR)/lib64/libcodec2_soft_ac4dec.so \
$(DOLBY_PATH)/proprietary/vendor/lib64/libcodec2_soft_ddpdec.so:$(TARGET_COPY_OUT_VENDOR)/lib64/libcodec2_soft_ddpdec.so \
$(DOLBY_PATH)/proprietary/vendor/lib64/libcodec2_soft_dolby.so:$(TARGET_COPY_OUT_VENDOR)/lib64/libcodec2_soft_dolby.so \
$(DOLBY_PATH)/proprietary/vendor/lib64/libcodec2_store_dolby.so:$(TARGET_COPY_OUT_VENDOR)/lib64/libcodec2_store_dolby.so \
$(DOLBY_PATH)/proprietary/vendor/lib64/libdeccfg.so:$(TARGET_COPY_OUT_VENDOR)/lib64/libdeccfg.so \
$(DOLBY_PATH)/proprietary/vendor/etc/init/vendor.dolby.media.c2@1.0-service.rc:$(TARGET_COPY_OUT_VENDOR)/etc/init/vendor.dolby.media.c2@1.0-service.rc
# Patched Proprietary Blobs
PRODUCT_COPY_FILES += \
$(DOLBY_PATH)/proprietary/vendor/lib64/libdlbdsservice.so:$(TARGET_COPY_OUT_VENDOR)/lib64/libdlbdsservice.so \
PRODUCT_PACKAGES += \
libcodec2_soft_ac4dec \
libcodec2_soft_ddpdec \
libcodec2_store_dolby \
libdeccfg \
vendor.dolby.media.c2@1.0-service
# Dolby SoundFX Blobs
PRODUCT_PACKAGES += \
libdlbvol \
libhwdap \
libswgamedap \
libswvqe
# Not Xiaomi Proprietary Blobs
PRODUCT_COPY_FILES += \
$(DOLBY_PATH)/proprietary/vendor/lib/soundfx/libdlbvol.so:$(TARGET_COPY_OUT_VENDOR)/lib/soundfx/libdlbvol.so \
$(DOLBY_PATH)/proprietary/vendor/lib64/soundfx/libdlbvol.so:$(TARGET_COPY_OUT_VENDOR)/lib64/soundfx/libdlbvol.so \

View File

@@ -15,7 +15,7 @@ android_app {
system_ext_specific: true,
privileged: true,
overrides: ["MusicFX", "AudioFX"],
overrides: ["MusicFX"],
static_libs: [
"SettingsLib",
"SpaLib",
@@ -23,15 +23,5 @@ android_app {
"androidx.compose.material3_material3",
"androidx.compose.runtime_runtime",
"androidx.preference_preference",
"org.lineageos.settings.resources",
],
required: ["preinstalled-packages-platform-dolby.xml"],
}
prebuilt_etc {
name: "preinstalled-packages-platform-dolby.xml",
src: "preinstalled-packages-platform-dolby.xml",
sub_dir: "sysconfig",
system_ext_specific: true,
}

View File

@@ -13,20 +13,23 @@
android:icon="@mipmap/ic_launcher"
android:allowBackup="false"
android:label="@string/dolby_title"
android:persistent="true">
android:persistent="true"
android:directBootAware="true"
android:defaultToDeviceProtectedStorage="true"
android:theme="@style/Theme.SubSettingsBase.Expressive">
<receiver
android:name=".BootCompletedReceiver"
android:exported="true">
<intent-filter android:priority="1000">
<action android:name="android.intent.action.BOOT_COMPLETED" />
<action android:name="android.intent.action.LOCKED_BOOT_COMPLETED" />
</intent-filter>
</receiver>
<activity
android:name=".DolbyActivity"
android:name=".DolbySettingsActivity"
android:label="@string/dolby_title"
android:theme="@style/Theme.SubSettingsBase"
android:exported="true">
<intent-filter>
<action android:name="com.android.settings.action.IA_SETTINGS" />
@@ -50,7 +53,6 @@
<activity
android:name=".geq.EqualizerActivity"
android:label="@string/dolby_preset"
android:theme="@style/Theme.SubSettingsBase"
android:exported="true" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />

View File

@@ -0,0 +1,10 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="960"
android:viewportHeight="960"
android:tint="?attr/colorControlNormal">
<path
android:fillColor="@android:color/white"
android:pathData="M653,752L565,840L480,755L568,667Q564,656 562,644Q560,632 560,620Q560,562 601,521Q642,480 700,480Q718,480 735,484.5Q752,489 767,497L672,592L728,648L823,554Q831,569 835.5,585.5Q840,602 840,620Q840,678 799,719Q758,760 700,760Q687,760 675.5,758Q664,756 653,752ZM831,400L748,400Q722,312 649,256Q576,200 480,200Q363,200 281.5,281.5Q200,363 200,480Q200,552 232.5,612Q265,672 320,710L320,600L400,600L400,840L160,840L160,760L254,760Q192,710 156,637.5Q120,565 120,480Q120,405 148.5,339.5Q177,274 225.5,225.5Q274,177 339.5,148.5Q405,120 480,120Q609,120 706.5,199.5Q804,279 831,400Z"/>
</vector>

View File

@@ -10,8 +10,8 @@
<item>@string/dolby_profile_dynamic</item>
<item>@string/dolby_profile_video</item>
<item>@string/dolby_profile_music</item>
<item>@string/dolby_profile_game</item>
<item>@string/dolby_profile_voice</item>
<item>@string/dolby_profile_custom</item>
</string-array>
<string-array name="dolby_profile_values">
@@ -19,7 +19,7 @@
<item>1</item>
<item>2</item>
<item>8</item>
<item>9</item>
<item>3</item>
</string-array>
<string-array name="dolby_preset_entries" translatable="false">
@@ -57,41 +57,11 @@
<item>40,24,8,8,8,-4,-16,-12,-8,-32,-56,-24,8,8,8,8,8,8,8,8</item>
</string-array>
<string-array name="dolby_dialogue_entries">
<item>@string/dolby_off</item>
<item>@string/dolby_low</item>
<item>@string/dolby_medium</item>
<item>@string/dolby_high</item>
<item>@string/dolby_max</item>
</string-array>
<string-array name="dolby_dialogue_values">
<item>0</item>
<item>2</item>
<item>6</item>
<item>9</item>
<item>12</item>
</string-array>
<string-array name="dolby_stereo_entries">
<item>@string/dolby_low</item>
<item>@string/dolby_medium</item>
<item>@string/dolby_high</item>
<item>@string/dolby_max</item>
</string-array>
<string-array name="dolby_stereo_values">
<item>4</item>
<item>24</item>
<item>44</item>
<item>64</item>
</string-array>
<string-array name="dolby_ieq_entries">
<item>@string/dolby_off</item>
<item>@string/dolby_detailed</item>
<item>@string/dolby_balanced</item>
<item>@string/dolby_warm</item>
<item>@string/dolby_detailed</item>
</string-array>
<string-array name="dolby_ieq_values">

View File

@@ -0,0 +1,14 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
Copyright (C) 2023-25 Paranoid Android
SPDX-License-Identifier: Apache-2.0
-->
<resources>
<!-- Whether stereo widening levels are supported -->
<bool name="dolby_stereo_widening_supported">true</bool>
<!-- Whether volume leveler is supported -->
<bool name="dolby_volume_leveler_supported">true</bool>
</resources>

View File

@@ -0,0 +1,16 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
Copyright (C) 2025 Paranoid Android
SPDX-License-Identifier: Apache-2.0
-->
<resources>
<!-- Stereo widening amount -->
<integer name="stereo_widening_min">4</integer>
<integer name="stereo_widening_max">64</integer>
<!-- Dialogue enhancer amount -->
<integer name="dialogue_enhancer_min">1</integer>
<integer name="dialogue_enhancer_max">12</integer>
</resources>

View File

@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
Copyright (C) 2023-24 Paranoid Android
Copyright (C) 2023-25 Paranoid Android
SPDX-License-Identifier: Apache-2.0
-->
<resources>
@@ -19,22 +19,25 @@
<string name="dolby_unknown">Unknown</string>
<string name="dolby_on_with_profile">On (%1$s)</string>
<string name="dolby_category_settings">Settings</string>
<string name="dolby_category_adv_settings">Advanced settings</string>
<string name="dolby_adv_settings_footer">Choose a different profile to show advanced settings.</string>
<string name="dolby_bass_enhancer">Bass enhancer</string>
<string name="dolby_dialogue_enhancer">Dialogue enhancer</string>
<string name="dolby_spk_virtualizer">Speaker virtualization</string>
<string name="dolby_hp_virtualizer">Headphone virtualization</string>
<string name="dolby_stereo_widening">Stereo widening</string>
<string name="dolby_spk_virtualizer">Speaker surround virtualizer</string>
<string name="dolby_hp_virtualizer">Headphone surround virtualizer</string>
<string name="dolby_volume_leveler">Volume leveler</string>
<string name="dolby_connect_headphones">Connect headphones</string>
<string name="dolby_reset_profile">Reset to defaults</string>
<string name="dolby_reset_profile_toast">Successfully reset settings for %1$s profile</string>
<string name="dolby_reset_all">Reset profiles</string>
<string name="dolby_reset_all_message">This will reset all profiles to factory defaults.</string>
<string name="dolby_reset_all_toast">Succesfully reset all profiles</string>
<string name="dolby_strength">Strength</string>
<!-- Dolby profiles -->
<string name="dolby_profile_dynamic">Dynamic</string>
<string name="dolby_profile_video">Movie/Video</string>
<string name="dolby_profile_music">Music</string>
<string name="dolby_profile_game">Game</string>
<string name="dolby_profile_voice">Voice</string>
<string name="dolby_profile_custom">Custom</string>
<!-- Dolby equalizer presets -->
<string name="dolby_preset_default">Flat (off)</string>
@@ -48,6 +51,7 @@
<string name="dolby_preset_country">Country</string>
<string name="dolby_preset_dance">Dance</string>
<string name="dolby_preset_metal">Metal</string>
<string name="dolby_preset_custom">Custom</string>
<!-- Dolby equalizer UI -->
<string name="dolby_geq_slider_label_gain">Gain</string>

View File

@@ -1,10 +1,11 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
Copyright (C) 2023-24 Paranoid Android
Copyright (C) 2023-25 Paranoid Android
SPDX-License-Identifier: Apache-2.0
-->
<PreferenceScreen
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:title="@string/dolby_title">
<com.android.settingslib.widget.MainSwitchPreference
@@ -14,6 +15,7 @@
<ListPreference
android:key="dolby_profile"
android:dependency="dolby_enable"
android:entries="@array/dolby_profile_entries"
android:entryValues="@array/dolby_profile_values"
android:defaultValue="0"
@@ -22,7 +24,9 @@
android:icon="@drawable/ic_dolby" />
<PreferenceCategory
android:title="@string/dolby_category_settings">
android:key="dolby_category_settings"
android:title="@string/dolby_category_settings"
android:dependency="dolby_enable">
<Preference
android:key="dolby_preset"
@@ -33,6 +37,17 @@
android:targetClass="co.aospa.dolby.xiaomi.geq.EqualizerActivity" />
</Preference>
<SwitchPreferenceCompat
android:key="dolby_bass"
android:title="@string/dolby_bass_enhancer" />
</PreferenceCategory>
<PreferenceCategory
android:key="dolby_category_adv_settings"
android:title="@string/dolby_category_adv_settings"
android:dependency="dolby_enable">
<co.aospa.dolby.xiaomi.preference.DolbyIeqPreference
android:key="dolby_ieq"
android:entries="@array/dolby_ieq_entries"
@@ -47,31 +62,33 @@
android:key="dolby_virtualizer"
android:title="@string/dolby_hp_virtualizer" />
<ListPreference
android:key="dolby_stereo"
android:entries="@array/dolby_stereo_entries"
android:entryValues="@array/dolby_stereo_values"
android:title="@string/dolby_stereo_widening"
android:dependency="dolby_virtualizer" />
<ListPreference
android:key="dolby_dialogue"
android:entries="@array/dolby_dialogue_entries"
android:entryValues="@array/dolby_dialogue_values"
android:title="@string/dolby_dialogue_enhancer" />
<SeekBarPreference
android:key="dolby_stereo_widening"
android:title="@string/dolby_strength"
android:dependency="dolby_virtualizer"
android:min="@integer/stereo_widening_min"
android:max="@integer/stereo_widening_max"/>
<SwitchPreferenceCompat
android:key="dolby_bass"
android:title="@string/dolby_bass_enhancer" />
android:key="dolby_dialogue_enabled"
android:title="@string/dolby_dialogue_enhancer" />
<SeekBarPreference
android:key="dolby_dialogue_amount"
android:title="@string/dolby_strength"
android:dependency="dolby_dialogue_enabled"
android:min="@integer/dialogue_enhancer_min"
android:max="@integer/dialogue_enhancer_max"/>
<SwitchPreferenceCompat
android:key="dolby_volume"
android:title="@string/dolby_volume_leveler" />
<Preference
android:key="dolby_reset"
android:title="@string/dolby_reset_profile" />
</PreferenceCategory>
<com.android.settingslib.widget.FooterPreference
android:key="dolby_adv_settings_footer"
android:title="@string/dolby_adv_settings_footer"
android:selectable="false" />
</PreferenceScreen>

View File

@@ -17,11 +17,15 @@ class BootCompletedReceiver : BroadcastReceiver() {
override fun onReceive(context: Context, intent: Intent) {
Log.d(TAG, "Received intent: ${intent.action}")
if (intent.action != Intent.ACTION_BOOT_COMPLETED) {
return
when (intent.action) {
Intent.ACTION_LOCKED_BOOT_COMPLETED -> {
// we perform everything in the initializer
DolbyController.getInstance(context)
}
Intent.ACTION_BOOT_COMPLETED -> {
DolbyController.getInstance(context).onBootCompleted()
}
else -> Log.e(TAG, "unhandled intent action")
}
Log.i(TAG, "Boot completed, starting dolby")
DolbyController.getInstance(context).onBootCompleted()
}
}

View File

@@ -34,8 +34,9 @@ class DolbyConstants {
const val PREF_IEQ = "dolby_ieq"
const val PREF_HP_VIRTUALIZER = "dolby_virtualizer"
const val PREF_SPK_VIRTUALIZER = "dolby_spk_virtualizer"
const val PREF_STEREO = "dolby_stereo"
const val PREF_DIALOGUE = "dolby_dialogue"
const val PREF_STEREO_WIDENING = "dolby_stereo_widening"
const val PREF_DIALOGUE = "dolby_dialogue_enabled"
const val PREF_DIALOGUE_AMOUNT = "dolby_dialogue_amount"
const val PREF_BASS = "dolby_bass"
const val PREF_VOLUME = "dolby_volume"
const val PREF_RESET = "dolby_reset"
@@ -45,15 +46,16 @@ class DolbyConstants {
PREF_IEQ,
PREF_HP_VIRTUALIZER,
PREF_SPK_VIRTUALIZER,
PREF_STEREO,
PREF_STEREO_WIDENING,
PREF_DIALOGUE,
PREF_DIALOGUE_AMOUNT,
PREF_BASS,
PREF_VOLUME
)
fun dlog(tag: String, msg: String) {
if (Log.isLoggable(TAG, Log.DEBUG)) {
Log.d(tag, msg)
if (Log.isLoggable(TAG, Log.DEBUG) || Log.isLoggable(tag, Log.DEBUG)) {
Log.d("$TAG-$tag", msg)
}
}
}

View File

@@ -1,5 +1,5 @@
/*
* Copyright (C) 2023-24 Paranoid Android
* Copyright (C) 2023-25 Paranoid Android
*
* SPDX-License-Identifier: Apache-2.0
*/
@@ -23,8 +23,12 @@ internal class DolbyController private constructor(
private val context: Context
) {
private var dolbyEffect = DolbyAudioEffect(EFFECT_PRIORITY, audioSession = 0)
private val audioManager = context.getSystemService(AudioManager::class.java)
private val audioManager = context.getSystemService(AudioManager::class.java)!!
private val handler = Handler(context.mainLooper)
private val stereoWideningSupported =
context.getResources().getBoolean(R.bool.dolby_stereo_widening_supported)
private val volumeLevelerSupported =
context.getResources().getBoolean(R.bool.dolby_volume_leveler_supported)
// Restore current profile on every media session
private val playbackCallback = object : AudioPlaybackCallback() {
@@ -57,10 +61,10 @@ internal class DolbyController private constructor(
field = value
dlog(TAG, "setRegisterCallbacks($value)")
if (value) {
audioManager!!.registerAudioPlaybackCallback(playbackCallback, handler)
audioManager.registerAudioPlaybackCallback(playbackCallback, handler)
audioManager.registerAudioDeviceCallback(audioDeviceCallback, handler)
} else {
audioManager!!.unregisterAudioPlaybackCallback(playbackCallback)
audioManager.unregisterAudioPlaybackCallback(playbackCallback)
audioManager.unregisterAudioDeviceCallback(audioDeviceCallback)
}
}
@@ -91,27 +95,30 @@ internal class DolbyController private constructor(
}
init {
dlog(TAG, "initialized")
}
fun onBootCompleted() {
dlog(TAG, "onBootCompleted")
// Restore our main settings
val prefs = PreferenceManager.getDefaultSharedPreferences(context)
dsOn = prefs.getBoolean(DolbyConstants.PREF_ENABLE, true)
context.resources.getStringArray(R.array.dolby_profile_values)
.map { it.toInt() }
.forEach { profile ->
// Reset dolby first to prevent it from loading bad settings
dolbyEffect.resetProfileSpecificSettings(profile)
// Now restore our profile-specific settings
restoreSettings(profile)
}
.map { it.toInt() }
.forEach { profile ->
// Reset dolby first to prevent it from loading bad settings
dolbyEffect.resetProfileSpecificSettings(profile)
// Now restore our profile-specific settings
restoreSettings(profile)
}
// Finally restore the current profile.
setCurrentProfile()
dlog(TAG, "initialized")
}
fun onBootCompleted () {
dlog(TAG, "onBootCompleted()")
// Migrate presets from credential protected storage if needed
maybeMigratePresets()
}
private fun restoreSettings(profile: Int) {
@@ -121,6 +128,20 @@ internal class DolbyController private constructor(
prefs.getString(DolbyConstants.PREF_PRESET, getPreset(profile))!!,
profile
)
setBassEnhancerEnabled(
prefs.getBoolean(DolbyConstants.PREF_BASS, getBassEnhancerEnabled(profile)),
profile
)
setVolumeLevelerEnabled(
// force disable if unsupported, else force enable on dynamic profile
volumeLevelerSupported && (profile == 0 ||
prefs.getBoolean(DolbyConstants.PREF_VOLUME, getVolumeLevelerEnabled(profile))),
profile
)
if (profile == 0) {
// below settings are not applicable for dynamic
return
}
setIeqPreset(
prefs.getString(
DolbyConstants.PREF_IEQ,
@@ -137,27 +158,45 @@ internal class DolbyController private constructor(
profile
)
setStereoWideningAmount(
prefs.getString(
DolbyConstants.PREF_STEREO,
getStereoWideningAmount(profile).toString()
prefs.getInt(
DolbyConstants.PREF_STEREO_WIDENING,
getStereoWideningAmount(profile)
)!!.toInt(),
profile
)
setDialogueEnhancerEnabled(
prefs.getBoolean(
DolbyConstants.PREF_DIALOGUE,
getDialogueEnhancerEnabled(profile)
),
profile
)
setDialogueEnhancerAmount(
prefs.getString(
DolbyConstants.PREF_DIALOGUE,
getDialogueEnhancerAmount(profile).toString()
prefs.getInt(
DolbyConstants.PREF_DIALOGUE_AMOUNT,
getDialogueEnhancerAmount(profile)
)!!.toInt(),
profile
)
setBassEnhancerEnabled(
prefs.getBoolean(DolbyConstants.PREF_BASS, getBassEnhancerEnabled(profile)),
profile
)
setVolumeLevelerEnabled(
prefs.getBoolean(DolbyConstants.PREF_VOLUME, getVolumeLevelerEnabled(profile)),
profile
)
}
private fun maybeMigratePresets() {
val prefs = PreferenceManager.getDefaultSharedPreferences(context)
if (prefs.getBoolean(PREF_KEY_PRESETS_MIGRATED, false)) {
return
}
val ceContext = context.createCredentialProtectedStorageContext()
val cePrefs = ceContext.getSharedPreferences(PREF_PRESETS, Context.MODE_PRIVATE)
if (cePrefs.all.isEmpty()) {
dlog(TAG, "no presets to migrate")
return
}
if (context.moveSharedPreferencesFrom(ceContext, PREF_PRESETS)) {
prefs.edit().putBoolean(PREF_KEY_PRESETS_MIGRATED, true).apply()
dlog(TAG, "presets migrated successfully")
} else {
Log.w(TAG, "failed to migrate presets")
}
}
private fun checkEffect() {
@@ -174,6 +213,13 @@ internal class DolbyController private constructor(
profile = prefs.getString(DolbyConstants.PREF_PROFILE, "0" /*dynamic*/)!!.toInt()
}
fun setDsOnAndPersist(dsOn: Boolean) {
this.dsOn = dsOn
PreferenceManager.getDefaultSharedPreferences(context).edit()
.putBoolean(DolbyConstants.PREF_ENABLE, dsOn)
.apply()
}
fun getProfileName(): String? {
val profile = dolbyEffect.profile.toString()
val profiles = context.resources.getStringArray(R.array.dolby_profile_values)
@@ -184,13 +230,27 @@ internal class DolbyController private constructor(
)[profileIndex]
}
fun resetProfileSpecificSettings() {
dlog(TAG, "resetProfileSpecificSettings")
fun resetProfileSpecificSettings(profile: Int = this.profile) {
dlog(TAG, "resetProfileSpecificSettings($profile)")
checkEffect()
dolbyEffect.resetProfileSpecificSettings()
dolbyEffect.resetProfileSpecificSettings(profile)
context.deleteSharedPreferences("profile_$profile")
}
fun resetAllProfiles() {
dlog(TAG, "resetAllProfiles")
checkEffect()
// Reset profile-specific settings
context.resources.getStringArray(R.array.dolby_profile_values)
.map { it.toInt() }
.forEach { resetProfileSpecificSettings(it) }
// Set default dynamic profile
profile = 0
PreferenceManager.getDefaultSharedPreferences(context).edit()
.putString(DolbyConstants.PREF_PROFILE, "0")
.apply()
}
fun getPreset(profile: Int = this.profile): String {
val gains = dolbyEffect.getDapParameter(DsParam.GEQ_BAND_GAINS, profile)
return gains.joinToString(separator = ",").also {
@@ -202,20 +262,20 @@ internal class DolbyController private constructor(
dlog(TAG, "setPreset: $value")
checkEffect()
val gains = value.split(",")
.map { it.toInt() }
.toIntArray()
.map { it.toInt() }
.toIntArray()
dolbyEffect.setDapParameter(DsParam.GEQ_BAND_GAINS, gains, profile)
}
fun getPresetName(): String {
val preset = getPreset()
val presets = context.resources.getStringArray(R.array.dolby_preset_values)
val presetIndex = presets.indexOf(getPreset())
return if (presetIndex == -1) {
"Custom"
val userPresets = context.getSharedPreferences(PREF_PRESETS, Context.MODE_PRIVATE)
return if (presets.contains(preset)) {
context.resources.getStringArray(R.array.dolby_preset_entries)[presets.indexOf(preset)]
} else {
context.resources.getStringArray(
R.array.dolby_preset_entries
)[presetIndex]
userPresets.all.entries.firstOrNull { it.value == preset }?.key
?: context.getString(R.string.dolby_preset_custom)
}
}
@@ -264,29 +324,40 @@ internal class DolbyController private constructor(
}
fun getStereoWideningAmount(profile: Int = this.profile) =
dolbyEffect.getDapParameterInt(DsParam.STEREO_WIDENING_AMOUNT, profile).also {
dlog(TAG, "getStereoWideningAmount: $it")
if (!stereoWideningSupported) {
0
} else {
dolbyEffect.getDapParameterInt(DsParam.STEREO_WIDENING_AMOUNT, profile).also {
dlog(TAG, "getStereoWideningAmount: $it")
}
}
fun setStereoWideningAmount(value: Int, profile: Int = this.profile) {
if (!stereoWideningSupported) return
dlog(TAG, "setStereoWideningAmount: $value")
checkEffect()
dolbyEffect.setDapParameter(DsParam.STEREO_WIDENING_AMOUNT, value, profile)
}
fun getDialogueEnhancerAmount(profile: Int = this.profile): Int {
val enabled = dolbyEffect.getDapParameterBool(DsParam.DIALOGUE_ENHANCER_ENABLE, profile)
val amount = if (enabled) {
dolbyEffect.getDapParameterInt(DsParam.DIALOGUE_ENHANCER_AMOUNT, profile)
} else 0
dlog(TAG, "getDialogueEnhancerAmount: enabled=$enabled amount=$amount")
return amount
fun getDialogueEnhancerEnabled(profile: Int = this.profile) =
dolbyEffect.getDapParameterBool(DsParam.DIALOGUE_ENHANCER_ENABLE, profile).also {
dlog(TAG, "getDialogueEnhancerEnabled: $it")
}
fun setDialogueEnhancerEnabled(value: Boolean, profile: Int = this.profile) {
dlog(TAG, "setDialogueEnhancerEnabled: $value")
checkEffect()
dolbyEffect.setDapParameter(DsParam.DIALOGUE_ENHANCER_ENABLE, value, profile)
}
fun getDialogueEnhancerAmount(profile: Int = this.profile) =
dolbyEffect.getDapParameterInt(DsParam.DIALOGUE_ENHANCER_AMOUNT, profile).also {
dlog(TAG, "getDialogueEnhancerAmount: $it")
}
fun setDialogueEnhancerAmount(value: Int, profile: Int = this.profile) {
dlog(TAG, "setDialogueEnhancerAmount: $value")
checkEffect()
dolbyEffect.setDapParameter(DsParam.DIALOGUE_ENHANCER_ENABLE, (value > 0), profile)
dolbyEffect.setDapParameter(DsParam.DIALOGUE_ENHANCER_AMOUNT, value, profile)
}
@@ -304,6 +375,8 @@ internal class DolbyController private constructor(
companion object {
private const val TAG = "DolbyController"
private const val EFFECT_PRIORITY = 100
private const val PREF_PRESETS = "presets"
private const val PREF_KEY_PRESETS_MIGRATED = "presets_migrated"
@Volatile
private var instance: DolbyController? = null

View File

@@ -0,0 +1,69 @@
/*
* Copyright (C) 2023-25 Paranoid Android
*
* SPDX-License-Identifier: Apache-2.0
*/
package co.aospa.dolby.xiaomi
import android.app.AlertDialog
import android.os.Bundle
import android.view.Menu
import android.view.MenuItem
import android.widget.Toast
import co.aospa.dolby.xiaomi.preference.DolbySettingsFragment
import com.android.settingslib.collapsingtoolbar.CollapsingToolbarBaseActivity
class DolbySettingsActivity : CollapsingToolbarBaseActivity() {
private lateinit var dolbyController: DolbyController
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
supportFragmentManager
.beginTransaction()
.replace(
com.android.settingslib.collapsingtoolbar.R.id.content_frame,
DolbySettingsFragment(),
TAG
)
.commit()
dolbyController = DolbyController.getInstance(this)
}
override fun onCreateOptionsMenu(menu: Menu): Boolean {
menu
.add(Menu.NONE, MENU_RESET, Menu.NONE, R.string.dolby_reset_all)
.setIcon(R.drawable.reset_wrench_24px)
.setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM)
return super.onCreateOptionsMenu(menu)
}
override fun onOptionsItemSelected(item: MenuItem): Boolean =
when (item.itemId) {
MENU_RESET -> {
confirmReset()
true
}
else -> super.onOptionsItemSelected(item)
}
private fun confirmReset() {
AlertDialog.Builder(this)
.setTitle(R.string.dolby_reset_all)
.setMessage(R.string.dolby_reset_all_message)
.setPositiveButton(android.R.string.yes) { _, _ ->
dolbyController.resetAllProfiles()
recreate()
Toast.makeText(this, getString(R.string.dolby_reset_all_toast), Toast.LENGTH_SHORT)
.show()
}
.setNegativeButton(android.R.string.no, null)
.show()
}
companion object {
private const val TAG = "DolbySettingsActivity"
private const val MENU_RESET = 1001
}
}

View File

@@ -26,7 +26,7 @@ class DolbyTileService : TileService() {
override fun onClick() {
val isDsOn = dolbyController.dsOn
dolbyController.dsOn = !isDsOn
dolbyController.setDsOnAndPersist(!isDsOn) // toggle
qsTile.apply {
state = if (isDsOn) Tile.STATE_INACTIVE else Tile.STATE_ACTIVE
updateTile()

View File

@@ -58,13 +58,14 @@ class SummaryProvider : ContentProvider() {
): Int = 0
private fun getDolbySummary(): String {
val dolbyController = DolbyController.getInstance(context!!)
val context = context!!
val dolbyController = DolbyController.getInstance(context)
if (!dolbyController.dsOn) {
return context!!.getString(R.string.dolby_off)
return context.getString(R.string.dolby_off)
}
return dolbyController.getProfileName()?.let {
context!!.getString(R.string.dolby_on_with_profile, it)
} ?: context!!.getString(R.string.dolby_on)
context.getString(R.string.dolby_on_with_profile, it)
} ?: context.getString(R.string.dolby_on)
}
}

View File

@@ -7,7 +7,7 @@
package co.aospa.dolby.xiaomi.geq.data
data class Preset(
var name: String,
var name: String? = null,
val bandGains: List<BandGain>,
var isUserDefined: Boolean = false,
var isMutated: Boolean = false

View File

@@ -16,30 +16,27 @@ import androidx.compose.material3.Surface
import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier
import androidx.compose.ui.unit.dp
import com.android.settingslib.spa.framework.theme.settingsBackground
import com.android.settingslib.spa.framework.theme.SettingsDimension
import com.android.settingslib.spa.framework.theme.SettingsTheme
@Composable
fun EqualizerScreen(
viewModel: EqualizerViewModel,
modifier: Modifier = Modifier
) {
SettingsTheme {
Surface(
modifier = Modifier
.fillMaxSize()
.padding(SettingsDimension.itemPadding)
.then(modifier),
color = MaterialTheme.colorScheme.background
Surface(
modifier = Modifier
.fillMaxSize()
.padding(SettingsDimension.itemPadding)
.then(modifier),
color = MaterialTheme.colorScheme.settingsBackground
) {
Column(
verticalArrangement = Arrangement.Top,
modifier = Modifier.fillMaxHeight()
) {
Column(
verticalArrangement = Arrangement.Top,
modifier = Modifier.fillMaxHeight()
) {
PresetSelector(viewModel = viewModel)
EqualizerBands(viewModel = viewModel)
}
PresetSelector(viewModel = viewModel)
EqualizerBands(viewModel = viewModel)
}
}
}

View File

@@ -27,10 +27,10 @@ class EqualizerViewModel(
private val repository: EqualizerRepository
) : ViewModel() {
private val _presets = MutableStateFlow(repository.builtInPresets)
private val _presets = MutableStateFlow<List<Preset>>(repository.builtInPresets)
val presets = _presets.asStateFlow()
private val _preset = MutableStateFlow(repository.defaultPreset)
private val _preset = MutableStateFlow<Preset>(repository.defaultPreset)
val preset = _preset.asStateFlow()
private var presetRestored = false
@@ -52,10 +52,7 @@ class EqualizerViewModel(
val bandGains = repository.getBandGains()
_preset.value = _presets.value.find {
bandGains == it.bandGains
} ?: Preset(
name = "Custom",
bandGains = bandGains
)
} ?: Preset(bandGains = bandGains)
dlog(TAG, "restored preset: ${_preset.value}")
presetRestored = true
}
@@ -101,7 +98,8 @@ class EqualizerViewModel(
dlog(TAG, "setGain($index, $gain)")
_preset.value = _preset.value.run {
copy(
name = if (!isUserDefined) "Custom" else name,
// if we're modifying predefined preset, set name to null so UI shows "Custom"
name = if (!isUserDefined) null else name,
bandGains = bandGains
.toMutableList()
// create a new object to ensure the flow emits an update.
@@ -117,7 +115,7 @@ class EqualizerViewModel(
// Ensure we don't have another preset with the same name
return if (
_presets.value
.any { it.name.equals(name.trim(), ignoreCase = true) }
.any { it.name!!.equals(name.trim(), ignoreCase = true) }
) {
PresetNameValidationError.NAME_EXISTS
} else if (name.length > 50) {

View File

@@ -61,7 +61,7 @@ fun PresetSelector(viewModel: EqualizerViewModel) {
.weight(1f)
) {
TextField(
value = currentPreset.name,
value = currentPreset.name ?: stringResource(id = R.string.dolby_preset_custom),
onValueChange = { },
readOnly = true,
label = {
@@ -86,7 +86,7 @@ fun PresetSelector(viewModel: EqualizerViewModel) {
) {
presets.forEach { preset ->
DropdownMenuItem(
text = { Text(text = preset.name) },
text = { Text(text = preset.name!!) },
onClick = {
viewModel.setPreset(preset)
expanded = false
@@ -147,7 +147,7 @@ fun PresetSelector(viewModel: EqualizerViewModel) {
if (showRenamePresetDialog) {
PresetNameDialog(
title = stringResource(id = R.string.dolby_geq_rename_preset),
presetName = currentPreset.name,
presetName = currentPreset.name!!,
onPresetNameSet = {
return@PresetNameDialog viewModel.renamePreset(
preset = currentPreset,

View File

@@ -27,7 +27,7 @@ fun TooltipIconButton(
onClick: () -> Unit
) {
TooltipBox(
positionProvider = TooltipDefaults.rememberPlainTooltipPositionProvider(),
positionProvider = TooltipDefaults.rememberTooltipPositionProvider(),
tooltip = {
Text(text)
},

View File

@@ -32,14 +32,11 @@ class DolbyIeqPreference(
iconView.setImageDrawable(icon)
}
private fun getIeqIconResId(): Int {
val ieqValue = value?.toIntOrNull() ?: 0
return when (ieqValue) {
0 -> R.drawable.ic_ieq_off
1 -> R.drawable.ic_ieq_balanced
2 -> R.drawable.ic_ieq_warm
3 -> R.drawable.ic_ieq_detailed
else -> 0 // should never hit this!
private fun getIeqIconResId(): Int =
when (findIndexOfValue(value)) {
1 -> R.drawable.ic_ieq_detailed
2 -> R.drawable.ic_ieq_balanced
3 -> R.drawable.ic_ieq_warm
else -> R.drawable.ic_ieq_off
}
}
}

View File

@@ -40,24 +40,24 @@ class DolbyPreferenceStore(
override fun putBoolean(key: String, value: Boolean) =
getSharedPreferences(key).edit()
.putBoolean(key, value)
.apply()
.putBoolean(key, value)
.apply()
override fun getBoolean(key: String, defValue: Boolean) =
getSharedPreferences(key).getBoolean(key, defValue)
override fun putInt(key: String, value: Int) =
getSharedPreferences(key).edit()
.putInt(key, value)
.apply()
.putInt(key, value)
.apply()
override fun getInt(key: String, defValue: Int) =
getSharedPreferences(key).getInt(key, defValue)
override fun putString(key: String, value: String?) =
getSharedPreferences(key).edit()
.putString(key, value)
.apply()
.putString(key, value)
.apply()
override fun getString(key: String, defValue: String?) =
getSharedPreferences(key).getString(key, defValue)

View File

@@ -1,5 +1,5 @@
/*
* Copyright (C) 2023-24 Paranoid Android
* Copyright (C) 2023-25 Paranoid Android
*
* SPDX-License-Identifier: Apache-2.0
*/
@@ -12,17 +12,18 @@ import android.media.AudioDeviceInfo
import android.media.AudioManager
import android.os.Bundle
import android.os.Handler
import android.widget.CompoundButton
import android.widget.CompoundButton.OnCheckedChangeListener
import android.widget.Toast
import androidx.core.os.postDelayed
import androidx.preference.ListPreference
import androidx.preference.Preference
import androidx.preference.Preference.OnPreferenceChangeListener
import androidx.preference.PreferenceFragment
import androidx.preference.PreferenceCategory
import androidx.preference.SeekBarPreference
import androidx.preference.SwitchPreferenceCompat
import co.aospa.dolby.xiaomi.DolbyConstants
import co.aospa.dolby.xiaomi.DolbyConstants.Companion.PREF_BASS
import co.aospa.dolby.xiaomi.DolbyConstants.Companion.PREF_DIALOGUE
import co.aospa.dolby.xiaomi.DolbyConstants.Companion.PREF_DIALOGUE_AMOUNT
import co.aospa.dolby.xiaomi.DolbyConstants.Companion.PREF_ENABLE
import co.aospa.dolby.xiaomi.DolbyConstants.Companion.PREF_HP_VIRTUALIZER
import co.aospa.dolby.xiaomi.DolbyConstants.Companion.PREF_IEQ
@@ -30,15 +31,16 @@ import co.aospa.dolby.xiaomi.DolbyConstants.Companion.PREF_PRESET
import co.aospa.dolby.xiaomi.DolbyConstants.Companion.PREF_PROFILE
import co.aospa.dolby.xiaomi.DolbyConstants.Companion.PREF_RESET
import co.aospa.dolby.xiaomi.DolbyConstants.Companion.PREF_SPK_VIRTUALIZER
import co.aospa.dolby.xiaomi.DolbyConstants.Companion.PREF_STEREO
import co.aospa.dolby.xiaomi.DolbyConstants.Companion.PREF_STEREO_WIDENING
import co.aospa.dolby.xiaomi.DolbyConstants.Companion.PREF_VOLUME
import co.aospa.dolby.xiaomi.DolbyConstants.Companion.dlog
import co.aospa.dolby.xiaomi.DolbyController
import co.aospa.dolby.xiaomi.R
import com.android.settingslib.widget.MainSwitchPreference
import com.android.settingslib.widget.SettingsBasePreferenceFragment
class DolbySettingsFragment : PreferenceFragment(),
OnPreferenceChangeListener, CompoundButton.OnCheckedChangeListener {
class DolbySettingsFragment : SettingsBasePreferenceFragment(),
OnPreferenceChangeListener {
private val switchBar by lazy {
findPreference<MainSwitchPreference>(PREF_ENABLE)!!
@@ -52,11 +54,11 @@ class DolbySettingsFragment : PreferenceFragment(),
private val ieqPref by lazy {
findPreference<DolbyIeqPreference>(PREF_IEQ)!!
}
private val stereoPref by lazy {
findPreference<ListPreference>(PREF_STEREO)!!
}
private val dialoguePref by lazy {
findPreference<ListPreference>(PREF_DIALOGUE)!!
findPreference<SwitchPreferenceCompat>(PREF_DIALOGUE)!!
}
private val dialogueAmountPref by lazy {
findPreference<SeekBarPreference>(PREF_DIALOGUE_AMOUNT)!!
}
private val bassPref by lazy {
findPreference<SwitchPreferenceCompat>(PREF_BASS)!!
@@ -67,15 +69,20 @@ class DolbySettingsFragment : PreferenceFragment(),
private val spkVirtPref by lazy {
findPreference<SwitchPreferenceCompat>(PREF_SPK_VIRTUALIZER)!!
}
private val volumePref by lazy {
findPreference<SwitchPreferenceCompat>(PREF_VOLUME)!!
private val settingsCategory by lazy {
findPreference<PreferenceCategory>("dolby_category_settings")!!
}
private val resetPref by lazy {
findPreference<Preference>(PREF_RESET)!!
private val advSettingsCategory by lazy {
findPreference<PreferenceCategory>("dolby_category_adv_settings")!!
}
private val advSettingsFooter by lazy {
findPreference<Preference>("dolby_adv_settings_footer")!!
}
private var volumePref: SwitchPreferenceCompat? = null
private var stereoPref: SeekBarPreference? = null
private val dolbyController by lazy { DolbyController.getInstance(context) }
private val audioManager by lazy { context.getSystemService(AudioManager::class.java) }
private val dolbyController by lazy { DolbyController.getInstance(requireContext()) }
private val audioManager by lazy { requireContext().getSystemService(AudioManager::class.java)!! }
private val handler = Handler()
private var isOnSpeaker = true
@@ -100,70 +107,75 @@ class DolbySettingsFragment : PreferenceFragment(),
override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) {
dlog(TAG, "onCreatePreferences")
addPreferencesFromResource(R.xml.dolby_settings)
setPreferencesFromResource(R.xml.dolby_settings, rootKey)
val profile = dolbyController.profile
preferenceManager.preferenceDataStore = DolbyPreferenceStore(context).also {
it.profile = profile
stereoPref = findPreference<SeekBarPreference>(PREF_STEREO_WIDENING)!!
if (!resources.getBoolean(R.bool.dolby_stereo_widening_supported)) {
settingsCategory.removePreference(stereoPref!!)
stereoPref = null
}
volumePref = findPreference<SwitchPreferenceCompat>(PREF_VOLUME)!!
if (!resources.getBoolean(R.bool.dolby_volume_leveler_supported)) {
advSettingsCategory.removePreference(volumePref!!)
volumePref = null
}
preferenceManager.preferenceDataStore = DolbyPreferenceStore(requireContext()).also {
it.profile = dolbyController.profile
}
val dsOn = dolbyController.dsOn
switchBar.addOnSwitchChangeListener(this)
switchBar.onPreferenceChangeListener = this
switchBar.setChecked(dsOn)
profilePref.onPreferenceChangeListener = this
profilePref.setEnabled(dsOn)
profilePref.apply {
if (entryValues.contains(profile.toString())) {
summary = "%s"
value = profile.toString()
} else {
summary = context.getString(R.string.dolby_unknown)
}
}
hpVirtPref.onPreferenceChangeListener = this
spkVirtPref.onPreferenceChangeListener = this
stereoPref.onPreferenceChangeListener = this
stereoPref?.apply {
onPreferenceChangeListener = this@DolbySettingsFragment
min = context.resources.getInteger(R.integer.stereo_widening_min)
max = context.resources.getInteger(R.integer.stereo_widening_max)
}
dialoguePref.onPreferenceChangeListener = this
dialogueAmountPref.apply {
onPreferenceChangeListener = this@DolbySettingsFragment
min = context.resources.getInteger(R.integer.dialogue_enhancer_min)
max = context.resources.getInteger(R.integer.dialogue_enhancer_max)
}
bassPref.onPreferenceChangeListener = this
volumePref.onPreferenceChangeListener = this
volumePref?.onPreferenceChangeListener = this
ieqPref.onPreferenceChangeListener = this
resetPref.setOnPreferenceClickListener {
dolbyController.resetProfileSpecificSettings()
updateProfileSpecificPrefs()
Toast.makeText(
context,
context.getString(R.string.dolby_reset_profile_toast, profilePref.summary),
Toast.LENGTH_SHORT
).show()
true
}
audioManager!!.registerAudioDeviceCallback(audioDeviceCallback, handler)
audioManager.registerAudioDeviceCallback(audioDeviceCallback, handler)
updateSpeakerState()
updateProfileSpecificPrefs()
updateProfileSpecificPrefsImmediate()
}
override fun onDestroyView() {
dlog(TAG, "onDestroyView")
audioManager!!.unregisterAudioDeviceCallback(audioDeviceCallback)
audioManager.unregisterAudioDeviceCallback(audioDeviceCallback)
handler.removeCallbacksAndMessages(null)
super.onDestroyView()
}
override fun onResume() {
super.onResume()
updateProfileSpecificPrefs()
updateProfileSpecificPrefsImmediate()
}
override fun onPreferenceChange(preference: Preference, newValue: Any): Boolean {
dlog(TAG, "onPreferenceChange: key=${preference.key} value=$newValue")
when (preference.key) {
PREF_ENABLE -> {
val isChecked = newValue as Boolean
dlog(TAG, "PREF_ENABLE -> $isChecked")
dolbyController.dsOn = isChecked
updateProfileSpecificPrefs()
}
PREF_PROFILE -> {
val profile = newValue.toString().toInt()
dolbyController.profile = profile
(preferenceManager.preferenceDataStore as DolbyPreferenceStore).profile = profile
updateProfileSpecificPrefs()
}
@@ -175,12 +187,16 @@ class DolbySettingsFragment : PreferenceFragment(),
dolbyController.setHeadphoneVirtEnabled(newValue as Boolean)
}
PREF_STEREO -> {
dolbyController.setStereoWideningAmount(newValue.toString().toInt())
PREF_STEREO_WIDENING -> {
dolbyController.setStereoWideningAmount(newValue as Int)
}
PREF_DIALOGUE -> {
dolbyController.setDialogueEnhancerAmount(newValue.toString().toInt())
dolbyController.setDialogueEnhancerEnabled(newValue as Boolean)
}
PREF_DIALOGUE_AMOUNT -> {
dolbyController.setDialogueEnhancerAmount(newValue as Int)
}
PREF_BASS -> {
@@ -200,43 +216,50 @@ class DolbySettingsFragment : PreferenceFragment(),
return true
}
override fun onCheckedChanged(buttonView: CompoundButton, isChecked: Boolean) {
dlog(TAG, "onCheckedChanged($isChecked)")
dolbyController.dsOn = isChecked
profilePref.setEnabled(isChecked)
updateProfileSpecificPrefs()
}
private fun updateSpeakerState() {
val device = audioManager!!.getDevicesForAttributes(ATTRIBUTES_MEDIA)[0]
val device = audioManager.getDevicesForAttributes(ATTRIBUTES_MEDIA)[0]
isOnSpeaker = (device.type == AudioDeviceInfo.TYPE_BUILTIN_SPEAKER)
}
private fun updateProfileSpecificPrefs() {
val unknownRes = context.getString(R.string.dolby_unknown)
val headphoneRes = context.getString(R.string.dolby_connect_headphones)
val dsOn = dolbyController.dsOn
handler.postDelayed(100) { updateProfileSpecificPrefsImmediate() }
}
private fun updateProfileSpecificPrefsImmediate() {
if (context == null) return
if (!dolbyController.dsOn) {
dlog(TAG, "updateProfileSpecificPrefs: Dolby is off")
advSettingsCategory.isVisible = false
return
}
val unknownRes = getString(R.string.dolby_unknown)
val headphoneRes = getString(R.string.dolby_connect_headphones)
val currentProfile = dolbyController.profile
val isDynamicProfile = currentProfile == 0
(preferenceManager.preferenceDataStore as DolbyPreferenceStore).profile = currentProfile
dlog(
TAG, "updateProfileSpecificPrefs: dsOn=$dsOn currentProfile=$currentProfile"
+ " isOnSpeaker=$isOnSpeaker"
)
dlog(TAG, "updateProfileSpecificPrefs: currentProfile=$currentProfile")
val enable = dsOn && (currentProfile != -1)
presetPref.setEnabled(enable)
spkVirtPref.setEnabled(enable)
ieqPref.setEnabled(enable)
dialoguePref.setEnabled(enable)
volumePref.setEnabled(enable)
bassPref.setEnabled(enable)
resetPref.setEnabled(enable)
hpVirtPref.setEnabled(enable && !isOnSpeaker)
stereoPref.setEnabled(enable && !isOnSpeaker)
profilePref.apply {
if (entryValues.contains(currentProfile.toString())) {
summary = "%s"
value = currentProfile.toString()
} else {
summary = unknownRes
dlog(TAG, "current profile $currentProfile unknown")
}
}
if (!enable) return
// hide advanced settings on dynamic profile
advSettingsCategory.isVisible = !isDynamicProfile
advSettingsFooter.isVisible = isDynamicProfile
presetPref.summary = dolbyController.getPresetName()
bassPref.isChecked = dolbyController.getBassEnhancerEnabled(currentProfile)
// below prefs are not visible on dynamic profile
if (isDynamicProfile) return
val ieqValue = dolbyController.getIeqPreset(currentProfile)
ieqPref.apply {
@@ -245,50 +268,22 @@ class DolbySettingsFragment : PreferenceFragment(),
value = ieqValue.toString()
} else {
summary = unknownRes
dlog(TAG, "ieq value $ieqValue unknown")
}
}
val deValue = dolbyController.getDialogueEnhancerAmount(currentProfile).toString()
dialoguePref.apply {
if (entryValues.contains(deValue)) {
summary = "%s"
value = deValue
} else {
summary = unknownRes
}
}
spkVirtPref.setChecked(dolbyController.getSpeakerVirtEnabled(currentProfile))
volumePref.setChecked(dolbyController.getVolumeLevelerEnabled(currentProfile))
bassPref.setChecked(dolbyController.getBassEnhancerEnabled(currentProfile))
// below prefs are not enabled on loudspeaker
if (isOnSpeaker) {
stereoPref.summary = headphoneRes
hpVirtPref.summary = headphoneRes
return
}
val swValue = dolbyController.getStereoWideningAmount(currentProfile).toString()
stereoPref.apply {
if (entryValues.contains(swValue)) {
summary = "%s"
value = swValue
} else {
summary = unknownRes
}
}
hpVirtPref.apply {
setChecked(dolbyController.getHeadphoneVirtEnabled(currentProfile))
summary = null
}
dialoguePref.isChecked = dolbyController.getDialogueEnhancerEnabled(currentProfile)
dialogueAmountPref.value = dolbyController.getDialogueEnhancerAmount(currentProfile)
spkVirtPref.isChecked = dolbyController.getSpeakerVirtEnabled(currentProfile)
volumePref?.isChecked = dolbyController.getVolumeLevelerEnabled(currentProfile)
hpVirtPref.isChecked = dolbyController.getHeadphoneVirtEnabled(currentProfile)
stereoPref?.value = dolbyController.getStereoWideningAmount(currentProfile)
}
companion object {
private const val TAG = "DolbySettingsFragment"
private val ATTRIBUTES_MEDIA = AudioAttributes.Builder()
.setUsage(AudioAttributes.USAGE_MEDIA)
.build()
.setUsage(AudioAttributes.USAGE_MEDIA)
.build()
}
}

View File

@@ -1,18 +0,0 @@
<compatibility-matrix version="4.0" type="framework">
<hal format="hidl" optional="true">
<name>vendor.dolby.hardware.dms</name>
<version>2.0</version>
<interface>
<name>IDms</name>
<instance>default</instance>
</interface>
</hal>
<hal format="hidl" optional="true">
<name>android.hardware.media.c2</name>
<version>1.0</version>
<interface>
<name>IComponentStore</name>
<instance>default1</instance>
</interface>
</hal>
</compatibility-matrix>

17
libshims/Android.bp Normal file
View File

@@ -0,0 +1,17 @@
//
// Copyright (C) 2023 The LineageOS Project
//
// SPDX-License-Identifier: Apache-2.0
//
cc_library_shared {
name: "libshim_dolby",
srcs: ["libshim_dolby.cpp"],
compile_multilib: "64",
shared_libs: [
"liblog",
"libdl",
"libc",
],
vendor: true,
}

View File

@@ -0,0 +1,27 @@
//
// SPDX-FileCopyrightText: The LineageOS Project
// SPDX-License-Identifier: Apache-2.0
//
#include <log/log.h>
#include <dlfcn.h>
extern "C" void _ZNK7android7RefBase9incStrongEPKv(void* thisptr, const void* id) {
if (!thisptr) {
ALOGE("DolbyShim: incStrong called on nullptr!");
return;
}
typedef void (*RealFunc)(void*, const void*);
static RealFunc real = (RealFunc)dlsym(RTLD_NEXT, "_ZNK7android7RefBase9incStrongEPKv");
if (real) real(thisptr, id);
}
extern "C" void _ZNK7android7RefBase9decStrongEPKv(void* thisptr, const void* id) {
if (!thisptr) {
ALOGE("DolbyShim: decStrong called on nullptr!");
return;
}
typedef void (*RealFunc)(void*, const void*);
static RealFunc real = (RealFunc)dlsym(RTLD_NEXT, "_ZNK7android7RefBase9decStrongEPKv");
if (real) real(thisptr, id);
}

BIN
proprietary/vendor/bin/hw/vendor.dolby.hardware.dms@2.0-service vendored Normal file → Executable file

Binary file not shown.

BIN
proprietary/vendor/bin/hw/vendor.dolby.media.c2@1.0-service vendored Normal file → Executable file

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

6
rootdir/etc/Android.bp Normal file
View File

@@ -0,0 +1,6 @@
prebuilt_etc {
name: "init.dolby.rc",
src: "init.dolby.rc",
sub_dir: "init",
soc_specific: true
}

View File

@@ -0,0 +1,4 @@
on early-boot
# Dolby
mkdir /data/vendor/dolby 0770 media media
mkdir /data/vendor/multimedia 0775 system system

View File

@@ -1,11 +0,0 @@
<manifest version="1.0" type="device">
<hal format="hidl">
<name>vendor.dolby.hardware.dms</name>
<transport>hwbinder</transport>
<version>2.0</version>
<interface>
<name>IDms</name>
<instance>default</instance>
</interface>
</hal>
</manifest>

View File

@@ -1,19 +0,0 @@
<!--
This program is protected under international and U.S. copyright laws as
an unpublished work. This program is confidential and proprietary to the
copyright owners. Reproduction or disclosure, in whole or in part, or the
production of derivative works therefrom without the express permission of
the copyright owners is prohibited.
Copyright (C) 2020-2021 by Dolby Laboratories,
All rights reserved.
-->
<manifest version="1.0" type="device">
<hal format="hidl">
<name>android.hardware.media.c2</name>
<transport>hwbinder</transport>
<fqname>@1.0::IComponentStore/default1</fqname>
</hal>
</manifest>