From 9256190a9b8fb36b69bd6c73315bf09a10363204 Mon Sep 17 00:00:00 2001 From: Max Kellermann Date: Mon, 8 Mar 2021 22:14:23 +0100 Subject: [PATCH] output/wasapi: move catch block to the Work() function level If an exception has been caught, the method cannot continue playback, therefore it doesn't make sense to have the "catch" block inside the "while" block (and not break the loop after catching an exception). --- .../plugins/wasapi/WasapiOutputPlugin.cxx | 88 +++++++++---------- 1 file changed, 43 insertions(+), 45 deletions(-) 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 *