Merge "USBAudio: Add endstr check before reading each capability"
diff --git a/Pal.cpp b/Pal.cpp
index e0fc84f..f918fe9 100644
--- a/Pal.cpp
+++ b/Pal.cpp
@@ -256,14 +256,13 @@
return status;
}
- rm->lockActiveStream();
+ rm->lockValidStreamMutex();
if (!rm->isActiveStream(stream_handle)) {
status = -EINVAL;
- rm->unlockActiveStream();
+ rm->unlockValidStreamMutex();
return status;
}
-
- rm->unlockActiveStream();
+ rm->unlockValidStreamMutex();
s = reinterpret_cast<Stream *>(stream_handle);
s->setCachedState(STREAM_IDLE);
@@ -314,30 +313,31 @@
goto exit;
}
- s = reinterpret_cast<Stream *>(stream_handle);
- s->getStreamAttributes(&sAttr);
- if (sAttr.type == PAL_STREAM_VOICE_UI)
- rm->handleDeferredSwitch();
-
- rm->lockActiveStream();
+ rm->lockValidStreamMutex();
if (!rm->isActiveStream(stream_handle)) {
- rm->unlockActiveStream();
+ rm->unlockValidStreamMutex();
status = -EINVAL;
goto exit;
}
+ s = reinterpret_cast<Stream *>(stream_handle);
status = rm->increaseStreamUserCounter(s);
if (0 != status) {
- rm->unlockActiveStream();
+ rm->unlockValidStreamMutex();
PAL_ERR(LOG_TAG, "failed to increase stream user count");
goto exit;
}
- rm->unlockActiveStream();
+ rm->unlockValidStreamMutex();
+
+ s->getStreamAttributes(&sAttr);
+ if (sAttr.type == PAL_STREAM_VOICE_UI)
+ rm->handleDeferredSwitch();
+
status = s->start();
- rm->lockActiveStream();
+ rm->lockValidStreamMutex();
rm->decreaseStreamUserCounter(s);
- rm->unlockActiveStream();
+ rm->unlockValidStreamMutex();
if (0 != status) {
PAL_ERR(LOG_TAG, "stream start failed. status %d", status);
@@ -368,9 +368,9 @@
goto exit;
}
- rm->lockActiveStream();
+ rm->lockValidStreamMutex();
if (!rm->isActiveStream(stream_handle)) {
- rm->unlockActiveStream();
+ rm->unlockValidStreamMutex();
status = -EINVAL;
goto exit;
}
@@ -378,17 +378,17 @@
s = reinterpret_cast<Stream *>(stream_handle);
status = rm->increaseStreamUserCounter(s);
if (0 != status) {
- rm->unlockActiveStream();
+ rm->unlockValidStreamMutex();
PAL_ERR(LOG_TAG, "failed to increase stream user count");
goto exit;
}
- rm->unlockActiveStream();
+ rm->unlockValidStreamMutex();
s->setCachedState(STREAM_STOPPED);
status = s->stop();
- rm->lockActiveStream();
+ rm->lockValidStreamMutex();
rm->decreaseStreamUserCounter(s);
- rm->unlockActiveStream();
+ rm->unlockValidStreamMutex();
if (0 != status) {
PAL_ERR(LOG_TAG, "stream stop failed. status : %d", status);
@@ -412,22 +412,33 @@
status = -EINVAL;
return status;
}
- rm->lockActiveStream();
+ rm->lockValidStreamMutex();
if (!stream_handle || !rm->isActiveStream(stream_handle) || !buf) {
- rm->unlockActiveStream();
+ rm->unlockValidStreamMutex();
status = -EINVAL;
PAL_ERR(LOG_TAG, "Invalid input parameters status %d", status);
return status;
}
- rm->unlockActiveStream();
PAL_VERBOSE(LOG_TAG, "Enter. Stream handle :%pK", stream_handle);
s = reinterpret_cast<Stream *>(stream_handle);
+ status = rm->increaseStreamUserCounter(s);
+ if (0 != status) {
+ rm->unlockValidStreamMutex();
+ PAL_ERR(LOG_TAG, "failed to increase stream user count");
+ return status;
+ }
+ rm->unlockValidStreamMutex();
+
status = s->write(buf);
if (status < 0) {
PAL_ERR(LOG_TAG, "stream write failed status %d", status);
- return status;
}
+
+ rm->lockValidStreamMutex();
+ rm->decreaseStreamUserCounter(s);
+ rm->unlockValidStreamMutex();
+
PAL_VERBOSE(LOG_TAG, "Exit. status %d", status);
return status;
}
@@ -444,22 +455,32 @@
status = -EINVAL;
return status;
}
- rm->lockActiveStream();
+ rm->lockValidStreamMutex();
if (!stream_handle || !rm->isActiveStream(stream_handle) || !buf) {
- rm->unlockActiveStream();
+ rm->unlockValidStreamMutex();
status = -EINVAL;
PAL_ERR(LOG_TAG, "Invalid input parameters status %d", status);
return status;
}
- rm->unlockActiveStream();
PAL_VERBOSE(LOG_TAG, "Enter. Stream handle :%pK", stream_handle);
s = reinterpret_cast<Stream *>(stream_handle);
+ status = rm->increaseStreamUserCounter(s);
+ if (0 != status) {
+ rm->unlockValidStreamMutex();
+ PAL_ERR(LOG_TAG, "failed to increase stream user count");
+ return status;
+ }
+ rm->unlockValidStreamMutex();
+
status = s->read(buf);
if (status < 0) {
PAL_ERR(LOG_TAG, "stream read failed status %d", status);
- return status;
}
+
+ rm->lockValidStreamMutex();
+ rm->decreaseStreamUserCounter(s);
+ rm->unlockValidStreamMutex();
PAL_VERBOSE(LOG_TAG, "Exit. status %d", status);
return status;
}
@@ -478,22 +499,32 @@
return status;
}
- rm->lockActiveStream();
+ rm->lockValidStreamMutex();
if (!stream_handle || !rm->isActiveStream(stream_handle)) {
- rm->unlockActiveStream();
+ rm->unlockValidStreamMutex();
status = -EINVAL;
PAL_ERR(LOG_TAG, "Invalid input parameters status %d", status);
return status;
}
- rm->unlockActiveStream();
PAL_DBG(LOG_TAG, "Enter. Stream handle :%pK", stream_handle);
s = reinterpret_cast<Stream *>(stream_handle);
+ status = rm->increaseStreamUserCounter(s);
+ if (0 != status) {
+ rm->unlockValidStreamMutex();
+ PAL_ERR(LOG_TAG, "failed to increase stream user count");
+ return status;
+ }
+ rm->unlockValidStreamMutex();
+
status = s->getParameters(param_id, (void **)param_payload);
if (0 != status) {
PAL_ERR(LOG_TAG, "get parameters failed status %d param_id %u", status, param_id);
- return status;
}
+
+ rm->lockValidStreamMutex();
+ rm->decreaseStreamUserCounter(s);
+ rm->unlockValidStreamMutex();
PAL_DBG(LOG_TAG, "Exit. status %d", status);
return status;
}
@@ -512,23 +543,34 @@
return status;
}
- rm->lockActiveStream();
+ rm->lockValidStreamMutex();
if (!stream_handle || !rm->isActiveStream(stream_handle)) {
- rm->unlockActiveStream();
+ rm->unlockValidStreamMutex();
status = -EINVAL;
PAL_ERR(LOG_TAG, "Invalid stream handle, status %d", status);
return status;
}
- rm->unlockActiveStream();
PAL_DBG(LOG_TAG, "Enter. Stream handle :%pK param_id %d", stream_handle,
param_id);
s = reinterpret_cast<Stream *>(stream_handle);
+ status = rm->increaseStreamUserCounter(s);
+ if (0 != status) {
+ rm->unlockValidStreamMutex();
+ PAL_ERR(LOG_TAG, "failed to increase stream user count");
+ return status;
+ }
+ rm->unlockValidStreamMutex();
+
if (PAL_PARAM_ID_UIEFFECT == param_id) {
status = s->setEffectParameters((void *)param_payload);
} else {
status = s->setParameters(param_id, (void *)param_payload);
}
+ rm->lockValidStreamMutex();
+ rm->decreaseStreamUserCounter(s);
+ rm->unlockValidStreamMutex();
+
if (0 != status) {
PAL_ERR(LOG_TAG, "set parameters failed status %d param_id %u", status, param_id);
return status;
@@ -538,6 +580,7 @@
PAL_DBG(LOG_TAG, "Buffering stopped, handle deferred LPI<->NLPI switch");
rm->handleDeferredSwitch();
}
+
PAL_DBG(LOG_TAG, "Exit. status %d", status);
return status;
}
@@ -562,9 +605,9 @@
}
PAL_DBG(LOG_TAG, "Enter. Stream handle :%pK", stream_handle);
- rm->lockActiveStream();
+ rm->lockValidStreamMutex();
if (!rm->isActiveStream(stream_handle)) {
- rm->unlockActiveStream();
+ rm->unlockValidStreamMutex();
status = -EINVAL;
return status;
}
@@ -572,19 +615,19 @@
s = reinterpret_cast<Stream *>(stream_handle);
status = rm->increaseStreamUserCounter(s);
if (0 != status) {
- rm->unlockActiveStream();
+ rm->unlockValidStreamMutex();
PAL_ERR(LOG_TAG, "failed to increase stream user count");
return status;
}
- rm->unlockActiveStream();
+ rm->unlockValidStreamMutex();
s->lockStreamMutex();
status = s->setVolume(volume);
s->unlockStreamMutex();
- rm->lockActiveStream();
+ rm->lockValidStreamMutex();
rm->decreaseStreamUserCounter(s);
- rm->unlockActiveStream();
+ rm->unlockValidStreamMutex();
if (0 != status) {
PAL_ERR(LOG_TAG, "setVolume failed with status %d", status);
@@ -615,9 +658,9 @@
PAL_DBG(LOG_TAG, "Enter. Stream handle :%pK", stream_handle);
- rm->lockActiveStream();
+ rm->lockValidStreamMutex();
if (!rm->isActiveStream(stream_handle)) {
- rm->unlockActiveStream();
+ rm->unlockValidStreamMutex();
status = -EINVAL;
goto exit;
}
@@ -625,16 +668,16 @@
s = reinterpret_cast<Stream *>(stream_handle);
status = rm->increaseStreamUserCounter(s);
if (0 != status) {
- rm->unlockActiveStream();
+ rm->unlockValidStreamMutex();
PAL_ERR(LOG_TAG, "failed to increase stream user count");
goto exit;
}
- rm->unlockActiveStream();
+ rm->unlockValidStreamMutex();
status = s->mute(state);
- rm->lockActiveStream();
+ rm->lockValidStreamMutex();
rm->decreaseStreamUserCounter(s);
- rm->unlockActiveStream();
+ rm->unlockValidStreamMutex();
if (0 != status) {
PAL_ERR(LOG_TAG, "mute failed with status %d", status);
@@ -643,7 +686,6 @@
exit:
PAL_DBG(LOG_TAG, "Exit. status %d", status);
-
return status;
}
@@ -660,22 +702,31 @@
return status;
}
- rm->lockActiveStream();
+ rm->lockValidStreamMutex();
if (!stream_handle || !rm->isActiveStream(stream_handle)) {
- rm->unlockActiveStream();
+ rm->unlockValidStreamMutex();
status = -EINVAL;
PAL_ERR(LOG_TAG, "Invalid stream handle status %d", status);
return status;
}
- rm->unlockActiveStream();
PAL_DBG(LOG_TAG, "Enter. Stream handle :%pK", stream_handle);
s = reinterpret_cast<Stream *>(stream_handle);
+ status = rm->increaseStreamUserCounter(s);
+ if (0 != status) {
+ rm->unlockValidStreamMutex();
+ PAL_ERR(LOG_TAG, "failed to increase stream user count");
+ return status;
+ }
+ rm->unlockValidStreamMutex();
+
status = s->pause();
if (0 != status) {
PAL_ERR(LOG_TAG, "pal_stream_pause failed with status %d", status);
- return status;
}
+ rm->lockValidStreamMutex();
+ rm->decreaseStreamUserCounter(s);
+ rm->unlockValidStreamMutex();
PAL_DBG(LOG_TAG, "Exit. status %d", status);
return status;
}
@@ -693,24 +744,31 @@
return status;
}
- rm->lockActiveStream();
+ rm->lockValidStreamMutex();
if (!stream_handle || !rm->isActiveStream(stream_handle)) {
- rm->unlockActiveStream();
+ rm->unlockValidStreamMutex();
status = -EINVAL;
PAL_ERR(LOG_TAG, "Invalid stream handle status %d", status);
return status;
}
- rm->unlockActiveStream();
PAL_DBG(LOG_TAG, "Enter. Stream handle :%pK", stream_handle);
s = reinterpret_cast<Stream *>(stream_handle);
+ status = rm->increaseStreamUserCounter(s);
+ if (0 != status) {
+ rm->unlockValidStreamMutex();
+ PAL_ERR(LOG_TAG, "failed to increase stream user count");
+ return status;
+ }
+ rm->unlockValidStreamMutex();
status = s->resume();
if (0 != status) {
PAL_ERR(LOG_TAG, "resume failed with status %d", status);
- return status;
}
-
+ rm->lockValidStreamMutex();
+ rm->decreaseStreamUserCounter(s);
+ rm->unlockValidStreamMutex();
PAL_DBG(LOG_TAG, "Exit. status %d", status);
return status;
}
@@ -736,9 +794,9 @@
goto exit;
}
- rm->lockActiveStream();
+ rm->lockValidStreamMutex();
if (!rm->isActiveStream(stream_handle)) {
- rm->unlockActiveStream();
+ rm->unlockValidStreamMutex();
status = -EINVAL;
goto exit;
}
@@ -746,17 +804,17 @@
s = reinterpret_cast<Stream *>(stream_handle);
status = rm->increaseStreamUserCounter(s);
if (0 != status) {
- rm->unlockActiveStream();
+ rm->unlockValidStreamMutex();
PAL_ERR(LOG_TAG, "failed to increase stream user count");
goto exit;
}
- rm->unlockActiveStream();
+ rm->unlockValidStreamMutex();
status = s->drain(type);
- rm->lockActiveStream();
+ rm->lockValidStreamMutex();
rm->decreaseStreamUserCounter(s);
- rm->unlockActiveStream();
+ rm->unlockValidStreamMutex();
if (0 != status) {
PAL_ERR(LOG_TAG, "drain failed with status %d", status);
@@ -780,24 +838,32 @@
return status;
}
- rm->lockActiveStream();
+ rm->lockValidStreamMutex();
if (!stream_handle || !rm->isActiveStream(stream_handle)) {
- rm->unlockActiveStream();
+ rm->unlockValidStreamMutex();
status = -EINVAL;
PAL_ERR(LOG_TAG, "Invalid stream handle status %d", status);
return status;
}
- rm->unlockActiveStream();
PAL_DBG(LOG_TAG, "Enter. Stream handle :%pK", stream_handle);
s = reinterpret_cast<Stream *>(stream_handle);
+ status = rm->increaseStreamUserCounter(s);
+ if (0 != status) {
+ rm->unlockValidStreamMutex();
+ PAL_ERR(LOG_TAG, "failed to increase stream user count");
+ return status;
+ }
+ rm->unlockValidStreamMutex();
status = s->flush();
if (0 != status) {
PAL_ERR(LOG_TAG, "flush failed with status %d", status);
- return status;
}
+ rm->lockValidStreamMutex();
+ rm->decreaseStreamUserCounter(s);
+ rm->unlockValidStreamMutex();
PAL_DBG(LOG_TAG, "Exit. status %d", status);
return status;
}
@@ -815,23 +881,32 @@
return status;
}
- rm->lockActiveStream();
+ rm->lockValidStreamMutex();
if (!stream_handle || !rm->isActiveStream(stream_handle)) {
- rm->unlockActiveStream();
+ rm->unlockValidStreamMutex();
status = -EINVAL;
PAL_ERR(LOG_TAG, "Invalid stream handle status %d", status);
return status;
}
- rm->unlockActiveStream();
PAL_DBG(LOG_TAG, "Enter. Stream handle :%pK", stream_handle);
s = reinterpret_cast<Stream *>(stream_handle);
+ status = rm->increaseStreamUserCounter(s);
+ if (0 != status) {
+ rm->unlockValidStreamMutex();
+ PAL_ERR(LOG_TAG, "failed to increase stream user count");
+ return status;
+ }
+ rm->unlockValidStreamMutex();
status = s->suspend();
if (0 != status) {
PAL_ERR(LOG_TAG, "suspend failed with status %d", status);
}
+ rm->lockValidStreamMutex();
+ rm->decreaseStreamUserCounter(s);
+ rm->unlockValidStreamMutex();
PAL_DBG(LOG_TAG, "Exit. status %d", status);
return status;
}
@@ -851,23 +926,31 @@
return status;
}
- rm->lockActiveStream();
+ rm->lockValidStreamMutex();
if (!stream_handle || !rm->isActiveStream(stream_handle)) {
- rm->unlockActiveStream();
+ rm->unlockValidStreamMutex();
status = -EINVAL;
PAL_ERR(LOG_TAG, "Invalid stream handle status %d", status);
return status;
}
- rm->unlockActiveStream();
PAL_DBG(LOG_TAG, "Enter. Stream handle :%pK", stream_handle);
s = reinterpret_cast<Stream *>(stream_handle);
+ status = rm->increaseStreamUserCounter(s);
+ if (0 != status) {
+ rm->unlockValidStreamMutex();
+ PAL_ERR(LOG_TAG, "failed to increase stream user count");
+ return status;
+ }
+ rm->unlockValidStreamMutex();
status = s->setBufInfo(in_buffer_cfg, out_buffer_cfg);
if (0 != status) {
PAL_ERR(LOG_TAG, "pal_stream_set_buffer_size failed with status %d", status);
- return status;
}
+ rm->lockValidStreamMutex();
+ rm->decreaseStreamUserCounter(s);
+ rm->unlockValidStreamMutex();
PAL_DBG(LOG_TAG, "Exit. status %d", status);
return status;
}
@@ -878,11 +961,6 @@
Stream *s = NULL;
int status = -EINVAL;
std::shared_ptr<ResourceManager> rm = NULL;
-
- if (!stream_handle) {
- PAL_ERR(LOG_TAG, "Invalid input parameters status %d\n", status);
- return status;
- }
PAL_DBG(LOG_TAG, "Enter. Stream handle :%pK\n", stream_handle);
rm = ResourceManager::getInstance();
@@ -891,20 +969,26 @@
return status;
}
- rm->lockActiveStream();
+ rm->lockValidStreamMutex();
+ if (!stream_handle || !rm->isActiveStream(stream_handle)) {
+ rm->unlockValidStreamMutex();
+ status = -EINVAL;
+ PAL_ERR(LOG_TAG, "Invalid stream handle status %d", status);
+ return status;
+ }
s = reinterpret_cast<Stream *>(stream_handle);
status = rm->increaseStreamUserCounter(s);
if (0 != status) {
- rm->unlockActiveStream();
+ rm->unlockValidStreamMutex();
PAL_ERR(LOG_TAG, "failed to increase stream user count");
return status;
}
- rm->unlockActiveStream();
+ rm->unlockValidStreamMutex();
status = s->getTimestamp(stime);
- rm->lockActiveStream();
+ rm->lockValidStreamMutex();
rm->decreaseStreamUserCounter(s);
- rm->unlockActiveStream();
+ rm->unlockValidStreamMutex();
if (0 != status) {
PAL_ERR(LOG_TAG, "pal_get_timestamp failed with status %d\n", status);
@@ -933,23 +1017,32 @@
return status;
}
- rm->lockActiveStream();
+ rm->lockValidStreamMutex();
if (!stream_handle || !rm->isActiveStream(stream_handle)) {
- rm->unlockActiveStream();
+ rm->unlockValidStreamMutex();
status = -EINVAL;
PAL_ERR(LOG_TAG, "Invalid stream handle status %d", status);
return status;
}
- rm->unlockActiveStream();
PAL_DBG(LOG_TAG, "Enter. Stream handle :%pK", stream_handle);
-
s = reinterpret_cast<Stream *>(stream_handle);
+ status = rm->increaseStreamUserCounter(s);
+ if (0 != status) {
+ rm->unlockValidStreamMutex();
+ PAL_ERR(LOG_TAG, "failed to increase stream user count");
+ return status;
+ }
+ rm->unlockValidStreamMutex();
+
status = s->addRemoveEffect(effect, enable);
if (0 != status) {
PAL_ERR(LOG_TAG, "pal_add_effect failed with status %d", status);
- return status;
}
+
+ rm->lockValidStreamMutex();
+ rm->decreaseStreamUserCounter(s);
+ rm->unlockValidStreamMutex();
PAL_DBG(LOG_TAG, "Exit. status %d", status);
return status;
@@ -988,9 +1081,9 @@
return status;
}
- rm->lockActiveStream();
+ rm->lockValidStreamMutex();
if (!rm->isActiveStream(stream_handle)) {
- rm->unlockActiveStream();
+ rm->unlockValidStreamMutex();
status = -EINVAL;
return status;
}
@@ -1000,11 +1093,11 @@
s = reinterpret_cast<Stream *>(stream_handle);
status = rm->increaseStreamUserCounter(s);
if (0 != status) {
- rm->unlockActiveStream();
+ rm->unlockValidStreamMutex();
PAL_ERR(LOG_TAG, "failed to increase stream user count");
return status;
}
- rm->unlockActiveStream();
+ rm->unlockValidStreamMutex();
s->getStreamAttributes(&sattr);
@@ -1127,9 +1220,9 @@
}
exit:
- rm->lockActiveStream();
+ rm->lockValidStreamMutex();
rm->decreaseStreamUserCounter(s);
- rm->unlockActiveStream();
+ rm->unlockValidStreamMutex();
if (pDevices)
free(pDevices);
PAL_INFO(LOG_TAG, "Exit. status %d", status);
@@ -1150,20 +1243,30 @@
return status;
}
- rm->lockActiveStream();
+ rm->lockValidStreamMutex();
if (!stream_handle || !rm->isActiveStream(stream_handle)) {
- rm->unlockActiveStream();
+ rm->unlockValidStreamMutex();
status = -EINVAL;
PAL_ERR(LOG_TAG, "Invalid stream handle status %d", status);
return status;
}
- rm->unlockActiveStream();
PAL_DBG(LOG_TAG, "Enter. Stream handle :%pK", stream_handle);
s = reinterpret_cast<Stream *>(stream_handle);
+ status = rm->increaseStreamUserCounter(s);
+ if (0 != status) {
+ rm->unlockValidStreamMutex();
+ PAL_ERR(LOG_TAG, "failed to increase stream user count");
+ return status;
+ }
+ rm->unlockValidStreamMutex();
+
status = s->getTagsWithModuleInfo(size, payload);
+ rm->lockValidStreamMutex();
+ rm->decreaseStreamUserCounter(s);
+ rm->unlockValidStreamMutex();
PAL_DBG(LOG_TAG, "Exit. Stream handle: %pK, status %d", stream_handle, status);
return status;
}
@@ -1228,22 +1331,32 @@
return status;
}
- rm->lockActiveStream();
+ rm->lockValidStreamMutex();
if (!stream_handle || !rm->isActiveStream(stream_handle)) {
- rm->unlockActiveStream();
+ rm->unlockValidStreamMutex();
status = -EINVAL;
PAL_ERR(LOG_TAG, "Invalid stream handle status %d", status);
return status;
}
- rm->unlockActiveStream();
PAL_DBG(LOG_TAG, "Enter. Stream handle :%pK", stream_handle);
s = reinterpret_cast<Stream *>(stream_handle);
+ status = rm->increaseStreamUserCounter(s);
+ if (0 != status) {
+ rm->unlockValidStreamMutex();
+ PAL_ERR(LOG_TAG, "failed to increase stream user count");
+ return status;
+ }
+ rm->unlockValidStreamMutex();
+
status = s->GetMmapPosition(position);
if (0 != status) {
PAL_ERR(LOG_TAG, "pal_stream_get_mmap_position failed with status %d", status);
- return status;
}
+
+ rm->lockValidStreamMutex();
+ rm->decreaseStreamUserCounter(s);
+ rm->unlockValidStreamMutex();
PAL_DBG(LOG_TAG, "Exit. status %d", status);
return status;
}
@@ -1263,22 +1376,32 @@
return status;
}
- rm->lockActiveStream();
+ rm->lockValidStreamMutex();
if (!stream_handle || !rm->isActiveStream(stream_handle)) {
- rm->unlockActiveStream();
+ rm->unlockValidStreamMutex();
status = -EINVAL;
PAL_ERR(LOG_TAG, "Invalid stream handle status %d", status);
return status;
}
- rm->unlockActiveStream();
PAL_DBG(LOG_TAG, "Enter. Stream handle :%pK", stream_handle);
s = reinterpret_cast<Stream *>(stream_handle);
+ status = rm->increaseStreamUserCounter(s);
+ if (0 != status) {
+ rm->unlockValidStreamMutex();
+ PAL_ERR(LOG_TAG, "failed to increase stream user count");
+ return status;
+ }
+ rm->unlockValidStreamMutex();
+
status = s->createMmapBuffer(min_size_frames, info);
if (0 != status) {
PAL_ERR(LOG_TAG, "pal_stream_create_mmap_buffer failed with status %d", status);
- return status;
}
+
+ rm->lockValidStreamMutex();
+ rm->decreaseStreamUserCounter(s);
+ rm->unlockValidStreamMutex();
PAL_DBG(LOG_TAG, "Exit. status %d", status);
return status;
}
diff --git a/device/src/Bluetooth.cpp b/device/src/Bluetooth.cpp
index 1d2a2fa..709143e 100644
--- a/device/src/Bluetooth.cpp
+++ b/device/src/Bluetooth.cpp
@@ -1734,6 +1734,9 @@
// session will be restarted after suspend completion
PAL_INFO(LOG_TAG, "a2dp start requested during suspend state");
return -ENOSYS;
+ } else if (a2dpState == A2DP_STATE_DISCONNECTED) {
+ PAL_INFO(LOG_TAG, "a2dp start requested when a2dp source stream is failed to open");
+ return -ENOSYS;
}
if (a2dpState != A2DP_STATE_STARTED && !totalActiveSessionRequests) {
@@ -2288,6 +2291,9 @@
((a2dpState != A2DP_STATE_STARTED) && (param_bt_a2dp.a2dp_suspended == true))) {
param_bt_a2dp.is_force_switch = true;
PAL_DBG(LOG_TAG, "a2dp reconfig or a2dp suspended/a2dpState is not started");
+ } else if (totalActiveSessionRequests == 0) {
+ param_bt_a2dp.is_force_switch = true;
+ PAL_DBG(LOG_TAG, "Force BT device switch for no total active BT sessions");
} else {
param_bt_a2dp.is_force_switch = false;
}
diff --git a/ipc/HwBinders/pal_ipc_client/src/pal_client_wrapper.cpp b/ipc/HwBinders/pal_ipc_client/src/pal_client_wrapper.cpp
index 894da97..4f42240 100644
--- a/ipc/HwBinders/pal_ipc_client/src/pal_client_wrapper.cpp
+++ b/ipc/HwBinders/pal_ipc_client/src/pal_client_wrapper.cpp
@@ -713,8 +713,7 @@
if (pal_client == nullptr)
return ret;
- hidl_vec<PalParamPayload> paramPayload;
- paramPayload.resize(sizeof(PalParamPayload));
+ hidl_vec<PalParamPayload> paramPayload(1);
paramPayload.data()->payload.resize(param_payload->payload_size);
paramPayload.data()->size = param_payload->payload_size;
memcpy(paramPayload.data()->payload.data(), param_payload->payload,
diff --git a/ipc/HwBinders/pal_ipc_server/src/pal_server_wrapper.cpp b/ipc/HwBinders/pal_ipc_server/src/pal_server_wrapper.cpp
index 1896d31..3381842 100644
--- a/ipc/HwBinders/pal_ipc_server/src/pal_server_wrapper.cpp
+++ b/ipc/HwBinders/pal_ipc_server/src/pal_server_wrapper.cpp
@@ -825,6 +825,14 @@
{
int32_t ret = 0;
pal_param_payload *param_payload;
+ if (1 != paramPayload.size()) {
+ ALOGE("Invalid vector size");
+ return -EINVAL;
+ }
+ if (paramPayload.data()->size > paramPayload.data()->payload.size()) {
+ ALOGE("Invalid payload size");
+ return -EINVAL;
+ }
param_payload = (pal_param_payload *)calloc (1,
sizeof(pal_param_payload) + paramPayload.data()->size);
if (!param_payload) {
diff --git a/resource_manager/inc/ResourceManager.h b/resource_manager/inc/ResourceManager.h
index f5fcfda..ed87d2f 100644
--- a/resource_manager/inc/ResourceManager.h
+++ b/resource_manager/inc/ResourceManager.h
@@ -508,6 +508,7 @@
static std::mutex mResourceManagerMutex;
static std::mutex mGraphMutex;
static std::mutex mActiveStreamMutex;
+ static std::mutex mValidStreamMutex;
static std::mutex mSleepMonitorMutex;
static std::mutex mListFrontEndsMutex;
static int snd_virt_card;
@@ -948,6 +949,8 @@
void unlockGraph() { mGraphMutex.unlock(); };
void lockActiveStream() { mActiveStreamMutex.lock(); };
void unlockActiveStream() { mActiveStreamMutex.unlock(); };
+ void lockValidStreamMutex() { mValidStreamMutex.lock(); };
+ void unlockValidStreamMutex() { mValidStreamMutex.unlock(); };
void lockResourceManagerMutex() {mResourceManagerMutex.lock();};
void unlockResourceManagerMutex() {mResourceManagerMutex.unlock();};
void getSharedBEActiveStreamDevs(std::vector <std::tuple<Stream *, uint32_t>> &activeStreamDevs,
diff --git a/resource_manager/src/ResourceManager.cpp b/resource_manager/src/ResourceManager.cpp
index 374d1ff..ec1a876 100644
--- a/resource_manager/src/ResourceManager.cpp
+++ b/resource_manager/src/ResourceManager.cpp
@@ -428,6 +428,7 @@
std::mutex ResourceManager::mChargerBoostMutex;
std::mutex ResourceManager::mGraphMutex;
std::mutex ResourceManager::mActiveStreamMutex;
+std::mutex ResourceManager::mValidStreamMutex;
std::mutex ResourceManager::mSleepMonitorMutex;
std::mutex ResourceManager::mListFrontEndsMutex;
std::vector <int> ResourceManager::listAllFrontEndIds = {0};
@@ -1296,7 +1297,9 @@
PAL_INFO(LOG_TAG, "%d state already handled", state);
} else if (state == CARD_STATUS_OFFLINE) {
for (auto str: rm->mActiveStreams) {
+ lockValidStreamMutex();
ret = increaseStreamUserCounter(str);
+ unlockValidStreamMutex();
if (0 != ret) {
PAL_ERR(LOG_TAG, "Error incrementing the stream counter for the stream handle: %pK", str);
continue;
@@ -1312,7 +1315,9 @@
if (ret)
PAL_DBG(LOG_TAG, "Failed to unvote for stream type %d", type);
}
+ lockValidStreamMutex();
ret = decreaseStreamUserCounter(str);
+ unlockValidStreamMutex();
if (0 != ret) {
PAL_ERR(LOG_TAG, "Error decrementing the stream counter for the stream handle: %pK", str);
}
@@ -1338,7 +1343,9 @@
SoundTriggerCaptureProfile = GetCaptureProfileByPriority(nullptr);
for (auto str: rm->mActiveStreams) {
+ lockValidStreamMutex();
ret = increaseStreamUserCounter(str);
+ unlockValidStreamMutex();
if (0 != ret) {
PAL_ERR(LOG_TAG, "Error incrementing the stream counter for the stream handle: %pK", str);
continue;
@@ -1348,7 +1355,9 @@
PAL_ERR(LOG_TAG, "Ssr up handling failed for %pK ret %d",
str, ret);
}
+ lockValidStreamMutex();
ret = decreaseStreamUserCounter(str);
+ unlockValidStreamMutex();
if (0 != ret) {
PAL_ERR(LOG_TAG, "Error decrementing the stream counter for the stream handle: %pK", str);
}
@@ -3076,6 +3085,7 @@
}
PAL_DBG(LOG_TAG, "stream type %d", type);
mActiveStreamMutex.lock();
+ mValidStreamMutex.lock();
switch (type) {
case PAL_STREAM_LOW_LATENCY:
case PAL_STREAM_VOIP_RX:
@@ -3216,7 +3226,7 @@
mAllActiveStreams.push_back(s);
#endif
-
+ mValidStreamMutex.unlock();
mActiveStreamMutex.unlock();
PAL_DBG(LOG_TAG, "Exit. ret %d", ret);
return ret;
@@ -3255,6 +3265,7 @@
#endif
PAL_INFO(LOG_TAG, "stream type %d", type);
mActiveStreamMutex.lock();
+ mValidStreamMutex.lock();
switch (type) {
case PAL_STREAM_LOW_LATENCY:
case PAL_STREAM_VOIP_RX:
@@ -3385,6 +3396,7 @@
}
deregisterstream(s, mActiveStreams);
+ mValidStreamMutex.unlock();
mActiveStreamMutex.unlock();
exit:
PAL_DBG(LOG_TAG, "Exit. ret %d", ret);
@@ -3418,30 +3430,30 @@
int ResourceManager::initStreamUserCounter(Stream *s)
{
- lockActiveStream();
+ lockValidStreamMutex();
mActiveStreamUserCounter.insert(std::make_pair(s, std::make_pair(0, true)));
s->initStreamSmph();
- unlockActiveStream();
+ unlockValidStreamMutex();
return 0;
}
int ResourceManager::deactivateStreamUserCounter(Stream *s)
{
std::map<Stream*, std::pair<uint32_t, bool>>::iterator it;
- lockActiveStream();
+ lockValidStreamMutex();
printStreamUserCounter(s);
it = mActiveStreamUserCounter.find(s);
if (it != mActiveStreamUserCounter.end() && it->second.second == true) {
PAL_DBG(LOG_TAG, "stream %p is to be deactivated.", s);
it->second.second = false;
- unlockActiveStream();
+ unlockValidStreamMutex();
s->waitStreamSmph();
PAL_DBG(LOG_TAG, "stream %p is inactive.", s);
s->deinitStreamSmph();
return 0;
} else {
PAL_ERR(LOG_TAG, "stream %p is not found or inactive", s);
- unlockActiveStream();
+ unlockValidStreamMutex();
return -EINVAL;
}
}
@@ -3449,16 +3461,16 @@
int ResourceManager::eraseStreamUserCounter(Stream *s)
{
std::map<Stream*, std::pair<uint32_t, bool>>::iterator it;
- lockActiveStream();
+ lockValidStreamMutex();
it = mActiveStreamUserCounter.find(s);
if (it != mActiveStreamUserCounter.end()) {
mActiveStreamUserCounter.erase(it);
PAL_DBG(LOG_TAG, "stream counter for %p is erased.", s);
- unlockActiveStream();
+ unlockValidStreamMutex();
return 0;
} else {
PAL_ERR(LOG_TAG, "stream counter for %p is not found.", s);
- unlockActiveStream();
+ unlockValidStreamMutex();
return -EINVAL;
}
}
@@ -8867,20 +8879,20 @@
{
bool match = false;
std::list<Stream*>::iterator sIter;
- lockActiveStream();
+ lockValidStreamMutex();
for(sIter = mActiveStreams.begin(); sIter != mActiveStreams.end(); sIter++) {
match = (*sIter)->checkStreamMatch(pal_device_id, pal_stream_type);
if (match) {
if (increaseStreamUserCounter(*sIter) < 0)
continue;
- unlockActiveStream();
+ unlockValidStreamMutex();
status = (*sIter)->getEffectParameters(param_payload);
- lockActiveStream();
+ lockValidStreamMutex();
decreaseStreamUserCounter(*sIter);
break;
}
}
- unlockActiveStream();
+ unlockValidStreamMutex();
break;
}
default:
@@ -9813,7 +9825,7 @@
case PAL_PARAM_ID_UIEFFECT:
{
bool match = false;
- lockActiveStream();
+ lockValidStreamMutex();
std::list<Stream*>::iterator sIter;
for(sIter = mActiveStreams.begin(); sIter != mActiveStreams.end();
sIter++) {
@@ -9823,9 +9835,9 @@
if (match) {
if (increaseStreamUserCounter(*sIter) < 0)
continue;
- unlockActiveStream();
+ unlockValidStreamMutex();
status = (*sIter)->setEffectParameters(param_payload);
- lockActiveStream();
+ lockValidStreamMutex();
decreaseStreamUserCounter(*sIter);
if (status) {
PAL_ERR(LOG_TAG, "failed to set param for pal_device_id=%x stream_type=%x",
@@ -9836,7 +9848,7 @@
PAL_ERR(LOG_TAG, "There is no active stream.");
}
}
- unlockActiveStream();
+ unlockValidStreamMutex();
}
break;
default: