From 01401b5f5b4a255e7a071ae720dd8ebdba620805 Mon Sep 17 00:00:00 2001 From: Kevin Mitchell Date: Fri, 28 Nov 2014 10:43:48 -0800 Subject: ao/wasapi: handle VistaBlob failure more gracefully --- audio/out/ao_wasapi.h | 5 ++++- audio/out/ao_wasapi_utils.c | 22 +++++++++++++++++----- 2 files changed, 21 insertions(+), 6 deletions(-) diff --git a/audio/out/ao_wasapi.h b/audio/out/ao_wasapi.h index 8507ecaf0b..367aae03aa 100755 --- a/audio/out/ao_wasapi.h +++ b/audio/out/ao_wasapi.h @@ -106,7 +106,10 @@ typedef struct wasapi_state { int opt_list; char *opt_device; - /* We still need to support XP, don't use these functions directly, blob owned by main thread */ + /* Don't use these functions directly in case + they are unimplemented for some reason. + (XP shouldn't be an issue since it doesn't support wasapi, maybe wine?) + Blob is owned by the main thread */ struct { HMODULE hAvrt; HANDLE (WINAPI *pAvSetMmThreadCharacteristicsW)(LPCWSTR, LPDWORD); diff --git a/audio/out/ao_wasapi_utils.c b/audio/out/ao_wasapi_utils.c index 8a57c8660b..10b435dbe8 100755 --- a/audio/out/ao_wasapi_utils.c +++ b/audio/out/ao_wasapi_utils.c @@ -100,16 +100,25 @@ bool wasapi_fill_VistaBlob(wasapi_state *state) state->VistaBlob.hAvrt = LoadLibraryW(L"avrt.dll"); if (!state->VistaBlob.hAvrt) goto exit_label; + state->VistaBlob.pAvSetMmThreadCharacteristicsW = (HANDLE (WINAPI *)(LPCWSTR, LPDWORD)) - GetProcAddress(state->VistaBlob.hAvrt, "AvSetMmThreadCharacteristicsW"); + GetProcAddress(state->VistaBlob.hAvrt, "AvSetMmThreadCharacteristicsW"); + if (!state->VistaBlob.pAvSetMmThreadCharacteristicsW) + goto exit_label; + state->VistaBlob.pAvRevertMmThreadCharacteristics = (WINBOOL (WINAPI *)(HANDLE)) - GetProcAddress(state->VistaBlob.hAvrt, "AvRevertMmThreadCharacteristics"); + GetProcAddress(state->VistaBlob.hAvrt, "AvRevertMmThreadCharacteristics"); + if (!state->VistaBlob.pAvRevertMmThreadCharacteristics) + goto exit_label; + return true; exit_label: - if (state->VistaBlob.hAvrt) + if (state->VistaBlob.hAvrt) { FreeLibrary(state->VistaBlob.hAvrt); + state->VistaBlob.hAvrt = NULL; + } return false; } @@ -581,8 +590,11 @@ reinit: hr = init_session_display(state); EXIT_ON_ERROR(hr); - state->hTask = - state->VistaBlob.pAvSetMmThreadCharacteristicsW(L"Pro Audio", &state->taskIndex); + if (state->VistaBlob.hAvrt) { + state->hTask = + state->VistaBlob.pAvSetMmThreadCharacteristicsW(L"Pro Audio", &state->taskIndex); + } + MP_VERBOSE(state, "Format fixed. Using %lld byte buffer block size\n", (long long) state->buffer_block_size); -- cgit v1.2.3