Add an alcGetInteger64vSOFT method and a way to get the device clock
This commit is contained in:
parent
69f3a7da6d
commit
112b0f166f
206
Alc/ALc.c
206
Alc/ALc.c
@ -153,6 +153,8 @@ static const ALCfunction alcFunctions[] = {
|
||||
DECL(alcDevicePauseSOFT),
|
||||
DECL(alcDeviceResumeSOFT),
|
||||
|
||||
DECL(alcGetInteger64vSOFT),
|
||||
|
||||
DECL(alEnable),
|
||||
DECL(alDisable),
|
||||
DECL(alIsEnabled),
|
||||
@ -744,8 +746,8 @@ static const ALCchar alcNoDeviceExtList[] =
|
||||
static const ALCchar alcExtensionList[] =
|
||||
"ALC_ENUMERATE_ALL_EXT ALC_ENUMERATION_EXT ALC_EXT_CAPTURE "
|
||||
"ALC_EXT_DEDICATED ALC_EXT_disconnect ALC_EXT_EFX "
|
||||
"ALC_EXT_thread_local_context ALC_SOFTX_HRTF ALC_SOFT_loopback "
|
||||
"ALC_SOFTX_midi_interface ALC_SOFTX_pause_device";
|
||||
"ALC_EXT_thread_local_context ALC_SOFTX_device_clock ALC_SOFTX_HRTF "
|
||||
"ALC_SOFT_loopback ALC_SOFTX_midi_interface ALC_SOFTX_pause_device";
|
||||
static const ALCint alcMajorVersion = 1;
|
||||
static const ALCint alcMinorVersion = 1;
|
||||
|
||||
@ -2626,6 +2628,206 @@ ALC_API ALCvoid ALC_APIENTRY alcGetIntegerv(ALCdevice *device,ALCenum param,ALsi
|
||||
ALCdevice_DecRef(device);
|
||||
}
|
||||
|
||||
ALC_API void ALC_APIENTRY alcGetInteger64vSOFT(ALCdevice *device, ALCenum pname, ALsizei size, ALCint64SOFT *values)
|
||||
{
|
||||
device = VerifyDevice(device);
|
||||
|
||||
if(size == 0 || values == NULL)
|
||||
{
|
||||
alcSetError(device, ALC_INVALID_VALUE);
|
||||
if(device) ALCdevice_DecRef(device);
|
||||
return;
|
||||
}
|
||||
|
||||
if(!device)
|
||||
{
|
||||
switch(pname)
|
||||
{
|
||||
case ALC_MAJOR_VERSION:
|
||||
*values = alcMajorVersion;
|
||||
break;
|
||||
case ALC_MINOR_VERSION:
|
||||
*values = alcMinorVersion;
|
||||
break;
|
||||
|
||||
case ALC_ATTRIBUTES_SIZE:
|
||||
case ALC_ALL_ATTRIBUTES:
|
||||
case ALC_FREQUENCY:
|
||||
case ALC_REFRESH:
|
||||
case ALC_SYNC:
|
||||
case ALC_MONO_SOURCES:
|
||||
case ALC_STEREO_SOURCES:
|
||||
case ALC_CAPTURE_SAMPLES:
|
||||
case ALC_FORMAT_CHANNELS_SOFT:
|
||||
case ALC_FORMAT_TYPE_SOFT:
|
||||
alcSetError(NULL, ALC_INVALID_DEVICE);
|
||||
break;
|
||||
|
||||
default:
|
||||
alcSetError(NULL, ALC_INVALID_ENUM);
|
||||
break;
|
||||
}
|
||||
}
|
||||
else if(device->Type == Capture)
|
||||
{
|
||||
switch(pname)
|
||||
{
|
||||
case ALC_CAPTURE_SAMPLES:
|
||||
ALCdevice_Lock(device);
|
||||
*values = V0(device->Backend,availableSamples)();
|
||||
ALCdevice_Unlock(device);
|
||||
break;
|
||||
|
||||
case ALC_CONNECTED:
|
||||
*values = device->Connected;
|
||||
break;
|
||||
|
||||
default:
|
||||
alcSetError(device, ALC_INVALID_ENUM);
|
||||
break;
|
||||
}
|
||||
}
|
||||
else /* render device */
|
||||
{
|
||||
switch(pname)
|
||||
{
|
||||
case ALC_MAJOR_VERSION:
|
||||
*values = alcMajorVersion;
|
||||
break;
|
||||
|
||||
case ALC_MINOR_VERSION:
|
||||
*values = alcMinorVersion;
|
||||
break;
|
||||
|
||||
case ALC_EFX_MAJOR_VERSION:
|
||||
*values = alcEFXMajorVersion;
|
||||
break;
|
||||
|
||||
case ALC_EFX_MINOR_VERSION:
|
||||
*values = alcEFXMinorVersion;
|
||||
break;
|
||||
|
||||
case ALC_ATTRIBUTES_SIZE:
|
||||
*values = 17;
|
||||
break;
|
||||
|
||||
case ALC_ALL_ATTRIBUTES:
|
||||
if(size < 17)
|
||||
alcSetError(device, ALC_INVALID_VALUE);
|
||||
else
|
||||
{
|
||||
int i = 0;
|
||||
|
||||
V0(device->Backend,lock)();
|
||||
values[i++] = ALC_FREQUENCY;
|
||||
values[i++] = device->Frequency;
|
||||
|
||||
if(device->Type != Loopback)
|
||||
{
|
||||
values[i++] = ALC_REFRESH;
|
||||
values[i++] = device->Frequency / device->UpdateSize;
|
||||
|
||||
values[i++] = ALC_SYNC;
|
||||
values[i++] = ALC_FALSE;
|
||||
}
|
||||
else
|
||||
{
|
||||
values[i++] = ALC_FORMAT_CHANNELS_SOFT;
|
||||
values[i++] = device->FmtChans;
|
||||
|
||||
values[i++] = ALC_FORMAT_TYPE_SOFT;
|
||||
values[i++] = device->FmtType;
|
||||
}
|
||||
|
||||
values[i++] = ALC_MONO_SOURCES;
|
||||
values[i++] = device->NumMonoSources;
|
||||
|
||||
values[i++] = ALC_STEREO_SOURCES;
|
||||
values[i++] = device->NumStereoSources;
|
||||
|
||||
values[i++] = ALC_MAX_AUXILIARY_SENDS;
|
||||
values[i++] = device->NumAuxSends;
|
||||
|
||||
values[i++] = ALC_HRTF_SOFT;
|
||||
values[i++] = (device->Hrtf ? ALC_TRUE : ALC_FALSE);
|
||||
|
||||
values[i++] = ALC_DEVICE_CLOCK_SOFT;
|
||||
values[i++] = device->ClockBase +
|
||||
(device->SamplesDone * DEVICE_CLOCK_RES / device->Frequency);
|
||||
|
||||
values[i++] = 0;
|
||||
V0(device->Backend,unlock)();
|
||||
}
|
||||
break;
|
||||
|
||||
case ALC_FREQUENCY:
|
||||
*values = device->Frequency;
|
||||
break;
|
||||
|
||||
case ALC_REFRESH:
|
||||
if(device->Type == Loopback)
|
||||
alcSetError(device, ALC_INVALID_DEVICE);
|
||||
else
|
||||
*values = device->Frequency / device->UpdateSize;
|
||||
break;
|
||||
|
||||
case ALC_SYNC:
|
||||
if(device->Type == Loopback)
|
||||
alcSetError(device, ALC_INVALID_DEVICE);
|
||||
else
|
||||
*values = ALC_FALSE;
|
||||
break;
|
||||
|
||||
case ALC_FORMAT_CHANNELS_SOFT:
|
||||
if(device->Type != Loopback)
|
||||
alcSetError(device, ALC_INVALID_DEVICE);
|
||||
else
|
||||
*values = device->FmtChans;
|
||||
break;
|
||||
|
||||
case ALC_FORMAT_TYPE_SOFT:
|
||||
if(device->Type != Loopback)
|
||||
alcSetError(device, ALC_INVALID_DEVICE);
|
||||
else
|
||||
*values = device->FmtType;
|
||||
break;
|
||||
|
||||
case ALC_MONO_SOURCES:
|
||||
*values = device->NumMonoSources;
|
||||
break;
|
||||
|
||||
case ALC_STEREO_SOURCES:
|
||||
*values = device->NumStereoSources;
|
||||
break;
|
||||
|
||||
case ALC_MAX_AUXILIARY_SENDS:
|
||||
*values = device->NumAuxSends;
|
||||
break;
|
||||
|
||||
case ALC_CONNECTED:
|
||||
*values = device->Connected;
|
||||
break;
|
||||
|
||||
case ALC_HRTF_SOFT:
|
||||
*values = (device->Hrtf ? ALC_TRUE : ALC_FALSE);
|
||||
break;
|
||||
|
||||
case ALC_DEVICE_CLOCK_SOFT:
|
||||
V0(device->Backend,lock)();
|
||||
*values = device->ClockBase +
|
||||
(device->SamplesDone * DEVICE_CLOCK_RES / device->Frequency);
|
||||
V0(device->Backend,unlock)();
|
||||
break;
|
||||
|
||||
default:
|
||||
alcSetError(device, ALC_INVALID_ENUM);
|
||||
break;
|
||||
}
|
||||
}
|
||||
if(device)
|
||||
ALCdevice_DecRef(device);
|
||||
}
|
||||
|
||||
|
||||
/* alcIsExtensionPresent
|
||||
*
|
||||
|
@ -228,6 +228,17 @@ ALC_API void ALC_APIENTRY alcDeviceResumeSOFT(ALCdevice *device);
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#ifndef ALC_SOFT_device_clock
|
||||
#define ALC_SOFT_device_clock 1
|
||||
typedef int64_t ALCint64SOFT;
|
||||
typedef uint64_t ALCuint64SOFT;
|
||||
#define ALC_DEVICE_CLOCK_SOFT 0x1600
|
||||
typedef void (ALC_APIENTRY*LPALCGETINTEGER64VSOFT)(ALCdevice *device, ALCenum pname, ALsizei size, ALCint64SOFT *values);
|
||||
#ifdef AL_ALEXT_PROTOTYPES
|
||||
ALC_API void ALC_APIENTRY alcGetInteger64vSOFT(ALCdevice *device, ALCenum pname, ALsizei size, ALCint64SOFT *values);
|
||||
#endif
|
||||
#endif
|
||||
|
||||
|
||||
#ifdef IN_IDE_PARSER
|
||||
/* KDevelop's parser doesn't recognize the C99-standard restrict keyword, but
|
||||
|
Loading…
x
Reference in New Issue
Block a user