bool openal_init() { dev=alcOpenDevice(NULL); if(!dev) return true; ctx=alcCreateContext(dev,NULL); if(!ctx) return true; if(!alcMakeContextCurrent(ctx)) return true; sound_init_extensions(); /* if(cvars["s_volume"]>100) cvars["s_volume"]=100; if(cvars["s_on"]) alListenerf(AL_GAIN,float(cvars["s_volume"])/100); else alListenerf(AL_GAIN,0.0f); */ alGenAuxiliaryEffectSlots(1,&uiEffectSlot); alGenEffects(1,&uiEffect); alEffecti(uiEffect,AL_EFFECT_TYPE,AL_EFFECT_REVERB); alAuxiliaryEffectSloti(uiEffectSlot,AL_EFFECTSLOT_EFFECT,uiEffect); alGenFilters(1,&uiFilter); alFilteri(uiFilter,AL_FILTER_TYPE,AL_FILTER_LOWPASS); alFilterf(uiFilter,AL_LOWPASS_GAIN,1.0f); alFilterf(uiFilter,AL_LOWPASS_GAINHF,0.1f); soundbuffers.push_back(new SoundBuffer("data/sfx/01.ogg")); soundbuffers.push_back(new SoundBuffer("data/sfx/02.ogg")); return false; }
// Thread: Any. Must be locked: AudioMutex. bool CreatePlaybackDevice() { if (AudioDevice) return true; AudioDevice = alcOpenDevice(nullptr); if (!AudioDevice) { LOG(("Audio Error: Could not create default playback device, enumerating..")); EnumeratePlaybackDevices(); return false; } ALCint attributes[] = { ALC_STEREO_SOURCES, 128, ALC_FREQUENCY, Media::Player::kDefaultFrequency, 0 }; AudioContext = alcCreateContext(AudioDevice, attributes); alcMakeContextCurrent(AudioContext); if (ContextErrorHappened()) { DestroyPlaybackDevice(); return false; } ALfloat v[] = { 0.f, 0.f, -1.f, 0.f, 1.f, 0.f }; alListener3f(AL_POSITION, 0.f, 0.f, 0.f); alListener3f(AL_VELOCITY, 0.f, 0.f, 0.f); alListenerfv(AL_ORIENTATION, v); #ifndef TDESKTOP_DISABLE_OPENAL_EFFECTS // playback speed related init // generate an effect slot and an effect alGenAuxiliaryEffectSlots(1, &_playbackSpeedData.uiEffectSlot); alGenEffects(1, &_playbackSpeedData.uiEffect); // initialize the pitch shifter effect alEffecti(_playbackSpeedData.uiEffect, AL_EFFECT_TYPE, AL_EFFECT_PITCH_SHIFTER); // 12 semitones = 1 octave alEffecti(_playbackSpeedData.uiEffect, AL_PITCH_SHIFTER_COARSE_TUNE, kPlaybackSpeedTune); // connect the effect with the effect slot alAuxiliaryEffectSloti(_playbackSpeedData.uiEffectSlot, AL_EFFECTSLOT_EFFECT, _playbackSpeedData.uiEffect); // initialize a filter to disable the direct (dry) path alGenFilters(1, &_playbackSpeedData.uiFilter); alFilteri(_playbackSpeedData.uiFilter, AL_FILTER_TYPE, AL_FILTER_LOWPASS); // disable all frequencies alFilterf(_playbackSpeedData.uiFilter, AL_LOWPASS_GAIN, 0.f); // to use the modified playback speed: // connect both the effect slot and filter with the stream source and set AL_PITCH #endif // TDESKTOP_DISABLE_OPENAL_EFFECTS alDistanceModel(AL_NONE); return true; }
void CEFX::CommitEffects() { if (!supported) return; //! commit reverb properties for (std::map<ALuint, ALfloat>::iterator it = sfxProperties->properties_f.begin(); it != sfxProperties->properties_f.end(); ++it) alEffectf(sfxReverb, it->first, it->second); for (std::map<ALuint, ALint>::iterator it = sfxProperties->properties_i.begin(); it != sfxProperties->properties_i.end(); ++it) alEffecti(sfxReverb, it->first, it->second); for (std::map<ALuint, float3>::iterator it = sfxProperties->properties_v.begin(); it != sfxProperties->properties_v.end(); ++it) alEffectfv(sfxReverb, it->first, (ALfloat*)&it->second[0]); alEffectf(sfxReverb, AL_EAXREVERB_ROOM_ROLLOFF_FACTOR, sfxProperties->properties_f[AL_EAXREVERB_ROOM_ROLLOFF_FACTOR] * heightRolloffModifier); alAuxiliaryEffectSloti(sfxSlot, AL_EFFECTSLOT_EFFECT, sfxReverb); for (std::map<ALuint, ALfloat>::iterator it=sfxProperties->filter_properties_f.begin(); it != sfxProperties->filter_properties_f.end(); ++it) alFilterf(sfxFilter, it->first, it->second); updates++; }
ALvoid AL_APIENTRY alFilterfv(ALuint filter, ALenum param, ALfloat *pflValues) { ALCcontext *Context; Context = alcGetCurrentContext(); SuspendContext(Context); if (filter && alIsFilter(filter)) { switch(param) { default: alFilterf(filter, param, pflValues[0]); break; } } else alSetError(AL_INVALID_NAME); ProcessContext(Context); }
AL_API ALvoid AL_APIENTRY alFilterfv(ALuint filter, ALenum param, ALfloat *pflValues) { ALCcontext *Context; ALCdevice *Device; Context = GetContextSuspended(); if(!Context) return; Device = Context->Device; if(LookupFilter(Device->FilterMap, filter) != NULL) { switch(param) { default: alFilterf(filter, param, pflValues[0]); break; } } else alSetError(Context, AL_INVALID_NAME); ProcessContext(Context); }
static ALvoid CDECL wine_alFilterf(ALuint fid, ALenum param, ALfloat value) { alFilterf(fid, param, value); }
AL_API ALvoid AL_APIENTRY alFilterfv(ALuint filter, ALenum param, ALfloat *pflValues) { /* There are currently no multi-value filter parameters */ alFilterf(filter, param, pflValues[0]); }