Merge pull request #24301 from marcelofg55/default_device_pulseaudio

PulseAudio driver will now change the device if the default system device changes
This commit is contained in:
Rémi Verschelde 2019-01-07 20:10:50 +01:00 committed by GitHub
commit e4b02513fe
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23

View file

@ -316,6 +316,7 @@ void AudioDriverPulseAudio::thread_func(void *p_udata) {
AudioDriverPulseAudio *ad = (AudioDriverPulseAudio *)p_udata; AudioDriverPulseAudio *ad = (AudioDriverPulseAudio *)p_udata;
unsigned int write_ofs = 0; unsigned int write_ofs = 0;
size_t avail_bytes = 0; size_t avail_bytes = 0;
uint32_t default_device_msec = OS::get_singleton()->get_ticks_msec();
while (!ad->exit_thread) { while (!ad->exit_thread) {
@ -406,6 +407,47 @@ void AudioDriverPulseAudio::thread_func(void *p_udata) {
write_ofs = 0; write_ofs = 0;
} }
// If we're using the default device check that the current device is still the default
if (ad->device_name == "Default") {
uint32_t msec = OS::get_singleton()->get_ticks_msec();
if (msec > (default_device_msec + 1000)) {
String old_default_device = ad->default_device;
default_device_msec = msec;
ad->pa_status = 0;
pa_operation *pa_op = pa_context_get_server_info(ad->pa_ctx, &AudioDriverPulseAudio::pa_server_info_cb, (void *)ad);
if (pa_op) {
while (ad->pa_status == 0) {
int ret = pa_mainloop_iterate(ad->pa_ml, 1, NULL);
if (ret < 0) {
ERR_PRINT("pa_mainloop_iterate error");
}
}
pa_operation_unref(pa_op);
} else {
ERR_PRINT("pa_context_get_server_info error");
}
if (old_default_device != ad->default_device) {
ad->finish_device();
Error err = ad->init_device();
if (err != OK) {
ERR_PRINT("PulseAudio: init_device error");
ad->active = false;
ad->exit_thread = true;
break;
}
avail_bytes = 0;
write_ofs = 0;
}
}
}
if (ad->pa_rec_str && pa_stream_get_state(ad->pa_rec_str) == PA_STREAM_READY) { if (ad->pa_rec_str && pa_stream_get_state(ad->pa_rec_str) == PA_STREAM_READY) {
size_t bytes = pa_stream_readable_size(ad->pa_rec_str); size_t bytes = pa_stream_readable_size(ad->pa_rec_str);
if (bytes > 0) { if (bytes > 0) {