Skip to content

Commit

Permalink
Revert "wasapi: Call avrt functions directly since we only support Wi…
Browse files Browse the repository at this point in the history
…ndows 7 upwards."

Turns out this can crash sometimes, and we need to be more careful.

This reverts commit 661c653.
  • Loading branch information
padenot committed Mar 15, 2024
1 parent 5491fc8 commit 550f73b
Show file tree
Hide file tree
Showing 2 changed files with 56 additions and 3 deletions.
2 changes: 1 addition & 1 deletion CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -264,7 +264,7 @@ if(USE_WASAPI)
target_sources(cubeb PRIVATE
src/cubeb_wasapi.cpp)
target_compile_definitions(cubeb PRIVATE USE_WASAPI)
target_link_libraries(cubeb PRIVATE avrt ole32 ksuser)
target_link_libraries(cubeb PRIVATE ole32 ksuser)
endif()

check_include_files("windows.h;mmsystem.h" USE_WINMM)
Expand Down
57 changes: 55 additions & 2 deletions src/cubeb_wasapi.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -204,6 +204,10 @@ struct auto_stream_ref {
cubeb_stream * stm;
};

typedef HANDLE(WINAPI * set_mm_thread_characteristics_function)(
const char * TaskName, LPDWORD TaskIndex);
typedef BOOL(WINAPI * revert_mm_thread_characteristics_function)(HANDLE handle);

extern cubeb_ops const wasapi_ops;

static com_heap_ptr<wchar_t>
Expand Down Expand Up @@ -301,6 +305,13 @@ struct cubeb {
nullptr;
void * output_collection_changed_user_ptr = nullptr;
UINT64 performance_counter_frequency;
/* Library dynamically opened to increase the render thread priority, and
the two function pointers we need. */
HMODULE mmcss_module = nullptr;
set_mm_thread_characteristics_function set_mm_thread_characteristics =
nullptr;
revert_mm_thread_characteristics_function revert_mm_thread_characteristics =
nullptr;
};

class wasapi_endpoint_notification_client;
Expand Down Expand Up @@ -1401,7 +1412,8 @@ static unsigned int __stdcall wasapi_stream_render_loop(LPVOID stream)

/* We could consider using "Pro Audio" here for WebAudio and
maybe WebRTC. */
mmcss_handle = AvSetMmThreadCharacteristicsA("Audio", &mmcss_task_index);
mmcss_handle =
stm->context->set_mm_thread_characteristics("Audio", &mmcss_task_index);
if (!mmcss_handle) {
/* This is not fatal, but we might glitch under heavy load. */
LOG("Unable to use mmcss to bump the render thread priority: %lx",
Expand Down Expand Up @@ -1509,7 +1521,7 @@ static unsigned int __stdcall wasapi_stream_render_loop(LPVOID stream)
}

if (mmcss_handle) {
AvRevertMmThreadCharacteristics(mmcss_handle);
stm->context->revert_mm_thread_characteristics(mmcss_handle);
}

if (FAILED(hr)) {
Expand All @@ -1522,6 +1534,18 @@ static unsigned int __stdcall wasapi_stream_render_loop(LPVOID stream)
void
wasapi_destroy(cubeb * context);

HANDLE WINAPI
set_mm_thread_characteristics_noop(const char *, LPDWORD mmcss_task_index)
{
return (HANDLE)1;
}

BOOL WINAPI
revert_mm_thread_characteristics_noop(HANDLE mmcss_handle)
{
return true;
}

HRESULT
register_notification_client(cubeb_stream * stm)
{
Expand Down Expand Up @@ -1757,6 +1781,31 @@ wasapi_init(cubeb ** context, char const * context_name)
ctx->performance_counter_frequency = 0;
}

ctx->mmcss_module = LoadLibraryA("Avrt.dll");

if (ctx->mmcss_module) {
ctx->set_mm_thread_characteristics =
(set_mm_thread_characteristics_function)GetProcAddress(
ctx->mmcss_module, "AvSetMmThreadCharacteristicsA");
ctx->revert_mm_thread_characteristics =
(revert_mm_thread_characteristics_function)GetProcAddress(
ctx->mmcss_module, "AvRevertMmThreadCharacteristics");
if (!(ctx->set_mm_thread_characteristics &&
ctx->revert_mm_thread_characteristics)) {
LOG("Could not load AvSetMmThreadCharacteristics or "
"AvRevertMmThreadCharacteristics: %lx",
GetLastError());
FreeLibrary(ctx->mmcss_module);
}
} else {
// This is not a fatal error, but we might end up glitching when
// the system is under high load.
LOG("Could not load Avrt.dll");
ctx->set_mm_thread_characteristics = &set_mm_thread_characteristics_noop;
ctx->revert_mm_thread_characteristics =
&revert_mm_thread_characteristics_noop;
}

*context = ctx;

return CUBEB_OK;
Expand Down Expand Up @@ -1813,6 +1862,10 @@ wasapi_destroy(cubeb * context)
}
}

if (context->mmcss_module) {
FreeLibrary(context->mmcss_module);
}

delete context;
}

Expand Down

0 comments on commit 550f73b

Please sign in to comment.