static boolean rdpsnd_server_send_formats(rdpsnd_server* rdpsnd, STREAM* s) { uint16 i; RDPSND_PDU_INIT(s, SNDC_FORMATS); stream_write_uint32(s, 0); /* dwFlags */ stream_write_uint32(s, 0); /* dwVolume */ stream_write_uint32(s, 0); /* dwPitch */ stream_write_uint16(s, 0); /* wDGramPort */ stream_write_uint16(s, rdpsnd->context.num_server_formats); /* wNumberOfFormats */ stream_write_uint8(s, rdpsnd->context.block_no); /* cLastBlockConfirmed */ stream_write_uint16(s, 0x06); /* wVersion */ stream_write_uint8(s, 0); /* bPad */ for (i = 0; i < rdpsnd->context.num_server_formats; i++) { stream_write_uint16(s, rdpsnd->context.server_formats[i].wFormatTag); /* wFormatTag (WAVE_FORMAT_PCM) */ stream_write_uint16(s, rdpsnd->context.server_formats[i].nChannels); /* nChannels */ stream_write_uint32(s, rdpsnd->context.server_formats[i].nSamplesPerSec); /* nSamplesPerSec */ stream_write_uint32(s, rdpsnd->context.server_formats[i].nSamplesPerSec * rdpsnd->context.server_formats[i].nChannels * rdpsnd->context.server_formats[i].wBitsPerSample / 8); /* nAvgBytesPerSec */ stream_write_uint16(s, rdpsnd->context.server_formats[i].nBlockAlign); /* nBlockAlign */ stream_write_uint16(s, rdpsnd->context.server_formats[i].wBitsPerSample); /* wBitsPerSample */ stream_write_uint16(s, rdpsnd->context.server_formats[i].cbSize); /* cbSize */ if (rdpsnd->context.server_formats[i].cbSize > 0) { stream_write(s, rdpsnd->context.server_formats[i].data, rdpsnd->context.server_formats[i].cbSize); } } RDPSND_PDU_FINISH(s); }
static BOOL rdpsnd_server_set_volume(rdpsnd_server_context* context, int left, int right) { rdpsnd_server* rdpsnd = (rdpsnd_server*) context; STREAM* s = rdpsnd->rdpsnd_pdu; RDPSND_PDU_INIT(s, SNDC_SETVOLUME); stream_write_UINT16(s, left); stream_write_UINT16(s, right); RDPSND_PDU_FINISH(s); }
static BOOL rdpsnd_server_close(rdpsnd_server_context* context) { rdpsnd_server* rdpsnd = (rdpsnd_server*) context; STREAM* s = rdpsnd->rdpsnd_pdu; if (rdpsnd->context.selected_client_format < 0) return FALSE; if (rdpsnd->out_pending_frames > 0) { if (!rdpsnd_server_send_audio_pdu(rdpsnd)) return FALSE; } rdpsnd->context.selected_client_format = -1; RDPSND_PDU_INIT(s, SNDC_CLOSE); RDPSND_PDU_FINISH(s); }