Merge pull request #78 from glyptodon/pulseaudio-silence

GUAC-427: Avoid sending silence received from PulseAudio.
This commit is contained in:
James Muehlner 2015-09-04 13:49:47 -07:00
commit 487dc3dc46

View File

@ -29,6 +29,38 @@
#include <guacamole/client.h>
#include <pulse/pulseaudio.h>
/**
* Returns whether the given buffer contains only silence (only null bytes).
*
* @param buffer
* The audio buffer to check.
*
* @param length
* The length of the buffer to check.
*
* @return
* Non-zero if the audio buffer contains silence, zero otherwise.
*/
static int guac_pa_is_silence(const void* buffer, size_t length) {
int i;
const unsigned char* current = (const unsigned char*) buffer;
/* For each byte in buffer */
for (i = 0; i < length; i++) {
/* If current value non-zero, then not silence */
if (*(current++))
return 0;
}
/* Otherwise, the buffer contains 100% silence */
return 1;
}
static void __stream_read_callback(pa_stream* stream, size_t length,
void* data) {
@ -41,6 +73,9 @@ static void __stream_read_callback(pa_stream* stream, size_t length,
/* Read data */
pa_stream_peek(stream, &buffer, &length);
/* Avoid sending silence unless data is waiting to be flushed */
if (audio->pcm_bytes_written != 0 || !guac_pa_is_silence(buffer, length)) {
/* Write data */
guac_audio_stream_write_pcm(audio, buffer, length);
@ -53,6 +88,8 @@ static void __stream_read_callback(pa_stream* stream, size_t length,
GUAC_VNC_AUDIO_BPS);
}
}
/* Advance buffer */
pa_stream_drop(stream);