From 533a47f06da3559ab66161fe8af8f431add167f0 Mon Sep 17 00:00:00 2001 From: Michael Jumper Date: Wed, 11 May 2016 13:48:40 -0700 Subject: [PATCH] GUACAMOLE-25: Store input and output audio format. --- src/protocols/rdp/audio_input.c | 27 +++++----- src/protocols/rdp/audio_input.h | 69 +++++++++++++++++++++++-- src/protocols/rdp/guac_ai/ai_messages.c | 2 +- 3 files changed, 82 insertions(+), 16 deletions(-) diff --git a/src/protocols/rdp/audio_input.c b/src/protocols/rdp/audio_input.c index b7f605d7..b2f61bdb 100644 --- a/src/protocols/rdp/audio_input.c +++ b/src/protocols/rdp/audio_input.c @@ -118,7 +118,7 @@ static int guac_rdp_audio_parse_mimetype(const char* mimetype, } while (mimetype != NULL); /* Mimetype is invalid if rate was not specified */ - if (rate == -1) + if (parsed_rate == -1) return 1; /* Parse success */ @@ -142,25 +142,20 @@ int guac_rdp_audio_handler(guac_user* user, guac_stream* stream, /* Parse mimetype, abort on parse error */ if (guac_rdp_audio_parse_mimetype(mimetype, &rate, &channels, &bps)) { - guac_user_log(user, GUAC_LOG_WARN, "Denying user audio stream with " + guac_user_log(user, GUAC_LOG_WARNING, "Denying user audio stream with " "unsupported mimetype: \"%s\"", mimetype); guac_protocol_send_ack(user->socket, stream, "Unsupported audio " "mimetype", GUAC_PROTOCOL_STATUS_CLIENT_BAD_TYPE); return 0; } - /* FIXME: Assuming mimetype of "audio/L16;rate=44100,channels=2" */ - else { - guac_user_log(user, GUAC_LOG_DEBUG, "rate=%i, channels=%i, bps=%i", - rate, channels, bps); - } - /* Init stream data */ stream->blob_handler = guac_rdp_audio_blob_handler; stream->end_handler = guac_rdp_audio_end_handler; /* Associate stream with audio buffer */ - guac_rdp_audio_buffer_set_stream(rdp_client->audio_input, user, stream); + guac_rdp_audio_buffer_set_stream(rdp_client->audio_input, user, stream, + rate, channels, bps); return 0; @@ -240,13 +235,16 @@ static void guac_rdp_audio_buffer_ack(guac_rdp_audio_buffer* audio_buffer, } void guac_rdp_audio_buffer_set_stream(guac_rdp_audio_buffer* audio_buffer, - guac_user* user, guac_stream* stream) { + guac_user* user, guac_stream* stream, int rate, int channels, int bps) { pthread_mutex_lock(&(audio_buffer->lock)); /* Associate received stream */ audio_buffer->user = user; audio_buffer->stream = stream; + audio_buffer->in_rate = rate; + audio_buffer->in_channels = channels; + audio_buffer->in_bps = bps; /* Acknowledge stream creation (if buffer is ready to receive) */ guac_rdp_audio_buffer_ack(audio_buffer, @@ -257,13 +255,16 @@ void guac_rdp_audio_buffer_set_stream(guac_rdp_audio_buffer* audio_buffer, } void guac_rdp_audio_buffer_begin(guac_rdp_audio_buffer* audio_buffer, - int packet_size, guac_rdp_audio_buffer_flush_handler* flush_handler, - void* data) { + int rate, int channels, int bps, int packet_size, + guac_rdp_audio_buffer_flush_handler* flush_handler, void* data) { pthread_mutex_lock(&(audio_buffer->lock)); /* Reset buffer state to provided values */ audio_buffer->bytes_written = 0; + audio_buffer->out_rate = rate; + audio_buffer->out_channels = channels; + audio_buffer->out_bps = bps; audio_buffer->packet_size = packet_size; audio_buffer->flush_handler = flush_handler; audio_buffer->data = data; @@ -285,6 +286,8 @@ void guac_rdp_audio_buffer_write(guac_rdp_audio_buffer* audio_buffer, pthread_mutex_lock(&(audio_buffer->lock)); + /* FIXME: Assuming mimetype of "audio/L16;rate=44100,channels=2" */ + /* Ignore packet if there is no buffer */ if (audio_buffer->packet_size == 0 || audio_buffer->packet == NULL) { pthread_mutex_unlock(&(audio_buffer->lock)); diff --git a/src/protocols/rdp/audio_input.h b/src/protocols/rdp/audio_input.h index e13b41e6..2514b508 100644 --- a/src/protocols/rdp/audio_input.h +++ b/src/protocols/rdp/audio_input.h @@ -73,6 +73,45 @@ typedef struct guac_rdp_audio_buffer { */ guac_stream* stream; + /** + * The rate of the audio stream being received from the user, if any, in + * samples per second. If no stream is yet associated, this value is + * undefined. + */ + int in_rate; + + /** + * The number of channels included in the audio stream being received from + * the user, if any. If no stream is yet associated, this value is + * undefined. + */ + int in_channels; + + /** + * The size of each sample within the audio stream being received from the + * user, if any, in bytes. If no stream is yet associated, this value is + * undefined. + */ + int in_bps; + + /** + * The rate of the audio stream expected by RDP, if any, in samples per + * second. If no stream is yet associated, this value is undefined. + */ + int out_rate; + + /** + * The number of channels included in the audio stream expected by RDP, if + * any. If no stream is yet associated, this value is undefined. + */ + int out_channels; + + /** + * The size of each sample within the audio stream expected by RDP, if any, + * in bytes. If no stream is yet associated, this value is undefined. + */ + int out_bps; + /** * The size that each audio packet must be, in bytes. The packet buffer * within this structure will be at least this size. @@ -127,9 +166,21 @@ guac_rdp_audio_buffer* guac_rdp_audio_buffer_alloc(); * * @param stream * The guac_stream object representing the audio stream. + * + * @param rate + * The rate of the audio stream being received from the user, if any, in + * samples per second. + * + * @param channels + * The number of channels included in the audio stream being received from + * the user, if any. + * + * @param bps + * The size of each sample within the audio stream being received from the + * user, if any, in bytes. */ void guac_rdp_audio_buffer_set_stream(guac_rdp_audio_buffer* audio_buffer, - guac_user* user, guac_stream* stream); + guac_user* user, guac_stream* stream, int rate, int channels, int bps); /** * Begins handling of audio data received via guac_rdp_audio_buffer_write() and @@ -140,6 +191,18 @@ void guac_rdp_audio_buffer_set_stream(guac_rdp_audio_buffer* audio_buffer, * @param audio_buffer * The audio buffer to begin. * + * @param rate + * The rate of the audio stream expected by RDP, if any, in samples per + * second. + * + * @param channels + * The number of channels included in the audio stream expected by RDP, if + * any. + * + * @param bps + * The size of each sample within the audio stream expected by RDP, if any, + * in bytes. + * * @param packet_size * The number of bytes to include in all audio packets provided to the * given flush_handler. @@ -152,8 +215,8 @@ void guac_rdp_audio_buffer_set_stream(guac_rdp_audio_buffer* audio_buffer, * needs to be flushed. */ void guac_rdp_audio_buffer_begin(guac_rdp_audio_buffer* audio_buffer, - int packet_size, guac_rdp_audio_buffer_flush_handler* flush_handler, - void* data); + int rate, int channels, int bps, int packet_size, + guac_rdp_audio_buffer_flush_handler* flush_handler, void* data); /** * Writes the given buffer of audio data to the given audio buffer. A new diff --git a/src/protocols/rdp/guac_ai/ai_messages.c b/src/protocols/rdp/guac_ai/ai_messages.c index b0eb6cfc..520416cd 100644 --- a/src/protocols/rdp/guac_ai/ai_messages.c +++ b/src/protocols/rdp/guac_ai/ai_messages.c @@ -312,7 +312,7 @@ void guac_rdp_ai_process_open(guac_client* client, /* FIXME: Assuming mimetype of 16-bit 44100 Hz stereo PCM */ guac_rdp_audio_buffer_begin(audio_buffer, packet_frames * 2 * 2, - guac_rdp_ai_flush_packet, channel); + 44100, 2, 2, guac_rdp_ai_flush_packet, channel); }