summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDhananjay Kumar <dhakumar@codeaurora.org>2015-10-21 12:36:19 +0530
committerGerrit - the friendly Code Review server <code-review@localhost>2015-11-01 07:51:04 -0800
commitfc748cbb9fb1e2b8531f8003a0421f3005270f97 (patch)
treeeb97cbc71ea8c72c72d2842ded0db3702321ce1e
parentd5c974e1c7f7c1d9dbea5e064126188e44e1ba1b (diff)
downloadhardware_qcom_audio-fc748cbb9fb1e2b8531f8003a0421f3005270f97.tar.gz
hardware_qcom_audio-fc748cbb9fb1e2b8531f8003a0421f3005270f97.tar.bz2
hardware_qcom_audio-fc748cbb9fb1e2b8531f8003a0421f3005270f97.zip
policy_hal: add support for fm device loopback
Use device connection event against AUDIO_DEVICE_OUT_FM to configure FM device loopback. Update primary output to get routing and volume events. Change-Id: I5ddce36581568d377a08ea5afe470bdff4349ec7
-rw-r--r--policy_hal/Android.mk4
-rw-r--r--policy_hal/AudioPolicyManager.cpp24
2 files changed, 28 insertions, 0 deletions
diff --git a/policy_hal/Android.mk b/policy_hal/Android.mk
index 9f778cad..8fc1662e 100644
--- a/policy_hal/Android.mk
+++ b/policy_hal/Android.mk
@@ -55,6 +55,10 @@ ifeq ($(strip $(AUDIO_FEATURE_ENABLED_PROXY_DEVICE)),true)
LOCAL_CFLAGS += -DAUDIO_EXTN_AFE_PROXY_ENABLED
endif
+ifeq ($(strip $(AUDIO_FEATURE_ENABLED_FM_POWER_OPT)),true)
+LOCAL_CFLAGS += -DFM_POWER_OPT
+endif
+
LOCAL_MODULE := libaudiopolicymanager
include $(BUILD_SHARED_LIBRARY)
diff --git a/policy_hal/AudioPolicyManager.cpp b/policy_hal/AudioPolicyManager.cpp
index b603d354..189bf60c 100644
--- a/policy_hal/AudioPolicyManager.cpp
+++ b/policy_hal/AudioPolicyManager.cpp
@@ -254,6 +254,23 @@ status_t AudioPolicyManagerCustom::setDeviceConnectionStateInt(audio_devices_t d
audio_devices_t newDevice = getNewOutputDevice(mPrimaryOutput, false /*fromCache*/);
updateCallRouting(newDevice);
}
+
+#ifdef FM_POWER_OPT
+ // handle FM device connection state to trigger FM AFE loopback
+ 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;
+ } else {
+ mPrimaryOutput->changeRefCount(AUDIO_STREAM_MUSIC, -1);
+ }
+ AudioParameter param = AudioParameter();
+ param.addInt(String8("handle_fm"), (int)newDevice);
+ mpClientInterface->setParameters(mPrimaryOutput->mIoHandle, param.toString());
+ }
+#endif /* FM_POWER_OPT end */
+
for (size_t i = 0; i < mOutputs.size(); i++) {
sp<SwAudioOutputDescriptor> desc = mOutputs.valueAt(i);
if ((mEngine->getPhoneState() != AUDIO_MODE_IN_CALL) || (desc != mPrimaryOutput)) {
@@ -1187,6 +1204,13 @@ status_t AudioPolicyManagerCustom::checkAndSetVolume(audio_stream_type_t stream,
mpClientInterface->setVoiceVolume(voiceVolume, delayMs);
mLastVoiceVolume = voiceVolume;
}
+#ifdef FM_POWER_OPT
+ } else if (stream == AUDIO_STREAM_MUSIC && hasPrimaryOutput() &&
+ outputDesc == mPrimaryOutput) {
+ AudioParameter param = AudioParameter();
+ param.addFloat(String8("fm_volume"), Volume::DbToAmpl(volumeDb));
+ mpClientInterface->setParameters(mPrimaryOutput->mIoHandle, param.toString(), delayMs);
+#endif /* FM_POWER_OPT end */
}
return NO_ERROR;