static void rdpsnd_pulse_set_format(rdpsndDevicePlugin* device, rdpsndFormat* format, int latency) { rdpsndPulsePlugin* pulse = (rdpsndPulsePlugin*)device; if (pulse->stream) { pa_threaded_mainloop_lock(pulse->mainloop); pa_stream_disconnect(pulse->stream); pa_stream_unref(pulse->stream); pulse->stream = NULL; pa_threaded_mainloop_unlock(pulse->mainloop); } rdpsnd_pulse_open(device, format, latency); }
static int rdpsnd_pulse_set_format(rdpsndDevicePlugin * devplugin, char * snd_format, int size) { struct pulse_device_data * pulse_data; pa_sample_spec sample_spec = { 0 }; int nChannels; int wBitsPerSample; int nSamplesPerSec; int wFormatTag; int nBlockAlign; pulse_data = (struct pulse_device_data *) devplugin->device_data; if (!pulse_data->context) return 1; wFormatTag = GET_UINT16(snd_format, 0); nChannels = GET_UINT16(snd_format, 2); nSamplesPerSec = GET_UINT32(snd_format, 4); nBlockAlign = GET_UINT16(snd_format, 12); wBitsPerSample = GET_UINT16(snd_format, 14); LLOGLN(0, ("rdpsnd_pulse_set_format: wFormatTag=%d nChannels=%d " "nSamplesPerSec=%d wBitsPerSample=%d nBlockAlign=%d", wFormatTag, nChannels, nSamplesPerSec, wBitsPerSample, nBlockAlign)); sample_spec.rate = nSamplesPerSec; sample_spec.channels = nChannels; switch (wFormatTag) { case 1: /* PCM */ switch (wBitsPerSample) { case 8: sample_spec.format = PA_SAMPLE_U8; break; case 16: sample_spec.format = PA_SAMPLE_S16LE; break; } break; case 6: /* A-LAW */ sample_spec.format = PA_SAMPLE_ALAW; break; case 7: /* U-LAW */ sample_spec.format = PA_SAMPLE_ULAW; break; case 0x11: /* IMA ADPCM */ sample_spec.format = PA_SAMPLE_S16LE; break; } pulse_data->sample_spec = sample_spec; pulse_data->format = wFormatTag; pulse_data->block_size = nBlockAlign; if (pulse_data->stream) { pa_threaded_mainloop_lock(pulse_data->mainloop); pa_stream_disconnect(pulse_data->stream); pa_stream_unref(pulse_data->stream); pulse_data->stream = NULL; pa_threaded_mainloop_unlock(pulse_data->mainloop); } rdpsnd_pulse_open(devplugin); return 0; }