sfreerdp-server: get rdpsnd channel to initialize
This commit is contained in:
parent
829723582e
commit
84f88883e9
@ -373,6 +373,7 @@ static boolean audin_server_open(audin_server_context* context)
|
||||
if (audin->audin_channel_thread == NULL)
|
||||
{
|
||||
audin->audin_channel = WTSVirtualChannelOpenEx(context->vcm, "AUDIO_INPUT", WTS_CHANNEL_OPTION_DYNAMIC);
|
||||
|
||||
if (audin->audin_channel == NULL)
|
||||
return false;
|
||||
|
||||
|
@ -91,12 +91,15 @@ static boolean rdpsnd_server_send_formats(rdpsnd_server* rdpsnd, STREAM* s)
|
||||
stream_write_uint16(s, rdpsnd->context.server_formats[i].wFormatTag); /* wFormatTag (WAVE_FORMAT_PCM) */
|
||||
stream_write_uint16(s, rdpsnd->context.server_formats[i].nChannels); /* nChannels */
|
||||
stream_write_uint32(s, rdpsnd->context.server_formats[i].nSamplesPerSec); /* nSamplesPerSec */
|
||||
|
||||
stream_write_uint32(s, rdpsnd->context.server_formats[i].nSamplesPerSec *
|
||||
rdpsnd->context.server_formats[i].nChannels *
|
||||
rdpsnd->context.server_formats[i].wBitsPerSample / 8); /* nAvgBytesPerSec */
|
||||
|
||||
stream_write_uint16(s, rdpsnd->context.server_formats[i].nBlockAlign); /* nBlockAlign */
|
||||
stream_write_uint16(s, rdpsnd->context.server_formats[i].wBitsPerSample); /* wBitsPerSample */
|
||||
stream_write_uint16(s, rdpsnd->context.server_formats[i].cbSize); /* cbSize */
|
||||
|
||||
if (rdpsnd->context.server_formats[i].cbSize > 0)
|
||||
{
|
||||
stream_write(s, rdpsnd->context.server_formats[i].data, rdpsnd->context.server_formats[i].cbSize);
|
||||
@ -296,19 +299,20 @@ static void rdpsnd_server_select_format(rdpsnd_server_context* context, int clie
|
||||
|
||||
static boolean rdpsnd_server_send_audio_pdu(rdpsnd_server* rdpsnd)
|
||||
{
|
||||
STREAM* s = rdpsnd->rdpsnd_pdu;
|
||||
rdpsndFormat* format;
|
||||
int tbytes_per_frame;
|
||||
uint8* src;
|
||||
int size;
|
||||
boolean r;
|
||||
uint8* src;
|
||||
int frames;
|
||||
int fill_size;
|
||||
boolean r;
|
||||
rdpsndFormat* format;
|
||||
int tbytes_per_frame;
|
||||
STREAM* s = rdpsnd->rdpsnd_pdu;
|
||||
|
||||
format = &rdpsnd->context.client_formats[rdpsnd->context.selected_client_format];
|
||||
tbytes_per_frame = format->nChannels * rdpsnd->src_bytes_per_sample;
|
||||
|
||||
if (format->nSamplesPerSec == rdpsnd->context.src_format.nSamplesPerSec && format->nChannels == rdpsnd->context.src_format.nChannels)
|
||||
if ((format->nSamplesPerSec == rdpsnd->context.src_format.nSamplesPerSec) &&
|
||||
(format->nChannels == rdpsnd->context.src_format.nChannels))
|
||||
{
|
||||
src = rdpsnd->out_buffer;
|
||||
frames = rdpsnd->out_pending_frames;
|
||||
@ -366,6 +370,7 @@ static boolean rdpsnd_server_send_audio_pdu(rdpsnd_server* rdpsnd)
|
||||
stream_check_size(s, size + fill_size);
|
||||
stream_write_uint32(s, 0); /* bPad */
|
||||
stream_write(s, src + 4, size - 4);
|
||||
|
||||
if (fill_size > 0)
|
||||
stream_write_zero(s, fill_size);
|
||||
|
||||
@ -390,8 +395,8 @@ static boolean rdpsnd_server_send_samples(rdpsnd_server_context* context, const
|
||||
{
|
||||
cframes = MIN(nframes, rdpsnd->out_frames - rdpsnd->out_pending_frames);
|
||||
cframesize = cframes * rdpsnd->src_bytes_per_frame;
|
||||
memcpy(rdpsnd->out_buffer + (rdpsnd->out_pending_frames * rdpsnd->src_bytes_per_frame),
|
||||
buf, cframesize);
|
||||
|
||||
memcpy(rdpsnd->out_buffer + (rdpsnd->out_pending_frames * rdpsnd->src_bytes_per_frame), buf, cframesize);
|
||||
buf = (uint8*) buf + cframesize;
|
||||
nframes -= cframes;
|
||||
rdpsnd->out_pending_frames += cframes;
|
||||
@ -466,15 +471,21 @@ void rdpsnd_server_context_free(rdpsnd_server_context* context)
|
||||
freerdp_thread_stop(rdpsnd->rdpsnd_channel_thread);
|
||||
freerdp_thread_free(rdpsnd->rdpsnd_channel_thread);
|
||||
}
|
||||
|
||||
if (rdpsnd->rdpsnd_channel)
|
||||
WTSVirtualChannelClose(rdpsnd->rdpsnd_channel);
|
||||
|
||||
if (rdpsnd->rdpsnd_pdu)
|
||||
stream_free(rdpsnd->rdpsnd_pdu);
|
||||
|
||||
if (rdpsnd->out_buffer)
|
||||
xfree(rdpsnd->out_buffer);
|
||||
|
||||
if (rdpsnd->dsp_context)
|
||||
freerdp_dsp_context_free(rdpsnd->dsp_context);
|
||||
|
||||
if (rdpsnd->context.client_formats)
|
||||
xfree(rdpsnd->context.client_formats);
|
||||
|
||||
xfree(rdpsnd);
|
||||
}
|
||||
|
@ -44,7 +44,7 @@ static void sf_peer_rdpsnd_activated(rdpsnd_server_context* context)
|
||||
printf("RDPSND Activated\n");
|
||||
}
|
||||
|
||||
void sf_peer_rdpsnd_init(testPeerContext* context)
|
||||
boolean sf_peer_rdpsnd_init(testPeerContext* context)
|
||||
{
|
||||
context->rdpsnd = rdpsnd_server_context_new(context->vcm);
|
||||
context->rdpsnd->data = context;
|
||||
@ -59,4 +59,8 @@ void sf_peer_rdpsnd_init(testPeerContext* context)
|
||||
context->rdpsnd->src_format.wBitsPerSample = 16;
|
||||
|
||||
context->rdpsnd->Activated = sf_peer_rdpsnd_activated;
|
||||
|
||||
context->rdpsnd->Initialize(context->rdpsnd);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
@ -26,7 +26,7 @@
|
||||
|
||||
#include "sfreerdp.h"
|
||||
|
||||
void sf_peer_rdpsnd_init(testPeerContext* context);
|
||||
boolean sf_peer_rdpsnd_init(testPeerContext* context);
|
||||
|
||||
#endif /* SF_RDPSND_H */
|
||||
|
||||
|
@ -482,6 +482,7 @@ boolean tf_peer_post_connect(freerdp_peer* client)
|
||||
test_peer_load_icon(client);
|
||||
|
||||
/* Iterate all channel names requested by the client and activate those supported by the server */
|
||||
|
||||
for (i = 0; i < client->settings->num_channels; i++)
|
||||
{
|
||||
if (client->settings->channels[i].joined)
|
||||
@ -498,11 +499,16 @@ boolean tf_peer_post_connect(freerdp_peer* client)
|
||||
tf_debug_channel_thread_func, context);
|
||||
}
|
||||
}
|
||||
else if (strncmp(client->settings->channels[i].name, "rdpsnd", 6) == 0)
|
||||
{
|
||||
sf_peer_rdpsnd_init(context); /* Audio Output */
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* Dynamic Virtual Channels */
|
||||
|
||||
sf_peer_audin_init(context); /* Audio Input */
|
||||
sf_peer_rdpsnd_init(context); /* Audio Output */
|
||||
|
||||
/* Return false here would stop the execution of the peer mainloop. */
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user