Merge "audioserver: do not prefetch audioserver services" into main
diff --git a/media/libaudiohal/impl/DeviceHalAidl.cpp b/media/libaudiohal/impl/DeviceHalAidl.cpp
index 629cd7c..0a131fa 100644
--- a/media/libaudiohal/impl/DeviceHalAidl.cpp
+++ b/media/libaudiohal/impl/DeviceHalAidl.cpp
@@ -79,13 +79,13 @@
using aidl::android::hardware::audio::core::VendorParameter;
#define RETURN_IF_MODULE_NOT_INIT(retVal) \
- if (mModule == nullptr) { \
+ if (!isModuleInitialized()) { \
AUGMENT_LOG(E, "module not initialized"); \
return retVal; \
}
#define RETURN_IF_TELEPHONY_NOT_INIT(retVal) \
- if (mTelephony == nullptr) { \
+ if (!isTelephonyInitialized()) { \
AUGMENT_LOG(E, "telephony not initialized"); \
return retVal; \
}
@@ -124,12 +124,12 @@
const std::shared_ptr<IHalAdapterVendorExtension>& vext)
: ConversionHelperAidl("DeviceHalAidl", instance),
mModule(module),
- mVendorExt(vext),
mTelephony(retrieveSubInterface<ITelephony>(module, &IModule::getTelephony)),
mBluetooth(retrieveSubInterface<IBluetooth>(module, &IModule::getBluetooth)),
mBluetoothA2dp(retrieveSubInterface<IBluetoothA2dp>(module, &IModule::getBluetoothA2dp)),
mBluetoothLe(retrieveSubInterface<IBluetoothLe>(module, &IModule::getBluetoothLe)),
mSoundDose(retrieveSubInterface<ISoundDose>(module, &IModule::getSoundDose)),
+ mVendorExt(vext),
mMapper(instance, module),
mMapperAccessor(mMapper, mLock) {}
@@ -154,8 +154,11 @@
return BAD_VALUE;
}
std::vector<AudioMode> aidlModes;
- RETURN_STATUS_IF_ERROR(
- statusTFromBinderStatus(mTelephony->getSupportedAudioModes(&aidlModes)));
+ {
+ std::lock_guard l(mLock);
+ RETURN_STATUS_IF_ERROR(
+ statusTFromBinderStatus(mTelephony->getSupportedAudioModes(&aidlModes)));
+ }
*modes = VALUE_OR_RETURN_STATUS(
::aidl::android::convertContainer<std::vector<media::audio::common::AudioMode>>(
aidlModes, ndk2cpp_AudioMode));
@@ -182,8 +185,11 @@
RETURN_IF_TELEPHONY_NOT_INIT(INVALID_OPERATION);
ITelephony::TelecomConfig inConfig{.voiceVolume = Float{volume}}, outConfig;
- RETURN_STATUS_IF_ERROR(
- statusTFromBinderStatus(mTelephony->setTelecomConfig(inConfig, &outConfig)));
+ {
+ std::lock_guard l(mLock);
+ RETURN_STATUS_IF_ERROR(
+ statusTFromBinderStatus(mTelephony->setTelecomConfig(inConfig, &outConfig)));
+ }
AUGMENT_LOG_IF(
W, outConfig.voiceVolume.has_value() && volume != outConfig.voiceVolume.value().value,
"the resulting voice volume %f is not the same as requested %f",
@@ -196,6 +202,7 @@
TIME_CHECK();
RETURN_IF_MODULE_NOT_INIT(NO_INIT);
+ std::lock_guard l(mLock);
return statusTFromBinderStatus(mModule->setMasterVolume(volume));
}
@@ -207,6 +214,7 @@
AUGMENT_LOG(E, "uninitialized volumes");
return BAD_VALUE;
}
+ std::lock_guard l(mLock);
return statusTFromBinderStatus(mModule->getMasterVolume(volume));
}
@@ -216,6 +224,7 @@
TIME_CHECK();
RETURN_IF_MODULE_NOT_INIT(NO_INIT);
AudioMode audioMode = VALUE_OR_FATAL(::aidl::android::legacy2aidl_audio_mode_t_AudioMode(mode));
+ std::lock_guard l(mLock);
if (mTelephony != nullptr) {
RETURN_STATUS_IF_ERROR(statusTFromBinderStatus(mTelephony->switchAudioMode(audioMode)));
}
@@ -227,6 +236,7 @@
TIME_CHECK();
RETURN_IF_MODULE_NOT_INIT(NO_INIT);
+ std::lock_guard l(mLock);
return statusTFromBinderStatus(mModule->setMicMute(state));
}
@@ -239,6 +249,7 @@
AUGMENT_LOG(E, "uninitialized mute state");
return BAD_VALUE;
}
+ std::lock_guard l(mLock);
return statusTFromBinderStatus(mModule->getMicMute(state));
}
@@ -247,6 +258,7 @@
TIME_CHECK();
RETURN_IF_MODULE_NOT_INIT(NO_INIT);
+ std::lock_guard l(mLock);
return statusTFromBinderStatus(mModule->setMasterMute(state));
}
@@ -259,6 +271,7 @@
AUGMENT_LOG(E, "uninitialized mute state");
return BAD_VALUE;
}
+ std::lock_guard l(mLock);
return statusTFromBinderStatus(mModule->getMasterMute(state));
}
@@ -286,6 +299,7 @@
if (status_t status = filterAndUpdateTelephonyParameters(parameters); status != OK) {
AUGMENT_LOG(W, "filterAndUpdateTelephonyParameters failed: %d", status);
}
+ std::lock_guard l(mLock);
return parseAndSetVendorParameters(mVendorExt, mModule, parameters);
}
@@ -306,6 +320,7 @@
AUGMENT_LOG(W, "filterAndRetrieveBtLeParameters failed: %d", status);
}
*values = result.toString();
+ std::lock_guard l(mLock);
return parseAndGetVendorParameters(mVendorExt, mModule, parameterKeys, values);
}
@@ -526,7 +541,10 @@
args.eventCallback = eventCb;
args.sourceMetadata = aidlMetadata;
::aidl::android::hardware::audio::core::IModule::OpenOutputStreamReturn ret;
- RETURN_STATUS_IF_ERROR(statusTFromBinderStatus(mModule->openOutputStream(args, &ret)));
+ {
+ std::lock_guard l(mLock);
+ RETURN_STATUS_IF_ERROR(statusTFromBinderStatus(mModule->openOutputStream(args, &ret)));
+ }
StreamContextAidl context(ret.desc, isOffload, aidlHandle);
if (!context.isValid()) {
AUGMENT_LOG(E, "Failed to created a valid stream context from the descriptor: %s",
@@ -605,7 +623,10 @@
args.sinkMetadata.tracks.push_back(std::move(aidlTrackMetadata));
args.bufferSizeFrames = aidlConfig.frameCount;
::aidl::android::hardware::audio::core::IModule::OpenInputStreamReturn ret;
- RETURN_STATUS_IF_ERROR(statusTFromBinderStatus(mModule->openInputStream(args, &ret)));
+ {
+ std::lock_guard l(mLock);
+ RETURN_STATUS_IF_ERROR(statusTFromBinderStatus(mModule->openInputStream(args, &ret)));
+ }
StreamContextAidl context(ret.desc, false /*isAsynchronous*/, aidlHandle);
if (!context.isValid()) {
AUGMENT_LOG(E, "Failed to created a valid stream context from the descriptor: %s",
@@ -904,8 +925,11 @@
requestedPortConfig, {} /*destinationPortIds*/, &devicePortConfig, &cleanups));
}
auto aidlEffect = sp<effect::EffectHalAidl>::cast(effect);
- RETURN_STATUS_IF_ERROR(statusTFromBinderStatus(mModule->addDeviceEffect(
- devicePortConfig.id, aidlEffect->getIEffect())));
+ {
+ std::lock_guard l(mLock);
+ RETURN_STATUS_IF_ERROR(statusTFromBinderStatus(
+ mModule->addDeviceEffect(devicePortConfig.id, aidlEffect->getIEffect())));
+ }
cleanups.disarmAll();
return OK;
}
@@ -936,6 +960,7 @@
&devicePortConfig));
}
auto aidlEffect = sp<effect::EffectHalAidl>::cast(effect);
+ std::lock_guard l(mLock);
return statusTFromBinderStatus(mModule->removeDeviceEffect(
devicePortConfig.id, aidlEffect->getIEffect()));
}
@@ -953,9 +978,10 @@
std::vector<AudioMMapPolicyInfo> mmapPolicyInfos;
- if (status_t status = statusTFromBinderStatus(
- mModule->getMmapPolicyInfos(mmapPolicyType, &mmapPolicyInfos)); status != OK) {
- return status;
+ {
+ std::lock_guard l(mLock);
+ RETURN_STATUS_IF_ERROR(statusTFromBinderStatus(
+ mModule->getMmapPolicyInfos(mmapPolicyType, &mmapPolicyInfos)));
}
*policyInfos = VALUE_OR_RETURN_STATUS(
@@ -970,10 +996,8 @@
TIME_CHECK();
RETURN_IF_MODULE_NOT_INIT(NO_INIT);
int32_t mixerBurstCount = 0;
- if (mModule->getAAudioMixerBurstCount(&mixerBurstCount).isOk()) {
- return mixerBurstCount;
- }
- return 0;
+ std::lock_guard l(mLock);
+ return mModule->getAAudioMixerBurstCount(&mixerBurstCount).isOk() ? mixerBurstCount : 0;
}
int32_t DeviceHalAidl::getAAudioHardwareBurstMinUsec() {
@@ -982,10 +1006,9 @@
TIME_CHECK();
RETURN_IF_MODULE_NOT_INIT(NO_INIT);
int32_t hardwareBurstMinUsec = 0;
- if (mModule->getAAudioHardwareBurstMinUsec(&hardwareBurstMinUsec).isOk()) {
- return hardwareBurstMinUsec;
- }
- return 0;
+ std::lock_guard l(mLock);
+ return mModule->getAAudioHardwareBurstMinUsec(&hardwareBurstMinUsec).isOk() ?
+ hardwareBurstMinUsec : 0;
}
error::Result<audio_hw_sync_t> DeviceHalAidl::getHwAvSync() {
@@ -994,6 +1017,7 @@
TIME_CHECK();
RETURN_IF_MODULE_NOT_INIT(NO_INIT);
int32_t aidlHwAvSync;
+ std::lock_guard l(mLock);
RETURN_STATUS_IF_ERROR(statusTFromBinderStatus(mModule->generateHwAvSyncId(&aidlHwAvSync)));
return VALUE_OR_RETURN_STATUS(
::aidl::android::aidl2legacy_int32_t_audio_hw_sync_t(aidlHwAvSync));
@@ -1001,9 +1025,10 @@
status_t DeviceHalAidl::dump(int fd, const Vector<String16>& args) {
TIME_CHECK();
- if (mModule == nullptr) return NO_INIT;
+ if (!isModuleInitialized()) return NO_INIT;
Vector<String16> newArgs = args;
newArgs.push(String16(kDumpFromAudioServerArgument));
+ std::lock_guard l(mLock);
return mModule->dump(fd, Args(newArgs).args(), newArgs.size());
}
@@ -1015,6 +1040,7 @@
if (supports == nullptr) {
return BAD_VALUE;
}
+ std::lock_guard l(mLock);
return statusTFromBinderStatus(mModule->supportsVariableLatency(supports));
}
@@ -1028,15 +1054,15 @@
}
if (mSoundDose == nullptr) {
AUGMENT_LOG(E, "failed to retrieve the sound dose interface");
- return BAD_VALUE;
- }
-
- if (mSoundDose == nullptr) {
- AUGMENT_LOG(E, "failed to return the sound dose interface not implemented");
return NO_INIT;
}
*soundDoseBinder = mSoundDose->asBinder();
+ if (soundDoseBinder == nullptr) {
+ AUGMENT_LOG(E, "failed to return the sound dose interface not implemented");
+ return NO_INIT;
+ }
+
AUGMENT_LOG(I, "using audio AIDL HAL sound dose interface");
return OK;
}
@@ -1116,10 +1142,8 @@
AUGMENT_LOG(V);
TIME_CHECK();
RETURN_IF_MODULE_NOT_INIT(NO_INIT);
- {
- std::lock_guard l(mLock);
- mMapper.resetUnusedPatchesAndPortConfigs();
- }
+ std::lock_guard l(mLock);
+ mMapper.resetUnusedPatchesAndPortConfigs();
ModuleDebug debug{ .simulateDeviceConnections = enabled };
status_t status = statusTFromBinderStatus(mModule->setModuleDebug(debug));
// This is important to log as it affects HAL behavior.
@@ -1135,6 +1159,7 @@
AudioParameter &keys, AudioParameter *result) {
if (String8 key = String8(AudioParameter::keyReconfigA2dpSupported); keys.containsKey(key)) {
keys.remove(key);
+ std::lock_guard l(mLock);
if (mBluetoothA2dp != nullptr) {
bool supports;
RETURN_STATUS_IF_ERROR(statusTFromBinderStatus(
@@ -1152,6 +1177,7 @@
AudioParameter &keys, AudioParameter *result) {
if (String8 key = String8(AudioParameter::keyReconfigLeSupported); keys.containsKey(key)) {
keys.remove(key);
+ std::lock_guard l(mLock);
if (mBluetoothLe != nullptr) {
bool supports;
RETURN_STATUS_IF_ERROR(statusTFromBinderStatus(
@@ -1192,6 +1218,7 @@
reconfigureOffload = std::move(result);
return OK;
}));
+ std::lock_guard l(mLock);
if (mBluetoothA2dp != nullptr && a2dpEnabled.has_value()) {
return statusTFromBinderStatus(mBluetoothA2dp->setEnabled(a2dpEnabled.value()));
}
@@ -1232,6 +1259,7 @@
}
return BAD_VALUE;
}));
+ std::lock_guard l(mLock);
if (mBluetooth != nullptr && hfpConfig != IBluetooth::HfpConfig{}) {
IBluetooth::HfpConfig newHfpConfig;
return statusTFromBinderStatus(mBluetooth->setHfpConfig(hfpConfig, &newHfpConfig));
@@ -1270,6 +1298,7 @@
}
return OK;
}));
+ std::lock_guard l(mLock);
if (mBluetoothLe != nullptr && leEnabled.has_value()) {
return statusTFromBinderStatus(mBluetoothLe->setEnabled(leEnabled.value()));
}
@@ -1330,6 +1359,7 @@
AudioParameter::keyBtScoWb, onOrOff.c_str());
return BAD_VALUE;
}));
+ std::lock_guard l(mLock);
if (mBluetooth != nullptr && scoConfig != IBluetooth::ScoConfig{}) {
IBluetooth::ScoConfig newScoConfig;
return statusTFromBinderStatus(mBluetooth->setScoConfig(scoConfig, &newScoConfig));
@@ -1352,6 +1382,7 @@
AudioParameter::keyScreenState, onOrOff.c_str());
return BAD_VALUE;
}
+ std::lock_guard l(mLock);
return statusTFromBinderStatus(mModule->updateScreenState(isTurnedOn.value()));
}));
(void)VALUE_OR_RETURN_STATUS(filterOutAndProcessParameter<int>(
@@ -1376,6 +1407,7 @@
AudioParameter::keyScreenRotation, rotationDegrees);
return BAD_VALUE;
}
+ std::lock_guard l(mLock);
return statusTFromBinderStatus(mModule->updateScreenRotation(rotation));
}));
return OK;
@@ -1418,6 +1450,7 @@
AudioParameter::keyHacSetting, onOrOff.c_str());
return BAD_VALUE;
}));
+ std::lock_guard l(mLock);
if (mTelephony != nullptr && telConfig != ITelephony::TelecomConfig{}) {
ITelephony::TelecomConfig newTelConfig;
return statusTFromBinderStatus(mTelephony->setTelecomConfig(telConfig, &newTelConfig));
diff --git a/media/libaudiohal/impl/DeviceHalAidl.h b/media/libaudiohal/impl/DeviceHalAidl.h
index 6ae6402..af8b423 100644
--- a/media/libaudiohal/impl/DeviceHalAidl.h
+++ b/media/libaudiohal/impl/DeviceHalAidl.h
@@ -235,19 +235,32 @@
// MicrophoneInfoProvider implementation
MicrophoneInfoProvider::Info const* getMicrophoneInfo() override;
- const std::shared_ptr<::aidl::android::hardware::audio::core::IModule> mModule;
- const std::shared_ptr<::aidl::android::media::audio::IHalAdapterVendorExtension> mVendorExt;
- const std::shared_ptr<::aidl::android::hardware::audio::core::ITelephony> mTelephony;
- const std::shared_ptr<::aidl::android::hardware::audio::core::IBluetooth> mBluetooth;
- const std::shared_ptr<::aidl::android::hardware::audio::core::IBluetoothA2dp> mBluetoothA2dp;
- const std::shared_ptr<::aidl::android::hardware::audio::core::IBluetoothLe> mBluetoothLe;
+ // See below, the lock is only used to serialize calling into the interface.
+ bool isModuleInitialized() const NO_THREAD_SAFETY_ANALYSIS { return mModule != nullptr; }
+ bool isTelephonyInitialized() const NO_THREAD_SAFETY_ANALYSIS { return mTelephony != nullptr; }
+
+ mutable std::mutex mLock;
+ // GUARDED_BY is used to prevent concurrent calls into these interfaces from multiple threads.
+ // There is no requirement for IModule and its helper interfaces implementations
+ // to be thread-safe.
+ const std::shared_ptr<::aidl::android::hardware::audio::core::IModule> mModule
+ GUARDED_BY(mLock);
+ const std::shared_ptr<::aidl::android::hardware::audio::core::ITelephony> mTelephony
+ GUARDED_BY(mLock);
+ const std::shared_ptr<::aidl::android::hardware::audio::core::IBluetooth> mBluetooth
+ GUARDED_BY(mLock);
+ const std::shared_ptr<::aidl::android::hardware::audio::core::IBluetoothA2dp> mBluetoothA2dp
+ GUARDED_BY(mLock);
+ const std::shared_ptr<::aidl::android::hardware::audio::core::IBluetoothLe> mBluetoothLe
+ GUARDED_BY(mLock);
+
const std::shared_ptr<::aidl::android::hardware::audio::core::sounddose::ISoundDose> mSoundDose;
+ const std::shared_ptr<::aidl::android::media::audio::IHalAdapterVendorExtension> mVendorExt;
std::mutex mCallbacksLock;
// Use 'mCallbacksLock' only to implement exclusive access to 'mCallbacks'. Never hold it
// while making any calls.
std::map<void*, Callbacks> mCallbacks GUARDED_BY(mCallbacksLock);
- std::mutex mLock;
std::set<audio_port_handle_t> mDeviceDisconnectionNotified GUARDED_BY(mLock);
Hal2AidlMapper mMapper GUARDED_BY(mLock);
LockedAccessor<Hal2AidlMapper> mMapperAccessor;
diff --git a/services/audioflinger/Threads.cpp b/services/audioflinger/Threads.cpp
index 32690ff..e4f08b9 100644
--- a/services/audioflinger/Threads.cpp
+++ b/services/audioflinger/Threads.cpp
@@ -8643,6 +8643,10 @@
timestampCorrectionEnabled = isTimestampCorrectionEnabled_l();
lockEffectChains_l(effectChains);
+ // We're exiting locked scope with non empty activeTracks, make sure
+ // that we're not in standby mode which we could have entered if some
+ // tracks were muted/unmuted.
+ mStandby = false;
}
// thread mutex is now unlocked, mActiveTracks unknown, activeTracks.size() > 0