Browse Source

Merge pull request #24301 from marcelofg55/default_device_pulseaudio

PulseAudio driver will now change the device if the default system device changes
Rémi Verschelde 6 years ago
parent
commit
e4b02513fe
1 changed files with 42 additions and 0 deletions
  1. 42 0
      drivers/pulseaudio/audio_driver_pulseaudio.cpp

+ 42 - 0
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) {