AAudio: Add AAudioStream_getHardware* functions
Add new methods to AAudioStream that allow for queries on the hardware
aspects of streams.
These will allow developers understand the hardware limitations of their
Android devices after they create AAudio streams.
Bug: 245412674
Test: atest AAudioTests
Change-Id: I104a738df89ab22aba9e0658b43402ddf053b887
diff --git a/media/libaaudio/src/binding/AAudioStreamConfiguration.cpp b/media/libaaudio/src/binding/AAudioStreamConfiguration.cpp
index b60bac2..b1eefe4 100644
--- a/media/libaaudio/src/binding/AAudioStreamConfiguration.cpp
+++ b/media/libaaudio/src/binding/AAudioStreamConfiguration.cpp
@@ -40,6 +40,10 @@
auto convFormat = android::aidl2legacy_AudioFormatDescription_audio_format_t(
parcelable.audioFormat);
setFormat(convFormat.ok() ? convFormat.value() : AUDIO_FORMAT_INVALID);
+ if (!convFormat.ok()) {
+ ALOGE("audioFormat (%s) aidl2legacy conversion failed",
+ parcelable.hardwareAudioFormat.toString().c_str());
+ }
static_assert(sizeof(aaudio_direction_t) == sizeof(parcelable.direction));
setDirection(parcelable.direction);
static_assert(sizeof(audio_usage_t) == sizeof(parcelable.usage));
@@ -52,7 +56,6 @@
setSpatializationBehavior(parcelable.spatializationBehavior);
setIsContentSpatialized(parcelable.isContentSpatialized);
-
static_assert(sizeof(aaudio_input_preset_t) == sizeof(parcelable.inputPreset));
setInputPreset(parcelable.inputPreset);
setBufferCapacity(parcelable.bufferCapacity);
@@ -62,6 +65,15 @@
static_assert(sizeof(aaudio_session_id_t) == sizeof(parcelable.sessionId));
setSessionId(parcelable.sessionId);
setPrivacySensitive(parcelable.isPrivacySensitive);
+ setHardwareSamplesPerFrame(parcelable.hardwareSamplesPerFrame);
+ setHardwareSampleRate(parcelable.hardwareSampleRate);
+ auto convHardwareFormat = android::aidl2legacy_AudioFormatDescription_audio_format_t(
+ parcelable.hardwareAudioFormat);
+ setHardwareFormat(convHardwareFormat.ok() ? convHardwareFormat.value() : AUDIO_FORMAT_INVALID);
+ if (!convHardwareFormat.ok()) {
+ ALOGE("hardwareAudioFormat (%s) aidl2legacy conversion failed",
+ parcelable.hardwareAudioFormat.toString().c_str());
+ }
}
AAudioStreamConfiguration&
@@ -82,6 +94,8 @@
if (convAudioFormat.ok()) {
result.audioFormat = convAudioFormat.value();
} else {
+ ALOGE("audioFormat (%s) legacy2aidl conversion failed",
+ audio_format_to_string(getFormat()));
result.audioFormat = AudioFormatDescription{};
result.audioFormat.type =
android::media::audio::common::AudioFormatType::SYS_RESERVED_INVALID;
@@ -100,5 +114,18 @@
static_assert(sizeof(aaudio_session_id_t) == sizeof(result.sessionId));
result.sessionId = getSessionId();
result.isPrivacySensitive = isPrivacySensitive();
+ result.hardwareSamplesPerFrame = getHardwareSamplesPerFrame();
+ result.hardwareSampleRate = getHardwareSampleRate();
+ auto convHardwareAudioFormat = android::legacy2aidl_audio_format_t_AudioFormatDescription(
+ getHardwareFormat());
+ if (convHardwareAudioFormat.ok()) {
+ result.hardwareAudioFormat = convHardwareAudioFormat.value();
+ } else {
+ ALOGE("hardwareAudioFormat (%s) legacy2aidl conversion failed",
+ audio_format_to_string(getHardwareFormat()));
+ result.hardwareAudioFormat = AudioFormatDescription{};
+ result.hardwareAudioFormat.type =
+ android::media::audio::common::AudioFormatType::SYS_RESERVED_INVALID;
+ }
return result;
}
diff --git a/media/libaaudio/src/binding/aidl/aaudio/StreamParameters.aidl b/media/libaaudio/src/binding/aidl/aaudio/StreamParameters.aidl
index 983e193..fa46e0d 100644
--- a/media/libaaudio/src/binding/aidl/aaudio/StreamParameters.aidl
+++ b/media/libaaudio/src/binding/aidl/aaudio/StreamParameters.aidl
@@ -34,4 +34,7 @@
int /* aaudio_allowed_capture_policy_t */ allowedCapturePolicy; // = AAUDIO_UNSPECIFIED;
int /* aaudio_session_id_t */ sessionId; // = AAUDIO_SESSION_ID_NONE;
boolean isPrivacySensitive; // = false;
+ int hardwareSamplesPerFrame;//= AAUDIO_UNSPECIFIED;
+ int hardwareSampleRate; // = AAUDIO_UNSPECIFIED;
+ AudioFormatDescription hardwareAudioFormat; // = AUDIO_FORMAT_DEFAULT;
}