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); 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; mHardwareStatus = AUDIO_HW_SET_MIC_MUTE;
ret = primaryDev->setMicMute(state);
for (size_t i = 0; i < mAudioHwDevs.size(); i++) { for (size_t i = 0; i < mAudioHwDevs.size(); i++) {
sp<DeviceHalInterface> dev = mAudioHwDevs.valueAt(i)->hwDevice(); sp<DeviceHalInterface> dev = mAudioHwDevs.valueAt(i)->hwDevice();
status_t result = dev->setMicMute(state); if (dev != primaryDev) {
if (result != NO_ERROR) { (void)dev->setMicMute(state);
ret = result;
} }
} }
mHardwareStatus = AUDIO_HW_IDLE; mHardwareStatus = AUDIO_HW_IDLE;
ALOGW_IF(ret != NO_ERROR, "%s: error %d setting state to HAL", __func__, ret);
return ret; return ret;
} }
@ -1203,20 +1209,18 @@ bool AudioFlinger::getMicMute() const
if (ret != NO_ERROR) { if (ret != NO_ERROR) {
return false; return false;
} }
bool mute = true;
bool state = AUDIO_MODE_INVALID;
AutoMutex lock(mHardwareLock); AutoMutex lock(mHardwareLock);
mHardwareStatus = AUDIO_HW_GET_MIC_MUTE; sp<DeviceHalInterface> primaryDev = mPrimaryHardwareDev->hwDevice();
for (size_t i = 0; i < mAudioHwDevs.size(); i++) { if (primaryDev == nullptr) {
sp<DeviceHalInterface> dev = mAudioHwDevs.valueAt(i)->hwDevice(); ALOGW("%s: no primary HAL device", __func__);
status_t result = dev->getMicMute(&state); return false;
if (result == NO_ERROR) {
mute = mute && state;
}
} }
bool state;
mHardwareStatus = AUDIO_HW_GET_MIC_MUTE;
ret = primaryDev->getMicMute(&state);
mHardwareStatus = AUDIO_HW_IDLE; mHardwareStatus = AUDIO_HW_IDLE;
ALOGE_IF(ret != NO_ERROR, "%s: error %d getting state from HAL", __func__, ret);
return mute; return (ret == NO_ERROR) && state;
} }
void AudioFlinger::setRecordSilenced(audio_port_handle_t portId, bool silenced) void AudioFlinger::setRecordSilenced(audio_port_handle_t portId, bool silenced)

Loading…
Cancel
Save