Kaynağa Gözat

pulseaudio: Fix deadlock in HotplugThread.

If we wait for context subscription to finish, we might miss the signal
telling us to terminate the thread...this can happen if an app initializes
the audio subsystem and then quits immediately.

So just go right into the main loop of the thread; the subscription will
finish when it finishes and then events will flow.
Ryan C. Gordon 3 yıl önce
ebeveyn
işleme
924f370bd7
1 değiştirilmiş dosya ile 1 ekleme ve 1 silme
  1. 1 1
      src/audio/pulseaudio/SDL_pulseaudio.c

+ 1 - 1
src/audio/pulseaudio/SDL_pulseaudio.c

@@ -865,7 +865,7 @@ static int SDLCALL HotplugThread(void *data)
     SDL_SetThreadPriority(SDL_THREAD_PRIORITY_LOW);
     SDL_SetThreadPriority(SDL_THREAD_PRIORITY_LOW);
     PULSEAUDIO_pa_threaded_mainloop_lock(pulseaudio_threaded_mainloop);
     PULSEAUDIO_pa_threaded_mainloop_lock(pulseaudio_threaded_mainloop);
     PULSEAUDIO_pa_context_set_subscribe_callback(pulseaudio_context, HotplugCallback, NULL);
     PULSEAUDIO_pa_context_set_subscribe_callback(pulseaudio_context, HotplugCallback, NULL);
-    WaitForPulseOperation(PULSEAUDIO_pa_context_subscribe(pulseaudio_context, PA_SUBSCRIPTION_MASK_SINK | PA_SUBSCRIPTION_MASK_SOURCE, NULL, NULL));
+    PULSEAUDIO_pa_operation_unref(PULSEAUDIO_pa_context_subscribe(pulseaudio_context, PA_SUBSCRIPTION_MASK_SINK | PA_SUBSCRIPTION_MASK_SOURCE, NULL, NULL));
     while (SDL_AtomicGet(&pulseaudio_hotplug_thread_active)) {
     while (SDL_AtomicGet(&pulseaudio_hotplug_thread_active)) {
         PULSEAUDIO_pa_threaded_mainloop_wait(pulseaudio_threaded_mainloop);
         PULSEAUDIO_pa_threaded_mainloop_wait(pulseaudio_threaded_mainloop);