Add APIs to query MMAP support in AAudio.
Bug: 367809497
Test: atest AAudioTests
Flag: EXEMPT NDK
Change-Id: I19df0f40d6151bba9cb0869876bb6ea3fef38d91
diff --git a/media/libaaudio/src/core/AAudioAudio.cpp b/media/libaaudio/src/core/AAudioAudio.cpp
index 1e8ac8d..3315344 100644
--- a/media/libaaudio/src/core/AAudioAudio.cpp
+++ b/media/libaaudio/src/core/AAudioAudio.cpp
@@ -53,6 +53,16 @@
return AudioGlobal_convertStreamStateToText(state);
}
+AAUDIO_API aaudio_policy_t AAudio_getPlatformMMapPolicy(
+ AAudio_DeviceType device, aaudio_direction_t direction) {
+ return AudioGlobal_getPlatformMMapPolicy(device, direction);
+}
+
+AAUDIO_API aaudio_policy_t AAudio_getPlatformMMapExclusivePolicy(
+ AAudio_DeviceType device, aaudio_direction_t direction) {
+ return AudioGlobal_getPlatformMMapExclusivePolicy(device, direction);
+}
+
static AudioStream *convertAAudioStreamToAudioStream(AAudioStream* stream)
{
return (AudioStream*) stream;
diff --git a/media/libaaudio/src/core/AudioGlobal.cpp b/media/libaaudio/src/core/AudioGlobal.cpp
index 30f9677..3268488 100644
--- a/media/libaaudio/src/core/AudioGlobal.cpp
+++ b/media/libaaudio/src/core/AudioGlobal.cpp
@@ -15,6 +15,13 @@
*/
#include <aaudio/AAudio.h>
#include <aaudio/AAudioTesting.h>
+#include <android/media/audio/common/AudioDevice.h>
+#include <android/media/audio/common/AudioMMapPolicyInfo.h>
+#include <android/media/audio/common/AudioMMapPolicyType.h>
+#include <media/AidlConversionCppNdk.h>
+#include <media/AudioSystem.h>
+#include <system/audio-hal-enums.h>
+#include <utility/AAudioUtilities.h>
#include "AudioGlobal.h"
@@ -23,6 +30,10 @@
*/
namespace aaudio {
+using android::media::audio::common::AudioDevice;
+using android::media::audio::common::AudioMMapPolicyInfo;
+using android::media::audio::common::AudioMMapPolicyType;
+
static aaudio_policy_t g_MMapPolicy = AAUDIO_UNSPECIFIED;
aaudio_policy_t AudioGlobal_getMMapPolicy() {
@@ -132,6 +143,39 @@
return "Unrecognized";
}
+namespace {
+
+aaudio_policy_t getPlatformMMapPolicy(AudioMMapPolicyType policyType, AAudio_DeviceType device,
+ aaudio_direction_t direction) {
+ if (direction != AAUDIO_DIRECTION_INPUT && direction != AAUDIO_DIRECTION_OUTPUT) {
+ return AAUDIO_ERROR_ILLEGAL_ARGUMENT;
+ }
+ const audio_devices_t deviceType = AAudioConvert_aaudioToAndroidDeviceType(device, direction);
+ if (deviceType == AUDIO_DEVICE_NONE) {
+ return AAUDIO_ERROR_ILLEGAL_ARGUMENT;
+ }
+
+ AudioMMapPolicyInfo policyInfo;
+ if (android::status_t status = android::AudioSystem::getMmapPolicyForDevice(
+ policyType, deviceType, &policyInfo);
+ status != android::NO_ERROR) {
+ return AAudioConvert_androidToAAudioResult(status);
+ }
+ return AAudioConvert_androidToAAudioMMapPolicy(policyInfo.mmapPolicy);
+}
+
+} // namespace
+
+aaudio_policy_t AudioGlobal_getPlatformMMapPolicy(
+ AAudio_DeviceType device, aaudio_direction_t direction) {
+ return getPlatformMMapPolicy(AudioMMapPolicyType::DEFAULT, device, direction);
+}
+
+aaudio_policy_t AudioGlobal_getPlatformMMapExclusivePolicy(
+ AAudio_DeviceType device, aaudio_direction_t direction) {
+ return getPlatformMMapPolicy(AudioMMapPolicyType::EXCLUSIVE, device, direction);
+}
+
#undef AAUDIO_CASE_ENUM
} // namespace aaudio
diff --git a/media/libaaudio/src/core/AudioGlobal.h b/media/libaaudio/src/core/AudioGlobal.h
index 8af49b4..7ff344b 100644
--- a/media/libaaudio/src/core/AudioGlobal.h
+++ b/media/libaaudio/src/core/AudioGlobal.h
@@ -40,6 +40,11 @@
const char* AudioGlobal_convertSharingModeToText(aaudio_sharing_mode_t mode);
const char* AudioGlobal_convertStreamStateToText(aaudio_stream_state_t state);
+aaudio_policy_t AudioGlobal_getPlatformMMapPolicy(
+ AAudio_DeviceType device, aaudio_direction_t direction);
+aaudio_policy_t AudioGlobal_getPlatformMMapExclusivePolicy(
+ AAudio_DeviceType device, aaudio_direction_t direction);
+
} // namespace aaudio
#endif // AAUDIO_AUDIOGLOBAL_H
diff --git a/media/libaaudio/src/core/AudioStreamBuilder.cpp b/media/libaaudio/src/core/AudioStreamBuilder.cpp
index 01f0038..b0dc669 100644
--- a/media/libaaudio/src/core/AudioStreamBuilder.cpp
+++ b/media/libaaudio/src/core/AudioStreamBuilder.cpp
@@ -110,7 +110,7 @@
std::vector<AudioMMapPolicyInfo> policyInfos;
aaudio_policy_t mmapPolicy = AudioGlobal_getMMapPolicy();
ALOGD("%s, global mmap policy is %d", __func__, mmapPolicy);
- if (status_t status = android::AudioSystem::getMmapPolicyInfo(
+ if (status_t status = android::AudioSystem::getMmapPolicyInfos(
AudioMMapPolicyType::DEFAULT, &policyInfos); status == NO_ERROR) {
aaudio_policy_t systemMmapPolicy = AAudio_getAAudioPolicy(
policyInfos, AAUDIO_MMAP_POLICY_DEFAULT_AIDL);
@@ -143,7 +143,7 @@
policyInfos.clear();
aaudio_policy_t mmapExclusivePolicy = AAUDIO_UNSPECIFIED;
- if (status_t status = android::AudioSystem::getMmapPolicyInfo(
+ if (status_t status = android::AudioSystem::getMmapPolicyInfos(
AudioMMapPolicyType::EXCLUSIVE, &policyInfos); status == NO_ERROR) {
mmapExclusivePolicy = AAudio_getAAudioPolicy(
policyInfos, AAUDIO_MMAP_EXCLUSIVE_POLICY_DEFAULT_AIDL);
diff --git a/media/libaaudio/src/libaaudio.map.txt b/media/libaaudio/src/libaaudio.map.txt
index e28dcb4..7213393 100644
--- a/media/libaaudio/src/libaaudio.map.txt
+++ b/media/libaaudio/src/libaaudio.map.txt
@@ -70,6 +70,8 @@
AAudioStream_getHardwareChannelCount; # introduced=UpsideDownCake
AAudioStream_getHardwareFormat; # introduced=UpsideDownCake
AAudioStream_getHardwareSampleRate; # introduced=UpsideDownCake
+ AAudio_getPlatformMMapPolicy; # introduced=36
+ AAudio_getPlatformMMapExclusivePolicy; #introduced=36
local:
*;
};
diff --git a/media/libaaudio/src/utility/AAudioUtilities.cpp b/media/libaaudio/src/utility/AAudioUtilities.cpp
index 3df23ee..c741946 100644
--- a/media/libaaudio/src/utility/AAudioUtilities.cpp
+++ b/media/libaaudio/src/utility/AAudioUtilities.cpp
@@ -693,3 +693,128 @@
}
return aidl2legacy_aaudio_policy(policy);
}
+
+audio_devices_t AAudioConvert_aaudioToAndroidDeviceType(AAudio_DeviceType device,
+ aaudio_direction_t direction) {
+ if (direction == AAUDIO_DIRECTION_INPUT) {
+ switch (device) {
+ case AAUDIO_DEVICE_BUILTIN_MIC:
+ return AUDIO_DEVICE_IN_BUILTIN_MIC;
+ case AAUDIO_DEVICE_BLUETOOTH_SCO:
+ return AUDIO_DEVICE_IN_BLUETOOTH_SCO_HEADSET;
+ case AAUDIO_DEVICE_WIRED_HEADSET:
+ return AUDIO_DEVICE_IN_WIRED_HEADSET;
+ case AAUDIO_DEVICE_HDMI:
+ return AUDIO_DEVICE_IN_HDMI;
+ case AAUDIO_DEVICE_TELEPHONY:
+ return AUDIO_DEVICE_IN_TELEPHONY_RX;
+ case AAUDIO_DEVICE_DOCK:
+ return AUDIO_DEVICE_IN_DGTL_DOCK_HEADSET;
+ case AAUDIO_DEVICE_DOCK_ANALOG:
+ return AUDIO_DEVICE_IN_ANLG_DOCK_HEADSET;
+ case AAUDIO_DEVICE_USB_ACCESSORY:
+ return AUDIO_DEVICE_IN_USB_ACCESSORY;
+ case AAUDIO_DEVICE_USB_DEVICE:
+ return AUDIO_DEVICE_IN_USB_DEVICE;
+ case AAUDIO_DEVICE_USB_HEADSET:
+ return AUDIO_DEVICE_IN_USB_HEADSET;
+ case AAUDIO_DEVICE_FM_TUNER:
+ return AUDIO_DEVICE_IN_FM_TUNER;
+ case AAUDIO_DEVICE_TV_TUNER:
+ return AUDIO_DEVICE_IN_TV_TUNER;
+ case AAUDIO_DEVICE_LINE_ANALOG:
+ return AUDIO_DEVICE_IN_LINE;
+ case AAUDIO_DEVICE_LINE_DIGITAL:
+ return AUDIO_DEVICE_IN_SPDIF;
+ case AAUDIO_DEVICE_BLUETOOTH_A2DP:
+ return AUDIO_DEVICE_IN_BLUETOOTH_A2DP;
+ case AAUDIO_DEVICE_IP:
+ return AUDIO_DEVICE_IN_IP;
+ case AAUDIO_DEVICE_BUS:
+ return AUDIO_DEVICE_IN_BUS;
+ case AAUDIO_DEVICE_REMOTE_SUBMIX:
+ return AUDIO_DEVICE_IN_REMOTE_SUBMIX;
+ case AAUDIO_DEVICE_BLE_HEADSET:
+ return AUDIO_DEVICE_IN_BLE_HEADSET;
+ case AAUDIO_DEVICE_HDMI_ARC:
+ return AUDIO_DEVICE_IN_HDMI_ARC;
+ case AAUDIO_DEVICE_HDMI_EARC:
+ return AUDIO_DEVICE_IN_HDMI_EARC;
+ default:
+ break;
+ }
+ } else {
+ switch (device) {
+ case AAUDIO_DEVICE_BUILTIN_EARPIECE:
+ return AUDIO_DEVICE_OUT_EARPIECE;
+ case AAUDIO_DEVICE_BUILTIN_SPEAKER:
+ return AUDIO_DEVICE_OUT_SPEAKER;
+ case AAUDIO_DEVICE_WIRED_HEADSET:
+ return AUDIO_DEVICE_OUT_WIRED_HEADSET;
+ case AAUDIO_DEVICE_WIRED_HEADPHONES:
+ return AUDIO_DEVICE_OUT_WIRED_HEADPHONE;
+ case AAUDIO_DEVICE_LINE_ANALOG:
+ return AUDIO_DEVICE_OUT_LINE;
+ case AAUDIO_DEVICE_LINE_DIGITAL:
+ return AUDIO_DEVICE_OUT_SPDIF;
+ case AAUDIO_DEVICE_BLUETOOTH_SCO:
+ return AUDIO_DEVICE_OUT_BLUETOOTH_SCO;
+ case AAUDIO_DEVICE_BLUETOOTH_A2DP:
+ return AUDIO_DEVICE_OUT_BLUETOOTH_A2DP;
+ case AAUDIO_DEVICE_HDMI:
+ return AUDIO_DEVICE_OUT_HDMI;
+ case AAUDIO_DEVICE_HDMI_ARC:
+ return AUDIO_DEVICE_OUT_HDMI_ARC;
+ case AAUDIO_DEVICE_HDMI_EARC:
+ return AUDIO_DEVICE_OUT_HDMI_EARC;
+ case AAUDIO_DEVICE_USB_DEVICE:
+ return AUDIO_DEVICE_OUT_USB_DEVICE;
+ case AAUDIO_DEVICE_USB_HEADSET:
+ return AUDIO_DEVICE_OUT_USB_HEADSET;
+ case AAUDIO_DEVICE_USB_ACCESSORY:
+ return AUDIO_DEVICE_OUT_USB_ACCESSORY;
+ case AAUDIO_DEVICE_DOCK:
+ return AUDIO_DEVICE_OUT_DGTL_DOCK_HEADSET;
+ case AAUDIO_DEVICE_DOCK_ANALOG:
+ return AUDIO_DEVICE_OUT_ANLG_DOCK_HEADSET;
+ case AAUDIO_DEVICE_FM:
+ return AUDIO_DEVICE_OUT_FM;
+ case AAUDIO_DEVICE_TELEPHONY:
+ return AUDIO_DEVICE_OUT_TELEPHONY_TX;
+ case AAUDIO_DEVICE_AUX_LINE:
+ return AUDIO_DEVICE_OUT_AUX_LINE;
+ case AAUDIO_DEVICE_IP:
+ return AUDIO_DEVICE_OUT_IP;
+ case AAUDIO_DEVICE_BUS:
+ return AUDIO_DEVICE_OUT_BUS;
+ case AAUDIO_DEVICE_HEARING_AID:
+ return AUDIO_DEVICE_OUT_HEARING_AID;
+ case AAUDIO_DEVICE_BUILTIN_SPEAKER_SAFE:
+ return AUDIO_DEVICE_OUT_SPEAKER_SAFE;
+ case AAUDIO_DEVICE_REMOTE_SUBMIX:
+ return AUDIO_DEVICE_OUT_REMOTE_SUBMIX;
+ case AAUDIO_DEVICE_BLE_HEADSET:
+ return AUDIO_DEVICE_OUT_BLE_HEADSET;
+ case AAUDIO_DEVICE_BLE_SPEAKER:
+ return AUDIO_DEVICE_OUT_BLE_SPEAKER;
+ case AAUDIO_DEVICE_BLE_BROADCAST:
+ return AUDIO_DEVICE_OUT_BLE_BROADCAST;
+ default:
+ break;
+ }
+ }
+ return AUDIO_DEVICE_NONE;
+}
+
+aaudio_policy_t AAudioConvert_androidToAAudioMMapPolicy(AudioMMapPolicy policy) {
+ switch (policy) {
+ case AudioMMapPolicy::AUTO:
+ return AAUDIO_POLICY_AUTO;
+ case AudioMMapPolicy::ALWAYS:
+ return AAUDIO_POLICY_ALWAYS;
+ case AudioMMapPolicy::NEVER:
+ case AudioMMapPolicy::UNSPECIFIED:
+ default:
+ return AAUDIO_POLICY_NEVER;
+ }
+}
diff --git a/media/libaaudio/src/utility/AAudioUtilities.h b/media/libaaudio/src/utility/AAudioUtilities.h
index 7c351e1..d5069f5 100644
--- a/media/libaaudio/src/utility/AAudioUtilities.h
+++ b/media/libaaudio/src/utility/AAudioUtilities.h
@@ -363,4 +363,14 @@
android::media::audio::common::AudioMMapPolicy defaultPolicy =
android::media::audio::common::AudioMMapPolicy::NEVER);
+/**
+ * Convert the aaudio device type to android device type. Returns AUDIO_DEVICE_NONE if
+ * the given device is not a valid one.
+ */
+audio_devices_t AAudioConvert_aaudioToAndroidDeviceType(
+ AAudio_DeviceType device, aaudio_direction_t direction);
+
+aaudio_policy_t AAudioConvert_androidToAAudioMMapPolicy(
+ android::media::audio::common::AudioMMapPolicy policy);
+
#endif //UTILITY_AAUDIO_UTILITIES_H