Skip to content

Commit

Permalink
store all driver HANDLEs in a single array and incremented the wait t…
Browse files Browse the repository at this point in the history
…imeout for the start event to 1000 ms
  • Loading branch information
pedrolcl committed Apr 13, 2021
1 parent 1d984f0 commit 81c139c
Showing 1 changed file with 37 additions and 22 deletions.
59 changes: 37 additions & 22 deletions src/drivers/fluid_wasapi.c
Original file line number Diff line number Diff line change
Expand Up @@ -102,6 +102,13 @@ static const IID _IID_IAudioRenderClient =

#define FLUID_WASAPI_MAX_OUTPUTS 1

/* Please do not change the order of the HANDLE array */
#define FLUID_WASAPI_START 0
#define FLUID_WASAPI_THREAD 1
#define FLUID_WASAPI_QUIT 2
#define FLUID_WASAPI_LAST_HANDLE FLUID_WASAPI_QUIT
#define FLUID_WASAPI_MAX_HANDLES FLUID_WASAPI_LAST_HANDLE + 1

typedef void(*fluid_wasapi_devenum_callback_t)(IMMDevice *, void *);

static DWORD WINAPI fluid_wasapi_audio_run(void *p);
Expand Down Expand Up @@ -135,10 +142,8 @@ typedef struct
int channels_count;
int float_samples;

HANDLE start_ev;
HANDLE thread;
DWORD thread_id;
HANDLE quit_ev;
HANDLE handles[FLUID_WASAPI_MAX_HANDLES];

IAudioClient *aucl;
IAudioRenderClient *arcl;
Expand All @@ -163,6 +168,7 @@ fluid_audio_driver_t *new_fluid_wasapi_audio_driver(fluid_settings_t *settings,

fluid_audio_driver_t *new_fluid_wasapi_audio_driver2(fluid_settings_t *settings, fluid_audio_func_t func, void *data)
{
DWORD ret = 0;
fluid_wasapi_audio_driver_t *dev = NULL;
OSVERSIONINFOEXW vi = {sizeof(vi), 6, 0, 0, 0, {0}, 0, 0, 0, 0, 0};

Expand Down Expand Up @@ -225,32 +231,41 @@ fluid_audio_driver_t *new_fluid_wasapi_audio_driver2(fluid_settings_t *settings,
dev->buffer_duration_reftime = (fluid_long_long_t)(dev->buffer_duration * 1e7 + .5);
dev->periods_reftime = (fluid_long_long_t)( dev->period_size / dev->sample_rate * 1e7 + .5);

dev->quit_ev = CreateEvent(NULL, FALSE, FALSE, NULL);
dev->handles[FLUID_WASAPI_QUIT] = CreateEvent(NULL, FALSE, FALSE, NULL);

if(dev->quit_ev == NULL)
if(dev->handles[FLUID_WASAPI_QUIT] == NULL)
{
FLUID_LOG(FLUID_ERR, "wasapi: failed to create quit event.");
goto cleanup;
}

dev->start_ev = CreateEvent(NULL, FALSE, FALSE, NULL);
dev->handles[FLUID_WASAPI_START] = CreateEvent(NULL, FALSE, FALSE, NULL);

if(dev->start_ev == NULL)
if(dev->handles[FLUID_WASAPI_START] == NULL)
{
FLUID_LOG(FLUID_ERR, "wasapi: failed to create start event.");
goto cleanup;
}

dev->thread = CreateThread(NULL, 0, fluid_wasapi_audio_run, (void *)dev, 0, &dev->thread_id);
dev->handles[FLUID_WASAPI_THREAD] = CreateThread(NULL, 0, fluid_wasapi_audio_run, (void *)dev, 0, &dev->thread_id);

if(dev->thread == NULL)
if(dev->handles[FLUID_WASAPI_THREAD] == NULL)
{
FLUID_LOG(FLUID_ERR, "wasapi: failed to create audio thread.");
goto cleanup;
}

if (WaitForMultipleObjects(2, &dev->start_ev, FALSE, 200) == WAIT_OBJECT_0) {
return &dev->driver;
ret = WaitForMultipleObjects(2, (HANDLE *)&dev->handles, FALSE, 1000);
switch (ret) {
case WAIT_OBJECT_0:
return &dev->driver;

case WAIT_TIMEOUT:
FLUID_LOG(FLUID_WARN, "wasapi: initialization timeout!");
break;

default:
break;
}

cleanup:
Expand All @@ -266,27 +281,27 @@ void delete_fluid_wasapi_audio_driver(fluid_audio_driver_t *p)

fluid_return_if_fail(dev != NULL);

if(dev->thread != NULL)
if(dev->handles[FLUID_WASAPI_THREAD] != NULL)
{
SetEvent(dev->quit_ev);
SetEvent(dev->handles[FLUID_WASAPI_QUIT]);

if(WaitForSingleObject(dev->thread, 2000) != WAIT_OBJECT_0)
if(WaitForSingleObject(dev->handles[FLUID_WASAPI_THREAD], 2000) != WAIT_OBJECT_0)
{
FLUID_LOG(FLUID_WARN, "wasapi: couldn't join the audio thread. killing it.");
TerminateThread(dev->thread, 0);
TerminateThread(dev->handles[FLUID_WASAPI_THREAD], 0);
}

CloseHandle(dev->thread);
CloseHandle(dev->handles[FLUID_WASAPI_THREAD]);
}

if(dev->quit_ev != NULL)
if(dev->handles[FLUID_WASAPI_QUIT] != NULL)
{
CloseHandle(dev->quit_ev);
CloseHandle(dev->handles[FLUID_WASAPI_QUIT]);
}

if(dev->start_ev != NULL)
if(dev->handles[FLUID_WASAPI_START] != NULL)
{
CloseHandle(dev->start_ev);
CloseHandle(dev->handles[FLUID_WASAPI_START]);
}

if(dev->drybuf)
Expand Down Expand Up @@ -512,7 +527,7 @@ static DWORD WINAPI fluid_wasapi_audio_run(void *p)
}

/* Signal the success of the driver initialization */
SetEvent(dev->start_ev);
SetEvent(dev->handles[FLUID_WASAPI_START]);

for(;;)
{
Expand Down Expand Up @@ -553,7 +568,7 @@ static DWORD WINAPI fluid_wasapi_audio_run(void *p)
goto cleanup;
}

if(WaitForSingleObject(dev->quit_ev, time_to_sleep) == WAIT_OBJECT_0)
if(WaitForSingleObject(dev->handles[FLUID_WASAPI_QUIT], time_to_sleep) == WAIT_OBJECT_0)
{
break;
}
Expand Down

0 comments on commit 81c139c

Please sign in to comment.