#include <pulsecore/core.h>
typedef enum pa_communicator_hook {
- PA_COMMUNICATOR_HOOK_SELECT_INIT_SINK_OR_SOURCE,
- PA_COMMUNICATOR_HOOK_CHANGE_ROUTE,
- PA_COMMUNICATOR_HOOK_UPDATE_ROUTE_OPTION,
- PA_COMMUNICATOR_HOOK_DEVICE_CONNECTION_CHANGED,
- PA_COMMUNICATOR_HOOK_DEVICE_INFORMATION_CHANGED,
- /* This hook is fired when a event is handled by all subscribers */
- PA_COMMUNICATOR_HOOK_EVENT_FULLY_HANDLED,
+ PA_COMMUNICATOR_HOOK_SELECT_INIT_SINK_OR_SOURCE, /* It is fired when a stream is created and needs to be set to sink or source */
+ PA_COMMUNICATOR_HOOK_CHANGE_ROUTE, /* It is fired when routing using internal codec should be processed */
+ PA_COMMUNICATOR_HOOK_DEVICE_CONNECTION_CHANGED, /* It is fired when a device is connected or disconnected */
+ PA_COMMUNICATOR_HOOK_DEVICE_INFORMATION_CHANGED, /* It is fired when a device's property is changed */
+ PA_COMMUNICATOR_HOOK_EVENT_FULLY_HANDLED, /* It is fired when a event is handled by all subscribers */
+ PA_COMMUNICATOR_HOOK_UPDATE_INFORMATION, /* It is fired when information should be updated */
PA_COMMUNICATOR_HOOK_MAX
} pa_communicator_hook_t;
pa_communicator *comm;
pa_hook_slot *comm_hook_select_proper_sink_or_source_slot;
pa_hook_slot *comm_hook_change_route_slot;
- pa_hook_slot *comm_hook_update_route_option_slot;
pa_hook_slot *comm_hook_device_connection_changed_slot;
pa_hook_slot *comm_hook_device_info_changed_slot;
+ pa_hook_slot *comm_hook_update_info_slot;
} communicator;
pa_hal_manager *hal_manager;
return PA_HOOK_OK;
}
-/* Forward routing option to HAL */
-static pa_hook_result_t route_option_update_hook_cb(pa_core *c, pa_stream_manager_hook_data_for_option *data, struct userdata *u) {
- hal_route_option route_option;
-
+static pa_hook_result_t update_info_hook_cb(pa_core *c, pa_stream_manager_hook_data_for_update_info *data, struct userdata *u) {
pa_assert(c);
pa_assert(data);
pa_assert(u);
- pa_log_info("[ROUTE_OPT] route_option_update_hook_cb is called. (%p), stream_role(%s), option[name(%s)/value(%d)]",
- data, data->stream_role, data->name, data->value);
- route_option.role = data->stream_role;
- route_option.name = data->name;
- route_option.value = data->value;
-
- if (pa_streq(route_option.role, STREAM_ROLE_LOOPBACK)) {
- if (pa_streq(route_option.name, MSG_FOR_LOOPBACK_ARG_LATENCY))
- u->loopback_args.latency_msec = route_option.value;
- else if (pa_streq(route_option.name, MSG_FOR_LOOPBACK_ARG_ADJUST_TIME))
- u->loopback_args.adjust_sec = route_option.value;
- return PA_HOOK_OK;
+ if (pa_streq(data->stream_role, STREAM_ROLE_LOOPBACK)) {
+ pa_log_info("[UPDATE] update_info_hook_cb is called. stream_role(%s) [name(%s)/value(%d)]",
+ data->stream_role, data->name, data->value);
+ if (pa_streq(data->name, MSG_FOR_LOOPBACK_ARG_LATENCY))
+ u->loopback_args.latency_msec = data->value;
+ else if (pa_streq(data->name, MSG_FOR_LOOPBACK_ARG_ADJUST_TIME))
+ u->loopback_args.adjust_sec = data->value;
}
- /* send information to HAL to update routing option */
- if (pa_hal_manager_update_route_option(u->hal_manager, &route_option))
- pa_log_error("[ROUTE_OPT] Failed to pa_hal_manager_update_route_option()");
-
return PA_HOOK_OK;
}
u->communicator.comm_hook_change_route_slot = pa_hook_connect(
pa_communicator_hook(u->communicator.comm, PA_COMMUNICATOR_HOOK_CHANGE_ROUTE),
PA_HOOK_EARLY, (pa_hook_cb_t)route_change_hook_cb, u);
- u->communicator.comm_hook_update_route_option_slot = pa_hook_connect(
- pa_communicator_hook(u->communicator.comm, PA_COMMUNICATOR_HOOK_UPDATE_ROUTE_OPTION),
- PA_HOOK_EARLY, (pa_hook_cb_t)route_option_update_hook_cb, u);
u->communicator.comm_hook_device_connection_changed_slot = pa_hook_connect(
pa_communicator_hook(u->communicator.comm, PA_COMMUNICATOR_HOOK_DEVICE_CONNECTION_CHANGED),
PA_HOOK_EARLY, (pa_hook_cb_t)device_connection_changed_hook_cb, u);
u->communicator.comm_hook_device_info_changed_slot = pa_hook_connect(
pa_communicator_hook(u->communicator.comm, PA_COMMUNICATOR_HOOK_DEVICE_INFORMATION_CHANGED),
PA_HOOK_EARLY, (pa_hook_cb_t)device_info_changed_hook_cb, u);
+ u->communicator.comm_hook_update_info_slot = pa_hook_connect(
+ pa_communicator_hook(u->communicator.comm, PA_COMMUNICATOR_HOOK_UPDATE_INFORMATION),
+ PA_HOOK_EARLY, (pa_hook_cb_t)update_info_hook_cb, u);
}
u->device_manager = pa_device_manager_get(u->core);
pa_hook_slot_free(u->communicator.comm_hook_select_proper_sink_or_source_slot);
if (u->communicator.comm_hook_change_route_slot)
pa_hook_slot_free(u->communicator.comm_hook_change_route_slot);
- if (u->communicator.comm_hook_update_route_option_slot)
- pa_hook_slot_free(u->communicator.comm_hook_update_route_option_slot);
if (u->communicator.comm_hook_device_connection_changed_slot)
pa_hook_slot_free(u->communicator.comm_hook_device_connection_changed_slot);
if (u->communicator.comm_hook_device_info_changed_slot)
pa_hook_slot_free(u->communicator.comm_hook_device_info_changed_slot);
+ if (u->communicator.comm_hook_update_info_slot)
+ pa_hook_slot_free(u->communicator.comm_hook_update_info_slot);
pa_communicator_unref(u->communicator.comm);
}
static void do_notify(pa_stream_manager *m, notify_command_type_t command, stream_type_t type, bool is_new_data, void *user_data) {
pa_stream_manager_hook_data_for_select hook_call_select_data;
pa_stream_manager_hook_data_for_route hook_call_route_data;
- pa_stream_manager_hook_data_for_option hook_call_option_data;
hal_stream_connection_info stream_conn_info;
+ hal_route_option route_option;
const char *role = NULL;
void *s = NULL;
const char *modifier_gain = NULL;
}
case NOTIFY_COMMAND_UPDATE_ROUTE_OPTION: {
pa_assert(user_data);
- memset(&hook_call_option_data, 0, sizeof(pa_stream_manager_hook_data_for_option));
+ memset(&route_option, 0, sizeof(hal_route_option));
s = (type == STREAM_SINK_INPUT) ? (void*)(m->cur_highest_priority.sink_input) :
(void*)(m->cur_highest_priority.source_output);
if (s) {
- hook_call_option_data.stream_role = (type == STREAM_SINK_INPUT) ? (m->cur_highest_priority.role_si) :
+ route_option.role = (type == STREAM_SINK_INPUT) ? (m->cur_highest_priority.role_si) :
(m->cur_highest_priority.role_so);
- hook_call_option_data.name = ((stream_route_option*)user_data)->name;
- hook_call_option_data.value = ((stream_route_option*)user_data)->value;
- pa_hook_fire(pa_communicator_hook(m->comm.comm, PA_COMMUNICATOR_HOOK_UPDATE_ROUTE_OPTION), &hook_call_option_data);
+ route_option.name = ((stream_route_option*)user_data)->name;
+ route_option.value = ((stream_route_option*)user_data)->value;
+ pa_hal_manager_update_route_option(m->hal, &route_option);
}
break;
}
static void message_cb(const char *name, int value, void *user_data) {
pa_stream_manager *m;
- pa_stream_manager_hook_data_for_option hook_call_option_data;
+ pa_stream_manager_hook_data_for_update_info hook_call_data;
pa_assert(user_data);
pa_assert(name);
m = (pa_stream_manager*)user_data;
if (strstr(name, STREAM_ROLE_LOOPBACK)) {
- memset(&hook_call_option_data, 0, sizeof(pa_stream_manager_hook_data_for_option));
- hook_call_option_data.stream_role = STREAM_ROLE_LOOPBACK;
- hook_call_option_data.name = name;
- hook_call_option_data.value = value;
- pa_hook_fire(pa_communicator_hook(m->comm.comm, PA_COMMUNICATOR_HOOK_UPDATE_ROUTE_OPTION), &hook_call_option_data);
+ memset(&hook_call_data, 0, sizeof(pa_stream_manager_hook_data_for_update_info));
+ hook_call_data.stream_role = STREAM_ROLE_LOOPBACK;
+ hook_call_data.name = name;
+ hook_call_data.value = value;
+ pa_hook_fire(pa_communicator_hook(m->comm.comm, PA_COMMUNICATOR_HOOK_UPDATE_INFORMATION), &hook_call_data);
}
#ifdef HAVE_DBUS
else {