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