diff options
-rw-r--r-- | Alc/ALc.c | 206 | ||||
-rw-r--r-- | OpenAL32/Include/alMain.h | 11 |
2 files changed, 215 insertions, 2 deletions
@@ -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 * diff --git a/OpenAL32/Include/alMain.h b/OpenAL32/Include/alMain.h index 63c996e5..934a4e0f 100644 --- a/OpenAL32/Include/alMain.h +++ b/OpenAL32/Include/alMain.h @@ -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 |