Add interface to query the mmap support.
Currently, the mmap support is defined in system property. But the
system property only indicates if the mmap is supported or not. It
doesn't indicate on which device mmap is supported. In that case, adding
an interface to query the mmap support can help make things clear.
Test: atest AAudioTests
Test: Run OboeTester TEST OUTPUT
Test: Verify that MMAP is showed as enabled if supported
Test: Try toggling MMAP on and off when opening streams
Bug: 193275465
Change-Id: Iac289c1a02e6e2ab4076ab6f2b5045efecad97ac
diff --git a/media/libaudioclient/Android.bp b/media/libaudioclient/Android.bp
index 322f360..8ea3f32 100644
--- a/media/libaudioclient/Android.bp
+++ b/media/libaudioclient/Android.bp
@@ -325,6 +325,9 @@
"aidl/android/media/AudioIoConfigEvent.aidl",
"aidl/android/media/AudioIoDescriptor.aidl",
"aidl/android/media/AudioIoFlags.aidl",
+ "aidl/android/media/AudioMMapPolicy.aidl",
+ "aidl/android/media/AudioMMapPolicyInfo.aidl",
+ "aidl/android/media/AudioMMapPolicyType.aidl",
"aidl/android/media/AudioMixLatencyClass.aidl",
"aidl/android/media/AudioOutputFlags.aidl",
"aidl/android/media/AudioPatch.aidl",
diff --git a/media/libaudioclient/AudioSystem.cpp b/media/libaudioclient/AudioSystem.cpp
index 46ad296..97cb9af 100644
--- a/media/libaudioclient/AudioSystem.cpp
+++ b/media/libaudioclient/AudioSystem.cpp
@@ -2359,6 +2359,16 @@
return af->setVibratorInfos(vibratorInfos);
}
+status_t AudioSystem::getMmapPolicyInfo(
+ media::AudioMMapPolicyType policyType,
+ std::vector<media::AudioMMapPolicyInfo> *policyInfos) {
+ const sp<IAudioFlinger>& af = AudioSystem::get_audio_flinger();
+ if (af == nullptr) {
+ return PERMISSION_DENIED;
+ }
+ return af->getMmapPolicyInfos(policyType, policyInfos);
+}
+
// ---------------------------------------------------------------------------
int AudioSystem::AudioPolicyServiceClient::addAudioPortCallback(
diff --git a/media/libaudioclient/IAudioFlinger.cpp b/media/libaudioclient/IAudioFlinger.cpp
index b67f1f7..fdec918 100644
--- a/media/libaudioclient/IAudioFlinger.cpp
+++ b/media/libaudioclient/IAudioFlinger.cpp
@@ -17,6 +17,7 @@
#define LOG_TAG "IAudioFlinger"
//#define LOG_NDEBUG 0
+
#include <utils/Log.h>
#include <stdint.h>
@@ -780,6 +781,12 @@
return statusTFromBinderStatus(mDelegate->updateSecondaryOutputs(trackSecondaryOutputInfos));
}
+status_t AudioFlingerClientAdapter::getMmapPolicyInfos(
+ media::AudioMMapPolicyType policyType,
+ std::vector<media::AudioMMapPolicyInfo> *policyInfos) {
+ return statusTFromBinderStatus(mDelegate->getMmapPolicyInfos(policyType, policyInfos));
+}
+
////////////////////////////////////////////////////////////////////////////////////////////////////
// AudioFlingerServerAdapter
@@ -1252,4 +1259,10 @@
return Status::fromStatusT(mDelegate->updateSecondaryOutputs(trackSecondaryOutputs));
}
+Status AudioFlingerServerAdapter::getMmapPolicyInfos(
+ media::AudioMMapPolicyType policyType,
+ std::vector<media::AudioMMapPolicyInfo> *_aidl_return) {
+ return Status::fromStatusT(mDelegate->getMmapPolicyInfos(policyType, _aidl_return));
+}
+
} // namespace android
diff --git a/media/libaudioclient/aidl/android/media/AudioMMapPolicy.aidl b/media/libaudioclient/aidl/android/media/AudioMMapPolicy.aidl
new file mode 100644
index 0000000..e3fa951
--- /dev/null
+++ b/media/libaudioclient/aidl/android/media/AudioMMapPolicy.aidl
@@ -0,0 +1,40 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package android.media;
+
+/**
+ * Audio MMAP policy describe how the aaudio MMAP feature is used.
+ * {@hide}
+ */
+@Backing(type="int")
+enum AudioMMapPolicy {
+ /**
+ * The policy is unspecified.
+ */
+ UNSPECIFIED = 0,
+ /**
+ * The MMAP feature is disabled and never used.
+ */
+ NEVER = 1,
+ /**
+ * If MMAP feature works then uses it. Otherwise, fall back to something else.
+ */
+ AUTO = 2,
+ /**
+ * The MMAP feature must be used. If not available then fail.
+ */
+ ALWAYS = 3,
+}
\ No newline at end of file
diff --git a/media/libaudioclient/aidl/android/media/AudioMMapPolicyInfo.aidl b/media/libaudioclient/aidl/android/media/AudioMMapPolicyInfo.aidl
new file mode 100644
index 0000000..ad7bd45
--- /dev/null
+++ b/media/libaudioclient/aidl/android/media/AudioMMapPolicyInfo.aidl
@@ -0,0 +1,29 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package android.media;
+
+import android.media.AudioDevice;
+import android.media.AudioMMapPolicy;
+
+/**
+ * Audio MMAP policy info describes how an aaudio MMAP feature can be
+ * used on a particular device.
+ * {@hide}
+ */
+parcelable AudioMMapPolicyInfo {
+ AudioDevice device;
+ AudioMMapPolicy mmapPolicy = AudioMMapPolicy.UNSPECIFIED;
+}
\ No newline at end of file
diff --git a/media/libaudioclient/aidl/android/media/AudioMMapPolicyType.aidl b/media/libaudioclient/aidl/android/media/AudioMMapPolicyType.aidl
new file mode 100644
index 0000000..d6acd2c
--- /dev/null
+++ b/media/libaudioclient/aidl/android/media/AudioMMapPolicyType.aidl
@@ -0,0 +1,34 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package android.media;
+
+/**
+ * The aaudio MMAP policy type.
+ * {@hide}
+ */
+@Backing(type="int")
+enum AudioMMapPolicyType {
+ /**
+ * Default aaudio mmap policy. It is used to query whether the
+ * aaudio MMAP could be used or not.
+ */
+ DEFAULT = 1,
+ /**
+ * Exclusive aaudio mmap policy. It is used to query whether the
+ * aaudio MMAP could be used in exclusive mode or not.
+ */
+ EXCLUSIVE = 2,
+}
diff --git a/media/libaudioclient/aidl/android/media/IAudioFlingerService.aidl b/media/libaudioclient/aidl/android/media/IAudioFlingerService.aidl
index 0f84af6..7a46f48 100644
--- a/media/libaudioclient/aidl/android/media/IAudioFlingerService.aidl
+++ b/media/libaudioclient/aidl/android/media/IAudioFlingerService.aidl
@@ -16,6 +16,8 @@
package android.media;
+import android.media.AudioMMapPolicyInfo;
+import android.media.AudioMMapPolicyType;
import android.media.AudioPatch;
import android.media.AudioPort;
import android.media.AudioPortConfig;
@@ -217,4 +219,6 @@
// This usually happens when there is a dynamic policy registered.
void updateSecondaryOutputs(
in TrackSecondaryOutputInfo[] trackSecondaryOutputInfos);
+
+ AudioMMapPolicyInfo[] getMmapPolicyInfos(AudioMMapPolicyType policyType);
}
diff --git a/media/libaudioclient/include/media/AudioSystem.h b/media/libaudioclient/include/media/AudioSystem.h
index 3c610af..c546dfb 100644
--- a/media/libaudioclient/include/media/AudioSystem.h
+++ b/media/libaudioclient/include/media/AudioSystem.h
@@ -22,6 +22,8 @@
#include <set>
#include <vector>
+#include <android/media/AudioMMapPolicyInfo.h>
+#include <android/media/AudioMMapPolicyType.h>
#include <android/media/AudioVibratorInfo.h>
#include <android/media/BnAudioFlingerClient.h>
#include <android/media/BnAudioPolicyServiceClient.h>
@@ -614,6 +616,10 @@
static status_t setVibratorInfos(const std::vector<media::AudioVibratorInfo>& vibratorInfos);
+ static status_t getMmapPolicyInfo(
+ media::AudioMMapPolicyType policyType,
+ std::vector<media::AudioMMapPolicyInfo> *policyInfos);
+
private:
class AudioFlingerClient: public IBinder::DeathRecipient, public media::BnAudioFlingerClient
diff --git a/media/libaudioclient/include/media/IAudioFlinger.h b/media/libaudioclient/include/media/IAudioFlinger.h
index 25ded38..774e907 100644
--- a/media/libaudioclient/include/media/IAudioFlinger.h
+++ b/media/libaudioclient/include/media/IAudioFlinger.h
@@ -37,6 +37,8 @@
#include <string>
#include <vector>
+#include <android/media/AudioMMapPolicyInfo.h>
+#include <android/media/AudioMMapPolicyType.h>
#include <android/media/AudioVibratorInfo.h>
#include <android/media/BnAudioFlingerService.h>
#include <android/media/BpAudioFlingerService.h>
@@ -348,6 +350,10 @@
virtual status_t updateSecondaryOutputs(
const TrackSecondaryOutputsMap& trackSecondaryOutputs) = 0;
+
+ virtual status_t getMmapPolicyInfos(
+ media::AudioMMapPolicyType policyType,
+ std::vector<media::AudioMMapPolicyInfo> *policyInfos) = 0;
};
/**
@@ -445,6 +451,10 @@
status_t updateSecondaryOutputs(
const TrackSecondaryOutputsMap& trackSecondaryOutputs) override;
+ status_t getMmapPolicyInfos(
+ media::AudioMMapPolicyType policyType,
+ std::vector<media::AudioMMapPolicyInfo> *policyInfos) override;
+
private:
const sp<media::IAudioFlingerService> mDelegate;
};
@@ -529,6 +539,7 @@
SET_AUDIO_HAL_PIDS = media::BnAudioFlingerService::TRANSACTION_setAudioHalPids,
SET_VIBRATOR_INFOS = media::BnAudioFlingerService::TRANSACTION_setVibratorInfos,
UPDATE_SECONDARY_OUTPUTS = media::BnAudioFlingerService::TRANSACTION_updateSecondaryOutputs,
+ GET_MMAP_POLICY_INFOS = media::BnAudioFlingerService::TRANSACTION_getMmapPolicyInfos,
};
/**
@@ -643,6 +654,9 @@
Status setVibratorInfos(const std::vector<media::AudioVibratorInfo>& vibratorInfos) override;
Status updateSecondaryOutputs(
const std::vector<media::TrackSecondaryOutputInfo>& trackSecondaryOutputInfos) override;
+ Status getMmapPolicyInfos(
+ media::AudioMMapPolicyType policyType,
+ std::vector<media::AudioMMapPolicyInfo> *_aidl_return) override;
private:
const sp<AudioFlingerServerAdapter::Delegate> mDelegate;