/** * @brief Creates a sound environment. */ int sound_al_env( SoundEnv_t env, double param ) { int i; ALuint s; ALfloat f; soundLock(); switch (env) { case SOUND_ENV_NORMAL: /* Set global parameters. */ alSpeedOfSound( 3433. ); if (al_info.efx == AL_TRUE) { /* Disconnect the effect. */ nalAuxiliaryEffectSloti( efx_directSlot, AL_EFFECTSLOT_EFFECT, AL_EFFECT_NULL ); /* Set per-source parameters. */ for (i=0; i<source_ntotal; i++) { s = source_total[i]; alSourcef( s, AL_AIR_ABSORPTION_FACTOR, 0. ); } } break; case SOUND_ENV_NEBULA: f = param / 1000.; /* Set global parameters. */ alSpeedOfSound( 3433./(1. + f*2.) ); if (al_info.efx == AL_TRUE) { if (al_info.efx_reverb == AL_TRUE) { /* Tweak the reverb. */ nalEffectf( efx_reverb, AL_REVERB_DECAY_TIME, 10. ); nalEffectf( efx_reverb, AL_REVERB_DECAY_HFRATIO, 0.5 ); /* Connect the effect. */ nalAuxiliaryEffectSloti( efx_directSlot, AL_EFFECTSLOT_EFFECT, efx_reverb ); } /* Set per-source parameters. */ for (i=0; i<source_ntotal; i++) { s = source_total[i]; alSourcef( s, AL_AIR_ABSORPTION_FACTOR, 3.*f ); } } break; } /* Check for errors. */ al_checkErr(); soundUnlock(); return 0; }
/** * @brief Enables the OpenAL EFX extension. * * @return 0 on success. */ static int al_enableEFX (void) { /* Get general information. */ alcGetIntegerv( al_device, ALC_MAX_AUXILIARY_SENDS, 1, &al_info.efx_auxSends ); alcGetIntegerv( al_device, ALC_EFX_MAJOR_VERSION, 1, &al_info.efx_major ); alcGetIntegerv( al_device, ALC_EFX_MINOR_VERSION, 1, &al_info.efx_minor ); /* Get function pointers. */ nalGenAuxiliaryEffectSlots = alGetProcAddress( "alGenAuxiliaryEffectSlots" ); nalDeleteAuxiliaryEffectSlots = alGetProcAddress( "alDeleteAuxiliaryEffectSlots" ); nalIsAuxiliaryEffectSlot = alGetProcAddress( "alIsAuxiliaryEffectSlot" ); nalAuxiliaryEffectSloti = alGetProcAddress( "alAuxiliaryEffectSloti" ); nalAuxiliaryEffectSlotiv = alGetProcAddress( "alAuxiliaryEffectSlotiv" ); nalAuxiliaryEffectSlotf = alGetProcAddress( "alAuxiliaryEffectSlotf" ); nalAuxiliaryEffectSlotfv = alGetProcAddress( "alAuxiliaryEffectSlotfv" ); nalGetAuxiliaryEffectSloti = alGetProcAddress( "alGetAuxiliaryEffectSloti" ); nalGetAuxiliaryEffectSlotiv = alGetProcAddress( "alGetAuxiliaryEffectSlotiv" ); nalGetAuxiliaryEffectSlotf = alGetProcAddress( "alGetAuxiliaryEffectSlotf" ); nalGetAuxiliaryEffectSlotfv = alGetProcAddress( "alGetAuxiliaryEffectSlotfv" ); nalGenFilters = alGetProcAddress( "alGenFilters" ); nalDeleteFilters = alGetProcAddress( "alDeleteFilters" ); nalFilteri = alGetProcAddress( "alFilteri" ); nalFilteriv = alGetProcAddress( "alFilteriv" ); nalFilterf = alGetProcAddress( "alFilterf" ); nalFilterfv = alGetProcAddress( "alFilterfv" ); nalGenEffects = alGetProcAddress( "alGenEffects" ); nalDeleteEffects = alGetProcAddress( "alDeleteEffects" ); nalEffecti = alGetProcAddress( "alEffecti" ); nalEffectiv = alGetProcAddress( "alEffectiv" ); nalEffectf = alGetProcAddress( "alEffectf" ); nalEffectfv = alGetProcAddress( "alEffectfv" ); if (!nalGenAuxiliaryEffectSlots || !nalDeleteAuxiliaryEffectSlots || !nalIsAuxiliaryEffectSlot || !nalAuxiliaryEffectSloti || !nalAuxiliaryEffectSlotiv || !nalAuxiliaryEffectSlotf || !nalAuxiliaryEffectSlotfv || !nalGetAuxiliaryEffectSloti || !nalGetAuxiliaryEffectSlotiv || !nalGetAuxiliaryEffectSlotf || !nalGetAuxiliaryEffectSlotfv || !nalGenFilters || !nalDeleteFilters || !nalFilteri || !nalFilteriv || !nalFilterf || !nalFilterfv || !nalGenEffects || !nalDeleteEffects || !nalEffecti || !nalEffectiv || !nalEffectf || !nalEffectfv) { DEBUG("OpenAL EFX functions not found, disabling EFX."); al_info.efx = AL_FALSE; return -1; } /* Create auxiliary slot. */ nalGenAuxiliaryEffectSlots( 1, &efx_directSlot ); /* Create reverb effect. */ nalGenEffects( 1, &efx_reverb ); nalEffecti( efx_reverb, AL_EFFECT_TYPE, AL_EFFECT_REVERB ); if(alGetError() != AL_NO_ERROR) { DEBUG("OpenAL Reverb not found, disabling."); al_info.efx_reverb = AL_FALSE; nalDeleteEffects( 1, &efx_reverb ); } else { al_info.efx_reverb = AL_TRUE; /* Set Reverb parameters. */ /*nalEffectf( efx_reverb, AL_REVERB_DECAY_TIME, 15. );*/ } /* Create echo effect. */ nalGenEffects( 1, &efx_echo ); nalEffecti( efx_echo, AL_EFFECT_TYPE, AL_EFFECT_ECHO ); if(alGetError() != AL_NO_ERROR) { DEBUG("OpenAL Echo not found, disabling."); al_info.efx_echo = AL_FALSE; nalDeleteEffects( 1, &efx_echo ); } else { al_info.efx_echo = AL_TRUE; /* Set Echo parameters. */ nalEffectf( efx_echo, AL_ECHO_DELAY, 0.207 ); } /* Set up the listener. */ alListenerf( AL_METERS_PER_UNIT, 5. ); /* Check for errors. */ al_checkErr(); return 0; }
/** * @brief Creates a sound environment. */ int sound_al_env( SoundEnv_t env, double param ) { int i; ALuint s; ALfloat f; soundLock(); switch (env) { case SOUND_ENV_NORMAL: /* Set global parameters. */ alSpeedOfSound( 3433. ); if (al_info.efx == AL_TRUE) { /* Disconnect the effect. */ nalAuxiliaryEffectSloti( efx_directSlot, AL_EFFECTSLOT_EFFECT, AL_EFFECT_NULL ); /* Set per-source parameters. */ for (i=0; i<source_ntotal; i++) { s = source_total[i]; alSourcef( s, AL_AIR_ABSORPTION_FACTOR, 0. ); } } break; case SOUND_ENV_NEBULA: f = param / 1000.; /* Set global parameters. */ alSpeedOfSound( 3433./(1. + f*2.) ); if (al_info.efx == AL_TRUE) { if (al_info.efx_reverb == AL_TRUE) { /* Tweak the reverb. */ nalEffectf( efx_reverb, AL_REVERB_DECAY_TIME, 10. ); nalEffectf( efx_reverb, AL_REVERB_DECAY_HFRATIO, 0.5 ); /* Connect the effect. */ nalAuxiliaryEffectSloti( efx_directSlot, AL_EFFECTSLOT_EFFECT, efx_reverb ); } /* Set per-source parameters. */ for (i=0; i<source_ntotal; i++) { s = source_total[i]; /* Value is from 0. (normal) to 10.. * It represents the attenuation per meter. In this case it decreases by * 0.05*AB_FACTOR dB/meter where AB_FACTOR is the air absoprtion factor. * In our case each pixel represents 5 meters. */ alSourcef( s, AL_AIR_ABSORPTION_FACTOR, 3.*f ); } } break; } /* Check for errors. */ al_checkErr(); soundUnlock(); return 0; }