Zepp OS: Decode voice memo files

This commit is contained in:
José Rebelo
2025-03-30 20:43:20 +01:00
parent f9ceb16ff8
commit 51b30557fb
3 changed files with 28 additions and 4 deletions
@@ -28,11 +28,10 @@ import nodomain.freeyourgadget.gadgetbridge.deviceevents.GBDeviceEvent;
import nodomain.freeyourgadget.gadgetbridge.devices.DeviceCoordinator;
import nodomain.freeyourgadget.gadgetbridge.devices.huami.zeppos.ZeppOsCoordinator;
import nodomain.freeyourgadget.gadgetbridge.service.btle.TransactionBuilder;
import nodomain.freeyourgadget.gadgetbridge.service.devices.huami.zeppos.services.ZeppOsAssistantService;
import nodomain.freeyourgadget.gadgetbridge.util.Prefs;
public abstract class AbstractZeppOsService {
private static final Logger LOG = LoggerFactory.getLogger(ZeppOsAssistantService.class);
private static final Logger LOG = LoggerFactory.getLogger(AbstractZeppOsService.class);
private final ZeppOsSupport mSupport;
private boolean encrypted;
@@ -309,7 +309,7 @@ public class ZeppOsSupport extends HuamiSupport implements ZeppOsFileTransferSer
@Override
public void onTestNewFunction() {
setRawSensor(!rawSensor);
voiceMemosService.requestList();
}
@Override
@@ -19,6 +19,8 @@ package nodomain.freeyourgadget.gadgetbridge.service.devices.huami.zeppos.servic
import android.os.Handler;
import org.apache.commons.lang3.ArrayUtils;
import org.concentus.OpusDecoder;
import org.concentus.OpusException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -51,7 +53,7 @@ public class ZeppOsVoiceMemosService extends AbstractZeppOsService {
private final Handler handler = new Handler();
public ZeppOsVoiceMemosService(final ZeppOsSupport support) {
super(support, false);
super(support, true);
}
@Override
@@ -140,4 +142,27 @@ public class ZeppOsVoiceMemosService extends AbstractZeppOsService {
write("voice memo download finish", CMD_DOWNLOAD_FINISH_REQUEST);
}
}
private void decode(final byte[] opusBytes) throws OpusException {
final int SAMPLE_RATE = 16000;
final int NUM_CHANNELS = 1;
final int FRAME_SIZE = 320;
final OpusDecoder opusDecoder = new OpusDecoder(SAMPLE_RATE, NUM_CHANNELS);
final ByteBuffer buf = ByteBuffer.wrap(opusBytes).order(ByteOrder.BIG_ENDIAN);
final byte[] pcm = new byte[FRAME_SIZE * 2];
while (buf.hasRemaining()) {
final int len = buf.getInt();
final int unk = buf.getInt();
final byte[] arr = new byte[len];
buf.get(arr);
int decode = opusDecoder.decode(arr, 0, arr.length, pcm, 0, FRAME_SIZE, false);
// ffmpeg -f s16le -ar 16k -ac 1 -i memo.pcm memo.wav
// outputStream.write(pcm, 0, FRAME_SIZE * 2);
}
}
}