diff --git a/src/modules/module-netjack2-driver.c b/src/modules/module-netjack2-driver.c index e1f5eb6ca..0aa9a85cd 100644 --- a/src/modules/module-netjack2-driver.c +++ b/src/modules/module-netjack2-driver.c @@ -848,6 +848,10 @@ static int handle_follower_setup(struct impl *impl, struct nj2_session_params *p pw_log_warn("invalid follower setup"); return -EINVAL; } + /* the params are from the perspective of the manager, so send is our + * receive (source) and recv is our send (sink) */ + SPA_SWAP(peer->params.send_audio_channels, peer->params.recv_audio_channels); + SPA_SWAP(peer->params.send_midi_channels, peer->params.recv_midi_channels); pw_loop_update_io(impl->main_loop, impl->setup_socket, 0); @@ -1005,10 +1009,12 @@ static int send_follower_available(struct impl *impl) snprintf(params.follower_name, sizeof(params.follower_name), "%s", pw_get_host_name()); params.mtu = htonl(impl->mtu); params.transport_sync = htonl(0); - params.send_audio_channels = htonl(impl->sink.wanted_n_audio); - params.recv_audio_channels = htonl(impl->source.wanted_n_audio); - params.send_midi_channels = htonl(impl->sink.wanted_n_midi); - params.recv_midi_channels = htonl(impl->source.wanted_n_midi); + /* send/recv is from the perspective of the manager, so what we send (sink) + * is recv on the manager and vice versa. */ + params.recv_audio_channels = htonl(impl->sink.wanted_n_audio); + params.send_audio_channels = htonl(impl->source.wanted_n_audio); + params.recv_midi_channels = htonl(impl->sink.wanted_n_midi); + params.send_midi_channels = htonl(impl->source.wanted_n_midi); params.sample_encoder = htonl(NJ2_ENCODER_FLOAT); params.follower_sync_mode = htonl(1); params.network_latency = htonl(impl->latency); diff --git a/src/modules/module-netjack2-manager.c b/src/modules/module-netjack2-manager.c index 634a42d58..2cef87218 100644 --- a/src/modules/module-netjack2-manager.c +++ b/src/modules/module-netjack2-manager.c @@ -1012,29 +1012,28 @@ static int handle_follower_available(struct impl *impl, struct nj2_session_param peer->params.sample_encoder = impl->encoding; peer->params.kbps = impl->kbps; - /* params send and recv are from the client point of view and reversed for the - * manager, so when the client sends, we receive in a source etc. We swap the params - * later after we replied to the client. */ + /* params send and recv are from the manager point of view and reversed for the + * driver. So, for us send = sink and recv = source */ if (peer->params.send_audio_channels < 0) - peer->params.send_audio_channels = follower->source.n_audio; + peer->params.send_audio_channels = follower->sink.n_audio; if (peer->params.recv_audio_channels < 0) - peer->params.recv_audio_channels = follower->sink.n_audio; + peer->params.recv_audio_channels = follower->source.n_audio; if (peer->params.send_midi_channels < 0) - peer->params.send_midi_channels = follower->source.n_midi; + peer->params.send_midi_channels = follower->sink.n_midi; if (peer->params.recv_midi_channels < 0) - peer->params.recv_midi_channels = follower->sink.n_midi; + peer->params.recv_midi_channels = follower->source.n_midi; - follower->source.n_ports = peer->params.send_audio_channels + peer->params.send_midi_channels; + follower->source.n_ports = peer->params.recv_audio_channels + peer->params.recv_midi_channels; follower->source.info.rate = peer->params.sample_rate; - if ((uint32_t)peer->params.send_audio_channels != follower->source.info.channels) { - follower->source.info.channels = SPA_MIN(peer->params.send_audio_channels, (int)SPA_AUDIO_MAX_CHANNELS); + if ((uint32_t)peer->params.recv_audio_channels != follower->source.info.channels) { + follower->source.info.channels = SPA_MIN(peer->params.recv_audio_channels, (int)SPA_AUDIO_MAX_CHANNELS); for (i = 0; i < follower->source.info.channels; i++) follower->source.info.position[i] = SPA_AUDIO_CHANNEL_AUX0 + i; } - follower->sink.n_ports = peer->params.recv_audio_channels + peer->params.recv_midi_channels; + follower->sink.n_ports = peer->params.send_audio_channels + peer->params.send_midi_channels; follower->sink.info.rate = peer->params.sample_rate; - if ((uint32_t)peer->params.recv_audio_channels != follower->sink.info.channels) { - follower->sink.info.channels = SPA_MIN(peer->params.recv_audio_channels, (int)SPA_AUDIO_MAX_CHANNELS); + if ((uint32_t)peer->params.send_audio_channels != follower->sink.info.channels) { + follower->sink.info.channels = SPA_MIN(peer->params.send_audio_channels, (int)SPA_AUDIO_MAX_CHANNELS); for (i = 0; i < follower->sink.info.channels; i++) follower->sink.info.position[i] = SPA_AUDIO_CHANNEL_AUX0 + i; } @@ -1125,10 +1124,6 @@ static int handle_follower_available(struct impl *impl, struct nj2_session_param nj2_dump_session_params(params); send(follower->socket->fd, params, sizeof(*params), 0); - /* now swap send and recv to make it match our point of view */ - SPA_SWAP(peer->params.send_audio_channels, peer->params.recv_audio_channels); - SPA_SWAP(peer->params.send_midi_channels, peer->params.recv_midi_channels); - return 0; create_failed: