diff options
-rw-r--r-- | router/alc.cpp | 72 |
1 files changed, 34 insertions, 38 deletions
diff --git a/router/alc.cpp b/router/alc.cpp index 1a8538b8..92fe69f7 100644 --- a/router/alc.cpp +++ b/router/alc.cpp @@ -249,7 +249,7 @@ static const ALCint alcMajorVersion = 1; static const ALCint alcMinorVersion = 1; -static std::mutex EnumerationLock; +static std::recursive_mutex EnumerationLock; static std::mutex ContextSwitchLock; static std::atomic<ALCenum> LastError{ALC_NO_ERROR}; @@ -325,7 +325,8 @@ ALC_API ALCdevice* ALC_APIENTRY alcOpenDevice(const ALCchar *devicename) devicename = nullptr; if(devicename) { - { std::lock_guard<std::mutex> _{EnumerationLock}; + { + std::lock_guard<std::recursive_mutex> _{EnumerationLock}; if(DevicesList.Names.empty()) (void)alcGetString(nullptr, ALC_DEVICE_SPECIFIER); idx = GetDriverIndexForName(&DevicesList, devicename); @@ -623,18 +624,18 @@ ALC_API const ALCchar* ALC_APIENTRY alcGetString(ALCdevice *device, ALCenum para return alcExtensionList; case ALC_DEVICE_SPECIFIER: - { std::lock_guard<std::mutex> _{EnumerationLock}; + { + std::lock_guard<std::recursive_mutex> _{EnumerationLock}; DevicesList.clear(); - ALint idx = 0; + ALint idx{0}; for(const auto &drv : DriverList) { /* Only enumerate names from drivers that support it. */ - if(drv.ALCVer >= MAKE_ALC_VER(1, 1) || - drv.alcIsExtensionPresent(nullptr, "ALC_ENUMERATION_EXT")) + if(drv.ALCVer >= MAKE_ALC_VER(1, 1) + || drv.alcIsExtensionPresent(nullptr, "ALC_ENUMERATION_EXT")) AppendDeviceList(&DevicesList, - drv.alcGetString(nullptr, ALC_DEVICE_SPECIFIER), idx - ); - idx++; + drv.alcGetString(nullptr, ALC_DEVICE_SPECIFIER), idx); + ++idx; } /* Ensure the list is double-null termianted. */ if(DevicesList.Names.empty()) @@ -644,9 +645,10 @@ ALC_API const ALCchar* ALC_APIENTRY alcGetString(ALCdevice *device, ALCenum para } case ALC_ALL_DEVICES_SPECIFIER: - { std::lock_guard<std::mutex> _{EnumerationLock}; + { + std::lock_guard<std::recursive_mutex> _{EnumerationLock}; AllDevicesList.clear(); - ALint idx = 0; + ALint idx{0}; for(const auto &drv : DriverList) { /* If the driver doesn't support ALC_ENUMERATE_ALL_EXT, substitute @@ -654,13 +656,11 @@ ALC_API const ALCchar* ALC_APIENTRY alcGetString(ALCdevice *device, ALCenum para */ if(drv.alcIsExtensionPresent(nullptr, "ALC_ENUMERATE_ALL_EXT")) AppendDeviceList(&AllDevicesList, - drv.alcGetString(nullptr, ALC_ALL_DEVICES_SPECIFIER), idx - ); - else if(drv.ALCVer >= MAKE_ALC_VER(1, 1) || - drv.alcIsExtensionPresent(nullptr, "ALC_ENUMERATION_EXT")) + drv.alcGetString(nullptr, ALC_ALL_DEVICES_SPECIFIER), idx); + else if(drv.ALCVer >= MAKE_ALC_VER(1, 1) + || drv.alcIsExtensionPresent(nullptr, "ALC_ENUMERATION_EXT")) AppendDeviceList(&AllDevicesList, - drv.alcGetString(nullptr, ALC_DEVICE_SPECIFIER), idx - ); + drv.alcGetString(nullptr, ALC_DEVICE_SPECIFIER), idx); ++idx; } /* Ensure the list is double-null termianted. */ @@ -671,16 +671,16 @@ ALC_API const ALCchar* ALC_APIENTRY alcGetString(ALCdevice *device, ALCenum para } case ALC_CAPTURE_DEVICE_SPECIFIER: - { std::lock_guard<std::mutex> _{EnumerationLock}; + { + std::lock_guard<std::recursive_mutex> _{EnumerationLock}; CaptureDevicesList.clear(); - ALint idx = 0; + ALint idx{0}; for(const auto &drv : DriverList) { - if(drv.ALCVer >= MAKE_ALC_VER(1, 1) || - drv.alcIsExtensionPresent(nullptr, "ALC_EXT_CAPTURE")) + if(drv.ALCVer >= MAKE_ALC_VER(1, 1) + || drv.alcIsExtensionPresent(nullptr, "ALC_EXT_CAPTURE")) AppendDeviceList(&CaptureDevicesList, - drv.alcGetString(nullptr, ALC_CAPTURE_DEVICE_SPECIFIER), idx - ); + drv.alcGetString(nullptr, ALC_CAPTURE_DEVICE_SPECIFIER), idx); ++idx; } /* Ensure the list is double-null termianted. */ @@ -695,8 +695,8 @@ ALC_API const ALCchar* ALC_APIENTRY alcGetString(ALCdevice *device, ALCenum para auto iter = std::find_if(DriverList.cbegin(), DriverList.cend(), [](const DriverIface &drv) -> bool { - return drv.ALCVer >= MAKE_ALC_VER(1, 1) || - drv.alcIsExtensionPresent(nullptr, "ALC_ENUMERATION_EXT"); + return drv.ALCVer >= MAKE_ALC_VER(1, 1) + || drv.alcIsExtensionPresent(nullptr, "ALC_ENUMERATION_EXT"); } ); if(iter != DriverList.cend()) @@ -708,8 +708,7 @@ ALC_API const ALCchar* ALC_APIENTRY alcGetString(ALCdevice *device, ALCenum para { auto iter = std::find_if(DriverList.cbegin(), DriverList.cend(), [](const DriverIface &drv) -> bool - { return drv.alcIsExtensionPresent(nullptr, "ALC_ENUMERATE_ALL_EXT") != ALC_FALSE; } - ); + { return drv.alcIsExtensionPresent(nullptr, "ALC_ENUMERATE_ALL_EXT") != ALC_FALSE; }); if(iter != DriverList.cend()) return iter->alcGetString(nullptr, ALC_DEFAULT_ALL_DEVICES_SPECIFIER); return ""; @@ -720,8 +719,8 @@ ALC_API const ALCchar* ALC_APIENTRY alcGetString(ALCdevice *device, ALCenum para auto iter = std::find_if(DriverList.cbegin(), DriverList.cend(), [](const DriverIface &drv) -> bool { - return drv.ALCVer >= MAKE_ALC_VER(1, 1) || - drv.alcIsExtensionPresent(nullptr, "ALC_EXT_CAPTURE"); + return drv.ALCVer >= MAKE_ALC_VER(1, 1) + || drv.alcIsExtensionPresent(nullptr, "ALC_EXT_CAPTURE"); } ); if(iter != DriverList.cend()) @@ -800,7 +799,8 @@ ALC_API ALCdevice* ALC_APIENTRY alcCaptureOpenDevice(const ALCchar *devicename, devicename = nullptr; if(devicename) { - { std::lock_guard<std::mutex> _{EnumerationLock}; + { + std::lock_guard<std::recursive_mutex> _{EnumerationLock}; if(CaptureDevicesList.Names.empty()) (void)alcGetString(nullptr, ALC_CAPTURE_DEVICE_SPECIFIER); idx = GetDriverIndexForName(&CaptureDevicesList, devicename); @@ -813,21 +813,17 @@ ALC_API ALCdevice* ALC_APIENTRY alcCaptureOpenDevice(const ALCchar *devicename, return nullptr; } TRACE("Found driver %d for name \"%s\"\n", idx, devicename); - device = DriverList[idx].alcCaptureOpenDevice( - devicename, frequency, format, buffersize - ); + device = DriverList[idx].alcCaptureOpenDevice(devicename, frequency, format, buffersize); } else { for(const auto &drv : DriverList) { - if(drv.ALCVer >= MAKE_ALC_VER(1, 1) || - drv.alcIsExtensionPresent(nullptr, "ALC_EXT_CAPTURE")) + if(drv.ALCVer >= MAKE_ALC_VER(1, 1) + || drv.alcIsExtensionPresent(nullptr, "ALC_EXT_CAPTURE")) { TRACE("Using default capture device from driver %d\n", idx); - device = drv.alcCaptureOpenDevice( - nullptr, frequency, format, buffersize - ); + device = drv.alcCaptureOpenDevice(nullptr, frequency, format, buffersize); break; } ++idx; |