Use vectors for the dsound device lists

This commit is contained in:
Chris Robinson
2014-03-31 02:48:01 -07:00
parent 7b93e10f7a
commit 48b472abb7
+79 -127
View File
@@ -94,14 +94,15 @@ typedef struct {
al_string name;
GUID guid;
} DevMap;
DECL_VECTOR(DevMap)
vector_DevMap PlaybackDevices;
vector_DevMap CaptureDevices;
static DevMap *PlaybackDeviceList;
static ALuint NumPlaybackDevices;
static DevMap *CaptureDeviceList;
static ALuint NumCaptureDevices;
#define MAX_UPDATES 128
static ALCboolean DSoundLoad(void)
{
if(!ds_handle)
@@ -131,109 +132,49 @@ static ALCboolean DSoundLoad(void)
}
static BOOL CALLBACK DSoundEnumPlaybackDevices(LPGUID guid, LPCWSTR desc, LPCWSTR UNUSED(drvname), LPVOID UNUSED(data))
static BOOL CALLBACK DSoundEnumDevices(LPGUID guid, LPCWSTR desc, LPCWSTR UNUSED(drvname), LPVOID data)
{
vector_DevMap *devices = data;
LPOLESTR guidstr = NULL;
al_string dname;
DevMap *iter, *end;
DevMap entry;
HRESULT hr;
void *temp;
int count;
ALuint i;
if(!guid)
return TRUE;
AL_STRING_INIT(dname);
AL_STRING_INIT(entry.name);
count = 0;
do {
al_string_copy_wcstr(&dname, desc);
al_string_copy_wcstr(&entry.name, desc);
if(count != 0)
{
char str[64];
snprintf(str, sizeof(str), " #%d", count+1);
al_string_append_cstr(&dname, str);
al_string_append_cstr(&entry.name, str);
}
count++;
for(i = 0;i < NumPlaybackDevices;i++)
iter = VECTOR_ITER_BEGIN(*devices);
end = VECTOR_ITER_END(*devices);
for(;iter != end;++iter)
{
if(al_string_cmp(dname, PlaybackDeviceList[i].name) == 0)
if(al_string_cmp(entry.name, iter->name) == 0)
break;
}
} while(i != NumPlaybackDevices);
} while(iter != end);
entry.guid = *guid;
hr = StringFromCLSID(guid, &guidstr);
if(SUCCEEDED(hr))
{
TRACE("Got device \"%s\", GUID \"%ls\"\n", al_string_get_cstr(dname), guidstr);
TRACE("Got device \"%s\", GUID \"%ls\"\n", al_string_get_cstr(entry.name), guidstr);
CoTaskMemFree(guidstr);
}
temp = realloc(PlaybackDeviceList, sizeof(DevMap) * (NumPlaybackDevices+1));
if(!temp)
AL_STRING_DEINIT(dname);
else
{
PlaybackDeviceList = temp;
PlaybackDeviceList[NumPlaybackDevices].name = dname;
PlaybackDeviceList[NumPlaybackDevices].guid = *guid;
NumPlaybackDevices++;
}
return TRUE;
}
static BOOL CALLBACK DSoundEnumCaptureDevices(LPGUID guid, LPCWSTR desc, LPCWSTR UNUSED(drvname), LPVOID UNUSED(data))
{
LPOLESTR guidstr = NULL;
al_string dname;
HRESULT hr;
void *temp;
int count;
ALuint i;
if(!guid)
return TRUE;
AL_STRING_INIT(dname);
count = 0;
do {
al_string_copy_wcstr(&dname, desc);
if(count != 0)
{
char str[64];
snprintf(str, sizeof(str), " #%d", count+1);
al_string_append_cstr(&dname, str);
}
count++;
for(i = 0;i < NumCaptureDevices;i++)
{
if(al_string_cmp(dname, CaptureDeviceList[i].name) == 0)
break;
}
} while(i != NumCaptureDevices);
hr = StringFromCLSID(guid, &guidstr);
if(SUCCEEDED(hr))
{
TRACE("Got device \"%s\", GUID \"%ls\"\n", al_string_get_cstr(dname), guidstr);
CoTaskMemFree(guidstr);
}
temp = realloc(CaptureDeviceList, sizeof(DevMap) * (NumCaptureDevices+1));
if(!temp)
AL_STRING_DEINIT(dname);
else
{
CaptureDeviceList = temp;
CaptureDeviceList[NumCaptureDevices].name = dname;
CaptureDeviceList[NumCaptureDevices].guid = *guid;
NumCaptureDevices++;
}
VECTOR_PUSH_BACK(*devices, entry);
return TRUE;
}
@@ -353,35 +294,37 @@ static ALCenum DSoundOpenPlayback(ALCdevice *device, const ALCchar *deviceName)
LPGUID guid = NULL;
HRESULT hr, hrcom;
if(!PlaybackDeviceList)
if(VECTOR_SIZE(PlaybackDevices) == 0)
{
/* Initialize COM to prevent name truncation */
hrcom = CoInitialize(NULL);
hr = DirectSoundEnumerateW(DSoundEnumPlaybackDevices, NULL);
hr = DirectSoundEnumerateW(DSoundEnumDevices, &PlaybackDevices);
if(FAILED(hr))
ERR("Error enumerating DirectSound devices (0x%lx)!\n", hr);
if(SUCCEEDED(hrcom))
CoUninitialize();
}
if(!deviceName && NumPlaybackDevices > 0)
if(!deviceName && VECTOR_SIZE(PlaybackDevices) > 0)
{
deviceName = al_string_get_cstr(PlaybackDeviceList[0].name);
guid = &PlaybackDeviceList[0].guid;
deviceName = al_string_get_cstr(VECTOR_FRONT(PlaybackDevices).name);
guid = &VECTOR_FRONT(PlaybackDevices).guid;
}
else
{
ALuint i;
DevMap *iter, *end;
for(i = 0;i < NumPlaybackDevices;i++)
iter = VECTOR_ITER_BEGIN(PlaybackDevices);
end = VECTOR_ITER_END(PlaybackDevices);
for(;iter != end;++iter)
{
if(al_string_cmp_cstr(PlaybackDeviceList[i].name, deviceName) == 0)
if(al_string_cmp_cstr(iter->name, deviceName) == 0)
{
guid = &PlaybackDeviceList[i].guid;
guid = &iter->guid;
break;
}
}
if(i == NumPlaybackDevices)
if(iter == end)
return ALC_INVALID_VALUE;
}
@@ -684,35 +627,37 @@ static ALCenum DSoundOpenCapture(ALCdevice *device, const ALCchar *deviceName)
HRESULT hr, hrcom;
ALuint samples;
if(!CaptureDeviceList)
if(VECTOR_SIZE(CaptureDevices) == 0)
{
/* Initialize COM to prevent name truncation */
hrcom = CoInitialize(NULL);
hr = DirectSoundCaptureEnumerateW(DSoundEnumCaptureDevices, NULL);
hr = DirectSoundCaptureEnumerateW(DSoundEnumDevices, &CaptureDevices);
if(FAILED(hr))
ERR("Error enumerating DirectSound devices (0x%lx)!\n", hr);
if(SUCCEEDED(hrcom))
CoUninitialize();
}
if(!deviceName && NumCaptureDevices > 0)
if(!deviceName && VECTOR_SIZE(CaptureDevices) > 0)
{
deviceName = al_string_get_cstr(CaptureDeviceList[0].name);
guid = &CaptureDeviceList[0].guid;
deviceName = al_string_get_cstr(VECTOR_FRONT(CaptureDevices).name);
guid = &VECTOR_FRONT(CaptureDevices).guid;
}
else
{
ALuint i;
DevMap *iter, *end;
for(i = 0;i < NumCaptureDevices;i++)
iter = VECTOR_ITER_BEGIN(CaptureDevices);
end = VECTOR_ITER_END(CaptureDevices);
for(;iter != end;++iter)
{
if(al_string_cmp_cstr(CaptureDeviceList[i].name, deviceName) == 0)
if(al_string_cmp_cstr(iter->name, deviceName) == 0)
{
guid = &CaptureDeviceList[i].guid;
guid = &iter->guid;
break;
}
}
if(i == NumCaptureDevices)
if(iter == end)
return ALC_INVALID_VALUE;
}
@@ -980,6 +925,9 @@ static const BackendFuncs DSoundFuncs = {
ALCboolean alcDSoundInit(BackendFuncs *FuncList)
{
VECTOR_INIT(PlaybackDevices);
VECTOR_INIT(CaptureDevices);
if(!DSoundLoad())
return ALC_FALSE;
*FuncList = DSoundFuncs;
@@ -988,19 +936,19 @@ ALCboolean alcDSoundInit(BackendFuncs *FuncList)
void alcDSoundDeinit(void)
{
ALuint i;
DevMap *iter, *end;
for(i = 0;i < NumPlaybackDevices;++i)
AL_STRING_DEINIT(PlaybackDeviceList[i].name);
free(PlaybackDeviceList);
PlaybackDeviceList = NULL;
NumPlaybackDevices = 0;
iter = VECTOR_ITER_BEGIN(PlaybackDevices);
end = VECTOR_ITER_END(PlaybackDevices);
for(;iter != end;++iter)
AL_STRING_DEINIT(iter->name);
VECTOR_DEINIT(PlaybackDevices);
for(i = 0;i < NumCaptureDevices;++i)
AL_STRING_DEINIT(CaptureDeviceList[i].name);
free(CaptureDeviceList);
CaptureDeviceList = NULL;
NumCaptureDevices = 0;
iter = VECTOR_ITER_BEGIN(CaptureDevices);
end = VECTOR_ITER_END(CaptureDevices);
for(;iter != end;++iter)
AL_STRING_DEINIT(iter->name);
VECTOR_DEINIT(CaptureDevices);
if(ds_handle)
CloseLib(ds_handle);
@@ -1009,44 +957,48 @@ void alcDSoundDeinit(void)
void alcDSoundProbe(enum DevProbe type)
{
DevMap *iter, *end;
HRESULT hr, hrcom;
ALuint i;
/* Initialize COM to prevent name truncation */
hrcom = CoInitialize(NULL);
switch(type)
{
case ALL_DEVICE_PROBE:
for(i = 0;i < NumPlaybackDevices;++i)
AL_STRING_DEINIT(PlaybackDeviceList[i].name);
free(PlaybackDeviceList);
PlaybackDeviceList = NULL;
NumPlaybackDevices = 0;
iter = VECTOR_ITER_BEGIN(PlaybackDevices);
end = VECTOR_ITER_END(PlaybackDevices);
for(;iter != end;++iter)
AL_STRING_DEINIT(iter->name);
VECTOR_RESIZE(PlaybackDevices, 0);
hr = DirectSoundEnumerateW(DSoundEnumPlaybackDevices, NULL);
hr = DirectSoundEnumerateW(DSoundEnumDevices, &PlaybackDevices);
if(FAILED(hr))
ERR("Error enumerating DirectSound playback devices (0x%lx)!\n", hr);
else
{
for(i = 0;i < NumPlaybackDevices;i++)
AppendAllDevicesList(al_string_get_cstr(PlaybackDeviceList[i].name));
iter = VECTOR_ITER_BEGIN(PlaybackDevices);
end = VECTOR_ITER_END(PlaybackDevices);
for(;iter != end;++iter)
AppendAllDevicesList(al_string_get_cstr(iter->name));
}
break;
case CAPTURE_DEVICE_PROBE:
for(i = 0;i < NumCaptureDevices;++i)
AL_STRING_DEINIT(CaptureDeviceList[i].name);
free(CaptureDeviceList);
CaptureDeviceList = NULL;
NumCaptureDevices = 0;
iter = VECTOR_ITER_BEGIN(CaptureDevices);
end = VECTOR_ITER_END(CaptureDevices);
for(;iter != end;++iter)
AL_STRING_DEINIT(iter->name);
VECTOR_RESIZE(CaptureDevices, 0);
hr = DirectSoundCaptureEnumerateW(DSoundEnumCaptureDevices, NULL);
hr = DirectSoundCaptureEnumerateW(DSoundEnumDevices, &CaptureDevices);
if(FAILED(hr))
ERR("Error enumerating DirectSound capture devices (0x%lx)!\n", hr);
else
{
for(i = 0;i < NumCaptureDevices;i++)
AppendCaptureDeviceList(al_string_get_cstr(CaptureDeviceList[i].name));
iter = VECTOR_ITER_BEGIN(CaptureDevices);
end = VECTOR_ITER_END(CaptureDevices);
for(;iter != end;++iter)
AppendCaptureDeviceList(al_string_get_cstr(iter->name));
}
break;
}