예제 #1
0
void guac_pa_start_stream(guac_client* client) {

    vnc_guac_client_data* client_data = (vnc_guac_client_data*) client->data;
    pa_context* context;

    guac_client_log_info(client, "Starting audio stream");
    guac_audio_stream_begin(client_data->audio,
                GUAC_VNC_AUDIO_RATE,
                GUAC_VNC_AUDIO_CHANNELS,
                GUAC_VNC_AUDIO_BPS);

    /* Init main loop */
    client_data->pa_mainloop = pa_threaded_mainloop_new();

    /* Create context */
    context = pa_context_new(
            pa_threaded_mainloop_get_api(client_data->pa_mainloop),
            "Guacamole Audio");

    /* Set up context */
    pa_context_set_state_callback(context, __context_state_callback, client);
    pa_context_connect(context, client_data->pa_servername,
            PA_CONTEXT_NOAUTOSPAWN, NULL);

    /* Start loop */
    pa_threaded_mainloop_start(client_data->pa_mainloop);

}
예제 #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);

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

}
예제 #3
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);

}