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
gugelfrei
Eric Laurent 4 years ago
parent 967bfe95b6
commit 2325bf07ed

@ -1185,15 +1185,21 @@ status_t AudioFlinger::setMicMute(bool state)
}
AutoMutex lock(mHardwareLock);
sp<DeviceHalInterface> 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<DeviceHalInterface> 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<DeviceHalInterface> dev = mAudioHwDevs.valueAt(i)->hwDevice();
status_t result = dev->getMicMute(&state);
if (result == NO_ERROR) {
mute = mute && state;
}
sp<DeviceHalInterface> 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)

Loading…
Cancel
Save