pa_threaded_mainloop_unlock(virtual_stream->pa_mainloop);
return ret;
-//LCOV_EXCL_START
+
ERROR_WITH_UNLOCK:
- /* UNLOCK the pa_threaded_mainloop */
pa_threaded_mainloop_unlock(virtual_stream->pa_mainloop);
for (i = 0; i < SOUND_STREAM_DIRECTION_MAX; i++) {
return ret;
}
-}
+
+ int _set_volume_ratio(uint32_t stream_index, sound_stream_direction_e direction, double ratio)
+ {
+ int ret = MM_ERROR_NONE;
+ GDBusConnection *conn = NULL;
+ GError *err = NULL;
+ GVariant *result = NULL;
+ const gchar *dbus_ret = NULL;
+
+ if ((ret = __get_dbus_connection(&conn)))
+ return ret;
+
+ result = g_dbus_connection_call_sync(conn,
+ PA_BUS_NAME,
+ PA_STREAM_MANAGER_OBJECT_PATH,
+ PA_STREAM_MANAGER_INTERFACE,
+ PA_STREAM_MANAGER_METHOD_NAME_SET_VOLUME_RATIO,
+ g_variant_new("(sud)", (direction == SOUND_STREAM_DIRECTION_OUTPUT) ? "out" : "in", stream_index, ratio),
+ G_VARIANT_TYPE("(s)"),
+ G_DBUS_CALL_FLAGS_NONE,
+ 2000,
+ NULL,
+ &err);
+ if (!result || err) {
+ LOGE("g_dbus_connection_call_sync() for SET_VOLUME_RATIO error (%s)", err ? err->message : NULL);
+ ret = _convert_dbus_error(err ? err->message : NULL);
+ g_error_free(err);
+ goto LEAVE;
+ }
+ g_variant_get(result, "(&s)", &dbus_ret);
+ LOGI("g_dbus_connection_call_sync() success, method return value is (%s)", dbus_ret);
+ if (!strncmp("STREAM_MANAGER_RETURN_ERROR_INVALID_ARGUMENT", dbus_ret, strlen(dbus_ret)))
+ ret = MM_ERROR_INVALID_ARGUMENT;
+ else if (!strncmp("STREAM_MANAGER_RETURN_ERROR_NO_STREAM", dbus_ret, strlen(dbus_ret)))
+ ret = MM_ERROR_SOUND_NO_DATA;
+ else if (strncmp("STREAM_MANAGER_RETURN_OK", dbus_ret, strlen(dbus_ret)))
+ ret = MM_ERROR_SOUND_INTERNAL;
+
+ LEAVE:
+ g_variant_unref(result);
+ g_object_unref(conn);
+
+ return ret;
+ }
+
+ int _set_virtual_stream_volume(virtual_sound_stream_info_s *virtual_stream, double ratio)
+ {
+ int ret = MM_ERROR_NONE;
+ int i = 0;
+ uint32_t index;
+
+ SM_INSTANCE_CHECK_FOR_PRIV(virtual_stream);
+ SM_STATE_CHECK_FOR_PRIV(virtual_stream, _VSTREAM_STATE_RUNNING);
+
+ pa_threaded_mainloop_lock(virtual_stream->pa_mainloop);
+
+ for (i = 0; i < SOUND_STREAM_DIRECTION_MAX; i++) {
+ if (virtual_stream->pa_stream[i]) {
+ index = pa_stream_get_index(virtual_stream->pa_stream[i]);
+ if ((ret = _set_volume_ratio(index, i + 1, ratio))) {
+ if (ret == MM_ERROR_SOUND_NO_DATA) {
+ LOGE("something wrong, no match index of %u", index);
+ ret = MM_ERROR_SOUND_INTERNAL;
+ }
+ break;
+ }
+ }
+ }
+
+ pa_threaded_mainloop_unlock(virtual_stream->pa_mainloop);
+
+ return ret;
++}
+//LCOV_EXCL_STOP