aboutsummaryrefslogtreecommitdiffstats
path: root/alc/backends/dsound.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'alc/backends/dsound.cpp')
-rw-r--r--alc/backends/dsound.cpp30
1 files changed, 22 insertions, 8 deletions
diff --git a/alc/backends/dsound.cpp b/alc/backends/dsound.cpp
index c1921430..1c0b371c 100644
--- a/alc/backends/dsound.cpp
+++ b/alc/backends/dsound.cpp
@@ -329,11 +329,18 @@ void DSoundPlayback::open(const ALCchar *name)
else
{
auto iter = std::find_if(PlaybackDevices.cbegin(), PlaybackDevices.cend(),
- [name](const DevMap &entry) -> bool
- { return entry.name == name; }
- );
+ [name](const DevMap &entry) -> bool { return entry.name == name; });
if(iter == PlaybackDevices.cend())
- throw al::backend_exception{ALC_INVALID_VALUE, "Device name \"%s\" not found", name};
+ {
+ GUID id{};
+ hr = CLSIDFromString(utf8_to_wstr(name).c_str(), &id);
+ if(SUCCEEDED(hr))
+ iter = std::find_if(PlaybackDevices.cbegin(), PlaybackDevices.cend(),
+ [&id](const DevMap &entry) -> bool { return entry.guid == id; });
+ if(iter == PlaybackDevices.cend())
+ throw al::backend_exception{ALC_INVALID_VALUE, "Device name \"%s\" not found",
+ name};
+ }
guid = &iter->guid;
}
@@ -608,11 +615,18 @@ void DSoundCapture::open(const ALCchar *name)
else
{
auto iter = std::find_if(CaptureDevices.cbegin(), CaptureDevices.cend(),
- [name](const DevMap &entry) -> bool
- { return entry.name == name; }
- );
+ [name](const DevMap &entry) -> bool { return entry.name == name; });
if(iter == CaptureDevices.cend())
- throw al::backend_exception{ALC_INVALID_VALUE, "Device name \"%s\" not found", name};
+ {
+ GUID id{};
+ hr = CLSIDFromString(utf8_to_wstr(name).c_str(), &id);
+ if(SUCCEEDED(hr))
+ iter = std::find_if(CaptureDevices.cbegin(), CaptureDevices.cend(),
+ [&id](const DevMap &entry) -> bool { return entry.guid == id; });
+ if(iter == CaptureDevices.cend())
+ throw al::backend_exception{ALC_INVALID_VALUE, "Device name \"%s\" not found",
+ name};
+ }
guid = &iter->guid;
}