diff --git a/src/output/plugins/wasapi/WasapiOutputPlugin.cxx b/src/output/plugins/wasapi/WasapiOutputPlugin.cxx index 19a8ddf2e..922604bef 100644 --- a/src/output/plugins/wasapi/WasapiOutputPlugin.cxx +++ b/src/output/plugins/wasapi/WasapiOutputPlugin.cxx @@ -317,63 +317,61 @@ wasapi_output_get_client(WasapiOutput &output) noexcept inline void WasapiOutputThread::Work() noexcept -{ +try { SetThreadName("Wasapi Output Worker"); FormatDebug(wasapi_output_domain, "Working thread started"); COM com; while (true) { - try { - event.Wait(); + event.Wait(); - Status current_state = status.load(); - if (current_state == Status::FINISH) { - FormatDebug(wasapi_output_domain, - "Working thread stopped"); - return; + Status current_state = status.load(); + if (current_state == Status::FINISH) { + FormatDebug(wasapi_output_domain, + "Working thread stopped"); + return; + } + + UINT32 write_in_frames = buffer_size_in_frames; + if (!is_exclusive) { + UINT32 data_in_frames = + GetCurrentPaddingFrames(client); + + if (data_in_frames >= buffer_size_in_frames) { + continue; } + write_in_frames -= data_in_frames; + } - UINT32 write_in_frames = buffer_size_in_frames; - if (!is_exclusive) { - UINT32 data_in_frames = - GetCurrentPaddingFrames(client); + BYTE *data; + DWORD mode = 0; - if (data_in_frames >= buffer_size_in_frames) { - continue; - } - write_in_frames -= data_in_frames; - } + if (HRESULT result = + render_client->GetBuffer(write_in_frames, &data); + FAILED(result)) { + throw MakeHResultError(result, "Failed to get buffer"); + } - BYTE *data; - DWORD mode = 0; + AtScopeExit(&) { + render_client->ReleaseBuffer(write_in_frames, mode); + }; - if (HRESULT result = - render_client->GetBuffer(write_in_frames, &data); - FAILED(result)) { - throw MakeHResultError(result, "Failed to get buffer"); - } - - AtScopeExit(&) { - render_client->ReleaseBuffer(write_in_frames, mode); - }; - - if (current_state == Status::PLAY) { - const UINT32 write_size = write_in_frames * frame_size; - UINT32 new_data_size = 0; - new_data_size = spsc_buffer.pop(data, write_size); - std::fill_n(data + new_data_size, - write_size - new_data_size, 0); - data_poped.Set(); - } else { - mode = AUDCLNT_BUFFERFLAGS_SILENT; - FormatDebug(wasapi_output_domain, - "Working thread paused"); - } - } catch (...) { - error.ptr = std::current_exception(); - error.occur.store(true); - error.thrown.Wait(); + if (current_state == Status::PLAY) { + const UINT32 write_size = write_in_frames * frame_size; + UINT32 new_data_size = 0; + new_data_size = spsc_buffer.pop(data, write_size); + std::fill_n(data + new_data_size, + write_size - new_data_size, 0); + data_poped.Set(); + } else { + mode = AUDCLNT_BUFFERFLAGS_SILENT; + FormatDebug(wasapi_output_domain, + "Working thread paused"); } } +} catch (...) { + error.ptr = std::current_exception(); + error.occur.store(true); + error.thrown.Wait(); } AudioOutput *