Merge "hal: fix for Fluence V5 ECNS failing to work with AANC" into av-userspace.lnx.1.0-dev.1.0
diff --git a/hal/audio_hw.c b/hal/audio_hw.c
index c46f419..8c729ff 100644
--- a/hal/audio_hw.c
+++ b/hal/audio_hw.c
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2013-2015, The Linux Foundation. All rights reserved.
+ * Copyright (c) 2013-2016, The Linux Foundation. All rights reserved.
* Not a Contribution.
*
* Copyright (C) 2013 The Android Open Source Project
@@ -1000,7 +1000,8 @@
out_snd_device = SND_DEVICE_NONE;
if (in_snd_device == SND_DEVICE_NONE) {
audio_devices_t out_device = AUDIO_DEVICE_NONE;
- if ((adev->active_input->source == AUDIO_SOURCE_VOICE_COMMUNICATION ||
+ if (adev->active_input &&
+ (adev->active_input->source == AUDIO_SOURCE_VOICE_COMMUNICATION ||
(adev->mode == AUDIO_MODE_IN_COMMUNICATION &&
adev->active_input->source == AUDIO_SOURCE_MIC)) &&
adev->primary_output && !adev->primary_output->standby) {
diff --git a/policy_hal/AudioPolicyManager.cpp b/policy_hal/AudioPolicyManager.cpp
index ac814cd..1b1578e 100644
--- a/policy_hal/AudioPolicyManager.cpp
+++ b/policy_hal/AudioPolicyManager.cpp
@@ -279,15 +279,20 @@
#ifdef FM_POWER_OPT
// handle FM device connection state to trigger FM AFE loopback
- if(device == AUDIO_DEVICE_OUT_FM && hasPrimaryOutput()) {
+ if (device == AUDIO_DEVICE_OUT_FM && hasPrimaryOutput()) {
audio_devices_t newDevice = getNewOutputDevice(mPrimaryOutput, false /*fromCache*/);
if (state == AUDIO_POLICY_DEVICE_STATE_AVAILABLE) {
mPrimaryOutput->changeRefCount(AUDIO_STREAM_MUSIC, 1);
newDevice = newDevice | AUDIO_DEVICE_OUT_FM;
+ mFMIsActive = true;
} else {
+ mFMIsActive = false;
mPrimaryOutput->changeRefCount(AUDIO_STREAM_MUSIC, -1);
}
AudioParameter param = AudioParameter();
+ float volumeDb = mPrimaryOutput->mCurVolume[AUDIO_STREAM_MUSIC];
+ mPrevFMVolumeDb = volumeDb;
+ param.addFloat(String8("fm_volume"), Volume::DbToAmpl(volumeDb));
param.addInt(String8("handle_fm"), (int)newDevice);
mpClientInterface->setParameters(mPrimaryOutput->mIoHandle, param.toString());
}
@@ -1270,14 +1275,15 @@
}
#ifdef FM_POWER_OPT
} else if (stream == AUDIO_STREAM_MUSIC && hasPrimaryOutput() &&
- outputDesc == mPrimaryOutput) {
+ outputDesc == mPrimaryOutput && mFMIsActive) {
/* Avoid unnecessary set_parameter calls as it puts the primary
outputs FastMixer in HOT_IDLE leading to breaks in audio */
if (volumeDb != mPrevFMVolumeDb) {
mPrevFMVolumeDb = volumeDb;
AudioParameter param = AudioParameter();
param.addFloat(String8("fm_volume"), Volume::DbToAmpl(volumeDb));
- mpClientInterface->setParameters(mPrimaryOutput->mIoHandle, param.toString(), delayMs);
+ //Double delayMs to avoid sound burst while device switch.
+ mpClientInterface->setParameters(mPrimaryOutput->mIoHandle, param.toString(), delayMs*2);
}
#endif /* FM_POWER_OPT end */
}
@@ -2043,7 +2049,8 @@
mHdmiAudioDisabled(false),
mHdmiAudioEvent(false),
mPrevPhoneState(0),
- mPrevFMVolumeDb(0.0f)
+ mPrevFMVolumeDb(0.0f),
+ mFMIsActive(false)
{
char ssr_enabled[PROPERTY_VALUE_MAX] = {0};
bool prop_ssr_enabled = false;
diff --git a/policy_hal/AudioPolicyManager.h b/policy_hal/AudioPolicyManager.h
index 59124b8..af8c2a8 100644
--- a/policy_hal/AudioPolicyManager.h
+++ b/policy_hal/AudioPolicyManager.h
@@ -155,6 +155,7 @@
bool mIsInputRequestOnProgress;
#endif
float mPrevFMVolumeDb;
+ bool mFMIsActive;
};
};