diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/devicesettings/DeviceSettingsPreferenceConst.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/devicesettings/DeviceSettingsPreferenceConst.java index b7bc61d515..aa16b13e2d 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/devicesettings/DeviceSettingsPreferenceConst.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/devicesettings/DeviceSettingsPreferenceConst.java @@ -379,7 +379,7 @@ public class DeviceSettingsPreferenceConst { public static final String PREF_NOTHING_EAR1_ULTRA_BASS_LEVEL = "pref_nothing_ultra_bass_level"; public static final String PREF_HEADPHONES_EQUALIZER = "pref_headphones_equalizer"; public static final String PREF_HEADPHONES_LOW_LATENCY = "pref_headphones_low_latency"; - + public static final String PREF_NOTHING_EAR1_SPATIAL_AUDIO = "pref_nothing_spatial_audio"; public static final String PREF_HUAWEI_FREEBUDS_INEAR = "pref_freebuds_inear_detection"; public static final String PREF_HUAWEI_FREEBUDS_AUDIOMODE = "pref_freebuds_audiomode"; diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/devicesettings/DeviceSpecificSettingsFragment.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/devicesettings/DeviceSpecificSettingsFragment.java index b56b415c57..b2986d5919 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/devicesettings/DeviceSpecificSettingsFragment.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/devicesettings/DeviceSpecificSettingsFragment.java @@ -739,9 +739,10 @@ public class DeviceSpecificSettingsFragment extends AbstractPreferenceFragment i addPreferenceHandlerFor(PREF_NOTHING_EAR1_INEAR); addPreferenceHandlerFor(PREF_NOTHING_EAR1_AUDIOMODE); addPreferenceHandlerFor(PREF_HEADPHONES_LOW_LATENCY); + addPreferenceHandlerFor(PREF_HEADPHONES_EQUALIZER); addPreferenceHandlerFor(PREF_NOTHING_EAR1_ULTRA_BASS_ENABLED); addPreferenceHandlerFor(PREF_NOTHING_EAR1_ULTRA_BASS_LEVEL); - addPreferenceHandlerFor(PREF_HEADPHONES_EQUALIZER); + addPreferenceHandlerFor(PREF_NOTHING_EAR1_SPATIAL_AUDIO); addPreferenceHandlerFor(PREF_HUAWEI_FREEBUDS_INEAR); addPreferenceHandlerFor(PREF_HUAWEI_FREEBUDS_AUDIOMODE); diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/nothing/AbstractEarCoordinator.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/nothing/AbstractEarCoordinator.java index 20ef5a8b25..d35f915390 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/nothing/AbstractEarCoordinator.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/nothing/AbstractEarCoordinator.java @@ -81,6 +81,9 @@ public abstract class AbstractEarCoordinator extends AbstractBLClassicDeviceCoor final List touchOptions = deviceSpecificSettings.addRootScreen(DeviceSpecificSettingsScreen.TOUCH_OPTIONS); touchOptions.add(R.xml.devicesettings_cmf_buds_touch_options); } + if (supportsSpatialAudio()) { + audio.add(R.xml.devicesettings_nothing_spatial_audio); + } if (supportsLowLatency()) { final List connection = deviceSpecificSettings.addRootScreen(DeviceSpecificSettingsScreen.CONNECTION); connection.add(R.xml.devicesettings_headphones_low_latency); @@ -129,4 +132,6 @@ public abstract class AbstractEarCoordinator extends AbstractBLClassicDeviceCoor public boolean supportsTouchOptions() { return false; } + + public boolean supportsSpatialAudio() { return false; } } diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/nothing/CmfBuds2PlusCoordinator.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/nothing/CmfBuds2PlusCoordinator.java index d1e10b2653..2af99367f5 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/nothing/CmfBuds2PlusCoordinator.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/nothing/CmfBuds2PlusCoordinator.java @@ -69,4 +69,8 @@ public class CmfBuds2PlusCoordinator extends AbstractEarCoordinator { @Override public boolean supportsLowLatency() { return true; } + + @Override + public boolean supportsSpatialAudio() { return true; } + } diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/nothing/Ear1Support.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/nothing/Ear1Support.java index d2c3efb4c0..ff7cb025ca 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/nothing/Ear1Support.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/nothing/Ear1Support.java @@ -89,6 +89,9 @@ public class Ear1Support extends AbstractHeadphoneBTBRDeviceSupport { if (getCoordinator().supportsTouchOptions()) { sendCommand(builder, nothingProtocol.encodeTouchOptionsRequest()); } + if (getCoordinator().supportsSpatialAudio()) { + sendCommand(builder, nothingProtocol.encodeSpatialAudioReq()); + } return builder; } @@ -175,6 +178,10 @@ public class Ear1Support extends AbstractHeadphoneBTBRDeviceSupport { "set touch options " + config, nothingProtocol.encodeTouchOptions(config, prefs) ); + + case DeviceSettingsPreferenceConst.PREF_NOTHING_EAR1_SPATIAL_AUDIO: + byte spatial = (byte)(prefs.getBoolean(DeviceSettingsPreferenceConst.PREF_NOTHING_EAR1_SPATIAL_AUDIO, false) ? 0x01 : 0x00); + sendCommand("set spatial audio", nothingProtocol.encodeSpatialAudio(spatial)); break; default: LOG.debug("CONFIG: " + config); @@ -211,6 +218,7 @@ public class Ear1Support extends AbstractHeadphoneBTBRDeviceSupport { private static final short low_latency_status = (short) 0xc041; private static final short equalizer_status = (short) 0xc050; private static final short ultra_bass_status = (short) 0xc04e; + private static final short spatial_audio_status = (short) 0xc04f; private static final short unk_maybe_ack = (short) 0xf002; private static final short unk_close_case = (short) 0xe002; //sent twice when the case is closed with earphones in @@ -223,6 +231,7 @@ public class Ear1Support extends AbstractHeadphoneBTBRDeviceSupport { private static final short low_latency = (short) 0xf040; private static final short equalizer = (short) 0xf01d; private static final short ultra_bass = (short) 0xf051; + private static final short spatial_audio = (short) 0xf052; private final boolean incrementCounter; private int messageCounter = 0x00; @@ -322,6 +331,9 @@ public class Ear1Support extends AbstractHeadphoneBTBRDeviceSupport { devEvts.add(handleUltraBassStatus(payload)); } break; + case spatial_audio_status: + devEvts.add(handleSpatialAudio(payload)); + break; case low_latency_status: devEvts.add(handleLowLatency(payload)); break; @@ -399,6 +411,10 @@ public class Ear1Support extends AbstractHeadphoneBTBRDeviceSupport { return encodeMessage((short) 0x120, ultra_bass_status, new byte[]{}); } + byte[] encodeSpatialAudioReq() { + return encodeMessage((short) 0x120, spatial_audio_status, new byte[]{}); + } + byte[] encodeInEarDetectionReq() { return encodeMessage((short) 0x120, in_ear_detection_status, new byte[]{}); } @@ -465,7 +481,14 @@ public class Ear1Support extends AbstractHeadphoneBTBRDeviceSupport { final int level = Math.max(1, Math.min(5, ((payload[1] & 0xff) + 1) / 2)); preferencesEvent.withPreference(DeviceSettingsPreferenceConst.PREF_NOTHING_EAR1_ULTRA_BASS_LEVEL, level); } + return preferencesEvent; + } + private GBDeviceEventUpdatePreferences handleSpatialAudio(byte[] payload) { + final GBDeviceEventUpdatePreferences preferencesEvent = new GBDeviceEventUpdatePreferences(); + if (payload.length >= 1) { + preferencesEvent.withPreference(DeviceSettingsPreferenceConst.PREF_NOTHING_EAR1_SPATIAL_AUDIO, payload[0] == 0x01 ? true : false); + } return preferencesEvent; } @@ -528,6 +551,10 @@ public class Ear1Support extends AbstractHeadphoneBTBRDeviceSupport { return encodeMessage((short) 0x120, in_ear_detection, new byte[]{0x01, 0x01, enabled}); } + byte[] encodeSpatialAudio(byte enabled) { + return encodeMessage((short) 0x120, spatial_audio, new byte[]{enabled}); + } + byte[] encodeAudioMode(String desired) { int modeBitmask = NothingAudioMode.valueOf("off").getBitmask(); try { diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index b20cf4aaab..3cbf10877f 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -3218,6 +3218,8 @@ Classical Custom Dirac + Spatial Audio + An immersive listening experience that makes you feel like you\'re part of the music, movie or game. Equalizer Preset Normal Bass boost diff --git a/app/src/main/res/xml/devicesettings_nothing_spatial_audio.xml b/app/src/main/res/xml/devicesettings_nothing_spatial_audio.xml new file mode 100644 index 0000000000..edcd5729c1 --- /dev/null +++ b/app/src/main/res/xml/devicesettings_nothing_spatial_audio.xml @@ -0,0 +1,11 @@ + + + +