diff --git a/channels/audin/server/audin.c b/channels/audin/server/audin.c index 3f51f0a2b..ae2f2bb05 100644 --- a/channels/audin/server/audin.c +++ b/channels/audin/server/audin.c @@ -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; diff --git a/channels/rdpsnd/server/rdpsnd.c b/channels/rdpsnd/server/rdpsnd.c index 61a080a20..cfe273f0d 100644 --- a/channels/rdpsnd/server/rdpsnd.c +++ b/channels/rdpsnd/server/rdpsnd.c @@ -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,9 +395,9 @@ 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); - buf = (uint8*)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); } diff --git a/server/Sample/sf_rdpsnd.c b/server/Sample/sf_rdpsnd.c index 3508edca2..6775dd3ba 100644 --- a/server/Sample/sf_rdpsnd.c +++ b/server/Sample/sf_rdpsnd.c @@ -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; } diff --git a/server/Sample/sf_rdpsnd.h b/server/Sample/sf_rdpsnd.h index 98a3d6515..f9ebef8a5 100644 --- a/server/Sample/sf_rdpsnd.h +++ b/server/Sample/sf_rdpsnd.h @@ -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 */ diff --git a/server/Sample/sfreerdp.c b/server/Sample/sfreerdp.c index 6187face3..820c0187f 100644 --- a/server/Sample/sfreerdp.c +++ b/server/Sample/sfreerdp.c @@ -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. */