" <arg name=\"mask_flags\" direction=\"in\" type=\"i\"/>\n" \
" <arg name=\"ConnectedDeviceList\" direction=\"out\" type=\"a(isiis)\"/>\n" \
" </method>\n" \
+ " <method name=\"IsStreamOnDevice\">\n" \
+ " <arg name=\"stream_id\" direction=\"in\" type=\"i\"/>\n" \
+ " <arg name=\"device_id\" direction=\"in\" type=\"i\"/>\n" \
+ " <arg name=\"is_on\" direction=\"out\" type=\"b\"/>\n" \
+ " </method>\n" \
" <method name='GetBTA2DPStatus'>" \
" <arg type='b' name='is_bt_on' direction='out'/>" \
" <arg type='s' name='bt_name' direction='out'/>" \
/*** Defines for method handle ***/
/* method handlers */
static void handle_get_connected_device_list(DBusConnection *conn, DBusMessage *msg, void *userdata);
+static void handle_is_stream_on_device(DBusConnection *conn, DBusMessage *msg, void *userdata);
static void handle_get_bt_a2dp_status(DBusConnection *conn, DBusMessage *msg, void *userdata);
static void handle_load_sink(DBusConnection *conn, DBusMessage *msg, void *userdata);
static void handle_test_device_status_change(DBusConnection *conn, DBusMessage *msg, void *userdata);
enum method_handler_index {
METHOD_HANDLER_GET_CONNECTED_DEVICE_LIST,
+ METHOD_HANDLER_IS_STREAM_ON_DEVICE,
METHOD_HANDLER_GET_BT_A2DP_STATUS,
METHOD_HANDLER_LOAD_SINK,
METHOD_HANDLER_STATUS_TEST,
[METHOD_HANDLER_GET_CONNECTED_DEVICE_LIST] = {
.method_name = "GetConnectedDeviceList",
.receive_cb = handle_get_connected_device_list },
+ [METHOD_HANDLER_IS_STREAM_ON_DEVICE] = {
+ .method_name = "IsStreamOnDevice",
+ .receive_cb = handle_is_stream_on_device},
[METHOD_HANDLER_GET_BT_A2DP_STATUS] = {
.method_name = "GetBTA2DPStatus",
.receive_cb = handle_get_bt_a2dp_status },
dbus_connection_remove_filter(pa_dbus_connection_get(dm->dbus_conn), dbus_filter_device_detect_handler, dm);
}
-static void send_device_connection_changed_signal(uint32_t event_id, pa_tz_device *device, bool connected, pa_device_manager *dm) {
- DBusMessage *signal_msg;
- DBusMessageIter msg_iter, device_iter;
- dbus_bool_t _connected = connected;
- dm_device_state_t compound_state;
- dbus_int32_t device_id, direction;
+static void fill_signal_msg_with_device(const char *description, DBusMessageIter *msg_iter, uint32_t event_id, pa_tz_device *device) {
+ DBusMessageIter array_iter, device_iter;
char *type, *name;
+ dbus_int32_t device_id, direction, state, stream_id;
+ pa_intset *stream_id_set = NULL;
+ int32_t stream_id_val;
+ int ret;
+ pa_assert(msg_iter);
pa_assert(device);
- pa_assert(dm);
- pa_log_info("Send device connection changed signal, event_id(%u)", event_id);
-
- pa_assert_se(signal_msg = dbus_message_new_signal(DBUS_OBJECT_DEVICE_MANAGER, DBUS_INTERFACE_DEVICE_MANAGER, "DeviceConnected"));
- dbus_message_iter_init_append(signal_msg, &msg_iter);
- dbus_message_iter_append_basic(&msg_iter, DBUS_TYPE_UINT32, &event_id);
- pa_assert_se(dbus_message_iter_open_container(&msg_iter, DBUS_TYPE_STRUCT, NULL, &device_iter));
+ dbus_message_iter_append_basic(msg_iter, DBUS_TYPE_UINT32, &event_id);
+ pa_assert_se(dbus_message_iter_open_container(msg_iter, DBUS_TYPE_STRUCT, NULL, &device_iter));
direction = (dbus_int32_t) pa_tz_device_get_direction(device);
type = pa_tz_device_get_type(device);
name = pa_tz_device_get_name(device);
device_id = (dbus_int32_t) pa_tz_device_get_id(device);
- compound_state = pa_tz_device_get_state(device, DM_DEVICE_DIRECTION_BOTH);
+ state = pa_tz_device_get_state(device, DM_DEVICE_DIRECTION_BOTH);
- simple_device_dump(PA_LOG_INFO, connected ? "[Connected]" : "[Disconnected]", device_id, type, name, direction, compound_state);
+ simple_device_dump(PA_LOG_INFO, description, device_id, type, name, direction, state);
dbus_message_iter_append_basic(&device_iter, DBUS_TYPE_INT32, &device_id);
dbus_message_iter_append_basic(&device_iter, DBUS_TYPE_STRING, &type);
dbus_message_iter_append_basic(&device_iter, DBUS_TYPE_INT32, &direction);
- dbus_message_iter_append_basic(&device_iter, DBUS_TYPE_INT32, &compound_state);
+ dbus_message_iter_append_basic(&device_iter, DBUS_TYPE_INT32, &state);
dbus_message_iter_append_basic(&device_iter, DBUS_TYPE_STRING, &name);
- pa_assert_se(dbus_message_iter_close_container(&msg_iter, &device_iter));
+ if (state == DM_DEVICE_STATE_ACTIVATED)
+ stream_id_set = pa_tz_device_get_stream_list(device);
+ pa_assert_se(dbus_message_iter_open_container(&device_iter, DBUS_TYPE_ARRAY, "i", &array_iter));
+ if (state == DM_DEVICE_STATE_ACTIVATED) {
+ PA_INTSET_FOREACH(stream_id_val, stream_id_set, ret) {
+ stream_id = stream_id_val;
+ dbus_message_iter_append_basic(&array_iter, DBUS_TYPE_INT32, &stream_id);
+ }
+ }
+ pa_assert_se(dbus_message_iter_close_container(&device_iter, &array_iter));
+ if (stream_id_set)
+ pa_intset_free(stream_id_set);
+ pa_assert_se(dbus_message_iter_close_container(msg_iter, &device_iter));
+}
+
+static void send_device_connection_changed_signal(uint32_t event_id, pa_tz_device *device, bool connected, pa_device_manager *dm) {
+ DBusMessage *signal_msg;
+ DBusMessageIter msg_iter;
+ dbus_bool_t _connected = connected;
+
+ pa_assert(device);
+ pa_assert(dm);
+
+ pa_log_info("Send device connection changed signal, event_id(%u)", event_id);
+
+ pa_assert_se(signal_msg = dbus_message_new_signal(DBUS_OBJECT_DEVICE_MANAGER, DBUS_INTERFACE_DEVICE_MANAGER, "DeviceConnected"));
+ dbus_message_iter_init_append(signal_msg, &msg_iter);
+ fill_signal_msg_with_device(connected ? "[Connected]" : "[Disconnected]", &msg_iter, event_id, device);
+
dbus_message_iter_append_basic(&msg_iter, DBUS_TYPE_BOOLEAN, &_connected);
pa_assert_se(dbus_connection_send(pa_dbus_connection_get(dm->dbus_conn), signal_msg, NULL));
static void send_device_info_changed_signal(uint32_t event_id, pa_tz_device *device, int changed_type, pa_device_manager *dm) {
DBusMessage *signal_msg;
- DBusMessageIter msg_iter, device_iter;
- dm_device_state_t compound_state;
- dbus_int32_t device_id, direction;
- char *type, *name;
+ DBusMessageIter msg_iter;
const char *changed_prefix[] = {"[State Changed]", "[Direction Changed]", "[Avail-Mode Changed]"};
pa_assert(device);
pa_assert_se(signal_msg = dbus_message_new_signal(DBUS_OBJECT_DEVICE_MANAGER, DBUS_INTERFACE_DEVICE_MANAGER, "DeviceInfoChanged"));
dbus_message_iter_init_append(signal_msg, &msg_iter);
- dbus_message_iter_append_basic(&msg_iter, DBUS_TYPE_UINT32, &event_id);
- pa_assert_se(dbus_message_iter_open_container(&msg_iter, DBUS_TYPE_STRUCT, NULL, &device_iter));
-
- direction = (dbus_int32_t) pa_tz_device_get_direction(device);
- type = pa_tz_device_get_type(device);
- name = pa_tz_device_get_name(device);
- device_id = (dbus_int32_t) pa_tz_device_get_id(device);
- compound_state = pa_tz_device_get_state(device, DM_DEVICE_DIRECTION_BOTH);
-
- simple_device_dump(PA_LOG_DEBUG, changed_prefix[changed_type], device_id, type, name, direction, compound_state);
-
- dbus_message_iter_append_basic(&device_iter, DBUS_TYPE_INT32, &device_id);
- dbus_message_iter_append_basic(&device_iter, DBUS_TYPE_STRING, &type);
- dbus_message_iter_append_basic(&device_iter, DBUS_TYPE_INT32, &direction);
- dbus_message_iter_append_basic(&device_iter, DBUS_TYPE_INT32, &compound_state);
- dbus_message_iter_append_basic(&device_iter, DBUS_TYPE_STRING, &name);
- pa_assert_se(dbus_message_iter_close_container(&msg_iter, &device_iter));
+ fill_signal_msg_with_device(changed_prefix[changed_type], &msg_iter, event_id, device);
dbus_message_iter_append_basic(&msg_iter, DBUS_TYPE_INT32, &changed_type);
pa_assert_se(dbus_connection_send(pa_dbus_connection_get(dm->dbus_conn), signal_msg, NULL));
static void send_device_state_changed_signal(uint32_t event_id, pa_tz_device *device, bool activated, pa_device_manager *dm) {
DBusMessage *signal_msg;
- DBusMessageIter msg_iter, device_iter;
- dm_device_state_t compound_state;
- dbus_int32_t device_id, direction;
- char *type, *name;
+ DBusMessageIter msg_iter;
pa_assert(device);
pa_assert(dm);
pa_assert_se(signal_msg = dbus_message_new_signal(DBUS_OBJECT_DEVICE_MANAGER, DBUS_INTERFACE_DEVICE_MANAGER, "DeviceStateChanged"));
dbus_message_iter_init_append(signal_msg, &msg_iter);
- dbus_message_iter_append_basic(&msg_iter, DBUS_TYPE_UINT32, &event_id);
- pa_assert_se(dbus_message_iter_open_container(&msg_iter, DBUS_TYPE_STRUCT, NULL, &device_iter));
-
- direction = (dbus_int32_t) pa_tz_device_get_direction(device);
- type = pa_tz_device_get_type(device);
- name = pa_tz_device_get_name(device);
- device_id = (dbus_int32_t) pa_tz_device_get_id(device);
- compound_state = activated ? DM_DEVICE_STATE_ACTIVATED : DM_DEVICE_STATE_DEACTIVATED;
-
- simple_device_dump(PA_LOG_DEBUG, "[State Changed]", device_id, type, name, direction, compound_state);
-
- dbus_message_iter_append_basic(&device_iter, DBUS_TYPE_INT32, &device_id);
- dbus_message_iter_append_basic(&device_iter, DBUS_TYPE_STRING, &type);
- dbus_message_iter_append_basic(&device_iter, DBUS_TYPE_INT32, &direction);
- dbus_message_iter_append_basic(&device_iter, DBUS_TYPE_INT32, &compound_state);
- dbus_message_iter_append_basic(&device_iter, DBUS_TYPE_STRING, &name);
- pa_assert_se(dbus_message_iter_close_container(&msg_iter, &device_iter));
+ fill_signal_msg_with_device(activated ? "[Activated]" : "[Deactivated]", &msg_iter, event_id, device);
pa_assert_se(dbus_connection_send(pa_dbus_connection_get(dm->dbus_conn), signal_msg, NULL));
dbus_message_unref(reply);
}
+static void handle_is_stream_on_device(DBusConnection *conn, DBusMessage *msg, void *userdata) {
+ pa_device_manager *manager;
+ DBusMessage *reply;
+ pa_tz_device *device;
+ dbus_bool_t is_on = false;
+ dbus_int32_t stream_id, device_id;
+ pa_intset *stream_id_set;
+ int32_t stream_id_val;
+ int ret;
+ dm_device_state_t state;
+
+ pa_assert(conn);
+ pa_assert(msg);
+ pa_assert(userdata);
+
+ pa_log_info("Is stream on device");
+
+ manager = (pa_device_manager*) userdata;
+
+
+ pa_assert_se(dbus_message_get_args(msg, NULL,
+ DBUS_TYPE_INT32, &stream_id,
+ DBUS_TYPE_INT32, &device_id,
+ DBUS_TYPE_INVALID));
+
+ if ((device = _device_list_get_device_with_id(manager, device_id))) {
+ pa_assert_se((reply = dbus_message_new_method_return(msg)));
+
+ state = pa_tz_device_get_state(device, DM_DEVICE_DIRECTION_BOTH);
+ if (state == DM_DEVICE_STATE_ACTIVATED) {
+ stream_id_set = pa_tz_device_get_stream_list(device);
+ PA_INTSET_FOREACH(stream_id_val, stream_id_set, ret) {
+ if (stream_id_val == stream_id) {
+ is_on = true;
+ pa_log_info("stream(%d) is on device(%d)", stream_id, device_id);
+ break;
+ }
+ }
+ } else {
+ pa_log_info("device(%d) is not activated, regard as no stream on it", device_id);
+ is_on = false;
+ }
+
+ pa_assert_se(dbus_message_append_args(reply, DBUS_TYPE_BOOLEAN, &is_on,
+ DBUS_TYPE_INVALID));
+
+ pa_assert_se(dbus_connection_send(conn, reply, NULL));
+ dbus_message_unref(reply);
+ } else {
+ pa_dbus_send_error(conn, msg, DBUS_ERROR_INVALID_ARGS, "%s", "org.tizen.multimedia.audio.Internal");
+ }
+}
static void handle_get_bt_a2dp_status(DBusConnection *conn, DBusMessage *msg, void *userdata) {
pa_device_manager *dm;