21#include <freerdp/config.h>
26#include <winpr/windows.h>
27#include <freerdp/server/server-common.h>
32#ifdef WITH_RDPSND_DSOUND
34#include "wf_directsound.h"
42#include <freerdp/log.h>
43#define TAG SERVER_TAG("windows")
45static void wf_peer_rdpsnd_activated(RdpsndServerContext* context)
48 wfi = wf_info_get_instance();
49 wfi->agreed_format = NULL;
50 WLog_DBG(TAG,
"Client supports the following %d formats:", context->num_client_formats);
53 for (; i < context->num_client_formats; i++)
56 for (
size_t j = 0; j < context->num_server_formats; j++)
58 if ((context->client_formats[i].wFormatTag == context->server_formats[j].wFormatTag) &&
59 (context->client_formats[i].nChannels == context->server_formats[j].nChannels) &&
60 (context->client_formats[i].nSamplesPerSec ==
61 context->server_formats[j].nSamplesPerSec))
63 WLog_DBG(TAG,
"agreed on format!");
64 wfi->agreed_format = (
AUDIO_FORMAT*)&context->server_formats[j];
69 if (wfi->agreed_format != NULL)
73 if (wfi->agreed_format == NULL)
75 WLog_ERR(TAG,
"Could not agree on a audio format with the server");
79 context->SelectFormat(context, i);
80 context->SetVolume(context, 0x7FFF, 0x7FFF);
81#ifdef WITH_RDPSND_DSOUND
82 wf_directsound_activate(context);
84 wf_wasapi_activate(context);
92 wfi = wf_info_get_instance();
93 dRes = WaitForSingleObject(wfi->snd_mutex, INFINITE);
107 WLog_ERR(TAG,
"wf_rdpsnd_lock failed with 0x%08lX", GetLastError());
115int wf_rdpsnd_unlock()
118 wfi = wf_info_get_instance();
120 if (ReleaseMutex(wfi->snd_mutex) == 0)
122 WLog_DBG(TAG,
"wf_rdpsnd_unlock failed with 0x%08lX", GetLastError());
129BOOL wf_peer_rdpsnd_init(wfPeerContext* context)
131 wfInfo* wfi = wf_info_get_instance();
136 if (!(wfi->snd_mutex = CreateMutex(NULL, FALSE, NULL)))
139 context->rdpsnd = rdpsnd_server_context_new(context->vcm);
140 context->rdpsnd->rdpcontext = &context->_p;
141 context->rdpsnd->data = context;
142 context->rdpsnd->num_server_formats =
143 server_rdpsnd_get_formats(&context->rdpsnd->server_formats);
145 if (context->rdpsnd->num_server_formats > 0)
146 context->rdpsnd->src_format = &context->rdpsnd->server_formats[0];
148 context->rdpsnd->Activated = wf_peer_rdpsnd_activated;
149 context->rdpsnd->Initialize(context->rdpsnd, TRUE);
150 wf_rdpsnd_set_latest_peer(context);
151 wfi->snd_stop = FALSE;