From 6c5b20fdb106c126e5ac28e593a6f67e99b103c5 Mon Sep 17 00:00:00 2001 From: Romain Vimont Date: Fri, 31 Mar 2023 00:24:01 +0200 Subject: [PATCH] Call AudioRecord.getTimestamp() by reflection --- .../com/genymobile/scrcpy/AudioCapture.java | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/server/src/main/java/com/genymobile/scrcpy/AudioCapture.java b/server/src/main/java/com/genymobile/scrcpy/AudioCapture.java index e9448bfd..71011a41 100644 --- a/server/src/main/java/com/genymobile/scrcpy/AudioCapture.java +++ b/server/src/main/java/com/genymobile/scrcpy/AudioCapture.java @@ -14,6 +14,7 @@ import android.media.MediaRecorder; import android.os.Build; import android.os.SystemClock; +import java.lang.reflect.Method; import java.nio.ByteBuffer; public final class AudioCapture { @@ -121,6 +122,20 @@ public final class AudioCapture { } } + private static Method getTimestampMethod; + + private static int getRecorderTimestamp(AudioRecord recorder, AudioTimestamp timestamp) { + try { + if (getTimestampMethod == null) { + getTimestampMethod = AudioRecord.class.getMethod("getTimestamp", AudioTimestamp.class, int.class); + } + return (int) getTimestampMethod.invoke(recorder, timestamp, 0); + } catch (Exception e) { + Ln.e("Could not call AudioRecord.getTimestamp() method"); + return AudioRecord.ERROR; + } + } + @TargetApi(24) public int read(ByteBuffer directBuffer, int size, MediaCodec.BufferInfo outBufferInfo) { int r = recorder.read(directBuffer, size); @@ -130,7 +145,7 @@ public final class AudioCapture { long pts; - int ret = recorder.getTimestamp(timestamp, AudioTimestamp.TIMEBASE_MONOTONIC); + int ret = getRecorderTimestamp(recorder, timestamp); if (ret == AudioRecord.SUCCESS) { pts = timestamp.nanoTime / 1000; } else {