[openal] Can I use effect functions without using macros?

Sean s.tolstoyevski at gmail.com
Thu Jan 28 05:11:39 EST 2021


Hello Chris,
Thank you for your answer.

I've defined all these macros.

I wonder.
Is it enough just to write these?

I don't know if I should define macros differently in a different situation.


For example, in the alext.h file there is such a code:

The alcGetStringiSOFT function takes 3 parameters.

#ifndef ALC_SOFT_HRTF
#define ALC_SOFT_HRTF 1
#define ALC_HRTF_SOFT                            0x1992
#define ALC_DONT_CARE_SOFT                       0x0002
#define ALC_HRTF_STATUS_SOFT                     0x1993
#define ALC_HRTF_DISABLED_SOFT                   0x0000
#define ALC_HRTF_ENABLED_SOFT                    0x0001
#define ALC_HRTF_DENIED_SOFT                     0x0002
#define ALC_HRTF_REQUIRED_SOFT                   0x0003
#define ALC_HRTF_HEADPHONES_DETECTED_SOFT        0x0004
#define ALC_HRTF_UNSUPPORTED_FORMAT_SOFT         0x0005
#define ALC_NUM_HRTF_SPECIFIERS_SOFT             0x1994
#define ALC_HRTF_SPECIFIER_SOFT                  0x1995
#define ALC_HRTF_ID_SOFT                         0x1996
typedef const ALCchar* (ALC_APIENTRY*LPALCGETSTRINGISOFT)(ALCdevice 
*device, ALCenum paramName, ALCsizei index);
typedef ALCboolean (ALC_APIENTRY*LPALCRESETDEVICESOFT)(ALCdevice 
*device, const ALCint *attribs);
#ifdef AL_ALEXT_PROTOTYPES
ALC_API const ALCchar* ALC_APIENTRY alcGetStringiSOFT(ALCdevice *device, 
ALCenum paramName, ALCsizei index);
ALC_API ALCboolean ALC_APIENTRY alcResetDeviceSOFT(ALCdevice *device, 
const ALCint *attribs);
#endif
#endif

But a few lines below there is another definition:

2 parameters.

Can I use these two types of functions in any case with the macros I 
have defined?
Or are they for completely different situations?
So I have to rewrite the macros.

#ifndef AL_SOFT_source_resampler
#define AL_SOFT_source_resampler
#define AL_NUM_RESAMPLERS_SOFT                   0x1210
#define AL_DEFAULT_RESAMPLER_SOFT                0x1211
#define AL_SOURCE_RESAMPLER_SOFT                 0x1212
#define AL_RESAMPLER_NAME_SOFT                   0x1213
typedef const ALchar* (AL_APIENTRY*LPALGETSTRINGISOFT)(ALenum pname, 
ALsizei index);
#ifdef AL_ALEXT_PROTOTYPES
AL_API const ALchar* AL_APIENTRY alGetStringiSOFT(ALenum pname, ALsizei 
index);
#endif
#endif

* * *

