Use separate functions to find valid ALC loopback device formats

This commit is contained in:
Chris Robinson
2011-07-02 02:51:33 -07:00
parent 931d422443
commit 14bfe0293a
2 changed files with 39 additions and 12 deletions
+37 -10
View File
@@ -1001,6 +1001,38 @@ ALboolean DecomposeDevFormat(ALenum format, enum DevFmtChannels *chans,
return AL_FALSE;
}
static ALCboolean IsValidALCType(ALCenum type)
{
switch(type)
{
case ALC_BYTE:
case ALC_UNSIGNED_BYTE:
case ALC_SHORT:
case ALC_UNSIGNED_SHORT:
case ALC_INT:
case ALC_UNSIGNED_INT:
case ALC_FLOAT:
return ALC_TRUE;
}
return ALC_FALSE;
}
static ALCboolean IsValidALCChannels(ALCenum channels)
{
switch(channels)
{
case ALC_MONO:
case ALC_STEREO:
case ALC_QUAD:
case ALC_5POINT1:
case ALC_6POINT1:
case ALC_7POINT1:
return ALC_TRUE;
}
return ALC_FALSE;
}
ALboolean IsValidType(ALenum type)
{
switch(type)
@@ -1261,7 +1293,7 @@ static ALCboolean UpdateDeviceParams(ALCdevice *device, const ALCint *attrList)
device->IsLoopbackDevice)
{
ALCint val = attrList[attrIdx + 1];
if(!IsValidChannels(val) || !ChannelsFromDevFmt(val))
if(!IsValidALCChannels(val) || !ChannelsFromDevFmt(val))
{
alcSetError(device, ALC_INVALID_VALUE);
return ALC_FALSE;
@@ -1273,7 +1305,7 @@ static ALCboolean UpdateDeviceParams(ALCdevice *device, const ALCint *attrList)
device->IsLoopbackDevice)
{
ALCint val = attrList[attrIdx + 1];
if(!IsValidType(val) || !BytesFromDevFmt(val))
if(!IsValidALCType(val) || !BytesFromDevFmt(val))
{
alcSetError(device, ALC_INVALID_VALUE);
return ALC_FALSE;
@@ -2841,7 +2873,7 @@ ALC_API ALCdevice* ALC_APIENTRY alcLoopbackOpenDeviceSOFT(void)
return device;
}
ALC_API ALCboolean ALC_APIENTRY alcIsRenderFormatSupportedSOFT(ALCdevice *device, ALCsizei freq, ALenum channels, ALenum type)
ALC_API ALCboolean ALC_APIENTRY alcIsRenderFormatSupportedSOFT(ALCdevice *device, ALCsizei freq, ALCenum channels, ALCenum type)
{
ALCboolean ret = ALC_FALSE;
@@ -2850,16 +2882,11 @@ ALC_API ALCboolean ALC_APIENTRY alcIsRenderFormatSupportedSOFT(ALCdevice *device
alcSetError(device, ALC_INVALID_DEVICE);
else if(freq <= 0)
alcSetError(device, ALC_INVALID_VALUE);
else if(IsValidType(type) == AL_FALSE ||
IsValidChannels(channels) == AL_FALSE)
else if(!IsValidALCType(type) || !IsValidALCChannels(channels))
alcSetError(device, ALC_INVALID_ENUM);
else
{
if((type == DevFmtByte || type == DevFmtUByte || type == DevFmtShort ||
type == DevFmtUShort || type == DevFmtFloat) &&
(channels == DevFmtMono || channels == DevFmtStereo ||
channels == DevFmtQuad || channels == DevFmtX51 ||
channels == DevFmtX61 || channels == DevFmtX71) &&
if(BytesFromDevFmt(type) > 0 && ChannelsFromDevFmt(channels) > 0 &&
freq >= 8000)
ret = ALC_TRUE;
}
+2 -2
View File
@@ -36,11 +36,11 @@
#define ALC_7POINT1 0x1506 /* (WFX order) */
typedef ALCdevice* (ALC_APIENTRY*LPALCLOOPBACKOPENDEVICESOFT)(void);
typedef ALCboolean (ALC_APIENTRY*LPALCISRENDERFORMATSUPPORTEDSOFT)(ALCdevice *device, ALCsizei freq, ALenum channels, ALenum type);
typedef ALCboolean (ALC_APIENTRY*LPALCISRENDERFORMATSUPPORTEDSOFT)(ALCdevice *device, ALCsizei freq, ALCenum channels, ALCenum type);
typedef void (ALC_APIENTRY*LPALCRENDERSAMPLESSOFT)(ALCdevice *device, ALCvoid *buffer, ALCsizei samples);
#ifdef AL_ALEXT_PROTOTYPES
ALC_API ALCdevice* ALC_APIENTRY alcLoopbackOpenDeviceSOFT(void);
ALC_API ALCboolean ALC_APIENTRY alcIsRenderFormatSupportedSOFT(ALCdevice *device, ALCsizei freq, ALenum channels, ALenum type);
ALC_API ALCboolean ALC_APIENTRY alcIsRenderFormatSupportedSOFT(ALCdevice *device, ALCsizei freq, ALCenum channels, ALCenum type);
ALC_API void ALC_APIENTRY alcRenderSamplesSOFT(ALCdevice *device, ALCvoid *buffer, ALCsizei samples);
#endif
#endif