From 31a4547187126464d2774c13452f5c50e6923417 Mon Sep 17 00:00:00 2001 From: wm4 Date: Mon, 11 Jan 2016 14:39:19 +0100 Subject: ao_wasapi: move out some utility functions Note that hresult_to_str() (coming from wasapi_explain_err()) is mostly wasapi-specific, but since HRESULT error codes are unique, it can be extended for any other use. --- audio/out/ao_wasapi.h | 6 +-- audio/out/ao_wasapi_utils.c | 71 --------------------------------- osdep/windows_utils.c | 97 +++++++++++++++++++++++++++++++++++++++++++++ osdep/windows_utils.h | 29 ++++++++++++++ wscript_build.py | 1 + 5 files changed, 128 insertions(+), 76 deletions(-) create mode 100644 osdep/windows_utils.c create mode 100644 osdep/windows_utils.h diff --git a/audio/out/ao_wasapi.h b/audio/out/ao_wasapi.h index cc7f0f6e8b..5ba2aa325c 100644 --- a/audio/out/ao_wasapi.h +++ b/audio/out/ao_wasapi.h @@ -30,6 +30,7 @@ #include "common/msg.h" #include "osdep/atomics.h" +#include "osdep/windows_utils.h" #include "internal.h" #include "ao.h" @@ -114,13 +115,8 @@ typedef struct wasapi_state { change_notify change; } wasapi_state; -char *mp_GUID_to_str_buf(char *buf, size_t buf_size, const GUID *guid); char *mp_PKEY_to_str_buf(char *buf, size_t buf_size, const PROPERTYKEY *pkey); -char *mp_HRESULT_to_str_buf(char *buf, size_t buf_size, HRESULT hr); -#define mp_GUID_to_str(guid) mp_GUID_to_str_buf((char[40]){0}, 40, (guid)) #define mp_PKEY_to_str(pkey) mp_PKEY_to_str_buf((char[42]){0}, 42, (pkey)) -#define mp_HRESULT_to_str(hr) mp_HRESULT_to_str_buf((char[60]){0}, 60, (hr)) -#define mp_LastError_to_str() mp_HRESULT_to_str(HRESULT_FROM_WIN32(GetLastError())) void wasapi_list_devs(struct ao *ao, struct ao_device_list *list); LPWSTR find_deviceID(struct ao *ao); diff --git a/audio/out/ao_wasapi_utils.c b/audio/out/ao_wasapi_utils.c index f02650a36b..d29c6bed7d 100644 --- a/audio/out/ao_wasapi_utils.c +++ b/audio/out/ao_wasapi_utils.c @@ -104,18 +104,6 @@ static int special_subtype_to_format(const GUID *subtype) { return 0; } -char *mp_GUID_to_str_buf(char *buf, size_t buf_size, const GUID *guid) -{ - snprintf(buf, buf_size, - "{%8.8x-%4.4x-%4.4x-%2.2x%2.2x-%2.2x%2.2x%2.2x%2.2x%2.2x%2.2x}", - (unsigned) guid->Data1, guid->Data2, guid->Data3, - guid->Data4[0], guid->Data4[1], - guid->Data4[2], guid->Data4[3], - guid->Data4[4], guid->Data4[5], - guid->Data4[6], guid->Data4[7]); - return buf; -} - char *mp_PKEY_to_str_buf(char *buf, size_t buf_size, const PROPERTYKEY *pkey) { buf = mp_GUID_to_str_buf(buf, buf_size, &pkey->fmtid); @@ -125,65 +113,6 @@ char *mp_PKEY_to_str_buf(char *buf, size_t buf_size, const PROPERTYKEY *pkey) return buf; } -static char *wasapi_explain_err(const HRESULT hr) -{ -#define E(x) case x : return # x ; - switch (hr) { - E(S_OK) - E(S_FALSE) - E(E_FAIL) - E(E_OUTOFMEMORY) - E(E_POINTER) - E(E_HANDLE) - E(E_NOTIMPL) - E(E_INVALIDARG) - E(E_PROP_ID_UNSUPPORTED) - E(E_NOINTERFACE) - E(REGDB_E_IIDNOTREG) - E(CO_E_NOTINITIALIZED) - E(AUDCLNT_E_NOT_INITIALIZED) - E(AUDCLNT_E_ALREADY_INITIALIZED) - E(AUDCLNT_E_WRONG_ENDPOINT_TYPE) - E(AUDCLNT_E_DEVICE_INVALIDATED) - E(AUDCLNT_E_NOT_STOPPED) - E(AUDCLNT_E_BUFFER_TOO_LARGE) - E(AUDCLNT_E_OUT_OF_ORDER) - E(AUDCLNT_E_UNSUPPORTED_FORMAT) - E(AUDCLNT_E_INVALID_SIZE) - E(AUDCLNT_E_DEVICE_IN_USE) - E(AUDCLNT_E_BUFFER_OPERATION_PENDING) - E(AUDCLNT_E_THREAD_NOT_REGISTERED) - E(AUDCLNT_E_EXCLUSIVE_MODE_NOT_ALLOWED) - E(AUDCLNT_E_ENDPOINT_CREATE_FAILED) - E(AUDCLNT_E_SERVICE_NOT_RUNNING) - E(AUDCLNT_E_EVENTHANDLE_NOT_EXPECTED) - E(AUDCLNT_E_EXCLUSIVE_MODE_ONLY) - E(AUDCLNT_E_BUFDURATION_PERIOD_NOT_EQUAL) - E(AUDCLNT_E_EVENTHANDLE_NOT_SET) - E(AUDCLNT_E_INCORRECT_BUFFER_SIZE) - E(AUDCLNT_E_BUFFER_SIZE_ERROR) - E(AUDCLNT_E_CPUUSAGE_EXCEEDED) - E(AUDCLNT_E_BUFFER_ERROR) - E(AUDCLNT_E_BUFFER_SIZE_NOT_ALIGNED) - E(AUDCLNT_E_INVALID_DEVICE_PERIOD) - E(AUDCLNT_E_INVALID_STREAM_FLAG) - E(AUDCLNT_E_ENDPOINT_OFFLOAD_NOT_CAPABLE) - E(AUDCLNT_E_RESOURCES_INVALIDATED) - E(AUDCLNT_S_BUFFER_EMPTY) - E(AUDCLNT_S_THREAD_ALREADY_REGISTERED) - E(AUDCLNT_S_POSITION_STALLED) - default: - return ""; - } -#undef E -} - -char *mp_HRESULT_to_str_buf(char *buf, size_t buf_size, HRESULT hr) -{ - snprintf(buf, buf_size, "%s (0x%"PRIx32")", - wasapi_explain_err(hr), (uint32_t) hr); - return buf; -} static void update_waveformat_datarate(WAVEFORMATEXTENSIBLE *wformat) { WAVEFORMATEX *wf = &wformat->Format; diff --git a/osdep/windows_utils.c b/osdep/windows_utils.c new file mode 100644 index 0000000000..ee80a18ef4 --- /dev/null +++ b/osdep/windows_utils.c @@ -0,0 +1,97 @@ +/* + * This file is part of mpv. + * + * mpv is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * mpv is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with mpv. If not, see . + */ + +#include +#include + +#include +#include +#include + +#include "windows_utils.h" + +char *mp_GUID_to_str_buf(char *buf, size_t buf_size, const GUID *guid) +{ + snprintf(buf, buf_size, + "{%8.8x-%4.4x-%4.4x-%2.2x%2.2x-%2.2x%2.2x%2.2x%2.2x%2.2x%2.2x}", + (unsigned) guid->Data1, guid->Data2, guid->Data3, + guid->Data4[0], guid->Data4[1], + guid->Data4[2], guid->Data4[3], + guid->Data4[4], guid->Data4[5], + guid->Data4[6], guid->Data4[7]); + return buf; +} + +static char *hresult_to_str(const HRESULT hr) +{ +#define E(x) case x : return # x ; + switch (hr) { + E(S_OK) + E(S_FALSE) + E(E_FAIL) + E(E_OUTOFMEMORY) + E(E_POINTER) + E(E_HANDLE) + E(E_NOTIMPL) + E(E_INVALIDARG) + E(E_PROP_ID_UNSUPPORTED) + E(E_NOINTERFACE) + E(REGDB_E_IIDNOTREG) + E(CO_E_NOTINITIALIZED) + E(AUDCLNT_E_NOT_INITIALIZED) + E(AUDCLNT_E_ALREADY_INITIALIZED) + E(AUDCLNT_E_WRONG_ENDPOINT_TYPE) + E(AUDCLNT_E_DEVICE_INVALIDATED) + E(AUDCLNT_E_NOT_STOPPED) + E(AUDCLNT_E_BUFFER_TOO_LARGE) + E(AUDCLNT_E_OUT_OF_ORDER) + E(AUDCLNT_E_UNSUPPORTED_FORMAT) + E(AUDCLNT_E_INVALID_SIZE) + E(AUDCLNT_E_DEVICE_IN_USE) + E(AUDCLNT_E_BUFFER_OPERATION_PENDING) + E(AUDCLNT_E_THREAD_NOT_REGISTERED) + E(AUDCLNT_E_EXCLUSIVE_MODE_NOT_ALLOWED) + E(AUDCLNT_E_ENDPOINT_CREATE_FAILED) + E(AUDCLNT_E_SERVICE_NOT_RUNNING) + E(AUDCLNT_E_EVENTHANDLE_NOT_EXPECTED) + E(AUDCLNT_E_EXCLUSIVE_MODE_ONLY) + E(AUDCLNT_E_BUFDURATION_PERIOD_NOT_EQUAL) + E(AUDCLNT_E_EVENTHANDLE_NOT_SET) + E(AUDCLNT_E_INCORRECT_BUFFER_SIZE) + E(AUDCLNT_E_BUFFER_SIZE_ERROR) + E(AUDCLNT_E_CPUUSAGE_EXCEEDED) + E(AUDCLNT_E_BUFFER_ERROR) + E(AUDCLNT_E_BUFFER_SIZE_NOT_ALIGNED) + E(AUDCLNT_E_INVALID_DEVICE_PERIOD) + E(AUDCLNT_E_INVALID_STREAM_FLAG) + E(AUDCLNT_E_ENDPOINT_OFFLOAD_NOT_CAPABLE) + E(AUDCLNT_E_RESOURCES_INVALIDATED) + E(AUDCLNT_S_BUFFER_EMPTY) + E(AUDCLNT_S_THREAD_ALREADY_REGISTERED) + E(AUDCLNT_S_POSITION_STALLED) + default: + return ""; + } +#undef E +} + +char *mp_HRESULT_to_str_buf(char *buf, size_t buf_size, HRESULT hr) +{ + snprintf(buf, buf_size, "%s (0x%"PRIx32")", + hresult_to_str(hr), (uint32_t) hr); + return buf; +} diff --git a/osdep/windows_utils.h b/osdep/windows_utils.h new file mode 100644 index 0000000000..851eb1b4e3 --- /dev/null +++ b/osdep/windows_utils.h @@ -0,0 +1,29 @@ +/* + * This file is part of mpv. + * + * mpv is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * mpv is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with mpv. If not, see . + */ + +#ifndef MP_WINDOWS_UTILS_H_ +#define MP_WINDOWS_UTILS_H_ + +#include + +char *mp_GUID_to_str_buf(char *buf, size_t buf_size, const GUID *guid); +#define mp_GUID_to_str(guid) mp_GUID_to_str_buf((char[40]){0}, 40, (guid)) +char *mp_HRESULT_to_str_buf(char *buf, size_t buf_size, HRESULT hr); +#define mp_HRESULT_to_str(hr) mp_HRESULT_to_str_buf((char[60]){0}, 60, (hr)) +#define mp_LastError_to_str() mp_HRESULT_to_str(HRESULT_FROM_WIN32(GetLastError())) + +#endif diff --git a/wscript_build.py b/wscript_build.py index 6c7a9f01dc..f0e7504e07 100644 --- a/wscript_build.py +++ b/wscript_build.py @@ -392,6 +392,7 @@ def build(ctx): ( "osdep/glob-win.c", "glob-win32-replacement" ), ( "osdep/w32_keyboard.c", "os-win32" ), ( "osdep/w32_keyboard.c", "os-cygwin" ), + ( "osdep/windows_utils.c", "win32" ), ( "osdep/mpv.rc", "win32-executable" ), ( "osdep/win32/pthread.c", "win32-internal-pthreads"), -- cgit v1.2.3