pa_hook_slot *comm_hook_device_connection_changed_slot;
pa_hook_slot *comm_hook_device_state_changed_slot;
pa_hook_slot *comm_hook_device_running_changed_slot;
+ pa_hook_slot *source_proplist_changed_slot;
+ pa_hook_slot *sink_proplist_changed_slot;
pa_communicator *comm;
pa_hal_interface *hal_interface;
return pa_safe_streq(pa_proplist_gets(prop, PA_PROP_DEVICE_API), DEVICE_API_RAOP);
}
+static bool pulse_device_is_remote(pa_object *pdevice) {
+ pa_proplist *prop = pulse_device_get_proplist(pdevice);
+
+ if (!prop)
+ return false;
+
+ return pa_proplist_contains(prop, PA_PROP_MEDIA_REMOTE_NAME);
+}
+
static bool pulse_device_is_tizenaudio(pa_object *pdevice) {
if (!pdevice)
return pa_proplist_gets(prop, "bluez.path");
else if (pulse_device_is_raop(pdevice))
return pa_proplist_gets(prop, PA_PROP_DEVICE_STRING);
+ else if (pulse_device_is_remote(pdevice))
+ return pa_proplist_gets(prop, PA_PROP_DEVICE_DESCRIPTION);
else
- return NULL;
+ pa_log_error("ERROR!!!!!!!!!!!!!!!!!!!!");
+
+ return NULL;
}
static pa_sink* _core_get_sink(pa_core *core, const char *device_string, const char *params) {
} else if (pulse_device_is_raop(PA_OBJECT(sink))) {
handle_raop_pulse_device(PA_OBJECT(sink), false, dm);
return PA_HOOK_OK;
+ } else if (pulse_device_is_remote(PA_OBJECT(sink))) {
+ if (pa_safe_streq(pa_proplist_gets(sink->proplist, PA_PROP_MEDIA_REMOTE_ACCESS), "allowed")) {
+ pa_log("[REMOTE] sink [ALLOWED] unlinked!! update to [DENIED] now!");
+ pa_proplist* p = pa_proplist_new();
+ pa_proplist_sets(p, PA_PROP_MEDIA_REMOTE_ACCESS, "denied");
+ pa_sink_update_proplist(sink, PA_UPDATE_REPLACE, p);
+ pa_proplist_free(p);
+ pa_log("[REMOTE] Done!!");
+ } else {
+ pa_log("[REMOTE] sink [DENIED] unlinked!! nothing to do");
+ }
+ return PA_HOOK_OK;
} else if (pulse_device_is_acm(PA_OBJECT(sink))) {
handle_acm_pulse_device(PA_OBJECT(sink), false, dm);
return PA_HOOK_OK;
pulse_device_set_use_internal_codec(PA_OBJECT(source), false);
handle_bt_pulse_device(PA_OBJECT(source), true, dm);
return PA_HOOK_OK;
- else if (pulse_device_is_raop(PA_OBJECT(source))) {
+ } else if (pulse_device_is_raop(PA_OBJECT(source))) {
pulse_device_set_use_internal_codec(PA_OBJECT(source), false);
handle_raop_pulse_device(PA_OBJECT(source), true, dm);
return PA_HOOK_OK;
} else if (pulse_device_is_bluez(PA_OBJECT(source))) {
handle_bt_pulse_device(PA_OBJECT(source), false, dm);
return PA_HOOK_OK;
+ } else if (pulse_device_is_raop(PA_OBJECT(source))) {
+ handle_raop_pulse_device(PA_OBJECT(source), false, dm);
+ return PA_HOOK_OK;
+ } else if (pulse_device_is_remote(PA_OBJECT(source))) {
+ if (pa_safe_streq(pa_proplist_gets(source->proplist, PA_PROP_MEDIA_REMOTE_ACCESS), "allowed")) {
+ pa_log("[REMOTE] source [ALLOWED] unlinked!! update to [DENIED] now!");
+ pa_proplist* p = pa_proplist_new();
+ pa_proplist_sets(p, PA_PROP_MEDIA_REMOTE_ACCESS, "denied");
+ pa_source_update_proplist(source, PA_UPDATE_REPLACE, p);
+ pa_proplist_free(p);
+ pa_log("[REMOTE] Done!!");
+ } else {
+ pa_log("[REMOTE] source [DENIED] unlinked!! nothing to do");
+ }
+ return PA_HOOK_OK;
} else if (pulse_device_is_alsa(PA_OBJECT(source)) || pulse_device_is_tizenaudio(PA_OBJECT(source))) {
handle_internal_pulse_device(PA_OBJECT(source), false, dm);
return PA_HOOK_OK;
return PA_HOOK_OK;
}
+static pa_hook_result_t source_proplist_changed(pa_core *core, pa_source *source, pa_device_manager *dm) {
+ pa_core_assert_ref(core);
+ pa_source_assert_ref(source);
+
+ const char *remote_access = pa_proplist_gets(source->proplist, PA_PROP_MEDIA_REMOTE_ACCESS);
+ if (remote_access) {
+ /* FIXME : handle same value as before */
+ pulse_device_set_use_internal_codec(PA_OBJECT(source), false);
+ handle_raop_pulse_device(PA_OBJECT(source), pa_safe_streq(remote_access, "allowed"), dm);
+ }
+ return PA_HOOK_OK;
+}
+
+static pa_hook_result_t sink_proplist_changed(pa_core *core, pa_sink *sink, pa_device_manager *dm) {
+ pa_core_assert_ref(core);
+ pa_sink_assert_ref(sink);
+
+ const char *remote_access = pa_proplist_gets(sink->proplist, PA_PROP_MEDIA_REMOTE_ACCESS);
+ if (remote_access) {
+ /* FIXME : handle same value as before */
+ pulse_device_set_use_internal_codec(PA_OBJECT(sink), false);
+ handle_raop_pulse_device(PA_OBJECT(sink), pa_safe_streq(remote_access, "allowed"), dm);
+ }
+ return PA_HOOK_OK;
+}
+
/*
Build params for load sink or source, and load it.
*/
dm->comm_hook_device_running_changed_slot = pa_hook_connect(pa_communicator_hook(dm->comm, PA_COMMUNICATOR_HOOK_DEVICE_RUNNING_CHANGED),
PA_HOOK_EARLY, (pa_hook_cb_t)device_running_changed_hook_cb, dm);
+ dm->source_proplist_changed_slot = pa_hook_connect(&dm->core->hooks[PA_CORE_HOOK_SOURCE_PROPLIST_CHANGED], PA_HOOK_NORMAL, (pa_hook_cb_t) source_proplist_changed, dm);
+ dm->sink_proplist_changed_slot = pa_hook_connect(&dm->core->hooks[PA_CORE_HOOK_SINK_PROPLIST_CHANGED], PA_HOOK_NORMAL, (pa_hook_cb_t) sink_proplist_changed, dm);
+
dm->hal_interface = pa_hal_interface_get(dm->core);
if (!(dm->type_infos = parse_device_type_infos())) {
if (dm->source_state_changed_slot)
pa_hook_slot_free(dm->source_state_changed_slot);
+ if (dm->source_proplist_changed_slot)
+ pa_hook_slot_free(dm->source_proplist_changed_slot);
+ if (dm->sink_proplist_changed_slot)
+ pa_hook_slot_free(dm->sink_proplist_changed_slot);
+
if (dm->hal_interface)
pa_hal_interface_unref(dm->hal_interface);
data->ss = data->u->core->default_sample_spec;
data->cm = data->u->core->default_channel_map;
- properties = pa_sprintf_malloc("%s=raop", PA_PROP_DEVICE_API);
+ //properties = pa_sprintf_malloc("%s=raop", PA_PROP_DEVICE_API);
if (!data->channel_map_set && data->cm.channels != data->ss.channels)
pa_channel_map_init_extend(&data->cm, data->ss.channels, PA_CHANNEL_MAP_DEFAULT);
goto out;
}
pa_sink_input_update_proplist(i, PA_UPDATE_REPLACE, p);
-
+ pa_sink_input_send_event(i, PA_STREAM_EVENT_UPDATE_MEDIA_REMOTE_ACCESS, p);
} else if (pa_streq(type, "source-output")) {
pa_source_output *o;
*remote_source_output_unlink_slot,
*source_output_state_changed_slot,
*source_output_move_start_slot,
- *source_output_move_finish_slot,
- *source_proplist_changed_slot;
+ *source_output_move_finish_slot;
#ifdef HAVE_DBUS
#ifdef USE_DBUS_PROTOCOL
int32_t handle_restrictions(pa_stream_manager *m, const char *name, uint32_t value);
bool is_restricted(pa_stream_manager *m, void *stream, stream_type_t stream_type);
+bool is_remote_restricted(void *stream, stream_type_t type);
#endif
return 0;
}
+bool is_remote_restricted(void *stream, stream_type_t type) {
+ pa_proplist* p = NULL;
+ if (type == STREAM_SOURCE_OUTPUT)
+ p = ((pa_source_output_new_data *)stream)->source->proplist;
+ else
+ p = ((pa_sink_input_new_data *)stream)->sink->proplist;
+
+ if (pa_proplist_contains(p, PA_PROP_MEDIA_REMOTE_ACCESS)) {
+ if (pa_safe_streq(pa_proplist_gets(p, PA_PROP_MEDIA_REMOTE_ACCESS), "denied")) {
+ pa_log("[REMOTE] media remote access is currently denied for this stream %p!!!", stream);
+ return true;
+ }
+ pa_log("[REMOTE] stream %p is currently allowed.", stream);
+ } else {
+ pa_log("[REMOTE] stream %p is not for remote.", stream);
+ }
+ return false;
+}
+
+
bool is_restricted(pa_stream_manager *m, void *stream, stream_type_t type) {
const char *role;
- pa_source_output_new_data *data = (pa_source_output_new_data *)stream;
- const char *media_remote_access = NULL;
pa_assert(m);
}
}
- /* ToDo : temporal test code */
- pa_log("[REMOTE] driver = %s", data->driver);
- pa_log("[REMOTE] source = %p, name = %s, driver = %s",
- data->source,
- data->source? data->source->name : "null",
- data->source->driver);
- pa_log("[REMOTE] dest source = %p, name = %s", data->destination_source, data->destination_source ? data->destination_source->name : "null");
-
- if (pa_safe_streq(data->source->driver, "module-tunnel-source-new.c")) {
- media_remote_access = pa_proplist_gets(data->source->proplist, PA_PROP_MEDIA_REMOTE_ACCESS);
- pa_log("[REMOTE] %s = %s", PA_PROP_MEDIA_REMOTE_ACCESS, pa_strnull(media_remote_access));
- if (pa_safe_streq(media_remote_access, "denied")) {
- pa_log("[REMOTE] media remote access is currently denied!!!");
- return true;
- }
- }
- /* END */
-
return false;
}
pa_log_debug("sink-input-new-data(%p)", new_data);
process_stream(m, new_data, STREAM_SINK_INPUT, PROCESS_COMMAND_PREPARE, true);
+ if (is_remote_restricted(new_data, STREAM_SINK_INPUT))
+ return PA_HOOK_CANCEL;
process_stream(m, new_data, STREAM_SINK_INPUT, PROCESS_COMMAND_UPDATE_BUFFER_ATTR, true);
process_stream(m, new_data, STREAM_SINK_INPUT, PROCESS_COMMAND_UPDATE_VOLUME, true);
process_stream(m, new_data, STREAM_SINK_INPUT, PROCESS_COMMAND_CHANGE_ROUTE_BY_STREAM_STARTED, true);
pa_log_debug("source-output-new-data(%p)", new_data);
process_stream(m, new_data, STREAM_SOURCE_OUTPUT, PROCESS_COMMAND_PREPARE, true);
- if (is_restricted(m, new_data, STREAM_SOURCE_OUTPUT))
+ if (is_restricted(m, new_data, STREAM_SOURCE_OUTPUT) ||
+ is_remote_restricted(new_data, STREAM_SOURCE_OUTPUT))
return PA_HOOK_CANCEL;
process_stream(m, new_data, STREAM_SOURCE_OUTPUT, PROCESS_COMMAND_UPDATE_BUFFER_ATTR, true);
process_stream(m, new_data, STREAM_SOURCE_OUTPUT, PROCESS_COMMAND_UPDATE_VOLUME, true);
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);
- broadcast_connected_remote_device(pa_dbus_connection_get(m->dbus_conn), false, 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;
return PA_HOOK_OK;
}
-static pa_hook_result_t source_proplist_changed(pa_core *core, pa_source *o, pa_stream_manager *m) {
- pa_core_assert_ref(core);
- pa_source_assert_ref(o);
-
- const char *perm = pa_proplist_gets(o->proplist, PA_PROP_MEDIA_REMOTE_ACCESS);
- if (perm)
- broadcast_changed_remote_access(pa_dbus_connection_get(m->dbus_conn), o->index, perm);
-
- pa_log_error("jcsing test");
-
- 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->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->source_proplist_changed_slot = pa_hook_connect(&m->core->hooks[PA_CORE_HOOK_SOURCE_PROPLIST_CHANGED], PA_HOOK_EARLY, (pa_hook_cb_t) source_proplist_changed, 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);