aaudio: turn off RAW flag for sessions
Improve support for AudioEffects in LOW_LATENCY mode.
If a Session is requested then it is likely that effects will
be used so do not set the RAW flag. RAW flag could interfere with
creating effects on some devices.
Bug: 80203192
Test: Native Oboe Tester
Change-Id: I9e7ac8689de71b376b750259da36d5879fe4898d
diff --git a/media/libaaudio/src/legacy/AudioStreamRecord.cpp b/media/libaaudio/src/legacy/AudioStreamRecord.cpp
index dbf00a9..40e22ac 100644
--- a/media/libaaudio/src/legacy/AudioStreamRecord.cpp
+++ b/media/libaaudio/src/legacy/AudioStreamRecord.cpp
@@ -57,6 +57,9 @@
// Try to create an AudioRecord
+ const aaudio_session_id_t requestedSessionId = builder.getSessionId();
+ const audio_session_t sessionId = AAudioConvert_aaudioToAndroidSessionId(requestedSessionId);
+
// TODO Support UNSPECIFIED in AudioRecord. For now, use stereo if unspecified.
int32_t samplesPerFrame = (getSamplesPerFrame() == AAUDIO_UNSPECIFIED)
? 2 : getSamplesPerFrame();
@@ -66,17 +69,21 @@
: builder.getBufferCapacity();
- audio_input_flags_t flags = AUDIO_INPUT_FLAG_NONE;
+ audio_input_flags_t flags;
aaudio_performance_mode_t perfMode = getPerformanceMode();
switch (perfMode) {
case AAUDIO_PERFORMANCE_MODE_LOW_LATENCY:
- flags = (audio_input_flags_t) (AUDIO_INPUT_FLAG_FAST | AUDIO_INPUT_FLAG_RAW);
+ // If the app asks for a sessionId then it means they want to use effects.
+ // So don't use RAW flag.
+ flags = (audio_input_flags_t) ((requestedSessionId == AAUDIO_SESSION_ID_NONE)
+ ? (AUDIO_INPUT_FLAG_FAST | AUDIO_INPUT_FLAG_RAW)
+ : (AUDIO_INPUT_FLAG_FAST));
break;
case AAUDIO_PERFORMANCE_MODE_POWER_SAVING:
case AAUDIO_PERFORMANCE_MODE_NONE:
default:
- // No flags.
+ flags = AUDIO_INPUT_FLAG_NONE;
break;
}
@@ -141,9 +148,6 @@
.tags = ""
};
- aaudio_session_id_t requestedSessionId = builder.getSessionId();
- audio_session_t sessionId = AAudioConvert_aaudioToAndroidSessionId(requestedSessionId);
-
// ----------- open the AudioRecord ---------------------
// Might retry, but never more than once.
for (int i = 0; i < 2; i ++) {
diff --git a/media/libaaudio/src/legacy/AudioStreamTrack.cpp b/media/libaaudio/src/legacy/AudioStreamTrack.cpp
index 1572f0d..1ac2558 100644
--- a/media/libaaudio/src/legacy/AudioStreamTrack.cpp
+++ b/media/libaaudio/src/legacy/AudioStreamTrack.cpp
@@ -59,18 +59,25 @@
return result;
}
+ const aaudio_session_id_t requestedSessionId = builder.getSessionId();
+ const audio_session_t sessionId = AAudioConvert_aaudioToAndroidSessionId(requestedSessionId);
+
// Try to create an AudioTrack
// Use stereo if unspecified.
int32_t samplesPerFrame = (getSamplesPerFrame() == AAUDIO_UNSPECIFIED)
? 2 : getSamplesPerFrame();
audio_channel_mask_t channelMask = audio_channel_out_mask_from_count(samplesPerFrame);
- audio_output_flags_t flags = AUDIO_OUTPUT_FLAG_NONE;
+ audio_output_flags_t flags;
aaudio_performance_mode_t perfMode = getPerformanceMode();
switch(perfMode) {
case AAUDIO_PERFORMANCE_MODE_LOW_LATENCY:
// Bypass the normal mixer and go straight to the FAST mixer.
- flags = (audio_output_flags_t)(AUDIO_OUTPUT_FLAG_FAST | AUDIO_OUTPUT_FLAG_RAW);
+ // If the app asks for a sessionId then it means they want to use effects.
+ // So don't use RAW flag.
+ flags = (audio_output_flags_t) ((requestedSessionId == AAUDIO_SESSION_ID_NONE)
+ ? (AUDIO_OUTPUT_FLAG_FAST | AUDIO_OUTPUT_FLAG_RAW)
+ : (AUDIO_OUTPUT_FLAG_FAST));
break;
case AAUDIO_PERFORMANCE_MODE_POWER_SAVING:
@@ -81,6 +88,7 @@
case AAUDIO_PERFORMANCE_MODE_NONE:
default:
// No flags. Use a normal mixer in front of the FAST mixer.
+ flags = AUDIO_OUTPUT_FLAG_NONE;
break;
}
@@ -135,11 +143,6 @@
.tags = ""
};
- static_assert(AAUDIO_UNSPECIFIED == AUDIO_SESSION_ALLOCATE, "Session IDs should match");
-
- aaudio_session_id_t requestedSessionId = builder.getSessionId();
- audio_session_t sessionId = AAudioConvert_aaudioToAndroidSessionId(requestedSessionId);
-
mAudioTrack = new AudioTrack();
mAudioTrack->set(
AUDIO_STREAM_DEFAULT, // ignored because we pass attributes below