Merge "Pal: Avoid switching UPD streams to Bluetooth devices."
diff --git a/resource_manager/src/ResourceManager.cpp b/resource_manager/src/ResourceManager.cpp
index 4a59797..ec4dba3 100644
--- a/resource_manager/src/ResourceManager.cpp
+++ b/resource_manager/src/ResourceManager.cpp
@@ -8558,11 +8558,24 @@
if ((device->getSndDeviceId() > PAL_DEVICE_OUT_MIN &&
device->getSndDeviceId() < PAL_DEVICE_OUT_MAX) &&
((*sIter)->suspendedDevIds.size() == 1 /* non combo */)) {
- streamDevDisconnect.push_back({ (*sIter), device->getSndDeviceId() });
+ streamDevDisconnect.push_back({(*sIter), device->getSndDeviceId()});
}
}
}
-
+ restoredStreams.push_back((*sIter));
+ streamDevConnect.push_back({(*sIter), &a2dpDattr});
+ } else if (std::find((*sIter)->suspendedDevIds.begin(), (*sIter)->suspendedDevIds.end(),
+ PAL_DEVICE_OUT_BLUETOOTH_SCO) != (*sIter)->suspendedDevIds.end()) {
+ std::vector<std::shared_ptr<Device>> devices;
+ (*sIter)->getAssociatedDevices(devices);
+ if (devices.size() > 0) {
+ for (auto device: devices) {
+ if (device->getSndDeviceId() == PAL_DEVICE_OUT_BLUETOOTH_SCO) {
+ streamDevDisconnect.push_back({(*sIter), PAL_DEVICE_OUT_BLUETOOTH_SCO});
+ break;
+ }
+ }
+ }
restoredStreams.push_back((*sIter));
streamDevConnect.push_back({(*sIter), &a2dpDattr});
}
@@ -8584,6 +8597,7 @@
}
mActiveStreamMutex.lock();
+ SortAndUnique(restoredStreams);
for (sIter = restoredStreams.begin(); sIter != restoredStreams.end(); sIter++) {
if (((*sIter) != NULL) && isStreamActive(*sIter, mActiveStreams)) {
(*sIter)->lockStreamMutex();
@@ -9570,7 +9584,7 @@
(streamType == PAL_STREAM_COMPRESSED) ||
(streamType == PAL_STREAM_GENERIC)) {
(*sIter)->suspendedDevIds.clear();
- (*sIter)->suspendedDevIds.push_back(a2dp_dattr.id);
+ (*sIter)->suspendedDevIds.push_back(PAL_DEVICE_OUT_BLUETOOTH_SCO);
PAL_DBG(LOG_TAG, "a2dp resumed, mark sco streams as to route them later");
}
}
diff --git a/session/src/PayloadBuilder.cpp b/session/src/PayloadBuilder.cpp
index 4a07e3f..d57ce10 100644
--- a/session/src/PayloadBuilder.cpp
+++ b/session/src/PayloadBuilder.cpp
@@ -2047,7 +2047,7 @@
mediaFmtPayload->alignment = PCM_MSB_ALIGNED;
} else {
PAL_ERR(LOG_TAG, "invalid bit width %d", data->bit_width);
- free(payloadInfo);
+ delete[] payloadInfo;
payloadInfo = NULL;
*size = 0;
*payload = NULL;
diff --git a/stream/inc/Stream.h b/stream/inc/Stream.h
index e7f1b81..c66c13c 100644
--- a/stream/inc/Stream.h
+++ b/stream/inc/Stream.h
@@ -184,6 +184,7 @@
int mGainLevel;
int mOrientation = 0;
std::mutex mStreamMutex;
+ std::mutex mGetParamMutex;
static std::mutex mBaseStreamMutex; //TBD change this. as having a single static mutex for all instances of Stream is incorrect. Replace
static std::shared_ptr<ResourceManager> rm;
struct modifier_kv *mModifiers;
@@ -324,6 +325,8 @@
mStreamMutex.unlock();
};
bool isMutexLockedbyRm() { return mutexLockedbyRm; }
+ void lockGetParamMutex() { mGetParamMutex.lock(); };
+ void unlockGetParamMutex() { mGetParamMutex.unlock(); };
/* GetPalDevice only applies to Sound Trigger streams */
std::shared_ptr<Device> GetPalDevice(Stream *streamHandle, pal_device_id_t dev_id);
void setCachedState(stream_state_t state);
diff --git a/stream/src/Stream.cpp b/stream/src/Stream.cpp
index 63ca9c8..189431d 100644
--- a/stream/src/Stream.cpp
+++ b/stream/src/Stream.cpp
@@ -371,7 +371,9 @@
}
pal_param_payload *pal_param = (pal_param_payload *)effect_query;
effect_pal_payload_t *effectPayload = (effect_pal_payload_t *)pal_param->payload;
+ mGetParamMutex.lock();
status = session->getEffectParameters(this, effectPayload);
+ mGetParamMutex.unlock();
if (status) {
PAL_ERR(LOG_TAG, "getParameters failed with %d", status);
}
@@ -836,9 +838,9 @@
PAL_ERR(LOG_TAG, "Sound card offline, status %d", status);
goto exit;
}
- rm->lockResourceManagerMutex();
+ mGetParamMutex.lock();
status = session->getTimestamp(stime);
- rm->unlockResourceManagerMutex();
+ mGetParamMutex.unlock();
if (0 != status) {
PAL_ERR(LOG_TAG, "Failed to get session timestamp status %d", status);
if (errno == -ENETRESET &&