#include <winpr/crt.h>
#include <winpr/cmdline.h>
+#include <winpr/sysinfo.h>
#include <winpr/collections.h>
#include <alsa/asoundlib.h>
BYTE cBlockNo;
UINT16 wTimeStamp;
UINT16 wFormatNo;
+ UINT32 wTimeA;
+ UINT32 wTimeB;
};
typedef struct _RDPSND_WAVE_INFO RDPSND_WAVE_INFO;
int offset;
int frame_size;
wMessage message;
+ UINT32 wInitialTime;
+ UINT32 wCurrentTime;
+ UINT32 wSessionTime;
+ UINT16 wFixedLatency;
+ UINT16 wAverageLatency;
+ UINT16 wAverageSleepLatency;
RDPSND_WAVE_INFO* waveInfo;
snd_pcm_sframes_t available_input;
snd_pcm_sframes_t available_output;
rdpsndAlsaPlugin* alsa = (rdpsndAlsaPlugin*) arg;
+ rdpsndDevicePlugin* device = (rdpsndDevicePlugin*) arg;
+
+ wInitialTime = GetTickCount();
+
+ wFixedLatency = 250;
+ wAverageLatency = wFixedLatency / 2;
+ wAverageSleepLatency = wFixedLatency / 2;
while (1)
{
}
free(data);
+
+ if (message.id == 1)
+ {
+ UINT16 wLatency;
+ UINT16 wTimeStamp;
+ UINT16 wSleepLatency;
+ waveInfo = (RDPSND_WAVE_INFO*) message.wParam;
+
+ waveInfo->wTimeB = GetTickCount();
+ wLatency = (UINT16) (waveInfo->wTimeB - waveInfo->wTimeA);
+ wTimeStamp = waveInfo->wTimeStamp + wLatency;
+
+ wAverageLatency = (wAverageLatency + wLatency) / 2;
+
+ if (wFixedLatency > wLatency)
+ wSleepLatency = wFixedLatency - wLatency;
+ else
+ wSleepLatency = 0;
+
+ wAverageSleepLatency = (wAverageSleepLatency + wSleepLatency) / 2;
+
+ Sleep(wSleepLatency);
+
+ wCurrentTime = GetTickCount();
+ wSessionTime = wCurrentTime - wInitialTime;
+
+ printf("[%06d.%03d] FixedLatency: %d ms AverageLatency: %d ms CurrentLatency: %d ms "
+ "SleepLatency: %d ms AverageSleepLatency: %d ms\n",
+ wSessionTime / 1000, wSessionTime % 1000,
+ wFixedLatency, wAverageLatency, wLatency,
+ wSleepLatency, wAverageSleepLatency);
+
+ wTimeStamp += wSleepLatency;
+
+ device->WaveConfirm(device, wTimeStamp, waveInfo->cBlockNo);
+
+ free(waveInfo);
+ }
}
return NULL;
waveInfo = (RDPSND_WAVE_INFO*) malloc(sizeof(RDPSND_WAVE_INFO));
+ waveInfo->wTimeA = GetTickCount();
waveInfo->wTimeStamp = wTimeStamp;
waveInfo->wFormatNo = wFormatNo;
waveInfo->cBlockNo = cBlockNo;
}
}
- wTimeStamp = rdpsnd->wTimeStamp + TIME_DELAY_MS;
-
- data = stream_new(8);
- stream_write_BYTE(data, SNDC_WAVECONFIRM);
- stream_write_BYTE(data, 0);
- stream_write_UINT16(data, 4);
- stream_write_UINT16(data, wTimeStamp);
- stream_write_BYTE(data, rdpsnd->cBlockNo); /* cConfirmedBlockNo */
- stream_write_BYTE(data, 0); /* bPad */
-
- wTimeStamp = rdpsnd->wave_timestamp + TIME_DELAY_MS;
- MessageQueue_Post(rdpsnd->MsgPipe->Out, NULL, 0, (void*) data, (void*) (size_t) wTimeStamp);
+ if (!rdpsnd->device->WavePlay)
+ {
+ wTimeStamp = rdpsnd->wTimeStamp + TIME_DELAY_MS;
+
+ data = stream_new(8);
+ stream_write_BYTE(data, SNDC_WAVECONFIRM);
+ stream_write_BYTE(data, 0);
+ stream_write_UINT16(data, 4);
+ stream_write_UINT16(data, wTimeStamp);
+ stream_write_BYTE(data, rdpsnd->cBlockNo); /* cConfirmedBlockNo */
+ stream_write_BYTE(data, 0); /* bPad */
+
+ wTimeStamp = rdpsnd->wave_timestamp + TIME_DELAY_MS;
+ MessageQueue_Post(rdpsnd->MsgPipe->Out, NULL, 0, (void*) data, (void*) (size_t) wTimeStamp);
+ }
}
static void rdpsnd_recv_close_pdu(rdpsndPlugin* rdpsnd)