forked from 0ad/0ad
add support for retrieving all WMI class instances (required for detecting multiple graphics and sound cards)
fixes #998 This was SVN commit r10399.
This commit is contained in:
parent
9fdcc7a2fa
commit
f0df97d773
@ -139,10 +139,20 @@ static void AppendDriverVersionsFromKnownFiles(VersionList& versionList)
|
||||
|
||||
Status wgfx_CardName(wchar_t* cardName, size_t numChars)
|
||||
{
|
||||
WmiMap wmiMap;
|
||||
RETURN_STATUS_IF_ERR(wmi_GetClass(L"Win32_VideoController", wmiMap));
|
||||
swprintf_s(cardName, numChars, L"%ls", wmiMap[L"Caption"].bstrVal);
|
||||
return INFO::OK;
|
||||
WmiInstances instances;
|
||||
RETURN_STATUS_IF_ERR(wmi_GetClassInstances(L"Win32_VideoController", instances));
|
||||
wchar_t* pos = cardName;
|
||||
for(WmiInstances::iterator it = instances.begin(); it != instances.end(); ++it)
|
||||
{
|
||||
if((*it)[L"Availability"].intVal == 8) // offline
|
||||
continue;
|
||||
const int ret = swprintf_s(pos, numChars-(pos-cardName), L"%ls; ", (*it)[L"Caption"].bstrVal);
|
||||
if(ret > 0)
|
||||
pos += ret;
|
||||
return INFO::OK;
|
||||
}
|
||||
|
||||
return ERR::FAIL; // no active card found
|
||||
}
|
||||
|
||||
|
||||
|
@ -103,7 +103,7 @@ void wmi_Shutdown()
|
||||
}
|
||||
|
||||
|
||||
Status wmi_GetClass(const wchar_t* className, WmiMap& wmiMap)
|
||||
Status wmi_GetClassInstances(const wchar_t* className, WmiInstances& instances)
|
||||
{
|
||||
RETURN_STATUS_IF_ERR(ModuleInit(&initState, Init));
|
||||
|
||||
@ -126,6 +126,7 @@ Status wmi_GetClass(const wchar_t* className, WmiMap& wmiMap)
|
||||
break;
|
||||
ENSURE(pEnum);
|
||||
|
||||
WmiInstance instance;
|
||||
pObj->BeginEnumeration(WBEM_FLAG_NONSYSTEM_ONLY);
|
||||
for(;;)
|
||||
{
|
||||
@ -137,9 +138,10 @@ Status wmi_GetClass(const wchar_t* className, WmiMap& wmiMap)
|
||||
SysFreeString(name);
|
||||
break;
|
||||
}
|
||||
wmiMap[name] = value;
|
||||
instance[name] = value;
|
||||
SysFreeString(name);
|
||||
}
|
||||
instances.push_back(instance);
|
||||
}
|
||||
|
||||
return INFO::OK;
|
||||
|
@ -36,13 +36,15 @@
|
||||
#define _WIN32_DCOM
|
||||
#include "lib/sysdep/os/win/win.h"
|
||||
#include <comdef.h> // VARIANT
|
||||
typedef std::map<std::wstring, VARIANT> WmiMap;
|
||||
// contains name and value of all instance properties
|
||||
typedef std::map<std::wstring, VARIANT> WmiInstance;
|
||||
|
||||
typedef std::vector<WmiInstance> WmiInstances;
|
||||
|
||||
/**
|
||||
* return a map of name/value pairs of the WMI class members.
|
||||
* @return Status
|
||||
* get all instances of the requested class.
|
||||
**/
|
||||
extern Status wmi_GetClass(const wchar_t* className, WmiMap& wmiMap);
|
||||
extern Status wmi_GetClassInstances(const wchar_t* className, WmiInstances& instances);
|
||||
|
||||
extern void wmi_Shutdown();
|
||||
|
||||
|
@ -473,11 +473,17 @@ SDL_VideoInfo* SDL_GetVideoInfo()
|
||||
|
||||
if(video_info.video_mem == 0)
|
||||
{
|
||||
WmiMap videoAdapter;
|
||||
if(wmi_GetClass(L"Win32_VideoController", videoAdapter) == INFO::OK)
|
||||
WmiInstances instances;
|
||||
if(wmi_GetClassInstances(L"Win32_VideoController", instances) == INFO::OK)
|
||||
{
|
||||
VARIANT vTotalMemory = videoAdapter[L"AdapterRAM"];
|
||||
video_info.video_mem = vTotalMemory.lVal;
|
||||
for(WmiInstances::iterator it = instances.begin(); it != instances.end(); ++it)
|
||||
{
|
||||
if((*it)[L"Availability"].intVal != 8) // not offline
|
||||
{
|
||||
video_info.video_mem = std::max<Uint32>(video_info.video_mem, (*it)[L"AdapterRAM"].lVal);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -126,9 +126,21 @@ static const OsPath& GetDirectSoundDriverPath()
|
||||
|
||||
Status win_get_snd_info()
|
||||
{
|
||||
WmiMap wmiMap;
|
||||
if(wmi_GetClass(L"Win32_SoundDevice", wmiMap) == INFO::OK)
|
||||
swprintf_s(snd_card, SND_CARD_LEN, L"%ls", wmiMap[L"ProductName"].bstrVal);
|
||||
WmiInstances instances;
|
||||
RETURN_STATUS_IF_ERR(wmi_GetClassInstances(L"Win32_SoundDevice", instances));
|
||||
std::set<std::wstring> names; // get rid of duplicate "High Definition Audio Device" entries
|
||||
for(WmiInstances::iterator it = instances.begin(); it != instances.end(); ++it)
|
||||
{
|
||||
if((*it)[L"Availability"].intVal != 8) // not offline
|
||||
names.insert(std::wstring((*it)[L"ProductName"].bstrVal));
|
||||
}
|
||||
wchar_t* pos = snd_card;
|
||||
for(std::set<std::wstring>::const_iterator it = names.begin(); it != names.end(); ++it)
|
||||
{
|
||||
const int ret = swprintf_s(pos, SND_CARD_LEN-(pos-snd_card), L"%ls; ", it->c_str());
|
||||
if(ret > 0)
|
||||
pos += ret;
|
||||
}
|
||||
|
||||
// find all DLLs related to OpenAL and retrieve their versions.
|
||||
VersionList versionList;
|
||||
|
@ -27,7 +27,7 @@
|
||||
#ifndef INCLUDED_SND
|
||||
#define INCLUDED_SND
|
||||
|
||||
const size_t SND_CARD_LEN = 128;
|
||||
const size_t SND_CARD_LEN = 256;
|
||||
/**
|
||||
* description of sound card.
|
||||
**/
|
||||
|
Loading…
Reference in New Issue
Block a user