Merge "pal: ipc_client: Remove the vol resize during pal stream set volume."
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/device/src/USBAudio.cpp b/device/src/USBAudio.cpp
index 718ceb6..a27fd25 100644
--- a/device/src/USBAudio.cpp
+++ b/device/src/USBAudio.cpp
@@ -508,13 +508,13 @@
check = true;
while (str_start != NULL) {
- str_start = strstr(str_start, "Altset");
+ str_start = strstr(str_start, "Altset ");
if ((str_start == NULL) || (check && (str_start >= str_end))) {
PAL_VERBOSE(LOG_TAG,"done parsing %s\n", str_start);
break;
}
PAL_VERBOSE(LOG_TAG,"remaining string %s\n", str_start);
- str_start += sizeof("Altset");
+ str_start += sizeof("Altset ");
std::shared_ptr<USBDeviceConfig> usb_device_info(new USBDeviceConfig());
if (!usb_device_info) {
PAL_ERR(LOG_TAG, "error unable to create usb device config object");
@@ -524,7 +524,7 @@
usb_device_info->setType(type);
/* Bit bit_width parsing */
bit_width_start = strstr(str_start, "Format: ");
- if (bit_width_start == NULL) {
+ if (bit_width_start == NULL || (check && (bit_width_start >= str_end))) {
PAL_INFO(LOG_TAG, "Could not find bit_width string");
continue;
}
@@ -558,7 +558,7 @@
/* channels parsing */
channel_start = strstr(str_start, CHANNEL_NUMBER_STR);
- if (channel_start == NULL) {
+ if (channel_start == NULL || (check && (channel_start >= str_end))) {
PAL_INFO(LOG_TAG, "could not find Channels string");
continue;
}
@@ -567,7 +567,7 @@
/* Sample rates parsing */
rates_str_start = strstr(str_start, "Rates: ");
- if (rates_str_start == NULL) {
+ if (rates_str_start == NULL || (check && (rates_str_start >= str_end))) {
PAL_INFO(LOG_TAG, "cant find rates string");
continue;
}
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 7b9ec4a..b0bf840 100644
--- a/ipc/HwBinders/pal_ipc_client/src/pal_client_wrapper.cpp
+++ b/ipc/HwBinders/pal_ipc_client/src/pal_client_wrapper.cpp
@@ -351,12 +351,11 @@
if (pal_client == nullptr)
return ret;
- hidl_vec<PalStreamAttributes> attr_hidl;
+ hidl_vec<PalStreamAttributes> attr_hidl(1);
hidl_vec<PalDevice> devs_hidl;
hidl_vec<ModifierKV> modskv_hidl;
uint16_t in_channels = 0;
uint16_t out_channels = 0;
- uint32_t dev_size = 0;
int cnt = 0;
uint8_t *temp = NULL;
struct pal_stream_info info = attr->info.opt_stream_info;
@@ -367,8 +366,6 @@
info.version, info.size, info.duration_us, info.has_video, info.is_streaming,
info.loopback_type);
- attr_hidl.resize(sizeof(::vendor::qti::hardware::pal::V1_0::PalStreamAttributes) + in_channels +
- out_channels);
attr_hidl.data()->type = (PalStreamType)attr->type;
attr_hidl.data()->info.version = info.version;
attr_hidl.data()->info.size = info.size;
@@ -382,7 +379,8 @@
if (in_channels) {
attr_hidl.data()->in_media_config.ch_info.channels = attr->in_media_config.ch_info.channels;
- attr_hidl.data()->in_media_config.ch_info.ch_map = attr->in_media_config.ch_info.ch_map;
+ memcpy(&attr_hidl.data()->in_media_config.ch_info.ch_map, &attr->in_media_config.ch_info.ch_map,
+ sizeof(uint8_t[64]));
}
attr_hidl.data()->in_media_config.aud_fmt_id = (PalAudioFmt)attr->in_media_config.aud_fmt_id;
@@ -394,26 +392,28 @@
attr_hidl.data()->out_media_config.bit_width = attr->out_media_config.bit_width;
if (out_channels) {
attr_hidl.data()->out_media_config.ch_info.channels = attr->out_media_config.ch_info.channels;
- attr_hidl.data()->out_media_config.ch_info.ch_map = attr->out_media_config.ch_info.ch_map;
+ memcpy(&attr_hidl.data()->out_media_config.ch_info.ch_map, &attr->out_media_config.ch_info.ch_map,
+ sizeof(uint8_t[64]));
}
attr_hidl.data()->out_media_config.aud_fmt_id = (PalAudioFmt)attr->out_media_config.aud_fmt_id;
if (devices) {
- dev_size = no_of_devices * sizeof(struct pal_device);
- devs_hidl.resize(dev_size);
- PalDevice *dev_hidl = devs_hidl.data();
+ devs_hidl.resize(no_of_devices);
for ( cnt = 0; cnt < no_of_devices; cnt++) {
- dev_hidl->id =(PalDeviceId)devices[cnt].id;
- dev_hidl->config.sample_rate = devices[cnt].config.sample_rate;
- dev_hidl->config.bit_width = devices[cnt].config.bit_width;
- dev_hidl->config.ch_info.channels = devices[cnt].config.ch_info.channels;
- dev_hidl->config.ch_info.ch_map = devices[cnt].config.ch_info.ch_map;
- dev_hidl->config.aud_fmt_id = (PalAudioFmt)devices[cnt].config.aud_fmt_id;
- dev_hidl = (PalDevice *)(devs_hidl.data() + sizeof(PalDevice));
+ devs_hidl[cnt].id =(PalDeviceId)devices[cnt].id;
+ devs_hidl[cnt].config.sample_rate = devices[cnt].config.sample_rate;
+ devs_hidl[cnt].config.bit_width = devices[cnt].config.bit_width;
+ devs_hidl[cnt].config.ch_info.channels = devices[cnt].config.ch_info.channels;
+ memcpy(&devs_hidl[cnt].config.ch_info.ch_map, &devices[cnt].config.ch_info.ch_map,
+ sizeof(uint8_t [64]));
+ devs_hidl[cnt].config.aud_fmt_id = (PalAudioFmt)devices[cnt].config.aud_fmt_id;
}
}
if (modifiers) {
- modskv_hidl.resize(sizeof(struct modifier_kv) * no_of_modifiers);
- memcpy(modskv_hidl.data(), modifiers, sizeof(struct modifier_kv) * no_of_modifiers);
+ modskv_hidl.resize(no_of_modifiers);
+ for ( cnt = 0; cnt < no_of_modifiers; cnt++) {
+ modskv_hidl[cnt].key = modifiers[cnt].key;
+ modskv_hidl[cnt].value = modifiers[cnt].value;
+ }
}
pal_client->ipc_pal_stream_open(attr_hidl, no_of_devices, devs_hidl, no_of_modifiers,
modskv_hidl, ClbkBinder, cookie,
@@ -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,
@@ -778,7 +777,6 @@
{
hidl_vec<PalDevice> devs_hidl;
int32_t cnt = 0;
- uint32_t dev_size = 0;
int32_t ret = -EINVAL;
if (!pal_server_died) {
@@ -789,18 +787,16 @@
if (devices) {
- dev_size = no_of_devices * sizeof(struct pal_device);
- ALOGD("dev_size %d", dev_size);
- devs_hidl.resize(dev_size);
- PalDevice *dev_hidl = devs_hidl.data();
+ ALOGD("no_of_devices %d", no_of_devices);
+ devs_hidl.resize(no_of_devices);
for (cnt = 0; cnt < no_of_devices; cnt++) {
- dev_hidl->id =(PalDeviceId)devices[cnt].id;
- dev_hidl->config.sample_rate = devices[cnt].config.sample_rate;
- dev_hidl->config.bit_width = devices[cnt].config.bit_width;
- dev_hidl->config.ch_info.channels = devices[cnt].config.ch_info.channels;
- dev_hidl->config.ch_info.ch_map = devices[cnt].config.ch_info.ch_map;
- dev_hidl->config.aud_fmt_id = (PalAudioFmt)devices[cnt].config.aud_fmt_id;
- dev_hidl = (PalDevice *)(devs_hidl.data() + sizeof(PalDevice));
+ devs_hidl[cnt].id =(PalDeviceId)devices[cnt].id;
+ devs_hidl[cnt].config.sample_rate = devices[cnt].config.sample_rate;
+ devs_hidl[cnt].config.bit_width = devices[cnt].config.bit_width;
+ devs_hidl[cnt].config.ch_info.channels = devices[cnt].config.ch_info.channels;
+ memcpy(&devs_hidl[cnt].config.ch_info.ch_map, &devices[cnt].config.ch_info.ch_map,
+ sizeof(uint8_t [64]));
+ devs_hidl[cnt].config.aud_fmt_id = (PalAudioFmt)devices[cnt].config.aud_fmt_id;
}
ret = pal_client->ipc_pal_stream_set_device((PalStreamHandle)stream_handle,
no_of_devices, devs_hidl);
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..1c4932e 100644
--- a/ipc/HwBinders/pal_ipc_server/src/pal_server_wrapper.cpp
+++ b/ipc/HwBinders/pal_ipc_server/src/pal_server_wrapper.cpp
@@ -510,24 +510,22 @@
}
if (devs_hidl.size()) {
- PalDevice *dev_hidl = NULL;
devices = (struct pal_device *)calloc (1,
sizeof(struct pal_device) * noOfDevices);
if (!devices) {
ALOGE("Not enough memory for devices");
goto exit;
}
- dev_hidl = (PalDevice *)devs_hidl.data();
+
for ( cnt = 0; cnt < noOfDevices; cnt++) {
- devices[cnt].id = (pal_device_id_t)dev_hidl->id;
- devices[cnt].config.sample_rate = dev_hidl->config.sample_rate;
- devices[cnt].config.bit_width = dev_hidl->config.bit_width;
- devices[cnt].config.ch_info.channels = dev_hidl->config.ch_info.channels;
- memcpy(&devices[cnt].config.ch_info.ch_map, &dev_hidl->config.ch_info.ch_map,
+ devices[cnt].id = (pal_device_id_t)devs_hidl[cnt].id;
+ devices[cnt].config.sample_rate = devs_hidl[cnt].config.sample_rate;
+ devices[cnt].config.bit_width = devs_hidl[cnt].config.bit_width;
+ devices[cnt].config.ch_info.channels = devs_hidl[cnt].config.ch_info.channels;
+ memcpy(&devices[cnt].config.ch_info.ch_map, &devs_hidl[cnt].config.ch_info.ch_map,
sizeof(uint8_t [64]));
devices[cnt].config.aud_fmt_id =
- (pal_audio_fmt_t)dev_hidl->config.aud_fmt_id;
- dev_hidl = (PalDevice *)(dev_hidl + sizeof(PalDevice));
+ (pal_audio_fmt_t)devs_hidl[cnt].config.aud_fmt_id;
}
}
@@ -825,6 +823,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) {
@@ -873,25 +879,28 @@
struct pal_device *devices = NULL;
int cnt = 0;
int32_t ret = -ENOMEM;
+
+ if (noOfDevices > devs_hidl.size()) {
+ ALOGE("Invalid noOfDevices");
+ return -EINVAL;
+ }
if (devs_hidl.size()) {
- PalDevice *dev_hidl = NULL;
devices = (struct pal_device *)calloc (1,
sizeof(struct pal_device) * noOfDevices);
if (!devices) {
ALOGE("Not enough memory for devices");
goto exit;
}
- dev_hidl = (PalDevice *)devs_hidl.data();
+
for (cnt = 0; cnt < noOfDevices; cnt++) {
- devices[cnt].id = (pal_device_id_t)dev_hidl->id;
- devices[cnt].config.sample_rate = dev_hidl->config.sample_rate;
- devices[cnt].config.bit_width = dev_hidl->config.bit_width;
- devices[cnt].config.ch_info.channels = dev_hidl->config.ch_info.channels;
- memcpy(&devices[cnt].config.ch_info.ch_map, &dev_hidl->config.ch_info.ch_map,
+ devices[cnt].id = (pal_device_id_t)devs_hidl[cnt].id;
+ devices[cnt].config.sample_rate = devs_hidl[cnt].config.sample_rate;
+ devices[cnt].config.bit_width = devs_hidl[cnt].config.bit_width;
+ devices[cnt].config.ch_info.channels = devs_hidl[cnt].config.ch_info.channels;
+ memcpy(&devices[cnt].config.ch_info.ch_map, &devs_hidl[cnt].config.ch_info.ch_map,
sizeof(uint8_t [64]));
devices[cnt].config.aud_fmt_id =
- (pal_audio_fmt_t)dev_hidl->config.aud_fmt_id;
- dev_hidl = (PalDevice *)(dev_hidl + sizeof(PalDevice));
+ (pal_audio_fmt_t)devs_hidl[cnt].config.aud_fmt_id;
}
}
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: