rdpsnd/server: decrease audio latency and make it configurable.
authorVic Lee <llyzs.vic@gmail.com>
Tue, 21 Jun 2016 06:05:29 +0000 (14:05 +0800)
committerVic Lee <llyzs.vic@gmail.com>
Tue, 21 Jun 2016 09:22:43 +0000 (17:22 +0800)
channels/rdpsnd/server/rdpsnd_main.c
include/freerdp/server/rdpsnd.h

index 7a93ecd..a1d1a25 100644 (file)
@@ -337,25 +337,26 @@ static UINT rdpsnd_server_select_format(RdpsndServerContext* context, int client
                goto out;
        }
 
+       if (context->latency <= 0)
+               context->latency = 50;
+       context->priv->out_frames = context->src_format.nSamplesPerSec * context->latency / 1000;
+       if (context->priv->out_frames < 1)
+               context->priv->out_frames = 1;
        switch(format->wFormatTag)
        {
                case WAVE_FORMAT_DVI_ADPCM:
                        bs = (format->nBlockAlign - 4 * format->nChannels) * 4;
-                       context->priv->out_frames = (format->nBlockAlign * 4 * format->nChannels * 2 / bs + 1) * bs / (format->nChannels * 2);
+                       context->priv->out_frames -= context->priv->out_frames % bs;
+                       if (context->priv->out_frames < bs)
+                               context->priv->out_frames = bs;
                        break;
 
                case WAVE_FORMAT_ADPCM:
                        bs = (format->nBlockAlign - 7 * format->nChannels) * 2 / format->nChannels + 2;
-                       context->priv->out_frames = bs * 4;
+                       context->priv->out_frames -= context->priv->out_frames % bs;
+                       if (context->priv->out_frames < bs)
+                               context->priv->out_frames = bs;
                        break;
-               default:
-                       context->priv->out_frames = 0x4000 / context->priv->src_bytes_per_frame;
-                       break;
-       }
-
-       if (format->nSamplesPerSec != context->src_format.nSamplesPerSec)
-       {
-               context->priv->out_frames = (context->priv->out_frames * context->src_format.nSamplesPerSec + format->nSamplesPerSec - 100) / format->nSamplesPerSec;
        }
        context->priv->out_pending_frames = 0;
 
index 701bca6..463469d 100644 (file)
@@ -61,6 +61,9 @@ struct _rdpsnd_server_context
        /* Server source PCM audio format. Set by server. */
        AUDIO_FORMAT src_format;
 
+       /* Server audio latency, or buffer size, in milli-seconds. Set by server. */
+       int latency;
+
        /* Client supported formats. */
        AUDIO_FORMAT* client_formats;
        int num_client_formats;