From f6f4acc9215e62c936d643d6a6b9ddbba997652e Mon Sep 17 00:00:00 2001 From: Steve Pronovost Date: Sat, 16 Oct 2021 11:55:46 -0700 Subject: [PATCH] Added support for AUDIO_PLAYBACK_DVC Support audio on dynamic channel. Please refer to MS-RDPEA. --- channels/rdpsnd/server/rdpsnd_main.c | 37 ++++++++++++++++++++++++---- channels/rdpsnd/server/rdpsnd_main.h | 1 + include/freerdp/server/rdpsnd.h | 3 +++ 3 files changed, 36 insertions(+), 5 deletions(-) diff --git a/channels/rdpsnd/server/rdpsnd_main.c b/channels/rdpsnd/server/rdpsnd_main.c index 615a5627a..6f01b47fa 100644 --- a/channels/rdpsnd/server/rdpsnd_main.c +++ b/channels/rdpsnd/server/rdpsnd_main.c @@ -673,13 +673,40 @@ static UINT rdpsnd_server_start(RdpsndServerContext* context) DWORD bytesReturned; RdpsndServerPrivate* priv = context->priv; UINT error = ERROR_INTERNAL_ERROR; - priv->ChannelHandle = - WTSVirtualChannelOpen(context->vcm, WTS_CURRENT_SESSION, RDPSND_CHANNEL_NAME); + PULONG pSessionId = NULL; - if (!priv->ChannelHandle) + priv->SessionId = WTS_CURRENT_SESSION; + + if (context->use_dynamic_virtual_channel) { - WLog_ERR(TAG, "WTSVirtualChannelOpen failed!"); - return ERROR_INTERNAL_ERROR; + if (WTSQuerySessionInformationA(context->vcm, WTS_CURRENT_SESSION, WTSSessionId, + (LPSTR*)&pSessionId, &bytesReturned)) + { + priv->SessionId = (DWORD)*pSessionId; + WTSFreeMemory(pSessionId); + priv->ChannelHandle = (HANDLE)WTSVirtualChannelOpenEx( + priv->SessionId, "AUDIO_PLAYBACK_DVC", WTS_CHANNEL_OPTION_DYNAMIC); + if (!priv->ChannelHandle) + { + WLog_ERR(TAG, "Open audio dynamic virtual channel (AUDIO_PLAYBACK_DVC) failed!"); + return ERROR_INTERNAL_ERROR; + } + } + else + { + WLog_ERR(TAG, "WTSQuerySessionInformationA failed!"); + return ERROR_INTERNAL_ERROR; + } + } + else + { + priv->ChannelHandle = + WTSVirtualChannelOpen(context->vcm, WTS_CURRENT_SESSION, RDPSND_CHANNEL_NAME); + if (!priv->ChannelHandle) + { + WLog_ERR(TAG, "Open audio static virtual channel (rdpsnd) failed!"); + return ERROR_INTERNAL_ERROR; + } } if (!WTSVirtualChannelQuery(priv->ChannelHandle, WTSVirtualEventHandle, &buffer, diff --git a/channels/rdpsnd/server/rdpsnd_main.h b/channels/rdpsnd/server/rdpsnd_main.h index 69923996f..149adbb13 100644 --- a/channels/rdpsnd/server/rdpsnd_main.h +++ b/channels/rdpsnd/server/rdpsnd_main.h @@ -39,6 +39,7 @@ struct _rdpsnd_server_private HANDLE StopEvent; HANDLE channelEvent; void* ChannelHandle; + DWORD SessionId; BOOL waitingHeader; DWORD expectedBytes; diff --git a/include/freerdp/server/rdpsnd.h b/include/freerdp/server/rdpsnd.h index 302e23e9a..b73e2a865 100644 --- a/include/freerdp/server/rdpsnd.h +++ b/include/freerdp/server/rdpsnd.h @@ -56,6 +56,9 @@ struct _rdpsnd_server_context /* Server self-defined pointer. */ void* data; + /* Server to request to use dynamic virtual channel. */ + BOOL use_dynamic_virtual_channel; + /* Server supported formats. Set by server. */ AUDIO_FORMAT* server_formats; size_t num_server_formats;