My function defining macros. These are taken from the examples:

     #include "al.h"
     #include "alc.h"
     #include "alext.h"

     #include "extras.c"
     #include "sndfile.h"

     static LPALCGETSTRINGISOFT alcGetStringiSOFT;
     static LPALCRESETDEVICESOFT alcResetDeviceSOFT;

     static LPALGENFILTERS alGenFilters;
     static LPALDELETEFILTERS alDeleteFilters;
     static LPALISFILTER alIsFilter;
     static LPALFILTERI alFilteri;
     static LPALFILTERIV alFilteriv;
     static LPALFILTERF alFilterf;
     static LPALFILTERFV alFilterfv;
     static LPALGETFILTERI alGetFilteri;
     static LPALGETFILTERIV alGetFilteriv;
     static LPALGETFILTERF alGetFilterf;
     static LPALGETFILTERFV alGetFilterfv;

     static LPALGENEFFECTS alGenEffects;
     static LPALDELETEEFFECTS alDeleteEffects;
     static LPALISEFFECT alIsEffect;
     static LPALEFFECTI alEffecti;
     static LPALEFFECTIV alEffectiv;
     static LPALEFFECTF alEffectf;
     static LPALEFFECTFV alEffectfv;
     static LPALGETEFFECTI alGetEffecti;
     static LPALGETEFFECTIV alGetEffectiv;
     static LPALGETEFFECTF alGetEffectf;
     static LPALGETEFFECTFV alGetEffectfv;

     static LPALGENAUXILIARYEFFECTSLOTS alGenAuxiliaryEffectSlots;
     static LPALDELETEAUXILIARYEFFECTSLOTS alDeleteAuxiliaryEffectSlots;
     static LPALISAUXILIARYEFFECTSLOT alIsAuxiliaryEffectSlot;
     static LPALAUXILIARYEFFECTSLOTI alAuxiliaryEffectSloti;
     static LPALAUXILIARYEFFECTSLOTIV alAuxiliaryEffectSlotiv;
     static LPALAUXILIARYEFFECTSLOTF alAuxiliaryEffectSlotf;
     static LPALAUXILIARYEFFECTSLOTFV alAuxiliaryEffectSlotfv;
     static LPALGETAUXILIARYEFFECTSLOTI alGetAuxiliaryEffectSloti;
     static LPALGETAUXILIARYEFFECTSLOTIV alGetAuxiliaryEffectSlotiv;
     static LPALGETAUXILIARYEFFECTSLOTF alGetAuxiliaryEffectSlotf;
     static LPALGETAUXILIARYEFFECTSLOTFV alGetAuxiliaryEffectSlotfv;

     int init;

     void initMacros() {
     if(init != 1) {
     #define LOAD_PROC(T, x)  ((x) = (T)alGetProcAddress(#x))
     LOAD_PROC(LPALGENFILTERS, alGenFilters);
     LOAD_PROC(LPALDELETEFILTERS, alDeleteFilters);
     LOAD_PROC(LPALISFILTER, alIsFilter);
     LOAD_PROC(LPALFILTERI, alFilteri);
     LOAD_PROC(LPALFILTERIV, alFilteriv);
     LOAD_PROC(LPALFILTERF, alFilterf);
     LOAD_PROC(LPALFILTERFV, alFilterfv);
     LOAD_PROC(LPALGETFILTERI, alGetFilteri);
     LOAD_PROC(LPALGETFILTERIV, alGetFilteriv);
     LOAD_PROC(LPALGETFILTERF, alGetFilterf);
     LOAD_PROC(LPALGETFILTERFV, alGetFilterfv);

     LOAD_PROC(LPALGENEFFECTS, alGenEffects);
     LOAD_PROC(LPALDELETEEFFECTS, alDeleteEffects);
     LOAD_PROC(LPALISEFFECT, alIsEffect);
     LOAD_PROC(LPALEFFECTI, alEffecti);
     LOAD_PROC(LPALEFFECTIV, alEffectiv);
     LOAD_PROC(LPALEFFECTF, alEffectf);
     LOAD_PROC(LPALEFFECTFV, alEffectfv);
     LOAD_PROC(LPALGETEFFECTI, alGetEffecti);
     LOAD_PROC(LPALGETEFFECTIV, alGetEffectiv);
     LOAD_PROC(LPALGETEFFECTF, alGetEffectf);
     LOAD_PROC(LPALGETEFFECTFV, alGetEffectfv);

     LOAD_PROC(LPALGENAUXILIARYEFFECTSLOTS, alGenAuxiliaryEffectSlots);
     LOAD_PROC(LPALDELETEAUXILIARYEFFECTSLOTS, 
alDeleteAuxiliaryEffectSlots);
     LOAD_PROC(LPALISAUXILIARYEFFECTSLOT, alIsAuxiliaryEffectSlot);
     LOAD_PROC(LPALAUXILIARYEFFECTSLOTI, alAuxiliaryEffectSloti);
     LOAD_PROC(LPALAUXILIARYEFFECTSLOTIV, alAuxiliaryEffectSlotiv);
     LOAD_PROC(LPALAUXILIARYEFFECTSLOTF, alAuxiliaryEffectSlotf);
     LOAD_PROC(LPALAUXILIARYEFFECTSLOTFV, alAuxiliaryEffectSlotfv);
     LOAD_PROC(LPALGETAUXILIARYEFFECTSLOTI, alGetAuxiliaryEffectSloti);
     LOAD_PROC(LPALGETAUXILIARYEFFECTSLOTIV, alGetAuxiliaryEffectSlotiv);
     LOAD_PROC(LPALGETAUXILIARYEFFECTSLOTF, alGetAuxiliaryEffectSlotf);
     LOAD_PROC(LPALGETAUXILIARYEFFECTSLOTFV, alGetAuxiliaryEffectSlotfv);
#undef LOAD_PROC


#define LOAD_PROC(d, T, x)  ((x) = (T)alcGetProcAddress((d), #x))
     LOAD_PROC(device, LPALCGETSTRINGISOFT, alcGetStringiSOFT);
     LOAD_PROC(device, LPALCRESETDEVICESOFT, alcResetDeviceSOFT);
#undef LOAD_PROC

         init = 1;
         }

     }



On 27/01/2021 16:58, Chris Robinson wrote:
> On Wed, 27 Jan 2021 08:43:50 +0300
> Sean <s.tolstoyevski at gmail.com> wrote:
>
>> No, no. :) .
>>
>> This is not what I want to tell you.
>>
>> For example I want to be able to use alGenFilters without LOAD_PROC.
>> Can I use these effect functions without writing the code between
>> #define and #undef?
> Oh, sorry I misunderstood.
>
> Yes it is possible, but you still need to load the function pointers.
> The macros are just there to avoid repetition and prevent errors.
> You'll need to do
>
> static LPALGENFILTERS alGenFilters;
> ...
> alGenFilters = (LPALGENFILTERS)alGetProcAddress("alGenFilters");
>
> for each EFX function (the cast may or may not be necessary).
>
> But be aware, for a general wrapper, an issue you may run into is that
> the function pointers are context-, device-, or driver-specific. This
> is really only a concern on Windows with the router DLL, but the pointer
> you get from a Generic Software device may be different from the
> pointer you get from an OpenAL Soft device, and you can't use one for
> the other.
>
> The alternative is to only link with OpenAL versions that export the
> functions directly, and I'm not sure which implementations do that
> aside from OpenAL Soft. At least until I add support for them in OpenAL
> Soft's router replacement/implementation.


More information about the openal mailing list