summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKevin Mitchell <kevmitch@gmail.com>2014-11-28 10:43:48 -0800
committerKevin Mitchell <kevmitch@gmail.com>2014-11-28 10:52:48 -0800
commit77f675a15156519b143d4057e3359e5303a3c5dd (patch)
treee76f879c8c7ee44772cdf3ce92a4aad005822883
parentb83e447e2b8aa830592dbac8293a45cc0400a806 (diff)
downloadmpv-77f675a15156519b143d4057e3359e5303a3c5dd.tar.bz2
mpv-77f675a15156519b143d4057e3359e5303a3c5dd.tar.xz
ao/wasapi: handle VistaBlob failure more gracefully
-rwxr-xr-xaudio/out/ao_wasapi.h5
-rwxr-xr-xaudio/out/ao_wasapi_utils.c22
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);