Commit 03e5c9fa authored by Davide Beatrici's avatar Davide Beatrici Committed by Alexandre Julliard

winepulse: Move main loop logic into mmdevapi.

parent c7431990
...@@ -38,6 +38,16 @@ extern void sessions_unlock(void) DECLSPEC_HIDDEN; ...@@ -38,6 +38,16 @@ extern void sessions_unlock(void) DECLSPEC_HIDDEN;
extern struct audio_session_wrapper *session_wrapper_create(struct audio_client *client) DECLSPEC_HIDDEN; extern struct audio_session_wrapper *session_wrapper_create(struct audio_client *client) DECLSPEC_HIDDEN;
static HANDLE main_loop_thread;
void main_loop_stop(void)
{
if (main_loop_thread) {
WaitForSingleObject(main_loop_thread, INFINITE);
CloseHandle(main_loop_thread);
}
}
void set_stream_volumes(struct audio_client *This) void set_stream_volumes(struct audio_client *This)
{ {
struct set_volumes_params params; struct set_volumes_params params;
...@@ -114,6 +124,37 @@ static void dump_fmt(const WAVEFORMATEX *fmt) ...@@ -114,6 +124,37 @@ static void dump_fmt(const WAVEFORMATEX *fmt)
} }
} }
static DWORD CALLBACK main_loop_func(void *event)
{
struct main_loop_params params;
SetThreadDescription(GetCurrentThread(), L"audio_client_main");
params.event = event;
WINE_UNIX_CALL(main_loop, &params);
return 0;
}
HRESULT main_loop_start(void)
{
if (!main_loop_thread) {
HANDLE event = CreateEventW(NULL, TRUE, FALSE, NULL);
if (!(main_loop_thread = CreateThread(NULL, 0, main_loop_func, event, 0, NULL))) {
ERR("Failed to create main loop thread\n");
CloseHandle(event);
return E_FAIL;
}
SetThreadPriority(main_loop_thread, THREAD_PRIORITY_TIME_CRITICAL);
WaitForSingleObject(event, INFINITE);
CloseHandle(event);
}
return S_OK;
}
static DWORD CALLBACK timer_loop_func(void *user) static DWORD CALLBACK timer_loop_func(void *user)
{ {
struct timer_loop_params params; struct timer_loop_params params;
......
...@@ -202,6 +202,8 @@ BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved) ...@@ -202,6 +202,8 @@ BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved)
WARN("Unable to deinitialize library: %lx\n", status); WARN("Unable to deinitialize library: %lx\n", status);
} }
main_loop_stop();
if (!lpvReserved) if (!lpvReserved)
MMDevEnum_Free(); MMDevEnum_Free();
break; break;
......
...@@ -80,4 +80,6 @@ extern HRESULT SpatialAudioClient_Create(IMMDevice *device, ISpatialAudioClient ...@@ -80,4 +80,6 @@ extern HRESULT SpatialAudioClient_Create(IMMDevice *device, ISpatialAudioClient
extern HRESULT load_devices_from_reg(void) DECLSPEC_HIDDEN; extern HRESULT load_devices_from_reg(void) DECLSPEC_HIDDEN;
extern HRESULT load_driver_devices(EDataFlow flow) DECLSPEC_HIDDEN; extern HRESULT load_driver_devices(EDataFlow flow) DECLSPEC_HIDDEN;
extern void main_loop_stop(void) DECLSPEC_HIDDEN;
extern const WCHAR drv_keyW[] DECLSPEC_HIDDEN; extern const WCHAR drv_keyW[] DECLSPEC_HIDDEN;
...@@ -56,7 +56,6 @@ WINE_DEFAULT_DEBUG_CHANNEL(pulse); ...@@ -56,7 +56,6 @@ WINE_DEFAULT_DEBUG_CHANNEL(pulse);
#define NULL_PTR_ERR MAKE_HRESULT(SEVERITY_ERROR, FACILITY_WIN32, RPC_X_NULL_REF_POINTER) #define NULL_PTR_ERR MAKE_HRESULT(SEVERITY_ERROR, FACILITY_WIN32, RPC_X_NULL_REF_POINTER)
static HANDLE pulse_thread;
static struct list g_sessions = LIST_INIT(g_sessions); static struct list g_sessions = LIST_INIT(g_sessions);
static struct list g_devices_cache = LIST_INIT(g_devices_cache); static struct list g_devices_cache = LIST_INIT(g_devices_cache);
...@@ -115,11 +114,6 @@ BOOL WINAPI DllMain(HINSTANCE dll, DWORD reason, void *reserved) ...@@ -115,11 +114,6 @@ BOOL WINAPI DllMain(HINSTANCE dll, DWORD reason, void *reserved)
LIST_FOR_EACH_ENTRY_SAFE(device, device_next, &g_devices_cache, struct device_cache, entry) LIST_FOR_EACH_ENTRY_SAFE(device, device_next, &g_devices_cache, struct device_cache, entry)
free(device); free(device);
if (pulse_thread) {
WaitForSingleObject(pulse_thread, INFINITE);
CloseHandle(pulse_thread);
}
} }
return TRUE; return TRUE;
} }
...@@ -134,6 +128,8 @@ extern const IAudioClockVtbl AudioClock_Vtbl; ...@@ -134,6 +128,8 @@ extern const IAudioClockVtbl AudioClock_Vtbl;
extern const IAudioClock2Vtbl AudioClock2_Vtbl; extern const IAudioClock2Vtbl AudioClock2_Vtbl;
extern const IAudioStreamVolumeVtbl AudioStreamVolume_Vtbl; extern const IAudioStreamVolumeVtbl AudioStreamVolume_Vtbl;
extern HRESULT main_loop_start(void) DECLSPEC_HIDDEN;
extern struct audio_session_wrapper *session_wrapper_create( extern struct audio_session_wrapper *session_wrapper_create(
struct audio_client *client) DECLSPEC_HIDDEN; struct audio_client *client) DECLSPEC_HIDDEN;
...@@ -157,15 +153,6 @@ static void pulse_release_stream(stream_handle stream, HANDLE timer) ...@@ -157,15 +153,6 @@ static void pulse_release_stream(stream_handle stream, HANDLE timer)
pulse_call(release_stream, &params); pulse_call(release_stream, &params);
} }
static DWORD CALLBACK pulse_mainloop_thread(void *event)
{
struct main_loop_params params;
params.event = event;
SetThreadDescription(GetCurrentThread(), L"winepulse_mainloop");
pulse_call(main_loop, &params);
return 0;
}
typedef struct tagLANGANDCODEPAGE typedef struct tagLANGANDCODEPAGE
{ {
WORD wLanguage; WORD wLanguage;
...@@ -735,19 +722,10 @@ static HRESULT WINAPI AudioClient_Initialize(IAudioClient3 *iface, ...@@ -735,19 +722,10 @@ static HRESULT WINAPI AudioClient_Initialize(IAudioClient3 *iface,
return AUDCLNT_E_ALREADY_INITIALIZED; return AUDCLNT_E_ALREADY_INITIALIZED;
} }
if (!pulse_thread) if (FAILED(hr = main_loop_start()))
{ {
HANDLE event = CreateEventW(NULL, TRUE, FALSE, NULL); sessions_unlock();
if (!(pulse_thread = CreateThread(NULL, 0, pulse_mainloop_thread, event, 0, NULL))) return hr;
{
ERR("Failed to create mainloop thread.\n");
sessions_unlock();
CloseHandle(event);
return E_FAIL;
}
SetThreadPriority(pulse_thread, THREAD_PRIORITY_TIME_CRITICAL);
WaitForSingleObject(event, INFINITE);
CloseHandle(event);
} }
params.name = name = get_application_name(TRUE); params.name = name = get_application_name(TRUE);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment