From 041aa4faf21f2f0b5ca6de1dae7805e125e5992f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20Rebelo?= Date: Fri, 30 Dec 2022 18:26:44 +0000 Subject: [PATCH] Sony WF-1000XM4: Fix audio codec --- .../protocol/impl/v2/PayloadTypeV2.java | 4 +++ .../protocol/impl/v2/SonyProtocolImplV2.java | 36 ++++++++++++++++--- .../impl/v2/SonyProtocolImplV2Test.java | 3 +- 3 files changed, 38 insertions(+), 5 deletions(-) diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/sony/headphones/protocol/impl/v2/PayloadTypeV2.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/sony/headphones/protocol/impl/v2/PayloadTypeV2.java index 668777712..190433a5d 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/sony/headphones/protocol/impl/v2/PayloadTypeV2.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/sony/headphones/protocol/impl/v2/PayloadTypeV2.java @@ -19,6 +19,10 @@ package nodomain.freeyourgadget.gadgetbridge.service.devices.sony.headphones.pro import nodomain.freeyourgadget.gadgetbridge.service.devices.sony.headphones.protocol.MessageType; public enum PayloadTypeV2 { + AUDIO_CODEC_REQUEST(MessageType.COMMAND_1, 0x12), + AUDIO_CODEC_REPLY(MessageType.COMMAND_1, 0x13), + AUDIO_CODEC_NOTIFY(MessageType.COMMAND_1, 0x15), + BATTERY_LEVEL_REQUEST(MessageType.COMMAND_1, 0x22), BATTERY_LEVEL_REPLY(MessageType.COMMAND_1, 0x23), BATTERY_LEVEL_NOTIFY(MessageType.COMMAND_1, 0x25), diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/sony/headphones/protocol/impl/v2/SonyProtocolImplV2.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/sony/headphones/protocol/impl/v2/SonyProtocolImplV2.java index 2d45ea40a..d95c71a09 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/sony/headphones/protocol/impl/v2/SonyProtocolImplV2.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/sony/headphones/protocol/impl/v2/SonyProtocolImplV2.java @@ -112,8 +112,13 @@ public class SonyProtocolImplV2 extends SonyProtocolImplV1 { @Override public Request getAudioCodec() { - LOG.warn("Audio codec not implemented for V2"); - return null; + return new Request( + PayloadTypeV2.AUDIO_CODEC_REQUEST.getMessageType(), + new byte[]{ + PayloadTypeV2.AUDIO_CODEC_REQUEST.getCode(), + (byte) 0x02 + } + ); } @Override @@ -346,6 +351,9 @@ public class SonyProtocolImplV2 extends SonyProtocolImplV1 { final PayloadTypeV2 payloadType = PayloadTypeV2.fromCode(messageType, payload[0]); switch (payloadType) { + case AUDIO_CODEC_REPLY: + case AUDIO_CODEC_NOTIFY: + return handleAudioCodec(payload); case BATTERY_LEVEL_NOTIFY: case BATTERY_LEVEL_REPLY: return handleBattery(payload); @@ -545,8 +553,28 @@ public class SonyProtocolImplV2 extends SonyProtocolImplV1 { @Override public List handleAudioCodec(final byte[] payload) { - LOG.warn("Audio codec not implemented for V2"); - return Collections.emptyList(); + if (payload.length != 3) { + LOG.warn("Unexpected payload length {}", payload.length); + return Collections.emptyList(); + } + + if (payload[1] != 0x02) { + LOG.warn("Not audio codec, ignoring"); + return Collections.emptyList(); + } + + final AudioCodec audioCodec = AudioCodec.fromCode(payload[2]); + if (audioCodec == null) { + LOG.warn("Unable to determine audio codec from {}", GB.hexdump(payload)); + return Collections.emptyList(); + } + + final GBDeviceEventUpdateDeviceInfo gbDeviceEventUpdateDeviceInfo = new GBDeviceEventUpdateDeviceInfo("AUDIO_CODEC: ", audioCodec.name()); + + final GBDeviceEventUpdatePreferences gbDeviceEventUpdatePreferences = new GBDeviceEventUpdatePreferences() + .withPreference(DeviceSettingsPreferenceConst.PREF_SONY_AUDIO_CODEC, audioCodec.name().toLowerCase(Locale.getDefault())); + + return Arrays.asList(gbDeviceEventUpdateDeviceInfo, gbDeviceEventUpdatePreferences); } @Override diff --git a/app/src/test/java/nodomain/freeyourgadget/gadgetbridge/service/devices/sony/headphones/protocol/impl/v2/SonyProtocolImplV2Test.java b/app/src/test/java/nodomain/freeyourgadget/gadgetbridge/service/devices/sony/headphones/protocol/impl/v2/SonyProtocolImplV2Test.java index 917d1169b..924ca0501 100644 --- a/app/src/test/java/nodomain/freeyourgadget/gadgetbridge/service/devices/sony/headphones/protocol/impl/v2/SonyProtocolImplV2Test.java +++ b/app/src/test/java/nodomain/freeyourgadget/gadgetbridge/service/devices/sony/headphones/protocol/impl/v2/SonyProtocolImplV2Test.java @@ -71,7 +71,8 @@ public class SonyProtocolImplV2Test { @Test public void getAudioCodec() { - // TODO + final Request requestEnabled = protocol.getAudioCodec(); + assertRequest(requestEnabled, "3e:0c:01:00:00:00:02:12:02:23:3c"); } @Test