From c078aee238794190dc307a1a0d97ed8a9b0d0bf7 Mon Sep 17 00:00:00 2001 From: Armin Novak Date: Wed, 16 May 2018 08:45:17 +0200 Subject: [PATCH] Return real alsa latency if buffer is filled. --- channels/rdpsnd/client/alsa/rdpsnd_alsa.c | 29 ++++++++++++++++++----------- 1 file changed, 18 insertions(+), 11 deletions(-) diff --git a/channels/rdpsnd/client/alsa/rdpsnd_alsa.c b/channels/rdpsnd/client/alsa/rdpsnd_alsa.c index 0740313..68ad092 100644 --- a/channels/rdpsnd/client/alsa/rdpsnd_alsa.c +++ b/channels/rdpsnd/client/alsa/rdpsnd_alsa.c @@ -420,6 +420,7 @@ static BOOL rdpsnd_alsa_set_volume(rdpsndDevicePlugin* device, UINT32 value) static UINT rdpsnd_alsa_play(rdpsndDevicePlugin* device, const BYTE* data, size_t size) { + UINT latency; size_t offset; int frame_size; rdpsndAlsaPlugin* alsa = (rdpsndAlsaPlugin*) device; @@ -431,16 +432,10 @@ static UINT rdpsnd_alsa_play(rdpsndDevicePlugin* device, const BYTE* data, size_ snd_pcm_sframes_t status = snd_pcm_writei(alsa->pcm_handle, &data[offset], (size - offset) / frame_size); - if (status == -EPIPE) - { - snd_pcm_recover(alsa->pcm_handle, status, 0); - status = 0; - } - else if (status == -EAGAIN) - { - status = 0; - } - else if (status < 0) + if (status < 0) + status = snd_pcm_recover(alsa->pcm_handle, status, 0); + + if (status < 0) { WLog_ERR(TAG, "status: %d\n", status); snd_pcm_close(alsa->pcm_handle); @@ -452,7 +447,19 @@ static UINT rdpsnd_alsa_play(rdpsndDevicePlugin* device, const BYTE* data, size_ offset += status * frame_size; } - return 10; /* TODO: Get real latency in [ms] */ + { + snd_pcm_sframes_t available, delay; + int rc = snd_pcm_avail_delay(alsa->pcm_handle, &available, &delay); + + if (rc != 0) + latency = 0; + else if (available == 0) /* Get [ms] from number of samples */ + latency = delay * 1000 / alsa->actual_rate; + else + latency = 0; + } + + return latency + alsa->latency; } static COMMAND_LINE_ARGUMENT_A rdpsnd_alsa_args[] = -- 2.7.4