Example #1
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);

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

}
void guac_rdpsnd_wave_handler(guac_rdpsndPlugin* rdpsnd,
        wStream* input_stream, guac_rdpsnd_pdu_header* header) {

    rdpSvcPlugin* plugin = (rdpSvcPlugin*)rdpsnd;

    /* Get associated client data */
    guac_client* client = rdpsnd->client;
    guac_rdp_client* rdp_client = (guac_rdp_client*) client->data;

    /* Get audio stream from client data */
    guac_audio_stream* audio = rdp_client->audio;

    /* Wave Confirmation PDU */
    wStream* output_stream = Stream_New(NULL, 8);

    /* Get wave data */
    unsigned char* buffer = Stream_Buffer(input_stream);

    /* Copy over first four bytes */
    memcpy(buffer, rdpsnd->initial_wave_data, 4);

    /* Write rest of audio packet */
    if (audio != NULL) {
        guac_audio_stream_write_pcm(audio, buffer,
                rdpsnd->incoming_wave_size + 4);
        guac_audio_stream_flush(audio);
    }

    /* Write Wave Confirmation PDU */
    Stream_Write_UINT8(output_stream, SNDC_WAVECONFIRM);
    Stream_Write_UINT8(output_stream, 0);
    Stream_Write_UINT16(output_stream, 4);
    Stream_Write_UINT16(output_stream, rdpsnd->server_timestamp);
    Stream_Write_UINT8(output_stream, rdpsnd->waveinfo_block_number);
    Stream_Write_UINT8(output_stream, 0);

    /* Send Wave Confirmation PDU */
    pthread_mutex_lock(&(rdp_client->rdp_lock));
    svc_plugin_send(plugin, output_stream);
    pthread_mutex_unlock(&(rdp_client->rdp_lock));

    /* We no longer expect to receive wave data */
    rdpsnd->next_pdu_is_wave = FALSE;

}