[Spice-devel] [PATCH 2/2] Detect played silence and stop audio stream after 1 second

Yonit Halperin yhalperi at redhat.com
Thu Aug 26 08:24:31 PDT 2010


On 08/25/2010 11:49 AM, alexl at redhat.com wrote:
> From: Alexander Larsson<alexl at redhat.com>
>
> VLC sends silence when paused (bug #28817), which causes a lot of
> unnecessary network traffic. We detect such silence and shut
> down the clients audio stream (even though the audio is still active
> in the server), re-enabling it when we get non-silent data again.
> ---

>   __visible__ void spice_server_playback_put_samples(SpicePlaybackInstance *sin, uint32_t *samples)
>   {
>       SndChannel *channel = sin->st->worker.connection;
>       PlaybackChannel *playback_channel = SPICE_CONTAINEROF(channel, PlaybackChannel, base);
>       AudioFrame *frame;
> +    uint32_t mm_time;
>
>       if (!channel)
>           return;
>       ASSERT(playback_channel->base.active);
>
> +    frame = SPICE_CONTAINEROF(samples, AudioFrame, samples);
> +
> +    mm_time = reds_get_mm_time();
> +    red_dispatcher_set_mm_time(mm_time);
> +
> +    if (frame_is_silent(frame)) {
> +        if (channel->client_silent) {
> +            snd_playback_free_frame(playback_channel, frame);
> +            return;
> +        }
> +        channel->silent_count++;
> +        if (channel->silent_count>  SPICE_INTERFACE_PLAYBACK_FREQ / FRAME_SIZE) {
> +            /* After 1 sec of silence we stop the audio */
> +            channel->client_silent = TRUE;
> +            if (playback_channel->pending_frame) {
> +                snd_playback_free_frame(playback_channel, playback_channel->pending_frame);
> +                playback_channel->pending_frame = NULL;
> +            }
> +            snd_playback_free_frame(playback_channel, frame);
> +            snd_playback_send_stop(playback_channel);
> +
> +            return;
> +        }
> +    } else {
> +        if (channel->client_silent) {
> +            snd_playback_send_start(playback_channel);
> +            channel->client_silent = FALSE;

you shouldn't call snd_playback_send_start/stop here, but rather use the 
channel's "pipe" (channel->command). Otherwise, you might corrupt the 
currently sent data or the order of messages.


More information about the Spice-devel mailing list