netjack2: keep per stream io_position

And handle the trigger failure with a warning and fallback.
This commit is contained in:
Wim Taymans 2025-04-29 09:16:54 +02:00
parent 3d6e77e96d
commit 40dbc5f00f

View file

@ -183,6 +183,8 @@ struct stream {
struct pw_filter *filter;
struct spa_hook listener;
struct spa_io_position *position;
struct spa_audio_info_raw info;
uint32_t n_midi;
@ -202,8 +204,6 @@ struct follower {
struct spa_list link;
struct impl *impl;
struct spa_io_position *position;
struct stream source;
struct stream sink;
@ -354,9 +354,8 @@ static void sink_process(void *d, struct spa_io_position *position)
pw_loop_update_io(s->impl->data_loop, follower->socket, SPA_IO_IN);
}
static void source_process(void *d, struct spa_io_position *position)
static inline void handle_source_process(struct stream *s, struct spa_io_position *position)
{
struct stream *s = d;
struct follower *follower = s->follower;
uint32_t nframes = position->clock.duration;
struct data_info midi[s->n_ports];
@ -369,6 +368,12 @@ static void source_process(void *d, struct spa_io_position *position)
netjack2_recv_data(&follower->peer, midi, n_midi, audio, n_audio);
}
static void source_process(void *d, struct spa_io_position *position)
{
struct stream *s = d;
handle_source_process(s, position);
}
static void follower_free(struct follower *follower)
{
struct impl *impl = follower->impl;
@ -473,18 +478,20 @@ on_data_io(void *data, int fd, uint32_t mask)
if (mask & SPA_IO_IN) {
pw_loop_update_io(impl->data_loop, follower->socket, 0);
pw_filter_trigger_process(follower->source.filter);
if (pw_filter_trigger_process(follower->source.filter) < 0) {
pw_log_warn("source not ready");
handle_source_process(&follower->source, follower->source.position);
}
}
}
static void stream_io_changed(void *data, void *port_data, uint32_t id, void *area, uint32_t size)
{
struct stream *s = data;
struct follower *follower = s->follower;
if (port_data == NULL) {
switch (id) {
case SPA_IO_Position:
follower->position = area;
s->position = area;
break;
default:
break;