diff options
-rw-r--r-- | Alc/ALc.c | 5 | ||||
-rw-r--r-- | Alc/mixer.c | 2 | ||||
-rw-r--r-- | OpenAL32/Include/alMain.h | 2 | ||||
-rw-r--r-- | OpenAL32/event.c | 19 |
4 files changed, 9 insertions, 19 deletions
@@ -2613,7 +2613,7 @@ static ALvoid InitContext(ALCcontext *Context) ATOMIC_FLAG_TEST_AND_SET(&Context->PropsClean, almemory_order_relaxed); ATOMIC_INIT(&Context->DeferUpdates, AL_FALSE); almtx_init(&Context->EventThrdLock, almtx_plain); - alcnd_init(&Context->EventCnd); + alsem_init(&Context->EventSem, 0); Context->AsyncEvents = NULL; ATOMIC_INIT(&Context->EnabledEvts, 0); almtx_init(&Context->EventCbLock, almtx_plain); @@ -2753,12 +2753,13 @@ static void FreeContext(ALCcontext *context) while(ll_ringbuffer_write_space(context->AsyncEvents) == 0) althrd_yield(); ll_ringbuffer_write(context->AsyncEvents, (const char*)&kill_evt, 1); + alsem_post(&context->EventSem); althrd_join(context->EventThread, NULL); } almtx_destroy(&context->EventCbLock); almtx_destroy(&context->EventThrdLock); - alcnd_destroy(&context->EventCnd); + alsem_destroy(&context->EventSem); ll_ringbuffer_free(context->AsyncEvents); context->AsyncEvents = NULL; diff --git a/Alc/mixer.c b/Alc/mixer.c index 31e94974..c34284d5 100644 --- a/Alc/mixer.c +++ b/Alc/mixer.c @@ -754,7 +754,7 @@ ALboolean MixSource(ALvoice *voice, ALuint SourceID, ALCcontext *Context, ALsize AL_EVENT_TYPE_BUFFER_COMPLETED_SOFT, SourceID, 0, "Buffer completed" ); } while(--buffers_done > 0); - alcnd_signal(&Context->EventCnd); + alsem_post(&Context->EventSem); } return isplaying; diff --git a/OpenAL32/Include/alMain.h b/OpenAL32/Include/alMain.h index e7a95eef..bc5a27c8 100644 --- a/OpenAL32/Include/alMain.h +++ b/OpenAL32/Include/alMain.h @@ -675,7 +675,7 @@ struct ALCcontext_struct { almtx_t EventThrdLock; althrd_t EventThread; - alcnd_t EventCnd; + alsem_t EventSem; struct ll_ringbuffer *AsyncEvents; ATOMIC(ALbitfieldSOFT) EnabledEvts; almtx_t EventCbLock; diff --git a/OpenAL32/event.c b/OpenAL32/event.c index ff53d7d8..38c12d98 100644 --- a/OpenAL32/event.c +++ b/OpenAL32/event.c @@ -13,7 +13,6 @@ static int EventThread(void *arg) { ALCcontext *context = arg; - almtx_lock(&context->EventCbLock); while(1) { AsyncEvent evt; @@ -21,30 +20,19 @@ static int EventThread(void *arg) if(ll_ringbuffer_read_space(context->AsyncEvents) == 0) { - /* Wait 50ms before checking again. Because events are delivered - * asynchronously by the mixer, it's possible for one to be written - * in between checking for a readable element and sleeping. So to - * ensure events don't get left to go stale in the ringbuffer, we - * need to keep checking regardless of being signaled. - */ - struct timespec ts; - altimespec_get(&ts, AL_TIME_UTC); - ts.tv_nsec += 50000000; - ts.tv_sec += ts.tv_nsec/1000000000; - ts.tv_nsec %= 1000000000; - alcnd_timedwait(&context->EventCnd, &context->EventCbLock, &ts); + alsem_wait(&context->EventSem); continue; } ll_ringbuffer_read(context->AsyncEvents, (char*)&evt, 1); if(!evt.EnumType) break; - /* Should check the actual type is enabled here too. */ + almtx_lock(&context->EventCbLock); enabledevts = ATOMIC_LOAD(&context->EnabledEvts, almemory_order_acquire); if(context->EventCb && (enabledevts&evt.EnumType) == evt.EnumType) context->EventCb(evt.Type, evt.ObjectId, evt.Param, (ALsizei)strlen(evt.Message), evt.Message, context->EventParam); + almtx_unlock(&context->EventCbLock); } - almtx_unlock(&context->EventCbLock); return 0; } @@ -114,6 +102,7 @@ AL_API void AL_APIENTRY alEventControlSOFT(ALsizei count, const ALenum *types, A while(ll_ringbuffer_write_space(context->AsyncEvents) == 0) althrd_yield(); ll_ringbuffer_write(context->AsyncEvents, (const char*)&kill_evt, 1); + alsem_post(&context->EventSem); althrd_join(context->EventThread, NULL); } else |