diff --git a/protocols/vnc/include/buffer.h b/protocols/vnc/include/buffer.h index 2a95da8d..9e00206f 100644 --- a/protocols/vnc/include/buffer.h +++ b/protocols/vnc/include/buffer.h @@ -51,14 +51,14 @@ typedef struct { pthread_cond_t cond; } buffer; -void buffer_init(buffer* buf, int size_of_data); +void buffer_init(buffer* buf, int size_of_buffer, int size_of_data); void buffer_free(buffer* buf); void buffer_close(buffer* buf); -void buffer_insert(buffer* buf, void* data, int size_of_data); +void buffer_insert(buffer* buf, void* data); -void buffer_remove(buffer* buf, void* data, int size_of_data, guac_client* client); +void buffer_remove(buffer* buf, void* data); #endif diff --git a/protocols/vnc/include/queue.h b/protocols/vnc/include/queue.h index 1e1d01be..72bc98ff 100644 --- a/protocols/vnc/include/queue.h +++ b/protocols/vnc/include/queue.h @@ -1,42 +1,60 @@ /* ***** BEGIN LICENSE BLOCK ***** - * queue.c - * - * Implementation of a FIFO queue abstract data type. - * - * by: Steven Skiena - * begun: March 27, 2002 + * Version: MPL 1.1/GPL 2.0/LGPL 2.1 * - * Copyright 2003 by Steven S. Skiena; all rights reserved. - * - * Permission is granted for use in non-commerical applications - * provided this copyright notice remains intact and unchanged. - * - * Modified for the Guacamole project by: - * Craig Hokanson + * The contents of this file are subject to the Mozilla Public License Version + * 1.1 (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * Software distributed under the License is distributed on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License + * for the specific language governing rights and limitations under the + * License. + * + * The Original Code is queue. + * + * The Initial Developers of the Original Code are * Sion Chaudhuri - * Gio Perez - * + * Craig Hokanson + * + * Portions created by the Initial Developer are Copyright (C) 2013 + * the Initial Developers. All Rights Reserved. + * + * Contributor(s): + * + * Alternatively, the contents of this file may be used under the terms of + * either the GNU General Public License Version 2 or later (the "GPL"), or + * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), + * in which case the provisions of the GPL or the LGPL are applicable instead + * of those above. If you wish to allow use of your version of this file only + * under the terms of either the GPL or the LGPL, and not to allow others to + * use your version of this file under the terms of the MPL, indicate your + * decision by deleting the provisions above and replace them with the notice + * and other provisions required by the GPL or the LGPL. If you do not delete + * the provisions above, a recipient may use your version of this file under + * the terms of any one of the MPL, the GPL or the LGPL. + * * ***** END LICENSE BLOCK ***** */ #ifndef __GUAC_VNC_QUEUE_H #define __GUAC_VNC_QUEUE_H -#define QUEUESIZE 200 - typedef struct { - void* items[QUEUESIZE+1]; /* body of queue */ - int first; /* position of first element */ - int last; /* position of last element */ - int count; /* number of queue elements */ + void** elements; + int queue_size; + int element_size; + int num_elements; + int head; + int tail; } queue; -void queue_init(queue* q, int size_of_element); +void queue_init(queue* q, int queue_size, int element_size); void queue_free(queue* q); -int enqueue(queue* q, void* data, int size); +int queue_enqueue(queue* q, void* data); -int dequeue(queue* q, void* data, int size); +int queue_dequeue(queue* q, void* data); #endif diff --git a/protocols/vnc/src/buffer.c b/protocols/vnc/src/buffer.c index b833c869..fea51ab3 100644 --- a/protocols/vnc/src/buffer.c +++ b/protocols/vnc/src/buffer.c @@ -43,9 +43,9 @@ #include "buffer.h" #include "queue.h" -void buffer_init(buffer* buf, int size_of_data) { +void buffer_init(buffer* buf, int size_of_buffer, int size_of_data) { - queue_init(&(buf->data_queue), size_of_data); + queue_init(&(buf->data_queue), size_of_buffer, size_of_data); } @@ -61,26 +61,26 @@ void buffer_close(buffer* buf) { } -void buffer_insert(buffer* buf, void* data, int size_of_data) { +void buffer_insert(buffer* buf, void* data) { pthread_mutex_lock(&(buf->update_lock)); - enqueue(&(buf->data_queue), data, size_of_data); + queue_enqueue(&(buf->data_queue), data); pthread_mutex_unlock(&(buf->update_lock)); pthread_cond_signal(&(buf->cond)); } -void buffer_remove(buffer* buf, void* data, int size_of_data, guac_client* client) { - +void buffer_remove(buffer* buf, void* data) { + pthread_mutex_lock(&(buf->update_lock)); - if((buf->data_queue).count <= 0) + if((buf->data_queue).num_elements <= 0) pthread_cond_wait(&(buf->cond), &(buf->update_lock)); /* If the thread was signaled during a close, the queue might still be empty */ - if((buf->data_queue).count > 0) - dequeue(&(buf->data_queue), data, size_of_data); + if((buf->data_queue).num_elements > 0) + queue_dequeue(&(buf->data_queue), data); pthread_mutex_unlock(&(buf->update_lock)); - + } diff --git a/protocols/vnc/src/pa_handlers.c b/protocols/vnc/src/pa_handlers.c index 2f89a282..b2117114 100644 --- a/protocols/vnc/src/pa_handlers.c +++ b/protocols/vnc/src/pa_handlers.c @@ -54,7 +54,7 @@ buffer* guac_pa_buffer_alloc() { buffer* audio_buffer = malloc(sizeof(buffer)); - buffer_init(audio_buffer, sizeof(unsigned char) * BUF_DATA_SIZE); + buffer_init(audio_buffer, BUF_LENGTH * 2, sizeof(unsigned char) * BUF_DATA_SIZE); return audio_buffer; @@ -104,7 +104,7 @@ void* guac_pa_read_audio(void* data) { goto finish; } - buffer_insert(audio_buffer, (void*) buffer_data, sizeof(unsigned char) * BUF_DATA_SIZE); + buffer_insert(audio_buffer, (void*) buffer_data); } @@ -140,7 +140,7 @@ void* guac_pa_send_audio(void* data) { counter = 0; while (counter < BUF_LENGTH) { - buffer_remove(audio_buffer, (void *) buffer_data, sizeof(unsigned char) * BUF_DATA_SIZE, client); + buffer_remove(audio_buffer, (void *) buffer_data); audio_stream_write_pcm(audio, buffer_data, BUF_DATA_SIZE); counter++; diff --git a/protocols/vnc/src/queue.c b/protocols/vnc/src/queue.c index de8768e9..17b04f28 100644 --- a/protocols/vnc/src/queue.c +++ b/protocols/vnc/src/queue.c @@ -1,71 +1,99 @@ /* ***** BEGIN LICENSE BLOCK ***** - * queue.c - * - * Implementation of a FIFO queue abstract data type. - * - * by: Steven Skiena - * begun: March 27, 2002 + * Version: MPL 1.1/GPL 2.0/LGPL 2.1 * - * Copyright 2003 by Steven S. Skiena; all rights reserved. - * - * Permission is granted for use in non-commerical applications - * provided this copyright notice remains intact and unchanged. - * - * Modified for the Guacamole project by: - * Craig Hokanson + * The contents of this file are subject to the Mozilla Public License Version + * 1.1 (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * Software distributed under the License is distributed on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License + * for the specific language governing rights and limitations under the + * License. + * + * The Original Code is buffer. + * + * The Initial Developers of the Original Code are * Sion Chaudhuri - * Gio Perez - * + * Craig Hokanson + * + * Portions created by the Initial Developer are Copyright (C) 2013 + * the Initial Developers. All Rights Reserved. + * + * Contributor(s): + * + * Alternatively, the contents of this file may be used under the terms of + * either the GNU General Public License Version 2 or later (the "GPL"), or + * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), + * in which case the provisions of the GPL or the LGPL are applicable instead + * of those above. If you wish to allow use of your version of this file only + * under the terms of either the GPL or the LGPL, and not to allow others to + * use your version of this file under the terms of the MPL, indicate your + * decision by deleting the provisions above and replace them with the notice + * and other provisions required by the GPL or the LGPL. If you do not delete + * the provisions above, a recipient may use your version of this file under + * the terms of any one of the MPL, the GPL or the LGPL. + * * ***** END LICENSE BLOCK ***** */ #include #include #include "queue.h" -void queue_init(queue* q, int size_of_element) { +void queue_init(queue* q, int queue_size, int element_size) { int i; - q->first = 0; - q->last = QUEUESIZE-1; - q->count = 0; + q->queue_size = queue_size; + q->element_size = element_size; + q->head = 0; + q->tail = 0; + q->num_elements = 0; + + q->elements = malloc(sizeof(void *) * queue_size); + + for(i = 0; i < queue_size; i++) { + q->elements[i] = malloc(element_size); + } - for(i = 0; i < QUEUESIZE; i++) - q->items[i] = malloc(size_of_element); } -void queue_free(queue* q) { +void queue_free(queue* q) { int i; - for(i = 0; i < QUEUESIZE; i++) - free(q->items[i]); + for(i = 0; i < q->queue_size; i++) { + free(q->elements[i]); + } + + free(q->elements); + } - -int enqueue(queue* q, void* data, int size) { +int queue_enqueue(queue* q, void* data) { - if (q->count >= QUEUESIZE) + int capacity = q->queue_size - q->num_elements; + if (capacity <= 0) return -1; - - q->last = (q->last+1) % QUEUESIZE; - memcpy(q->items[ q->last ], data, size); - q->count = q->count + 1; + + q->tail = (q->tail + 1) % q->queue_size; + memcpy(q->elements[q->tail], data, q->element_size); + q->num_elements = q->num_elements + 1; return 0; } -int dequeue(queue* q, void* data, int size) { +int queue_dequeue(queue* q, void* data) { - if (q->count <= 0) + if (q->num_elements <= 0) return -1; - - memcpy(data, q->items[ q->first ], size); - q->first = (q->first+1) % QUEUESIZE; - q->count = q->count - 1; - + + memcpy(data, q->elements[q->head], q->element_size); + q->head = (q->head + 1) % q->queue_size; + q->num_elements = q->num_elements - 1; + return 0; }