media-session: improve plugged time

Use the node plugged time for the session or else use the time when the
session was created.
This commit is contained in:
Wim Taymans 2018-06-18 11:12:42 +02:00
parent 18f0194008
commit dbc3b4c1a4

View file

@ -73,6 +73,8 @@ static inline void init_type(struct type *type, struct spa_type_map *map)
struct impl { struct impl {
struct type type; struct type type;
struct timespec now;
struct pw_core *core; struct pw_core *core;
struct pw_type *t; struct pw_type *t;
struct pw_module *module; struct pw_module *module;
@ -91,6 +93,7 @@ struct session {
struct impl *impl; struct impl *impl;
enum pw_direction direction; enum pw_direction direction;
uint64_t plugged;
struct pw_node *node; struct pw_node *node;
struct spa_hook node_listener; struct spa_hook node_listener;
@ -410,13 +413,11 @@ static int find_session(void *data, struct session *sess)
if (strcmp(str, find->media_class) != 0) if (strcmp(str, find->media_class) != 0)
return 0; return 0;
if ((str = pw_properties_get(props, "node.plugged")) != NULL)
plugged = pw_properties_parse_uint64(str);
if (sess->exclusive) { if (sess->exclusive) {
pw_log_debug("module %p: session in use", impl); pw_log_debug("module %p: session in use", impl);
return 0; return 0;
} }
plugged = sess->plugged;
} }
pw_log_debug("module %p: found session '%d' %" PRIu64, impl, pw_log_debug("module %p: found session '%d' %" PRIu64, impl,
@ -661,6 +662,7 @@ static int on_global(void *data, struct pw_global *global)
struct pw_port *node_port, *dsp_port; struct pw_port *node_port, *dsp_port;
uint32_t id, channels, rate; uint32_t id, channels, rate;
bool need_dsp; bool need_dsp;
uint64_t plugged;
if (pw_global_get_type(global) != impl->t->node) if (pw_global_get_type(global) != impl->t->node)
return 0; return 0;
@ -672,6 +674,11 @@ static int on_global(void *data, struct pw_global *global)
properties = pw_node_get_properties(node); properties = pw_node_get_properties(node);
if ((str = pw_properties_get(properties, "node.plugged")) != NULL)
plugged = pw_properties_parse_uint64(str);
else
plugged = impl->now.tv_sec * SPA_NSEC_PER_SEC + impl->now.tv_nsec;
if (handle_autoconnect(impl, node, properties) == 1) { if (handle_autoconnect(impl, node, properties) == 1) {
return 0; return 0;
} }
@ -705,8 +712,11 @@ static int on_global(void *data, struct pw_global *global)
sess->id = id; sess->id = id;
sess->node = node; sess->node = node;
sess->node_port = node_port; sess->node_port = node_port;
sess->plugged = plugged;
spa_list_init(&sess->node_list); spa_list_init(&sess->node_list);
spa_list_append(&impl->session_list, &sess->l); spa_list_append(&impl->session_list, &sess->l);
pw_log_debug("new session %p for node %d", sess, id);
pw_node_add_listener(node, &sess->node_listener, &node_events, sess); pw_node_add_listener(node, &sess->node_listener, &node_events, sess);
@ -767,6 +777,8 @@ static const struct pw_module_events module_events = {
static void static void
core_global_added(void *data, struct pw_global *global) core_global_added(void *data, struct pw_global *global)
{ {
struct impl *impl = data;
clock_gettime(CLOCK_MONOTONIC, &impl->now);
on_global(data, global); on_global(data, global);
} }
@ -795,6 +807,7 @@ static int module_init(struct pw_module *module, struct pw_properties *propertie
spa_list_init(&impl->session_list); spa_list_init(&impl->session_list);
clock_gettime(CLOCK_MONOTONIC, &impl->now);
pw_core_for_each_global(core, on_global, impl); pw_core_for_each_global(core, on_global, impl);
pw_core_add_listener(core, &impl->core_listener, &core_events, impl); pw_core_add_listener(core, &impl->core_listener, &core_events, impl);