policy_hal: Override stopOutput method in policy_hal
-Ringtone is not heard over BT and speaker once MT call is
disconnected. When the call is disconnected from
MO device, only one output is getting unmuted as
part of stopSource of base AudioPolicy.
-stopSource is called from stopOutput, as stopOutput
is not overriden in CustomPolicy, stopSource of base class
is getting called and only one output is getting unmuted
-Overriding stopOutput in CustomPolicy, so that stopSource of
CustomPolicy gets called and all the outputs are unmuted in
case of duplicate outputs.
CR's fixed: 897000
Change-Id: I8c0a99dbaae860a261ce2f15b6056d3d9c545568
diff --git a/policy_hal/AudioPolicyManager.cpp b/policy_hal/AudioPolicyManager.cpp
index dfe379a..85a7393 100644
--- a/policy_hal/AudioPolicyManager.cpp
+++ b/policy_hal/AudioPolicyManager.cpp
@@ -954,6 +954,46 @@
}
+status_t AudioPolicyManagerCustom::stopOutput(audio_io_handle_t output,
+ audio_stream_type_t stream,
+ audio_session_t session)
+{
+ ALOGV("stopOutput() output %d, stream %d, session %d", output, stream, session);
+ ssize_t index = mOutputs.indexOfKey(output);
+ if (index < 0) {
+ ALOGW("stopOutput() unknown output %d", output);
+ return BAD_VALUE;
+ }
+
+ sp<SwAudioOutputDescriptor> outputDesc = mOutputs.valueAt(index);
+
+ if (outputDesc->mRefCount[stream] == 1) {
+ // Automatically disable the remote submix input when output is stopped on a
+ // re routing mix of type MIX_TYPE_RECORDERS
+ if (audio_is_remote_submix_device(outputDesc->mDevice) &&
+ outputDesc->mPolicyMix != NULL &&
+ outputDesc->mPolicyMix->mMixType == MIX_TYPE_RECORDERS) {
+ setDeviceConnectionStateInt(AUDIO_DEVICE_IN_REMOTE_SUBMIX,
+ AUDIO_POLICY_DEVICE_STATE_UNAVAILABLE,
+ outputDesc->mPolicyMix->mRegistrationId,
+ "remote-submix");
+ }
+ }
+
+ // Routing?
+ bool forceDeviceUpdate = false;
+ if (outputDesc->mRefCount[stream] > 0) {
+ int activityCount = mOutputRoutes.decRouteActivity(session);
+ forceDeviceUpdate = (mOutputRoutes.hasRoute(session) && (activityCount == 0));
+
+ if (forceDeviceUpdate) {
+ checkStrategyRoute(getStrategy(stream), AUDIO_IO_HANDLE_NONE);
+ }
+ }
+
+ return stopSource(outputDesc, stream, forceDeviceUpdate);
+}
+
status_t AudioPolicyManagerCustom::stopSource(sp<SwAudioOutputDescriptor> outputDesc,
audio_stream_type_t stream,
bool forceDeviceUpdate)
diff --git a/policy_hal/AudioPolicyManager.h b/policy_hal/AudioPolicyManager.h
index 66f9c38..69b2b1f 100644
--- a/policy_hal/AudioPolicyManager.h
+++ b/policy_hal/AudioPolicyManager.h
@@ -93,6 +93,9 @@
bool fromCache);
// returns true if given output is direct output
bool isDirectOutput(audio_io_handle_t output);
+ status_t stopOutput(audio_io_handle_t output,
+ audio_stream_type_t stream,
+ audio_session_t session);
// if argument "device" is different from AUDIO_DEVICE_NONE, startSource() will force
// the re-evaluation of the output device.