# Disables OpenAL Soft's event thread because we don't need it (we only need to render to the loopback driver), and because it causes problems on platforms with no threading support. --- a/al/event.cpp +++ b/al/event.cpp @@ -116,34 +116,34 @@ static int EventThread(ALCcontext *context) void StartEventThrd(ALCcontext *ctx) { - try { - ctx->mEventThread = std::thread{EventThread, ctx}; - } - catch(std::exception& e) { - ERR("Failed to start event thread: %s\n", e.what()); - } - catch(...) { - ERR("Failed to start event thread! Expect problems.\n"); - } + + + + + + + + + } void StopEventThrd(ALCcontext *ctx) { - RingBuffer *ring{ctx->mAsyncEvents.get()}; - auto evt_data = ring->getWriteVector().first; - if(evt_data.len == 0) - { - do { - std::this_thread::yield(); - evt_data = ring->getWriteVector().first; - } while(evt_data.len == 0); - } - al::construct_at(reinterpret_cast(evt_data.buf), AsyncEvent::KillThread); - ring->writeAdvance(1); - ctx->mEventSem.post(); - if(ctx->mEventThread.joinable()) - ctx->mEventThread.join(); + + + + + + + + + + + + + + } AL_API void AL_APIENTRY alEventControlSOFT(ALsizei count, const ALenum *types, ALboolean enable) --- a/core/context.h +++ b/core/context.h @@ -134,7 +134,7 @@ struct ContextBase { using EffectSlotArray = al::FlexArray; std::atomic mActiveAuxSlots{nullptr}; - std::thread mEventThread; + al::semaphore mEventSem; std::unique_ptr mAsyncEvents; using AsyncEventBitset = std::bitset;