Переглянути джерело

Prevent PulseAudio driver to lock its mutex for too long

Marcelo Fernandez 7 роки тому
батько
коміт
cf4371a0ad
1 змінених файлів з 11 додано та 2 видалено
  1. 11 2
      drivers/pulseaudio/audio_driver_pulseaudio.cpp

+ 11 - 2
drivers/pulseaudio/audio_driver_pulseaudio.cpp

@@ -340,13 +340,22 @@ void AudioDriverPulseAudio::thread_func(void *p_udata) {
 						bytes = byte_size;
 					}
 
-					int ret = pa_stream_write(ad->pa_str, ptr, bytes, NULL, 0LL, PA_SEEK_RELATIVE);
+					ret = pa_stream_write(ad->pa_str, ptr, bytes, NULL, 0LL, PA_SEEK_RELATIVE);
 					if (ret >= 0) {
 						byte_size -= bytes;
 						ptr = (const char *)ptr + bytes;
 					}
 				} else {
-					pa_mainloop_iterate(ad->pa_ml, 1, NULL);
+					ret = pa_mainloop_iterate(ad->pa_ml, 0, NULL);
+					if (ret == 0) {
+						// If pa_mainloop_iterate returns 0 sleep for 1 msec to wait
+						// for the stream to be able to process more bytes
+						ad->unlock();
+
+						OS::get_singleton()->delay_usec(1000);
+
+						ad->lock();
+					}
 				}
 			}
 		}