summaryrefslogtreecommitdiff
path: root/src/pulse/mainloop.c
diff options
context:
space:
mode:
authorPatrick Gaskin <patrick@pgaskin.net>2021-01-03 04:01:40 -0500
committerPulseAudio Marge Bot <pulseaudio-maintainers@lists.freedesktop.org>2021-01-13 03:16:06 +0000
commit0edcf725bcb77c5a3ae0c3473b775a85dbcd0236 (patch)
tree2e36e1e1ddbabaa709a484876dda5d9e7e943dce /src/pulse/mainloop.c
parentfa0d30eee1d86f3895e45a2aec6796cb17d008ef (diff)
win32: Fix WSAStartup issues
WSAStartup was not being called for pacat and pactl built with meson, causing them to fail in pa_mainloop_new with "cannot create wakeup pipe". This issue also affects other applications linking to libpulse other than the pulseaudio daemon, which calls WSAStartup itself. When built with autotools, WSAStartup would have been called in DllMain, which is recommended against by the documentation [1]. To fix these issues, the WSAStartup/WSACleanup calls can be moved into pa_mainloop_new/pa_mainloop_free. [1] https://docs.microsoft.com/en-us/windows/win32/api/winsock/nf-winsock-wsastartup Part-of: <https://gitlab.freedesktop.org/pulseaudio/pulseaudio/-/merge_requests/456>
Diffstat (limited to 'src/pulse/mainloop.c')
-rw-r--r--src/pulse/mainloop.c21
1 files changed, 21 insertions, 0 deletions
diff --git a/src/pulse/mainloop.c b/src/pulse/mainloop.c
index 355935e09..90112f589 100644
--- a/src/pulse/mainloop.c
+++ b/src/pulse/mainloop.c
@@ -32,6 +32,10 @@
#include <pulsecore/pipe.h>
#endif
+#ifdef OS_IS_WIN32
+#include <winsock2.h>
+#endif
+
#include <pulse/rtclock.h>
#include <pulse/timeval.h>
#include <pulse/xmalloc.h>
@@ -450,6 +454,17 @@ static const pa_mainloop_api vtable = {
pa_mainloop *pa_mainloop_new(void) {
pa_mainloop *m;
+#ifdef OS_IS_WIN32
+ {
+ int r;
+ WSADATA data;
+ if ((r = WSAStartup(MAKEWORD(2, 0), &data))) {
+ pa_log_error("ERROR: cannot initialize Winsock2 (%d)", r);
+ return NULL;
+ }
+ }
+#endif
+
pa_init_i18n();
m = pa_xnew0(pa_mainloop, 1);
@@ -579,6 +594,12 @@ void pa_mainloop_free(pa_mainloop *m) {
pa_close_pipe(m->wakeup_pipe);
pa_xfree(m);
+
+#ifdef OS_IS_WIN32
+ {
+ WSACleanup();
+ }
+#endif
}
static void scan_dead(pa_mainloop *m) {