From 8857b0f13aebe62b1fc77eaa279ea13ba2af0c2e Mon Sep 17 00:00:00 2001
From: Sam Lantinga <[EMAIL REDACTED]>
Date: Sat, 30 Sep 2023 16:24:49 -0700
Subject: [PATCH] Use the device audio format for the lowest latency
---
src/audio/aaudio/SDL_aaudio.c | 17 ++++++++---------
1 file changed, 8 insertions(+), 9 deletions(-)
diff --git a/src/audio/aaudio/SDL_aaudio.c b/src/audio/aaudio/SDL_aaudio.c
index 4ea18c8afc0f..47fbcbb12e37 100644
--- a/src/audio/aaudio/SDL_aaudio.c
+++ b/src/audio/aaudio/SDL_aaudio.c
@@ -287,18 +287,14 @@ static int BuildAAudioStream(SDL_AudioDevice *device)
return SDL_SetError("SDL Failed AAudio_createStreamBuilder - builder NULL");
}
- ctx.AAudioStreamBuilder_setSampleRate(builder, device->spec.freq);
- ctx.AAudioStreamBuilder_setChannelCount(builder, device->spec.channels);
-
#if ALLOW_MULTIPLE_ANDROID_AUDIO_DEVICES
const int aaudio_device_id = (int) ((size_t) device->handle);
LOGI("Opening device id %d", aaudio_device_id);
ctx.AAudioStreamBuilder_setDeviceId(builder, aaudio_device_id);
#endif
- const aaudio_direction_t direction = (iscapture ? AAUDIO_DIRECTION_INPUT : AAUDIO_DIRECTION_OUTPUT);
- ctx.AAudioStreamBuilder_setDirection(builder, direction);
aaudio_format_t format;
+#ifdef SET_AUDIO_FORMAT
if ((device->spec.format == SDL_AUDIO_S32) && (SDL_GetAndroidSDKVersion() >= 31)) {
format = AAUDIO_FORMAT_PCM_I32;
} else if (device->spec.format == SDL_AUDIO_F32) {
@@ -306,8 +302,13 @@ static int BuildAAudioStream(SDL_AudioDevice *device)
} else {
format = AAUDIO_FORMAT_PCM_I16; // sint16 is a safe bet for everything else.
}
-
ctx.AAudioStreamBuilder_setFormat(builder, format);
+ ctx.AAudioStreamBuilder_setSampleRate(builder, device->spec.freq);
+ ctx.AAudioStreamBuilder_setChannelCount(builder, device->spec.channels);
+#endif
+
+ const aaudio_direction_t direction = (iscapture ? AAUDIO_DIRECTION_INPUT : AAUDIO_DIRECTION_OUTPUT);
+ ctx.AAudioStreamBuilder_setDirection(builder, direction);
ctx.AAudioStreamBuilder_setErrorCallback(builder, AAUDIO_errorCallback, device);
ctx.AAudioStreamBuilder_setDataCallback(builder, AAUDIO_dataCallback, device);
ctx.AAudioStreamBuilder_setPerformanceMode(builder, AAUDIO_PERFORMANCE_MODE_LOW_LATENCY);
@@ -317,12 +318,12 @@ static int BuildAAudioStream(SDL_AudioDevice *device)
device->spec.channels, SDL_AUDIO_ISBIGENDIAN(device->spec.format) ? "BE" : "LE", device->sample_frames);
res = ctx.AAudioStreamBuilder_openStream(builder, &hidden->stream);
-
if (res != AAUDIO_OK) {
LOGI("SDL Failed AAudioStreamBuilder_openStream %d", res);
ctx.AAudioStreamBuilder_delete(builder);
return SDL_SetError("%s : %s", __func__, ctx.AAudio_convertResultToText(res));
}
+ ctx.AAudioStreamBuilder_delete(builder);
device->sample_frames = (int)ctx.AAudioStream_getFramesPerDataCallback(hidden->stream);
if (device->sample_frames == AAUDIO_UNSPECIFIED) {
@@ -330,8 +331,6 @@ static int BuildAAudioStream(SDL_AudioDevice *device)
device->sample_frames = (int)ctx.AAudioStream_getBufferCapacityInFrames(hidden->stream) / 2;
}
- ctx.AAudioStreamBuilder_delete(builder);
-
device->spec.freq = ctx.AAudioStream_getSampleRate(hidden->stream);
device->spec.channels = ctx.AAudioStream_getChannelCount(hidden->stream);