mirror of
https://github.com/WinampDesktop/winamp.git
synced 2024-12-04 21:31:28 -05:00
132 lines
2.3 KiB
C++
132 lines
2.3 KiB
C++
#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;
|
|
}
|