GUAC-427: Avoid sending silence received from PulseAudio.
This commit is contained in:
parent
5c4c0378b3
commit
47b060d6eb
@ -29,6 +29,38 @@
|
|||||||
#include <guacamole/client.h>
|
#include <guacamole/client.h>
|
||||||
#include <pulse/pulseaudio.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;
|
||||||
|
|
||||||
|
unsigned char* current = (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,
|
static void __stream_read_callback(pa_stream* stream, size_t length,
|
||||||
void* data) {
|
void* data) {
|
||||||
|
|
||||||
@ -41,16 +73,21 @@ static void __stream_read_callback(pa_stream* stream, size_t length,
|
|||||||
/* Read data */
|
/* Read data */
|
||||||
pa_stream_peek(stream, &buffer, &length);
|
pa_stream_peek(stream, &buffer, &length);
|
||||||
|
|
||||||
/* Write data */
|
/* Avoid sending silence unless data is waiting to be flushed */
|
||||||
guac_audio_stream_write_pcm(audio, buffer, length);
|
if (audio->pcm_bytes_written != 0 || !guac_pa_is_silence(buffer, length)) {
|
||||||
|
|
||||||
|
/* Write data */
|
||||||
|
guac_audio_stream_write_pcm(audio, buffer, length);
|
||||||
|
|
||||||
|
/* Flush occasionally */
|
||||||
|
if (audio->pcm_bytes_written > GUAC_VNC_PCM_WRITE_RATE) {
|
||||||
|
guac_audio_stream_end(audio);
|
||||||
|
guac_audio_stream_begin(client_data->audio,
|
||||||
|
GUAC_VNC_AUDIO_RATE,
|
||||||
|
GUAC_VNC_AUDIO_CHANNELS,
|
||||||
|
GUAC_VNC_AUDIO_BPS);
|
||||||
|
}
|
||||||
|
|
||||||
/* Flush occasionally */
|
|
||||||
if (audio->pcm_bytes_written > GUAC_VNC_PCM_WRITE_RATE) {
|
|
||||||
guac_audio_stream_end(audio);
|
|
||||||
guac_audio_stream_begin(client_data->audio,
|
|
||||||
GUAC_VNC_AUDIO_RATE,
|
|
||||||
GUAC_VNC_AUDIO_CHANNELS,
|
|
||||||
GUAC_VNC_AUDIO_BPS);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Advance buffer */
|
/* Advance buffer */
|
||||||
|
Loading…
Reference in New Issue
Block a user