This is in preparation for switching SndChannelClient into a proper RedChannelClient. The prototype of the new helper matches what is expected from the RedChannel::config_socket vfunc. To be able to achieve that, this commit associates the sound channel RedsStream instance with the DummyChannelClient instance we have, and then call snd_channel_config_socket() on that instance. Based on a patch from Frediano Ziglio <fziglio@xxxxxxxxxx> Signed-off-by: Christophe Fergeau <cfergeau@xxxxxxxxxx> --- server/dummy-channel-client.c | 2 + server/dummy-channel-client.h | 1 + server/sound.c | 98 +++++++++++++++++++++++-------------------- 3 files changed, 55 insertions(+), 46 deletions(-) diff --git a/server/dummy-channel-client.c b/server/dummy-channel-client.c index 61d5683..4efaa31 100644 --- a/server/dummy-channel-client.c +++ b/server/dummy-channel-client.c @@ -104,6 +104,7 @@ dummy_channel_client_init(DummyChannelClient *self) RedChannelClient* dummy_channel_client_create(RedChannel *channel, RedClient *client, + RedsStream *stream, int num_common_caps, uint32_t *common_caps, int num_caps, uint32_t *caps) @@ -125,6 +126,7 @@ RedChannelClient* dummy_channel_client_create(RedChannel *channel, NULL, NULL, "channel", channel, "client", client, + "stream", stream, "caps", caps_array, "common-caps", common_caps_array, NULL); diff --git a/server/dummy-channel-client.h b/server/dummy-channel-client.h index 8013aa2..54e0e6c 100644 --- a/server/dummy-channel-client.h +++ b/server/dummy-channel-client.h @@ -56,6 +56,7 @@ GType dummy_channel_client_get_type(void) G_GNUC_CONST; RedChannelClient *dummy_channel_client_create(RedChannel *channel, RedClient *client, + RedsStream *stream, int num_common_caps, uint32_t *common_caps, int num_caps, uint32_t *caps); diff --git a/server/sound.c b/server/sound.c index 2165644..1f88149 100644 --- a/server/sound.c +++ b/server/sound.c @@ -938,6 +938,8 @@ static void snd_record_send(void* data) } } +static int snd_channel_config_socket(RedChannelClient *rcc); + static SndChannelClient *__new_channel(SndChannel *channel, int size, uint32_t channel_id, RedClient *red_client, RedsStream *stream, @@ -949,50 +951,8 @@ static SndChannelClient *__new_channel(SndChannel *channel, int size, uint32_t c uint32_t *caps, int num_caps) { SndChannelClient *client; - int delay_val; - int flags; -#ifdef SO_PRIORITY - int priority; -#endif - int tos; - MainChannelClient *mcc = red_client_get_main(red_client); RedsState *reds = red_channel_get_server(RED_CHANNEL(channel)); - spice_assert(stream); - if ((flags = fcntl(stream->socket, F_GETFL)) == -1) { - spice_printerr("accept failed, %s", strerror(errno)); - goto error1; - } - -#ifdef SO_PRIORITY - priority = 6; - if (setsockopt(stream->socket, SOL_SOCKET, SO_PRIORITY, (void*)&priority, - sizeof(priority)) == -1) { - if (errno != ENOTSUP) { - spice_printerr("setsockopt failed, %s", strerror(errno)); - } - } -#endif - - tos = IPTOS_LOWDELAY; - if (setsockopt(stream->socket, IPPROTO_IP, IP_TOS, (void*)&tos, sizeof(tos)) == -1) { - if (errno != ENOTSUP) { - spice_printerr("setsockopt failed, %s", strerror(errno)); - } - } - - delay_val = main_channel_client_is_low_bandwidth(mcc) ? 0 : 1; - if (setsockopt(stream->socket, IPPROTO_TCP, TCP_NODELAY, &delay_val, sizeof(delay_val)) == -1) { - if (errno != ENOTSUP) { - spice_printerr("setsockopt failed, %s", strerror(errno)); - } - } - - if (fcntl(stream->socket, F_SETFL, flags | O_NONBLOCK) == -1) { - spice_printerr("accept failed, %s", strerror(errno)); - goto error1; - } - spice_assert(size >= sizeof(*client)); client = spice_malloc0(size); client->refs = 1; @@ -1017,24 +977,70 @@ static SndChannelClient *__new_channel(SndChannel *channel, int size, uint32_t c client->cleanup = cleanup; client->channel_client = - dummy_channel_client_create(RED_CHANNEL(channel), red_client, + dummy_channel_client_create(RED_CHANNEL(channel), red_client, stream, num_common_caps, common_caps, num_caps, caps); if (!client->channel_client) { goto error2; } + if (!snd_channel_config_socket(RED_CHANNEL_CLIENT(client->channel_client))) { + goto error2; + } + return client; error2: free(client); - -error1: reds_stream_free(stream); return NULL; } static int snd_channel_config_socket(RedChannelClient *rcc) { - g_assert_not_reached(); + int delay_val; + int flags; +#ifdef SO_PRIORITY + int priority; +#endif + int tos; + RedsStream *stream = red_channel_client_get_stream(rcc); + RedClient *red_client = red_channel_client_get_client(rcc); + MainChannelClient *mcc = red_client_get_main(red_client); + + if ((flags = fcntl(stream->socket, F_GETFL)) == -1) { + spice_printerr("accept failed, %s", strerror(errno)); + return FALSE; + } + +#ifdef SO_PRIORITY + priority = 6; + if (setsockopt(stream->socket, SOL_SOCKET, SO_PRIORITY, (void*)&priority, + sizeof(priority)) == -1) { + if (errno != ENOTSUP) { + spice_printerr("setsockopt failed, %s", strerror(errno)); + } + } +#endif + + tos = IPTOS_LOWDELAY; + if (setsockopt(stream->socket, IPPROTO_IP, IP_TOS, (void*)&tos, sizeof(tos)) == -1) { + if (errno != ENOTSUP) { + spice_printerr("setsockopt failed, %s", strerror(errno)); + } + } + + delay_val = main_channel_client_is_low_bandwidth(mcc) ? 0 : 1; + if (setsockopt(stream->socket, IPPROTO_TCP, TCP_NODELAY, &delay_val, sizeof(delay_val)) == -1) { + if (errno != ENOTSUP) { + spice_printerr("setsockopt failed, %s", strerror(errno)); + } + } + + if (fcntl(stream->socket, F_SETFL, flags | O_NONBLOCK) == -1) { + spice_printerr("accept failed, %s", strerror(errno)); + return FALSE; + } + + return TRUE; } static void snd_channel_on_disconnect(RedChannelClient *rcc) -- 2.9.3 _______________________________________________ Spice-devel mailing list Spice-devel@xxxxxxxxxxxxxxxxxxxxx https://lists.freedesktop.org/mailman/listinfo/spice-devel