static void __stream_read_callback(pa_stream* stream, size_t length,
        void* data) {

    guac_client* client = (guac_client*) data;
    vnc_guac_client_data* client_data = (vnc_guac_client_data*) client->data;
    guac_audio_stream* audio = client_data->audio;

    const void* buffer;

    /* Read data */
    pa_stream_peek(stream, &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);
    }

    /* Advance buffer */
    pa_stream_drop(stream);

}
Exemple #2
0
static void __stream_read_callback(pa_stream* stream, size_t length,
        void* data) {

    guac_client* client = (guac_client*) data;
    vnc_guac_client_data* client_data = (vnc_guac_client_data*) client->data;
    guac_audio_stream* audio = client_data->audio;

    const void* buffer;

    /* 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);

        /* 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);
            guac_socket_flush(client->socket);
        }

    }

    /* Advance buffer */
    pa_stream_drop(stream);

}