Add HAL interface to replace aaudio system property.
Using the HAL interface instead of reading system property is a better
option when moving to AIDL HAL. The replaced property includes:
- aaudio.mixer_bursts
- aaudio.hw_burst_min_usec
Test: atest AAudioTests
Bug: 193275465
Change-Id: I9c9a04296e56ff083babcfa089fcdddc6b89ed94
diff --git a/services/audioflinger/AudioFlinger.cpp b/services/audioflinger/AudioFlinger.cpp
index a75e427..b359331 100644
--- a/services/audioflinger/AudioFlinger.cpp
+++ b/services/audioflinger/AudioFlinger.cpp
@@ -104,6 +104,8 @@
namespace android {
+#define MAX_AAUDIO_PROPERTY_DEVICE_HAL_VERSION 7.0
+
using media::IEffectClient;
using media::audio::common::AudioMMapPolicyInfo;
using media::audio::common::AudioMMapPolicyType;
@@ -304,6 +306,11 @@
mDevicesFactoryHalCallback = new DevicesFactoryHalCallbackImpl;
mDevicesFactoryHal->setCallbackOnce(mDevicesFactoryHalCallback);
+
+ if (mDevicesFactoryHal->getHalVersion() <= MAX_AAUDIO_PROPERTY_DEVICE_HAL_VERSION) {
+ mAAudioBurstsPerBuffer = getAAudioMixerBurstCountFromSystemProperty();
+ mAAudioHwBurstMinMicros = getAAudioHardwareBurstMinUsecFromSystemProperty();
+ }
}
status_t AudioFlinger::setAudioHalPids(const std::vector<pid_t>& pids) {
@@ -339,15 +346,14 @@
return NO_ERROR;
}
-#define MAX_MMAP_PROPERTY_DEVICE_HAL_VERSION 7.0
-
status_t AudioFlinger::getMmapPolicyInfos(
AudioMMapPolicyType policyType, std::vector<AudioMMapPolicyInfo> *policyInfos) {
+ Mutex::Autolock _l(mLock);
if (const auto it = mPolicyInfos.find(policyType); it != mPolicyInfos.end()) {
*policyInfos = it->second;
return NO_ERROR;
}
- if (mDevicesFactoryHal->getHalVersion() > MAX_MMAP_PROPERTY_DEVICE_HAL_VERSION) {
+ if (mDevicesFactoryHal->getHalVersion() > MAX_AAUDIO_PROPERTY_DEVICE_HAL_VERSION) {
AutoMutex lock(mHardwareLock);
for (size_t i = 0; i < mAudioHwDevs.size(); ++i) {
AudioHwDevice *dev = mAudioHwDevs.valueAt(i);
@@ -368,6 +374,16 @@
return NO_ERROR;
}
+int32_t AudioFlinger::getAAudioMixerBurstCount() {
+ Mutex::Autolock _l(mLock);
+ return mAAudioBurstsPerBuffer;
+}
+
+int32_t AudioFlinger::getAAudioHardwareBurstMinUsec() {
+ Mutex::Autolock _l(mLock);
+ return mAAudioHwBurstMinMicros;
+}
+
// getDefaultVibratorInfo_l must be called with AudioFlinger lock held.
std::optional<media::AudioVibratorInfo> AudioFlinger::getDefaultVibratorInfo_l() {
if (mAudioVibratorInfos.empty()) {
@@ -2322,6 +2338,17 @@
mHardwareStatus = AUDIO_HW_IDLE;
}
+ if (mDevicesFactoryHal->getHalVersion() > MAX_AAUDIO_PROPERTY_DEVICE_HAL_VERSION) {
+ if (int32_t mixerBursts = dev->getAAudioMixerBurstCount();
+ mixerBursts > mAAudioBurstsPerBuffer) {
+ mAAudioBurstsPerBuffer = mixerBursts;
+ }
+ if (int32_t hwBurstMinMicros = dev->getAAudioHardwareBurstMinUsec();
+ hwBurstMinMicros < mAAudioHwBurstMinMicros || mAAudioHwBurstMinMicros == 0) {
+ mAAudioHwBurstMinMicros = hwBurstMinMicros;
+ }
+ }
+
mAudioHwDevs.add(handle, audioDevice);
ALOGI("loadHwModule() Loaded %s audio interface, handle %d", name, handle);
diff --git a/services/audioflinger/AudioFlinger.h b/services/audioflinger/AudioFlinger.h
index d0a9ea8..8c546cc 100644
--- a/services/audioflinger/AudioFlinger.h
+++ b/services/audioflinger/AudioFlinger.h
@@ -286,6 +286,10 @@
media::audio::common::AudioMMapPolicyType policyType,
std::vector<media::audio::common::AudioMMapPolicyInfo> *policyInfos);
+ virtual int32_t getAAudioMixerBurstCount();
+
+ virtual int32_t getAAudioHardwareBurstMinUsec();
+
status_t onTransactWrapper(TransactionCode code, const Parcel& data, uint32_t flags,
const std::function<status_t()>& delegate) override;
@@ -1011,6 +1015,8 @@
std::map<media::audio::common::AudioMMapPolicyType,
std::vector<media::audio::common::AudioMMapPolicyInfo>> mPolicyInfos;
+ int32_t mAAudioBurstsPerBuffer = 0;
+ int32_t mAAudioHwBurstMinMicros = 0;
};
#undef INCLUDING_FROM_AUDIOFLINGER_H
diff --git a/services/audioflinger/AudioHwDevice.cpp b/services/audioflinger/AudioHwDevice.cpp
index 12f8272..dee6161 100644
--- a/services/audioflinger/AudioHwDevice.cpp
+++ b/services/audioflinger/AudioHwDevice.cpp
@@ -110,5 +110,13 @@
return mHwDevice->getMmapPolicyInfos(policyType, policyInfos);
}
+int32_t AudioHwDevice::getAAudioMixerBurstCount() const {
+ return mHwDevice->getAAudioMixerBurstCount();
+}
+
+int32_t AudioHwDevice::getAAudioHardwareBurstMinUsec() const {
+ return mHwDevice->getAAudioHardwareBurstMinUsec();
+}
+
}; // namespace android
diff --git a/services/audioflinger/AudioHwDevice.h b/services/audioflinger/AudioHwDevice.h
index 0715e55..8c5d239 100644
--- a/services/audioflinger/AudioHwDevice.h
+++ b/services/audioflinger/AudioHwDevice.h
@@ -91,6 +91,10 @@
media::audio::common::AudioMMapPolicyType policyType,
std::vector<media::audio::common::AudioMMapPolicyInfo> *policyInfos) const;
+ int32_t getAAudioMixerBurstCount() const;
+
+ int32_t getAAudioHardwareBurstMinUsec() const;
+
private:
const audio_module_handle_t mHandle;
const char * const mModuleName;
diff --git a/services/audioflinger/PropertyUtils.cpp b/services/audioflinger/PropertyUtils.cpp
index 341d5bb..65e2533 100644
--- a/services/audioflinger/PropertyUtils.cpp
+++ b/services/audioflinger/PropertyUtils.cpp
@@ -77,4 +77,28 @@
return NO_ERROR;
}
+int32_t getAAudioMixerBurstCountFromSystemProperty() {
+ static const int32_t sDefaultBursts = 2; // arbitrary, use 2 for double buffered
+ static const int32_t sMaxBursts = 1024; // arbitrary
+ static const char* sPropMixerBursts = "aaudio.mixer_bursts";
+ int32_t prop = property_get_int32(sPropMixerBursts, sDefaultBursts);
+ if (prop <= 0 || prop > sMaxBursts) {
+ ALOGE("%s: invalid value %d, use default %d", __func__, prop, sDefaultBursts);
+ prop = sDefaultBursts;
+ }
+ return prop;
+}
+
+int32_t getAAudioHardwareBurstMinUsecFromSystemProperty() {
+ static const int32_t sDefaultMicros = 1000; // arbitrary
+ static const int32_t sMaxMicros = 1000 * 1000; // arbitrary
+ static const char* sPropHwBurstMinUsec = "aaudio.hw_burst_min_usec";
+ int32_t prop = property_get_int32(sPropHwBurstMinUsec, sDefaultMicros);
+ if (prop <= 0 || prop > sMaxMicros) {
+ ALOGE("%s invalid value %d, use default %d", __func__, prop, sDefaultMicros);
+ prop = sDefaultMicros;
+ }
+ return prop;
+}
+
} // namespace android
diff --git a/services/audioflinger/PropertyUtils.h b/services/audioflinger/PropertyUtils.h
index 3bb6fa2..fbf651a 100644
--- a/services/audioflinger/PropertyUtils.h
+++ b/services/audioflinger/PropertyUtils.h
@@ -25,4 +25,8 @@
media::audio::common::AudioMMapPolicyType policyType,
std::vector<media::audio::common::AudioMMapPolicyInfo> *policyInfos);
+int32_t getAAudioMixerBurstCountFromSystemProperty();
+
+int32_t getAAudioHardwareBurstMinUsecFromSystemProperty();
+
} // namespace android