Initial community commit
This commit is contained in:
parent
537bcbc862
commit
fc06254474
16440 changed files with 4239995 additions and 2 deletions
132
Src/Plugins/Output/out_ds/DevEnum.cpp
Normal file
132
Src/Plugins/Output/out_ds/DevEnum.cpp
Normal file
|
@ -0,0 +1,132 @@
|
|||
#include "DevEnum.h"
|
||||
#include "ds2.h"
|
||||
#include "strsafe.h"
|
||||
|
||||
static int device_count=0;
|
||||
static const GUID NULL_GUID;
|
||||
|
||||
|
||||
BOOL WINAPI DsDevEnum::DSEnumCallback(LPGUID guid,LPCTSTR desc,LPCTSTR,DS_DEV *** var)
|
||||
{
|
||||
DS_DEV * dev=new DS_DEV;
|
||||
|
||||
size_t length=lstrlen(desc);
|
||||
length+=4; // "##: "
|
||||
length+=1; // null terminator
|
||||
|
||||
dev->name = (TCHAR *)calloc(sizeof(TCHAR),length);
|
||||
|
||||
StringCchPrintf(dev->name,length, TEXT("%02d: %s"), device_count++, desc);
|
||||
|
||||
dev->guid=guid ? *guid : NULL_GUID;
|
||||
|
||||
**var = dev;
|
||||
*var=&dev->next;
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
DsDevEnum::DsDevEnum()
|
||||
{
|
||||
DS2::InitDLL();
|
||||
ds_devs=0;
|
||||
|
||||
DS_DEV ** dev_ptr=&ds_devs;
|
||||
device_count = 1;
|
||||
if (DS2::pDirectSoundEnumerate)
|
||||
DS2::pDirectSoundEnumerate((LPDSENUMCALLBACK)DSEnumCallback,&dev_ptr);
|
||||
|
||||
*dev_ptr=0;
|
||||
pDev=ds_devs;
|
||||
}
|
||||
|
||||
DsDevEnum::~DsDevEnum()
|
||||
{
|
||||
DS_DEV* dev=ds_devs;
|
||||
while(dev)
|
||||
{
|
||||
DS_DEV * next=dev->next;
|
||||
free(dev->name);
|
||||
delete dev;
|
||||
dev=next;
|
||||
}
|
||||
// ds_devs=0;
|
||||
}
|
||||
|
||||
bool DsDevEnum::FindGuid(const GUID & guid)
|
||||
{
|
||||
pDev=ds_devs;
|
||||
while(pDev)
|
||||
{
|
||||
if (pDev->guid== guid) return true;
|
||||
pDev=pDev->next;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
bool DsDevEnum::FindDefault()
|
||||
{
|
||||
return FindGuid(NULL_GUID);
|
||||
}
|
||||
|
||||
bool DsDevEnum::FindName(const TCHAR *deviceToFind)
|
||||
{
|
||||
pDev=ds_devs;
|
||||
if (!deviceToFind) return true;
|
||||
while(pDev)
|
||||
{
|
||||
if (!lstrcmpi(pDev->name,deviceToFind)) return true;
|
||||
pDev=pDev->next;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
/*
|
||||
const GUID DsDevEnum::GuidFromName(const char* name)
|
||||
{
|
||||
return FindName(name) ? GetGuid() : NULL_GUID;
|
||||
}
|
||||
|
||||
const char * DsDevEnum::NameFromGuid(const GUID & g, char * def)
|
||||
{
|
||||
return FindGuid(g) ? GetName() : def;
|
||||
}
|
||||
*/
|
||||
const GUID DsDevEnum::GetGuid()
|
||||
{
|
||||
return pDev ? pDev->guid : NULL_GUID;
|
||||
}
|
||||
|
||||
|
||||
static bool _getcaps(IDirectSound * pDS,LPDSCAPS pCaps,DWORD * speakercfg)
|
||||
{
|
||||
bool rv = true;
|
||||
if (pCaps)
|
||||
{
|
||||
memset(pCaps,0,sizeof(*pCaps));
|
||||
pCaps->dwSize=sizeof(*pCaps);
|
||||
if (FAILED(pDS->GetCaps(pCaps))) rv = false;
|
||||
}
|
||||
if (speakercfg)
|
||||
{
|
||||
if (FAILED(pDS->GetSpeakerConfig(speakercfg))) rv = false;
|
||||
}
|
||||
return rv;
|
||||
}
|
||||
|
||||
bool DsDevEnum::GetCapsFromGuid(const GUID *dev,LPDSCAPS pCaps,DWORD * speakercfg)
|
||||
{
|
||||
bool rv=false;
|
||||
if (!dev) dev=&NULL_GUID;
|
||||
|
||||
if (DS2::TryGetDevCaps(dev,pCaps,speakercfg)) rv=true;
|
||||
else
|
||||
{
|
||||
IDirectSound * l_pDS=0;
|
||||
if (SUCCEEDED(DS2::myDirectSoundCreate(dev,&l_pDS)) && l_pDS)
|
||||
{
|
||||
rv=_getcaps(l_pDS,pCaps,speakercfg);
|
||||
l_pDS->Release();
|
||||
}
|
||||
}
|
||||
return rv;
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue