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>
This commit is contained in:
Patrick Gaskin 2021-01-03 04:01:40 -05:00 committed by PulseAudio Marge Bot
parent fa0d30eee1
commit 0edcf725bc
3 changed files with 21 additions and 57 deletions

View file

@ -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) {