From 2325bf07edfa494aa5a186aacdcc80ff0233adbe Mon Sep 17 00:00:00 2001 From: Eric Laurent Date: Wed, 8 Apr 2020 19:38:13 -0700 Subject: [PATCH] AudioFlinger: mute mic on primary HAL only Only the primary HAL has to support mic mute function. Ignore errors returned by other HALs in setMicMute() and only report mic mute state from primary HAL in getMicMute(). Bug: 153103117 Test: CTS AudioManagerTest.testMicrophoneMute Test: manual phone call and verify microphone mute. Change-Id: Ic121c49e7e7cd75eeee9342249271c7fca7c1c2a --- services/audioflinger/AudioFlinger.cpp | 32 +++++++++++++++----------- 1 file changed, 18 insertions(+), 14 deletions(-) diff --git a/services/audioflinger/AudioFlinger.cpp b/services/audioflinger/AudioFlinger.cpp index 5c891e29a6..03c16f38c7 100644 --- a/services/audioflinger/AudioFlinger.cpp +++ b/services/audioflinger/AudioFlinger.cpp @@ -1185,15 +1185,21 @@ status_t AudioFlinger::setMicMute(bool state) } AutoMutex lock(mHardwareLock); + sp primaryDev = mPrimaryHardwareDev->hwDevice(); + if (primaryDev == nullptr) { + ALOGW("%s: no primary HAL device", __func__); + return INVALID_OPERATION; + } mHardwareStatus = AUDIO_HW_SET_MIC_MUTE; + ret = primaryDev->setMicMute(state); for (size_t i = 0; i < mAudioHwDevs.size(); i++) { sp dev = mAudioHwDevs.valueAt(i)->hwDevice(); - status_t result = dev->setMicMute(state); - if (result != NO_ERROR) { - ret = result; + if (dev != primaryDev) { + (void)dev->setMicMute(state); } } mHardwareStatus = AUDIO_HW_IDLE; + ALOGW_IF(ret != NO_ERROR, "%s: error %d setting state to HAL", __func__, ret); return ret; } @@ -1203,20 +1209,18 @@ bool AudioFlinger::getMicMute() const if (ret != NO_ERROR) { return false; } - bool mute = true; - bool state = AUDIO_MODE_INVALID; AutoMutex lock(mHardwareLock); - mHardwareStatus = AUDIO_HW_GET_MIC_MUTE; - for (size_t i = 0; i < mAudioHwDevs.size(); i++) { - sp dev = mAudioHwDevs.valueAt(i)->hwDevice(); - status_t result = dev->getMicMute(&state); - if (result == NO_ERROR) { - mute = mute && state; - } + sp primaryDev = mPrimaryHardwareDev->hwDevice(); + if (primaryDev == nullptr) { + ALOGW("%s: no primary HAL device", __func__); + return false; } + bool state; + mHardwareStatus = AUDIO_HW_GET_MIC_MUTE; + ret = primaryDev->getMicMute(&state); mHardwareStatus = AUDIO_HW_IDLE; - - return mute; + ALOGE_IF(ret != NO_ERROR, "%s: error %d getting state from HAL", __func__, ret); + return (ret == NO_ERROR) && state; } void AudioFlinger::setRecordSilenced(audio_port_handle_t portId, bool silenced)