audiopolicy: fix preferred device selection
Make sure preferred device selection is taken into account
in getOutputForAttr() even if called twice on the same session:
Force changed flag when adding a SessionRoute even if
the same device is specified.
Also renamed SessionRoute isActive() to isActiveOrChanged() and
hasRouteChanged() to getAndClearRouteChanged() for clarity.
Bug: 69680975
Test: manual
Change-Id: I3f3a659568c4dfc825a788753b0302136fd89871
diff --git a/services/audiopolicy/common/managerdefinitions/include/SessionRoute.h b/services/audiopolicy/common/managerdefinitions/include/SessionRoute.h
index fc2c273..fac6cbe 100644
--- a/services/audiopolicy/common/managerdefinitions/include/SessionRoute.h
+++ b/services/audiopolicy/common/managerdefinitions/include/SessionRoute.h
@@ -54,7 +54,7 @@
void log(const char* prefix);
- bool isActive() {
+ bool isActiveOrChanged() {
return (mDeviceDescriptor != 0) && (mChanged || (mActivityCount > 0));
}
@@ -96,7 +96,7 @@
int incRouteActivity(audio_session_t session);
int decRouteActivity(audio_session_t session);
- bool hasRouteChanged(audio_session_t session); // also clears the changed flag
+ bool getAndClearRouteChanged(audio_session_t session); // also clears the changed flag
void log(const char* caption);
// Specify an Output(Sink) route by passing SessionRoute::SOURCE_TYPE_NA in the
diff --git a/services/audiopolicy/common/managerdefinitions/src/SessionRoute.cpp b/services/audiopolicy/common/managerdefinitions/src/SessionRoute.cpp
index 689f4e6..8edd4d1 100644
--- a/services/audiopolicy/common/managerdefinitions/src/SessionRoute.cpp
+++ b/services/audiopolicy/common/managerdefinitions/src/SessionRoute.cpp
@@ -40,7 +40,7 @@
return indexOfKey(session) >= 0 && valueFor(session)->mDeviceDescriptor != 0;
}
-bool SessionRouteMap::hasRouteChanged(audio_session_t session)
+bool SessionRouteMap::getAndClearRouteChanged(audio_session_t session)
{
if (indexOfKey(session) >= 0) {
if (valueFor(session)->mChanged) {
@@ -104,9 +104,7 @@
sp<SessionRoute> route = indexOfKey(session) >= 0 ? valueFor(session) : 0;
if (route != 0) {
- if (((route->mDeviceDescriptor == 0) && (descriptor != 0)) ||
- ((route->mDeviceDescriptor != 0) &&
- ((descriptor == 0) || (!route->mDeviceDescriptor->equals(descriptor))))) {
+ if (descriptor != 0 || route->mDeviceDescriptor != 0) {
route->mChanged = true;
}
route->mRefCount++;
@@ -114,10 +112,10 @@
} else {
route = new SessionRoute(session, streamType, source, descriptor, uid);
route->mRefCount++;
- add(session, route);
if (descriptor != 0) {
route->mChanged = true;
}
+ add(session, route);
}
}
diff --git a/services/audiopolicy/managerdefault/AudioPolicyManager.cpp b/services/audiopolicy/managerdefault/AudioPolicyManager.cpp
index bb00c3f..22bc426 100644
--- a/services/audiopolicy/managerdefault/AudioPolicyManager.cpp
+++ b/services/audiopolicy/managerdefault/AudioPolicyManager.cpp
@@ -1116,7 +1116,7 @@
} else {
newDevice = AUDIO_DEVICE_OUT_REMOTE_SUBMIX;
}
- } else if (mOutputRoutes.hasRouteChanged(session)) {
+ } else if (mOutputRoutes.getAndClearRouteChanged(session)) {
newDevice = getNewOutputDevice(outputDesc, false /*fromCache*/);
checkStrategyRoute(getStrategy(stream), output);
} else {
@@ -1980,7 +1980,7 @@
// Routing?
mInputRoutes.incRouteActivity(session);
- if (audioSession->activeCount() == 1 || mInputRoutes.hasRouteChanged(session)) {
+ if (audioSession->activeCount() == 1 || mInputRoutes.getAndClearRouteChanged(session)) {
// indicate active capture to sound trigger service if starting capture from a mic on
// primary HW module
audio_devices_t device = getNewInputDevice(inputDesc);
@@ -4707,7 +4707,7 @@
for (size_t routeIndex = 0; routeIndex < mOutputRoutes.size(); routeIndex++) {
sp<SessionRoute> route = mOutputRoutes.valueAt(routeIndex);
routing_strategy routeStrategy = getStrategy(route->mStreamType);
- if ((routeStrategy == strategy) && route->isActive() &&
+ if ((routeStrategy == strategy) && route->isActiveOrChanged() &&
(mAvailableOutputDevices.indexOf(route->mDeviceDescriptor) >= 0)) {
return route->mDeviceDescriptor->type();
}
@@ -5139,7 +5139,7 @@
// then select this device.
for (size_t routeIndex = 0; routeIndex < mInputRoutes.size(); routeIndex++) {
sp<SessionRoute> route = mInputRoutes.valueAt(routeIndex);
- if ((inputSource == route->mSource) && route->isActive() &&
+ if ((inputSource == route->mSource) && route->isActiveOrChanged() &&
(mAvailableInputDevices.indexOf(route->mDeviceDescriptor) >= 0)) {
return route->mDeviceDescriptor->type();
}