From c3e08ad9c977af3172a3f8faec6914795984e36b Mon Sep 17 00:00:00 2001 From: Wim Taymans Date: Tue, 29 Apr 2025 18:09:02 +0200 Subject: [PATCH] netjack2: handle connection errors in more cases --- src/modules/module-netjack2-manager.c | 18 +++++++++++++++--- src/modules/module-netjack2/peer.c | 4 ++-- 2 files changed, 17 insertions(+), 5 deletions(-) diff --git a/src/modules/module-netjack2-manager.c b/src/modules/module-netjack2-manager.c index 30cedb795..b690ec771 100644 --- a/src/modules/module-netjack2-manager.c +++ b/src/modules/module-netjack2-manager.c @@ -359,6 +359,15 @@ 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 int stop_follower(struct follower *follower); + +static int do_stop_follower(struct spa_loop *loop, + bool async, uint32_t seq, const void *data, size_t size, void *user_data) +{ + stop_follower(user_data); + return 0; +} + static inline void handle_source_process(struct stream *s, struct spa_io_position *position) { struct follower *follower = s->follower; @@ -369,7 +378,10 @@ static inline void handle_source_process(struct stream *s, struct spa_io_positio set_info(s, nframes, midi, &n_midi, audio, &n_audio); - netjack2_manager_sync_wait(&follower->peer); + if (netjack2_manager_sync_wait(&follower->peer) < 0) { + pw_loop_invoke(s->impl->main_loop, do_stop_follower, 0, NULL, 0, false, follower); + return; + } netjack2_recv_data(&follower->peer, midi, n_midi, audio, n_audio); } @@ -481,8 +493,8 @@ on_data_io(void *data, int fd, uint32_t mask) if (mask & (SPA_IO_ERR | SPA_IO_HUP)) { pw_log_warn("error:%08x", mask); - pw_loop_destroy_source(impl->data_loop, follower->socket); - follower->socket = NULL; + pw_loop_update_io(impl->data_loop, follower->socket, 0); + pw_loop_invoke(impl->main_loop, do_stop_follower, 0, NULL, 0, false, follower); return; } if (mask & SPA_IO_IN) { diff --git a/src/modules/module-netjack2/peer.c b/src/modules/module-netjack2/peer.c index 3870b3817..833b22723 100644 --- a/src/modules/module-netjack2/peer.c +++ b/src/modules/module-netjack2/peer.c @@ -758,7 +758,7 @@ static inline int32_t netjack2_driver_sync_wait(struct netjack2_peer *peer) receive_error: pw_log_warn("recv error: %m"); - return 0; + return -errno; } static inline int32_t netjack2_manager_sync_wait(struct netjack2_peer *peer) @@ -802,7 +802,7 @@ static inline int32_t netjack2_manager_sync_wait(struct netjack2_peer *peer) receive_error: pw_log_warn("recv error: %m"); - return 0; + return -errno; } static int netjack2_recv_midi(struct netjack2_peer *peer, struct nj2_packet_header *header, uint32_t *count,