Store copies of the device names in the individual backends

This commit is contained in:
Chris Robinson
2009-08-27 01:47:41 -07:00
parent 81db01ebf1
commit 45dc804819
10 changed files with 151 additions and 78 deletions
+6 -12
View File
@@ -351,43 +351,37 @@ static void InitAL(void)
}
}
ALCchar *AppendDeviceList(char *name)
void AppendDeviceList(const ALCchar *name)
{
static size_t pos;
ALCchar *ret = alcDeviceList+pos;
if(pos >= sizeof(alcDeviceList))
{
AL_PRINT("Not enough room to add %s!\n", name);
return alcDeviceList + sizeof(alcDeviceList) - 1;
return;
}
pos += snprintf(alcDeviceList+pos, sizeof(alcDeviceList)-pos-1, "%s", name) + 1;
return ret;
}
ALCchar *AppendAllDeviceList(char *name)
void AppendAllDeviceList(const ALCchar *name)
{
static size_t pos;
ALCchar *ret = alcAllDeviceList+pos;
if(pos >= sizeof(alcAllDeviceList))
{
AL_PRINT("Not enough room to add %s!\n", name);
return alcAllDeviceList + sizeof(alcAllDeviceList) - 1;
return;
}
pos += snprintf(alcAllDeviceList+pos, sizeof(alcAllDeviceList)-pos-1, "%s", name) + 1;
return ret;
}
ALCchar *AppendCaptureDeviceList(char *name)
void AppendCaptureDeviceList(const ALCchar *name)
{
static size_t pos;
ALCchar *ret = alcCaptureDeviceList+pos;
if(pos >= sizeof(alcCaptureDeviceList))
{
AL_PRINT("Not enough room to add %s!\n", name);
return alcCaptureDeviceList + sizeof(alcCaptureDeviceList) - 1;
return;
}
pos += snprintf(alcCaptureDeviceList+pos, sizeof(alcCaptureDeviceList)-pos-1, "%s", name) + 1;
return ret;
}
/*
+69 -28
View File
@@ -108,11 +108,13 @@ MAKE_FUNC(snd_ctl_card_info_get_name);
MAKE_FUNC(snd_card_next);
#undef MAKE_FUNC
#define MAX_ALL_DEVICES 32
static ALCchar *alsaDevice;
static DevMap allDevNameMap[MAX_ALL_DEVICES];
static DevMap allCaptureDevNameMap[MAX_ALL_DEVICES];
static const ALCchar alsaDevice[] = "ALSA Software";
static DevMap *allDevNameMap;
static ALuint numDevNames;
static DevMap *allCaptureDevNameMap;
static ALuint numCaptureDevNames;
static int xrun_recovery(snd_pcm_t *handle, int err)
{
@@ -363,7 +365,7 @@ static ALCboolean alsa_open_playback(ALCdevice *device, const ALCchar *deviceNam
{
size_t idx;
for(idx = 0;idx < MAX_ALL_DEVICES;idx++)
for(idx = 0;idx < numDevNames;idx++)
{
if(allDevNameMap[idx].name &&
strcmp(deviceName, allDevNameMap[idx].name) == 0)
@@ -597,7 +599,7 @@ static ALCboolean alsa_open_capture(ALCdevice *pDevice, const ALCchar *deviceNam
{
size_t idx;
for(idx = 0;idx < MAX_ALL_DEVICES;idx++)
for(idx = 0;idx < numCaptureDevNames;idx++)
{
if(allCaptureDevNameMap[idx].name &&
strcmp(deviceName, allCaptureDevNameMap[idx].name) == 0)
@@ -885,8 +887,10 @@ LOAD_FUNC(snd_card_next);
if(psnd_card_next(&card) < 0 || card < 0)
AL_PRINT("no playback cards found...\n");
alsaDevice = AppendDeviceList("ALSA Software");
allDevNameMap[0].name = AppendAllDeviceList("ALSA Software on default");
AppendDeviceList(alsaDevice);
allDevNameMap = malloc(sizeof(DevMap) * 1);
allDevNameMap[0].name = strdup("ALSA Software on default");
AppendAllDeviceList(allDevNameMap[0].name);
while (card >= 0) {
sprintf(name, "hw:%d", card);
@@ -901,8 +905,9 @@ LOAD_FUNC(snd_card_next);
}
dev = -1;
while (idx < MAX_ALL_DEVICES) {
while(1) {
const char *cname, *dname;
void *temp;
if (psnd_ctl_pcm_next_device(handle, &dev)<0)
AL_PRINT("snd_ctl_pcm_next_device failed\n");
@@ -918,14 +923,20 @@ LOAD_FUNC(snd_card_next);
continue;
}
cname = psnd_ctl_card_info_get_name(info);
dname = psnd_pcm_info_get_name(pcminfo);
snprintf(name, sizeof(name), "ALSA Software on %s [%s] (hw:%d,%d)",
cname, dname, card, dev);
allDevNameMap[idx].name = AppendAllDeviceList(name);
allDevNameMap[idx].card = card;
allDevNameMap[idx].dev = dev;
idx++;
temp = realloc(allDevNameMap, sizeof(DevMap) * (idx+1));
if(temp)
{
allDevNameMap = temp;
cname = psnd_ctl_card_info_get_name(info);
dname = psnd_pcm_info_get_name(pcminfo);
snprintf(name, sizeof(name), "ALSA Software on %s [%s] (hw:%d,%d)",
cname, dname, card, dev);
AppendAllDeviceList(name);
allDevNameMap[idx].name = strdup(name);
allDevNameMap[idx].card = card;
allDevNameMap[idx].dev = dev;
idx++;
}
}
psnd_ctl_close(handle);
next_card:
@@ -934,6 +945,7 @@ next_card:
break;
}
}
numDevNames = idx;
stream = SND_PCM_STREAM_CAPTURE;
@@ -946,9 +958,11 @@ next_card:
return;
}
allCaptureDevNameMap[0].name = AppendCaptureDeviceList("ALSA Capture on default");
idx = 1;
allCaptureDevNameMap = malloc(sizeof(DevMap) * 1);
allCaptureDevNameMap[0].name = strdup("ALSA Capture on default");
AppendCaptureDeviceList(allCaptureDevNameMap[0].name);
idx = 1;
while (card >= 0) {
sprintf(name, "hw:%d", card);
handle = NULL;
@@ -961,8 +975,9 @@ next_card:
else if (err >= 0)
{
dev = -1;
while (idx < MAX_ALL_DEVICES) {
while(1) {
const char *cname, *dname;
void *temp;
if (psnd_ctl_pcm_next_device(handle, &dev)<0)
AL_PRINT("snd_ctl_pcm_next_device failed\n");
@@ -977,14 +992,20 @@ next_card:
continue;
}
cname = psnd_ctl_card_info_get_name(info);
dname = psnd_pcm_info_get_name(pcminfo);
snprintf(name, sizeof(name), "ALSA Capture on %s [%s] (hw:%d,%d)",
cname, dname, card, dev);
allCaptureDevNameMap[idx].name = AppendCaptureDeviceList(name);
allCaptureDevNameMap[idx].card = card;
allCaptureDevNameMap[idx].dev = dev;
idx++;
temp = realloc(allCaptureDevNameMap, sizeof(DevMap) * (idx+1));
if(temp)
{
allCaptureDevNameMap = temp;
cname = psnd_ctl_card_info_get_name(info);
dname = psnd_pcm_info_get_name(pcminfo);
snprintf(name, sizeof(name), "ALSA Capture on %s [%s] (hw:%d,%d)",
cname, dname, card, dev);
AppendCaptureDeviceList(name);
allCaptureDevNameMap[idx].name = strdup(name);
allCaptureDevNameMap[idx].card = card;
allCaptureDevNameMap[idx].dev = dev;
idx++;
}
}
}
if(handle) psnd_ctl_close(handle);
@@ -993,10 +1014,30 @@ next_card:
break;
}
}
numCaptureDevNames = idx;
psnd_pcm_info_free(pcminfo);
psnd_ctl_card_info_free(info);
}
void alc_alsa_deinit(void)
{
ALuint i;
for(i = 0;i < numDevNames;++i)
free(allDevNameMap[i].name);
free(allDevNameMap);
allDevNameMap = NULL;
numDevNames = 0;
for(i = 0;i < numCaptureDevNames;++i)
free(allCaptureDevNameMap[i].name);
free(allCaptureDevNameMap);
allCaptureDevNameMap = NULL;
numCaptureDevNames = 0;
#ifdef HAVE_DLFCN_H
dlclose(alsa_handle);
alsa_handle = NULL;
#endif
}
+36 -10
View File
@@ -69,7 +69,8 @@ typedef struct {
ALCchar *name;
GUID guid;
} DevMap;
static DevMap DeviceList[16];
static DevMap *DeviceList;
static ALuint NumDevices;
static ALuint DSoundProc(ALvoid *ptr)
@@ -447,26 +448,33 @@ BackendFuncs DSoundFuncs = {
static BOOL CALLBACK DSoundEnumDevices(LPGUID guid, LPCSTR desc, LPCSTR drvname, LPVOID data)
{
size_t *iter = data;
(void)data;
(void)drvname;
if(guid)
{
char str[128];
snprintf(str, sizeof(str), "DirectSound Software on %s", desc);
DeviceList[*iter].name = AppendAllDeviceList(str);
DeviceList[*iter].guid = *guid;
(*iter)++;
void *temp;
temp = realloc(DeviceList, sizeof(DevMap) * (NumDevices+1));
if(temp)
{
DeviceList = temp;
snprintf(str, sizeof(str), "DirectSound Software on %s", desc);
AppendAllDeviceList(str);
DeviceList[NumDevices].name = strdup(str);
DeviceList[NumDevices].guid = *guid;
NumDevices++;
}
}
else
DeviceList[0].name = AppendDeviceList("DirectSound Software");
return TRUE;
}
void alcDSoundInit(BackendFuncs *FuncList)
{
size_t iter = 1;
HRESULT hr;
*FuncList = DSoundFuncs;
@@ -501,11 +509,29 @@ LOAD_FUNC(DirectSoundEnumerateA);
num_frags = GetConfigValueInt("dsound", "periods", 4);
if(num_frags < 2) num_frags = 2;
hr = pDirectSoundEnumerateA(DSoundEnumDevices, &iter);
DeviceList = malloc(sizeof(DevMap) * 1);
DeviceList[0].name = strdup("DirectSound Software");
NumDevices = 1;
AppendDeviceList(DeviceList[0].name);
hr = pDirectSoundEnumerateA(DSoundEnumDevices, NULL);
if(FAILED(hr))
AL_PRINT("Error enumerating DirectSound devices (%#x)!\n", (unsigned int)hr);
}
void alcDSoundDeinit(void)
{
ALuint i;
for(i = 0;i < NumDevices;++i)
free(DeviceList[i].name);
free(DeviceList);
DeviceList = NULL;
NumDevices = 0;
#ifdef _WIN32
FreeLibrary(ds_handle);
ds_handle = NULL;
#endif
}
+4 -4
View File
@@ -47,8 +47,8 @@
#define SOUND_MIXER_WRITE MIXER_WRITE
#endif
static char *oss_device;
static char *oss_device_capture;
static const ALCchar oss_device[] = "OSS Software";
static const ALCchar oss_device_capture[] = "OSS Capture";
typedef struct {
int fd;
@@ -474,10 +474,10 @@ void alc_oss_init(BackendFuncs *func_list)
{
*func_list = oss_funcs;
oss_device = AppendDeviceList("OSS Software");
AppendDeviceList(oss_device);
AppendAllDeviceList(oss_device);
oss_device_capture = AppendCaptureDeviceList("OSS Capture");
AppendCaptureDeviceList(oss_device_capture);
}
void alc_oss_deinit(void)
+2 -2
View File
@@ -44,7 +44,7 @@ MAKE_FUNC(Pa_GetDefaultOutputDevice);
#undef MAKE_FUNC
static char *pa_device;
static const ALCchar pa_device[] = "PortAudio Software";
typedef struct {
PaStream *stream;
@@ -248,7 +248,7 @@ void alc_pa_init(BackendFuncs *func_list)
return;
}
pa_device = AppendDeviceList("PortAudio Software");
AppendDeviceList(pa_device);
AppendAllDeviceList(pa_device);
}
+5 -5
View File
@@ -108,8 +108,8 @@ typedef struct {
pa_context *context;
} pulse_data;
static char *pulse_device;
static char *pulse_capture_device;
static const ALCchar pulse_device[] = "PulseAudio Software";
static const ALCchar pulse_capture_device[] = "PulseAudio Capture";
// PulseAudio Event Callbacks {{{
static void stream_state_callback(pa_stream *stream, void *pdata) //{{{
@@ -205,7 +205,7 @@ static void stream_read_callback(pa_stream *stream, size_t length, void *pdata)
} //}}}
//}}}
static ALCboolean pulse_open(ALCdevice *device, ALCchar *device_name) //{{{
static ALCboolean pulse_open(ALCdevice *device, const ALCchar *device_name) //{{{
{
pulse_data *data = ppa_xmalloc0(sizeof(pulse_data));
@@ -696,10 +696,10 @@ LOAD_FUNC(pa_threaded_mainloop_lock);
#undef LOAD_FUNC
pulse_device = AppendDeviceList("PulseAudio Software");
AppendDeviceList(pulse_device);
AppendAllDeviceList(pulse_device);
pulse_capture_device = AppendCaptureDeviceList("PulseAudio Capture");
AppendCaptureDeviceList(pulse_capture_device);
} //}}}
void alc_pulse_deinit(void) //{{{
+2 -2
View File
@@ -37,7 +37,7 @@
#include <sys/audioio.h>
static char *solaris_device;
static const ALCchar solaris_device[] = "Solaris Software";
typedef struct {
int fd;
@@ -279,7 +279,7 @@ void alc_solaris_init(BackendFuncs *func_list)
{
*func_list = solaris_funcs;
solaris_device = AppendDeviceList("Solaris Software");
AppendDeviceList(solaris_device);
AppendAllDeviceList(solaris_device);
}
+2 -2
View File
@@ -40,7 +40,7 @@ typedef struct {
} wave_data;
static ALCchar *waveDevice;
static const ALCchar waveDevice[] = "Wave File Writer";
static ALuint WaveProc(ALvoid *ptr)
@@ -367,7 +367,7 @@ void alc_wave_init(BackendFuncs *func_list)
{
*func_list = wave_funcs;
waveDevice = AppendDeviceList("Wave File Writer");
AppendDeviceList(waveDevice);
AppendAllDeviceList(waveDevice);
}
+21 -9
View File
@@ -50,7 +50,8 @@ typedef struct {
} WinMMData;
static ALCchar *CaptureDeviceList[16];
static ALCchar **CaptureDeviceList;
static ALuint NumCaptureDevices;
/*
WaveInProc
@@ -181,12 +182,12 @@ static ALCboolean WinMMOpenCapture(ALCdevice *pDevice, const ALCchar *deviceName
WinMMData *pData = NULL;
ALint lDeviceID = 0;
ALint lBufferSize;
ALint i;
ALuint i;
// Find the Device ID matching the deviceName if valid
if (deviceName)
{
for(i = 0;CaptureDeviceList[i];i++)
for(i = 0;i < NumCaptureDevices;i++)
{
if (!strcmp(deviceName, CaptureDeviceList[i]))
{
@@ -194,7 +195,7 @@ static ALCboolean WinMMOpenCapture(ALCdevice *pDevice, const ALCchar *deviceName
break;
}
}
if(!CaptureDeviceList[i])
if(i == NumCaptureDevices)
return ALC_FALSE;
}
pDevice->szDeviceName = CaptureDeviceList[lDeviceID];
@@ -423,24 +424,35 @@ BackendFuncs WinMMFuncs = {
void alcWinMMInit(BackendFuncs *FuncList)
{
ALint lNumDevs;
ALint lLoop;
ALuint lLoop;
*FuncList = WinMMFuncs;
lNumDevs = waveInGetNumDevs();
for (lLoop = 0; lLoop < lNumDevs; lLoop++)
NumCaptureDevices = waveInGetNumDevs();
CaptureDeviceList = malloc(sizeof(ALCchar*) * NumCaptureDevices);
for(lLoop = 0; lLoop < NumCaptureDevices; lLoop++)
{
WAVEINCAPS WaveInCaps;
CaptureDeviceList[lLoop] = strdup("");
if(waveInGetDevCaps(lLoop, &WaveInCaps, sizeof(WAVEINCAPS)) == MMSYSERR_NOERROR)
{
char name[128];
snprintf(name, sizeof(name), "WaveIn on %s", WaveInCaps.szPname);
CaptureDeviceList[lLoop] = AppendCaptureDeviceList(name);
AppendCaptureDeviceList(name);
CaptureDeviceList[lLoop] = strdup(name);
}
}
}
void alcWinMMDeinit()
{
ALuint lLoop;
for(lLoop = 0; lLoop < NumCaptureDevices; lLoop++)
free(CaptureDeviceList[lLoop]);
free(CaptureDeviceList);
CaptureDeviceList = NULL;
NumCaptureDevices = 0;
}
+4 -4
View File
@@ -187,7 +187,7 @@ struct ALCdevice_struct
ALuint BufferSize;
ALenum Format;
ALCchar *szDeviceName;
const ALCchar *szDeviceName;
// Maximum number of sources that can be created
ALuint MaxNoOfSources;
@@ -273,9 +273,9 @@ struct ALCcontext_struct
ALCvoid ReleaseALC(ALCvoid);
ALCchar *AppendDeviceList(char *name);
ALCchar *AppendAllDeviceList(char *name);
ALCchar *AppendCaptureDeviceList(char *name);
void AppendDeviceList(const ALCchar *name);
void AppendAllDeviceList(const ALCchar *name);
void AppendCaptureDeviceList(const ALCchar *name);
ALCvoid SetALCError(ALenum errorCode);