diff --git a/server/src/main/java/com/genymobile/scrcpy/AudioCapture.java b/server/src/main/java/com/genymobile/scrcpy/AudioCapture.java index 5575ffb6..e94b49ed 100644 --- a/server/src/main/java/com/genymobile/scrcpy/AudioCapture.java +++ b/server/src/main/java/com/genymobile/scrcpy/AudioCapture.java @@ -24,6 +24,11 @@ public final class AudioCapture { public static final int ENCODING = AudioFormat.ENCODING_PCM_16BIT; public static final int BYTES_PER_SAMPLE = 2; + // Never read more than 1024 samples, even if the buffer is bigger (that would increase latency). + // A lower value is useless, since the system captures audio samples by blocks of 1024 (so for example if we read by blocks of 256 samples, we + // receive 4 successive blocks without waiting, then we wait for the 4 next ones). + public static final int MAX_READ_SIZE = 1024 * CHANNELS * BYTES_PER_SAMPLE; + private final int audioSource; private AudioRecord recorder; @@ -36,10 +41,6 @@ public final class AudioCapture { this.audioSource = audioSource.value(); } - public static int millisToBytes(int millis) { - return SAMPLE_RATE * CHANNELS * BYTES_PER_SAMPLE * millis / 1000; - } - private static AudioFormat createAudioFormat() { AudioFormat.Builder builder = new AudioFormat.Builder(); builder.setEncoding(ENCODING); @@ -135,8 +136,8 @@ public final class AudioCapture { } @TargetApi(Build.VERSION_CODES.N) - public int read(ByteBuffer directBuffer, int size, MediaCodec.BufferInfo outBufferInfo) { - int r = recorder.read(directBuffer, size); + public int read(ByteBuffer directBuffer, MediaCodec.BufferInfo outBufferInfo) { + int r = recorder.read(directBuffer, MAX_READ_SIZE); if (r <= 0) { return r; } diff --git a/server/src/main/java/com/genymobile/scrcpy/AudioEncoder.java b/server/src/main/java/com/genymobile/scrcpy/AudioEncoder.java index bec79b05..ad8d0422 100644 --- a/server/src/main/java/com/genymobile/scrcpy/AudioEncoder.java +++ b/server/src/main/java/com/genymobile/scrcpy/AudioEncoder.java @@ -37,9 +37,6 @@ public final class AudioEncoder implements AsyncProcessor { private static final int SAMPLE_RATE = AudioCapture.SAMPLE_RATE; private static final int CHANNELS = AudioCapture.CHANNELS; - private static final int READ_MS = 5; // milliseconds - private static final int READ_SIZE = AudioCapture.millisToBytes(READ_MS); - private final AudioCapture capture; private final Streamer streamer; private final int bitRate; @@ -93,7 +90,7 @@ public final class AudioEncoder implements AsyncProcessor { while (!Thread.currentThread().isInterrupted()) { InputTask task = inputTasks.take(); ByteBuffer buffer = mediaCodec.getInputBuffer(task.index); - int r = capture.read(buffer, READ_SIZE, bufferInfo); + int r = capture.read(buffer, bufferInfo); if (r <= 0) { throw new IOException("Could not read audio: " + r); } diff --git a/server/src/main/java/com/genymobile/scrcpy/AudioRawRecorder.java b/server/src/main/java/com/genymobile/scrcpy/AudioRawRecorder.java index ce33ae85..7e052f32 100644 --- a/server/src/main/java/com/genymobile/scrcpy/AudioRawRecorder.java +++ b/server/src/main/java/com/genymobile/scrcpy/AudioRawRecorder.java @@ -13,9 +13,6 @@ public final class AudioRawRecorder implements AsyncProcessor { private Thread thread; - private static final int READ_MS = 5; // milliseconds - private static final int READ_SIZE = AudioCapture.millisToBytes(READ_MS); - public AudioRawRecorder(AudioCapture capture, Streamer streamer) { this.capture = capture; this.streamer = streamer; @@ -28,7 +25,7 @@ public final class AudioRawRecorder implements AsyncProcessor { return; } - final ByteBuffer buffer = ByteBuffer.allocateDirect(READ_SIZE); + final ByteBuffer buffer = ByteBuffer.allocateDirect(AudioCapture.MAX_READ_SIZE); final MediaCodec.BufferInfo bufferInfo = new MediaCodec.BufferInfo(); try { @@ -43,7 +40,7 @@ public final class AudioRawRecorder implements AsyncProcessor { streamer.writeAudioHeader(); while (!Thread.currentThread().isInterrupted()) { buffer.position(0); - int r = capture.read(buffer, READ_SIZE, bufferInfo); + int r = capture.read(buffer, bufferInfo); if (r < 0) { throw new IOException("Could not read audio: " + r); }