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:
janwas 2011-10-13 18:53:59 +00:00
parent 9fdcc7a2fa
commit f0df97d773
6 changed files with 50 additions and 18 deletions

View File

@ -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
}

View File

@ -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;

View File

@ -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();

View File

@ -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;
}
}
}
}

View File

@ -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;

View File

@ -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.
**/