jack: update the eventfd from the data loop

Also update the variables we use from the data loop.
This commit is contained in:
Wim Taymans 2024-06-04 17:14:02 +02:00
parent 1e9a557c06
commit fa154955af

View file

@ -420,6 +420,9 @@ struct client {
struct spa_io_position *position; struct spa_io_position *position;
struct pw_node_activation *driver_activation; struct pw_node_activation *driver_activation;
struct spa_list target_links; struct spa_list target_links;
unsigned int prepared:1;
unsigned int first:1;
unsigned int thread_entered:1;
} rt; } rt;
pthread_mutex_t rt_lock; pthread_mutex_t rt_lock;
@ -429,8 +432,6 @@ struct client {
unsigned int started:1; unsigned int started:1;
unsigned int active:1; unsigned int active:1;
unsigned int destroyed:1; unsigned int destroyed:1;
unsigned int first:1;
unsigned int thread_entered:1;
unsigned int has_transport:1; unsigned int has_transport:1;
unsigned int allow_mlock:1; unsigned int allow_mlock:1;
unsigned int warn_mlock:1; unsigned int warn_mlock:1;
@ -1834,10 +1835,10 @@ static inline uint32_t cycle_run(struct client *c)
activation->awake_time = get_time_ns(c->l->system); activation->awake_time = get_time_ns(c->l->system);
if (SPA_UNLIKELY(c->first)) { if (SPA_UNLIKELY(c->rt.first)) {
if (c->thread_init_callback) if (c->thread_init_callback)
c->thread_init_callback(c->thread_init_arg); c->thread_init_callback(c->thread_init_arg);
c->first = false; c->rt.first = false;
} }
if (SPA_UNLIKELY(pos == NULL)) { if (SPA_UNLIKELY(pos == NULL)) {
@ -1967,8 +1968,8 @@ on_rtsocket_condition(void *data, int fd, uint32_t mask)
return; return;
} }
if (SPA_UNLIKELY(c->thread_callback)) { if (SPA_UNLIKELY(c->thread_callback)) {
if (!c->thread_entered) { if (!c->rt.thread_entered) {
c->thread_entered = true; c->rt.thread_entered = true;
c->thread_callback(c->thread_arg); c->thread_callback(c->thread_arg);
} }
} else if (SPA_LIKELY(mask & SPA_IO_IN)) { } else if (SPA_LIKELY(mask & SPA_IO_IN)) {
@ -2106,7 +2107,7 @@ do_update_driver_activation(struct spa_loop *loop,
c->rt.position = c->position; c->rt.position = c->position;
c->rt.driver_activation = c->driver_activation; c->rt.driver_activation = c->driver_activation;
if (c->position) { if (c->position) {
pw_log_info("%p: driver:%d clock:%s", c, pw_log_debug("%p: driver:%d clock:%s", c,
c->driver_id, c->position->clock.name); c->driver_id, c->position->clock.name);
check_sample_rate(c, c->position); check_sample_rate(c, c->position);
check_buffer_frames(c, c->position); check_buffer_frames(c, c->position);
@ -2194,6 +2195,39 @@ static int client_node_event(void *data, const struct spa_event *event)
return -ENOTSUP; return -ENOTSUP;
} }
static int do_prepare_client(struct spa_loop *loop, bool async, uint32_t seq,
const void *data, size_t size, void *user_data)
{
struct client *c = user_data;
if (c->rt.prepared)
return 0;
pw_loop_update_io(c->l,
c->socket_source,
SPA_IO_IN | SPA_IO_ERR | SPA_IO_HUP);
c->rt.first = true;
c->rt.thread_entered = false;
c->rt.prepared = true;
return 0;
}
static int do_unprepare_client(struct spa_loop *loop, bool async, uint32_t seq,
const void *data, size_t size, void *user_data)
{
struct client *c = user_data;
if (!c->rt.prepared)
return 0;
pw_loop_update_io(c->l,
c->socket_source, SPA_IO_ERR | SPA_IO_HUP);
c->rt.prepared = false;
return 0;
}
static int client_node_command(void *data, const struct spa_command *command) static int client_node_command(void *data, const struct spa_command *command)
{ {
struct client *c = (struct client *) data; struct client *c = (struct client *) data;
@ -2204,8 +2238,8 @@ static int client_node_command(void *data, const struct spa_command *command)
case SPA_NODE_COMMAND_Suspend: case SPA_NODE_COMMAND_Suspend:
case SPA_NODE_COMMAND_Pause: case SPA_NODE_COMMAND_Pause:
if (c->started) { if (c->started) {
pw_loop_update_io(c->l, pw_data_loop_invoke(c->loop,
c->socket_source, SPA_IO_ERR | SPA_IO_HUP); do_unprepare_client, SPA_ID_INVALID, NULL, 0, false, c);
c->started = false; c->started = false;
} }
@ -2213,12 +2247,9 @@ static int client_node_command(void *data, const struct spa_command *command)
case SPA_NODE_COMMAND_Start: case SPA_NODE_COMMAND_Start:
if (!c->started) { if (!c->started) {
pw_loop_update_io(c->l, pw_data_loop_invoke(c->loop,
c->socket_source, do_prepare_client, SPA_ID_INVALID, NULL, 0, false, c);
SPA_IO_IN | SPA_IO_ERR | SPA_IO_HUP);
c->started = true; c->started = true;
c->first = true;
c->thread_entered = false;
} }
break; break;
default: default: