diff options
author | RĂ©mi Verschelde <rverschelde@gmail.com> | 2019-01-07 20:10:50 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2019-01-07 20:10:50 +0100 |
commit | e4b02513fe4e352c4ba74fc28b306e83b7014083 (patch) | |
tree | b0416c0b4d287b4140610060f73794f83e4d8558 /drivers/pulseaudio | |
parent | 270eae0a05bbcb3795bca63217d0c969c4c9a234 (diff) | |
parent | a6743414f86dbb40915668bb347b4d2c16a631b8 (diff) |
Merge pull request #24301 from marcelofg55/default_device_pulseaudio
PulseAudio driver will now change the device if the default system device changes
Diffstat (limited to 'drivers/pulseaudio')
-rw-r--r-- | drivers/pulseaudio/audio_driver_pulseaudio.cpp | 42 |
1 files changed, 42 insertions, 0 deletions
diff --git a/drivers/pulseaudio/audio_driver_pulseaudio.cpp b/drivers/pulseaudio/audio_driver_pulseaudio.cpp index c01fc71a43..0d98b7fbc0 100644 --- a/drivers/pulseaudio/audio_driver_pulseaudio.cpp +++ b/drivers/pulseaudio/audio_driver_pulseaudio.cpp @@ -316,6 +316,7 @@ void AudioDriverPulseAudio::thread_func(void *p_udata) { AudioDriverPulseAudio *ad = (AudioDriverPulseAudio *)p_udata; unsigned int write_ofs = 0; size_t avail_bytes = 0; + uint32_t default_device_msec = OS::get_singleton()->get_ticks_msec(); while (!ad->exit_thread) { @@ -406,6 +407,47 @@ void AudioDriverPulseAudio::thread_func(void *p_udata) { 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) { size_t bytes = pa_stream_readable_size(ad->pa_rec_str); if (bytes > 0) { |