dbus_message_unref(signal_msg);
}
-void broadcast_connected_remote_device(DBusConnection *conn, bool connected, unsigned int index,
- const char *remote_name, const char *peer_info) {
+void broadcast_connected_remote_device(DBusConnection *conn, int type, bool connected, unsigned int index,
+ const char *name, const char *description) {
DBusMessage *signal_msg;
DBusMessageIter msg_iter;
dbus_bool_t c = (dbus_bool_t)connected;
- uint32_t type = 1; // TODO: 0:sink-input, 1:source-output
pa_assert(conn);
- pa_log_error("broadcast");
-
- if (!remote_name || !peer_info) {
+ if (!name || !description) {
pa_log_error("Unknown device");
return;
}
- pa_log_info("type[%d], index[%d], connected[%d], remote_name[%s] peer_info[%s]", type, index, connected, remote_name, peer_info);
+ pa_log_info("type[%d], index[%d], connected[%d], name[%s] description[%s]", type, index, connected, name, description);
- pa_assert_se((signal_msg = dbus_message_new_signal(STREAM_MANAGER_OBJECT_PATH, STREAM_MANAGER_INTERFACE, STREAM_MANAGER_SIGNAL_NAME_FOUND_REMOTE)));
+ pa_assert_se((signal_msg = dbus_message_new_signal(STREAM_MANAGER_OBJECT_PATH, STREAM_MANAGER_INTERFACE, STREAM_MANAGER_SIGNAL_NAME_REMOTE_FOUND)));
dbus_message_iter_init_append(signal_msg, &msg_iter);
dbus_message_iter_append_basic(&msg_iter, DBUS_TYPE_INT32, &type);
dbus_message_iter_append_basic(&msg_iter, DBUS_TYPE_UINT32, &index);
dbus_message_iter_append_basic(&msg_iter, DBUS_TYPE_BOOLEAN, &c);
- dbus_message_iter_append_basic(&msg_iter, DBUS_TYPE_STRING, &remote_name);
- dbus_message_iter_append_basic(&msg_iter, DBUS_TYPE_STRING, &peer_info);
+ dbus_message_iter_append_basic(&msg_iter, DBUS_TYPE_STRING, &name);
+ dbus_message_iter_append_basic(&msg_iter, DBUS_TYPE_STRING, &description);
pa_assert_se(dbus_connection_send(conn, signal_msg, NULL));
dbus_message_unref(signal_msg);
}
+/* TODO: */
void broadcast_changed_remote_access(DBusConnection *conn, unsigned int index, const char *perm) {
DBusMessage *signal_msg;
DBusMessageIter msg_iter;
- pa_log_error("test remote access");
-
if (!perm) {
pa_log_error("unknown permision");
return;
return PA_HOOK_OK;
}
-static pa_hook_result_t remote_source_output_put_cb(pa_core *core, pa_source_output *o, pa_stream_manager *m) {
+static pa_hook_result_t source_output_unlink_cb(pa_core *core, pa_object *o, pa_stream_manager *m) {
pa_core_assert_ref(core);
- pa_source_output_assert_ref(o);
-
- pa_log_info("source-output(%p, index:%u)", o, o->index);
-
- if (pa_proplist_contains(o->proplist, PA_PROP_MEDIA_REMOTE_NAME)) {
- const char *remote_name = pa_proplist_gets(o->proplist, PA_PROP_MEDIA_REMOTE_NAME);
- const char *peer_info = pa_proplist_gets(o->proplist, "native-protocol.peer");
- pa_log_info("jcsing remote connected. %d %s %s", o->index, remote_name, peer_info);
- broadcast_connected_remote_device(pa_dbus_connection_get(m->dbus_conn), true, o->index, remote_name, peer_info);
- }
-}
-
-static pa_hook_result_t source_output_unlink_cb(pa_core *core, pa_source_output *o, pa_stream_manager *m) {
- pa_core_assert_ref(core);
- pa_source_output_assert_ref(o);
-
- pa_log_info("source-output(%p, index:%u)", o, o->index);
if (is_stream_related_call_active_routing(PA_OBJECT(o))) {
m->on_call = false;
return PA_HOOK_OK;
}
-static pa_hook_result_t remote_source_output_unlink_cb(pa_core *core, pa_source_output *o, pa_stream_manager *m) {
- pa_core_assert_ref(core);
- pa_source_output_assert_ref(o);
-
- pa_log_info("source-output(%p, index:%u)", o, o->index);
-
- if (pa_proplist_contains(o->proplist, PA_PROP_MEDIA_REMOTE_NAME)) {
- const char *remote_name = pa_proplist_gets(o->proplist, PA_PROP_MEDIA_REMOTE_NAME);
- const char *peer_info = pa_proplist_gets(o->proplist, "native-protocol.peer");
- pa_log_info("jcsing remote disconnected %d %s %s", o->index, remote_name, peer_info);
- (void)broadcast_connected_remote_device(pa_dbus_connection_get(m->dbus_conn), false, o->index, remote_name, peer_info);
- }
-
- return PA_HOOK_OK;
-}
-
static pa_hook_result_t source_output_state_changed_cb(pa_core *core, pa_source_output *o, pa_stream_manager *m) {
pa_assert(o);
pa_assert(m);
return PA_HOOK_OK;
}
+static void remote_client_callback(pa_core *core, pa_object *obj, pa_stream_manager *m, bool connected) {
+ pa_proplist *p;
+ pa_sink_input *i;
+ pa_source_output *o;
+ unsigned int index;
+
+ if (pa_source_output_isinstance(obj)) {
+ o = PA_SOURCE_OUTPUT(obj);
+ p = o->proplist;
+ index = o->index;
+ } else {
+ i = PA_SINK_INPUT(obj);
+ p = i->proplist;
+ index = i->index;
+ }
+
+ if (!p) {
+ pa_log_error("unknown remote client");
+ return;
+ }
+
+ if (pa_proplist_contains(p, PA_PROP_MEDIA_REMOTE_NAME)) {
+ const char *name = pa_proplist_gets(p, PA_PROP_MEDIA_REMOTE_NAME);
+ const char *description = pa_proplist_gets(p, PA_PROP_MEDIA_REMOTE_DESCRIPTION);
+
+ (void)broadcast_connected_remote_device(pa_dbus_connection_get(m->dbus_conn),
+ pa_source_output_isinstance(obj) ? 1 : 0, connected, index, name, description);
+ }
+}
+
+static pa_hook_result_t remote_client_put_cb(pa_core *core, pa_object *o, pa_stream_manager *m) {
+ pa_core_assert_ref(core);
+ pa_object_assert_ref(o);
+
+ remote_client_callback(core, o, m, true);
+
+ return PA_HOOK_OK;
+}
+
+static pa_hook_result_t remote_client_unlink_cb(pa_core *core, pa_object *o, pa_stream_manager *m) {
+ pa_core_assert_ref(core);
+ pa_object_assert_ref(o);
+
+ remote_client_callback(core, o, m, false);
+
+ return PA_HOOK_OK;
+}
+
static void find_next_device_for_auto_route(pa_stream_manager *m, stream_route_type_t route_type, const char *stream_role,
stream_type_t stream_type, const char *cur_device_type, const char *preferred_device_role, pa_tz_device **next_device) {
stream_info *si = NULL;
m->sink_input_ramp_finish_slot = pa_hook_connect(&m->core->hooks[PA_CORE_HOOK_SINK_INPUT_RAMP_FINISH], PA_HOOK_EARLY, (pa_hook_cb_t) sink_input_ramp_finish_cb, m);
m->source_output_new_slot = pa_hook_connect(&m->core->hooks[PA_CORE_HOOK_SOURCE_OUTPUT_NEW], PA_HOOK_EARLY, (pa_hook_cb_t) source_output_new_cb, m);
m->source_output_put_slot = pa_hook_connect(&m->core->hooks[PA_CORE_HOOK_SOURCE_OUTPUT_PUT], PA_HOOK_EARLY, (pa_hook_cb_t) source_output_put_cb, m);
- m->remote_source_output_put_slot = pa_hook_connect(&m->core->hooks[PA_CORE_HOOK_SOURCE_OUTPUT_PUT], PA_HOOK_NORMAL, (pa_hook_cb_t) remote_source_output_put_cb, m);
m->source_output_unlink_slot = pa_hook_connect(&m->core->hooks[PA_CORE_HOOK_SOURCE_OUTPUT_UNLINK], PA_HOOK_EARLY, (pa_hook_cb_t) source_output_unlink_cb, m);
- m->remote_source_output_unlink_slot = pa_hook_connect(&m->core->hooks[PA_CORE_HOOK_SOURCE_OUTPUT_UNLINK], PA_HOOK_NORMAL, (pa_hook_cb_t) remote_source_output_unlink_cb, m);
m->source_output_state_changed_slot = pa_hook_connect(&m->core->hooks[PA_CORE_HOOK_SOURCE_OUTPUT_STATE_CHANGED], PA_HOOK_EARLY, (pa_hook_cb_t) source_output_state_changed_cb, m);
m->source_output_move_start_slot = pa_hook_connect(&m->core->hooks[PA_CORE_HOOK_SOURCE_OUTPUT_MOVE_START], PA_HOOK_EARLY, (pa_hook_cb_t) source_output_move_start_cb, m);
m->source_output_move_finish_slot = pa_hook_connect(&m->core->hooks[PA_CORE_HOOK_SOURCE_OUTPUT_MOVE_FINISH], PA_HOOK_EARLY, (pa_hook_cb_t) source_output_move_finish_cb, m);
+ m->remote_sink_input_put_slot = pa_hook_connect(&m->core->hooks[PA_CORE_HOOK_SINK_INPUT_PUT], PA_HOOK_EARLY, (pa_hook_cb_t) remote_client_put_cb, m);
+ m->remote_sink_input_unlink_slot = pa_hook_connect(&m->core->hooks[PA_CORE_HOOK_SINK_INPUT_UNLINK], PA_HOOK_EARLY, (pa_hook_cb_t) remote_client_unlink_cb, m);
+ m->remote_source_output_put_slot = pa_hook_connect(&m->core->hooks[PA_CORE_HOOK_SOURCE_OUTPUT_PUT], PA_HOOK_NORMAL, (pa_hook_cb_t) remote_client_put_cb, m);
+ m->remote_source_output_unlink_slot = pa_hook_connect(&m->core->hooks[PA_CORE_HOOK_SOURCE_OUTPUT_UNLINK], PA_HOOK_NORMAL, (pa_hook_cb_t) remote_client_unlink_cb, m);
+
m->subscription = pa_subscription_new(m->core, PA_SUBSCRIPTION_MASK_CLIENT | PA_SUBSCRIPTION_MASK_SAMPLE_CACHE, (pa_subscription_cb_t)subscribe_cb, m);
m->comm.comm = pa_communicator_get(c);