mirror of
https://gitlab.freedesktop.org/pipewire/pipewire.git
synced 2025-10-29 05:40:27 -04:00
netjack2: reverse send/recv roles in driver/manager
The params contain the send/recv streams from the point of view of the manager (and not the driver as was assumed before). This means we need to swap send/recv in the driver, not the manager. This makes things interoperate with JACK/netjack2. See #4666
This commit is contained in:
parent
1445843ced
commit
4f53136891
2 changed files with 22 additions and 21 deletions
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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:
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue