rlm@0: /** rlm@0: * OpenAL cross platform audio library rlm@0: * Copyright (C) 1999-2000 by authors. rlm@0: * This library is free software; you can redistribute it and/or rlm@0: * modify it under the terms of the GNU Library General Public rlm@0: * License as published by the Free Software Foundation; either rlm@0: * version 2 of the License, or (at your option) any later version. rlm@0: * rlm@0: * This library is distributed in the hope that it will be useful, rlm@0: * but WITHOUT ANY WARRANTY; without even the implied warranty of rlm@0: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU rlm@0: * Library General Public License for more details. rlm@0: * rlm@0: * You should have received a copy of the GNU Library General Public rlm@0: * License along with this library; if not, write to the rlm@0: * Free Software Foundation, Inc., 59 Temple Place - Suite 330, rlm@0: * Boston, MA 02111-1307, USA. rlm@0: * Or go to http://www.gnu.org/copyleft/lgpl.html rlm@0: */ rlm@0: rlm@0: #include "config.h" rlm@0: rlm@0: #include "alMain.h" rlm@0: #include "AL/alc.h" rlm@0: #include "alError.h" rlm@0: #include "alListener.h" rlm@0: #include "alSource.h" rlm@0: rlm@0: AL_API ALvoid AL_APIENTRY alListenerf(ALenum eParam, ALfloat flValue) rlm@0: { rlm@0: ALCcontext *pContext; rlm@0: rlm@0: pContext = GetLockedContext(); rlm@0: if(!pContext) return; rlm@0: rlm@0: switch(eParam) rlm@0: { rlm@0: case AL_GAIN: rlm@0: if(flValue >= 0.0f && isfinite(flValue)) rlm@0: { rlm@0: pContext->Listener.Gain = flValue; rlm@0: pContext->UpdateSources = AL_TRUE; rlm@0: } rlm@0: else rlm@0: alSetError(pContext, AL_INVALID_VALUE); rlm@0: break; rlm@0: rlm@0: case AL_METERS_PER_UNIT: rlm@0: if(flValue > 0.0f && isfinite(flValue)) rlm@0: { rlm@0: pContext->Listener.MetersPerUnit = flValue; rlm@0: pContext->UpdateSources = AL_TRUE; rlm@0: } rlm@0: else rlm@0: alSetError(pContext, AL_INVALID_VALUE); rlm@0: break; rlm@0: rlm@0: default: rlm@0: alSetError(pContext, AL_INVALID_ENUM); rlm@0: break; rlm@0: } rlm@0: rlm@0: UnlockContext(pContext); rlm@0: } rlm@0: rlm@0: rlm@0: AL_API ALvoid AL_APIENTRY alListener3f(ALenum eParam, ALfloat flValue1, ALfloat flValue2, ALfloat flValue3) rlm@0: { rlm@0: ALCcontext *pContext; rlm@0: rlm@0: pContext = GetLockedContext(); rlm@0: if(!pContext) return; rlm@0: rlm@0: switch(eParam) rlm@0: { rlm@0: case AL_POSITION: rlm@0: if(isfinite(flValue1) && isfinite(flValue2) && isfinite(flValue3)) rlm@0: { rlm@0: pContext->Listener.Position[0] = flValue1; rlm@0: pContext->Listener.Position[1] = flValue2; rlm@0: pContext->Listener.Position[2] = flValue3; rlm@0: pContext->UpdateSources = AL_TRUE; rlm@0: } rlm@0: else rlm@0: alSetError(pContext, AL_INVALID_VALUE); rlm@0: break; rlm@0: rlm@0: case AL_VELOCITY: rlm@0: if(isfinite(flValue1) && isfinite(flValue2) && isfinite(flValue3)) rlm@0: { rlm@0: pContext->Listener.Velocity[0] = flValue1; rlm@0: pContext->Listener.Velocity[1] = flValue2; rlm@0: pContext->Listener.Velocity[2] = flValue3; rlm@0: pContext->UpdateSources = AL_TRUE; rlm@0: } rlm@0: else rlm@0: alSetError(pContext, AL_INVALID_VALUE); rlm@0: break; rlm@0: rlm@0: default: rlm@0: alSetError(pContext, AL_INVALID_ENUM); rlm@0: break; rlm@0: } rlm@0: rlm@0: UnlockContext(pContext); rlm@0: } rlm@0: rlm@0: rlm@0: AL_API ALvoid AL_APIENTRY alListenerfv(ALenum eParam, const ALfloat *pflValues) rlm@0: { rlm@0: ALCcontext *pContext; rlm@0: rlm@0: if(pflValues) rlm@0: { rlm@0: switch(eParam) rlm@0: { rlm@0: case AL_GAIN: rlm@0: case AL_METERS_PER_UNIT: rlm@0: alListenerf(eParam, pflValues[0]); rlm@0: return; rlm@0: rlm@0: case AL_POSITION: rlm@0: case AL_VELOCITY: rlm@0: alListener3f(eParam, pflValues[0], pflValues[1], pflValues[2]); rlm@0: return; rlm@0: } rlm@0: } rlm@0: rlm@0: pContext = GetLockedContext(); rlm@0: if(!pContext) return; rlm@0: rlm@0: if(pflValues) rlm@0: { rlm@0: switch(eParam) rlm@0: { rlm@0: case AL_ORIENTATION: rlm@0: if(isfinite(pflValues[0]) && isfinite(pflValues[1]) && rlm@0: isfinite(pflValues[2]) && isfinite(pflValues[3]) && rlm@0: isfinite(pflValues[4]) && isfinite(pflValues[5])) rlm@0: { rlm@0: // AT then UP rlm@0: pContext->Listener.Forward[0] = pflValues[0]; rlm@0: pContext->Listener.Forward[1] = pflValues[1]; rlm@0: pContext->Listener.Forward[2] = pflValues[2]; rlm@0: pContext->Listener.Up[0] = pflValues[3]; rlm@0: pContext->Listener.Up[1] = pflValues[4]; rlm@0: pContext->Listener.Up[2] = pflValues[5]; rlm@0: pContext->UpdateSources = AL_TRUE; rlm@0: } rlm@0: else rlm@0: alSetError(pContext, AL_INVALID_VALUE); rlm@0: break; rlm@0: rlm@0: default: rlm@0: alSetError(pContext, AL_INVALID_ENUM); rlm@0: break; rlm@0: } rlm@0: } rlm@0: else rlm@0: alSetError(pContext, AL_INVALID_VALUE); rlm@0: rlm@0: UnlockContext(pContext); rlm@0: } rlm@0: rlm@0: rlm@0: AL_API ALvoid AL_APIENTRY alListeneri(ALenum eParam, ALint lValue) rlm@0: { rlm@0: ALCcontext *pContext; rlm@0: rlm@0: (void)lValue; rlm@0: rlm@0: pContext = GetLockedContext(); rlm@0: if(!pContext) return; rlm@0: rlm@0: switch(eParam) rlm@0: { rlm@0: default: rlm@0: alSetError(pContext, AL_INVALID_ENUM); rlm@0: break; rlm@0: } rlm@0: rlm@0: UnlockContext(pContext); rlm@0: } rlm@0: rlm@0: rlm@0: AL_API void AL_APIENTRY alListener3i(ALenum eParam, ALint lValue1, ALint lValue2, ALint lValue3) rlm@0: { rlm@0: ALCcontext *pContext; rlm@0: rlm@0: switch(eParam) rlm@0: { rlm@0: case AL_POSITION: rlm@0: case AL_VELOCITY: rlm@0: alListener3f(eParam, (ALfloat)lValue1, (ALfloat)lValue2, (ALfloat)lValue3); rlm@0: return; rlm@0: } rlm@0: rlm@0: pContext = GetLockedContext(); rlm@0: if(!pContext) return; rlm@0: rlm@0: switch(eParam) rlm@0: { rlm@0: default: rlm@0: alSetError(pContext, AL_INVALID_ENUM); rlm@0: break; rlm@0: } rlm@0: rlm@0: UnlockContext(pContext); rlm@0: } rlm@0: rlm@0: rlm@0: AL_API void AL_APIENTRY alListeneriv( ALenum eParam, const ALint* plValues ) rlm@0: { rlm@0: ALCcontext *pContext; rlm@0: ALfloat flValues[6]; rlm@0: rlm@0: if(plValues) rlm@0: { rlm@0: switch(eParam) rlm@0: { rlm@0: case AL_POSITION: rlm@0: case AL_VELOCITY: rlm@0: alListener3f(eParam, plValues[0], plValues[1], plValues[2]); rlm@0: return; rlm@0: rlm@0: case AL_ORIENTATION: rlm@0: flValues[0] = (ALfloat)plValues[0]; rlm@0: flValues[1] = (ALfloat)plValues[1]; rlm@0: flValues[2] = (ALfloat)plValues[2]; rlm@0: flValues[3] = (ALfloat)plValues[3]; rlm@0: flValues[4] = (ALfloat)plValues[4]; rlm@0: flValues[5] = (ALfloat)plValues[5]; rlm@0: alListenerfv(eParam, flValues); rlm@0: return; rlm@0: } rlm@0: } rlm@0: rlm@0: pContext = GetLockedContext(); rlm@0: if(!pContext) return; rlm@0: rlm@0: if(plValues) rlm@0: { rlm@0: switch(eParam) rlm@0: { rlm@0: default: rlm@0: alSetError(pContext, AL_INVALID_ENUM); rlm@0: break; rlm@0: } rlm@0: } rlm@0: else rlm@0: alSetError(pContext, AL_INVALID_VALUE); rlm@0: rlm@0: UnlockContext(pContext); rlm@0: } rlm@0: rlm@0: rlm@0: AL_API ALvoid AL_APIENTRY alGetListenerf(ALenum eParam, ALfloat *pflValue) rlm@0: { rlm@0: ALCcontext *pContext; rlm@0: rlm@0: pContext = GetLockedContext(); rlm@0: if(!pContext) return; rlm@0: rlm@0: if(pflValue) rlm@0: { rlm@0: switch(eParam) rlm@0: { rlm@0: case AL_GAIN: rlm@0: *pflValue = pContext->Listener.Gain; rlm@0: break; rlm@0: rlm@0: case AL_METERS_PER_UNIT: rlm@0: *pflValue = pContext->Listener.MetersPerUnit; rlm@0: break; rlm@0: rlm@0: default: rlm@0: alSetError(pContext, AL_INVALID_ENUM); rlm@0: break; rlm@0: } rlm@0: } rlm@0: else rlm@0: alSetError(pContext, AL_INVALID_VALUE); rlm@0: rlm@0: UnlockContext(pContext); rlm@0: } rlm@0: rlm@0: rlm@0: AL_API ALvoid AL_APIENTRY alGetListener3f(ALenum eParam, ALfloat *pflValue1, ALfloat *pflValue2, ALfloat *pflValue3) rlm@0: { rlm@0: ALCcontext *pContext; rlm@0: rlm@0: pContext = GetLockedContext(); rlm@0: if(!pContext) return; rlm@0: rlm@0: if(pflValue1 && pflValue2 && pflValue3) rlm@0: { rlm@0: switch(eParam) rlm@0: { rlm@0: case AL_POSITION: rlm@0: *pflValue1 = pContext->Listener.Position[0]; rlm@0: *pflValue2 = pContext->Listener.Position[1]; rlm@0: *pflValue3 = pContext->Listener.Position[2]; rlm@0: break; rlm@0: rlm@0: case AL_VELOCITY: rlm@0: *pflValue1 = pContext->Listener.Velocity[0]; rlm@0: *pflValue2 = pContext->Listener.Velocity[1]; rlm@0: *pflValue3 = pContext->Listener.Velocity[2]; rlm@0: break; rlm@0: rlm@0: default: rlm@0: alSetError(pContext, AL_INVALID_ENUM); rlm@0: break; rlm@0: } rlm@0: } rlm@0: else rlm@0: alSetError(pContext, AL_INVALID_VALUE); rlm@0: rlm@0: UnlockContext(pContext); rlm@0: } rlm@0: rlm@0: rlm@0: AL_API ALvoid AL_APIENTRY alGetListenerfv(ALenum eParam, ALfloat *pflValues) rlm@0: { rlm@0: ALCcontext *pContext; rlm@0: rlm@0: switch(eParam) rlm@0: { rlm@0: case AL_GAIN: rlm@0: case AL_METERS_PER_UNIT: rlm@0: alGetListenerf(eParam, pflValues); rlm@0: return; rlm@0: rlm@0: case AL_POSITION: rlm@0: case AL_VELOCITY: rlm@0: alGetListener3f(eParam, pflValues+0, pflValues+1, pflValues+2); rlm@0: return; rlm@0: } rlm@0: rlm@0: pContext = GetLockedContext(); rlm@0: if(!pContext) return; rlm@0: rlm@0: if(pflValues) rlm@0: { rlm@0: switch(eParam) rlm@0: { rlm@0: case AL_ORIENTATION: rlm@0: // AT then UP rlm@0: pflValues[0] = pContext->Listener.Forward[0]; rlm@0: pflValues[1] = pContext->Listener.Forward[1]; rlm@0: pflValues[2] = pContext->Listener.Forward[2]; rlm@0: pflValues[3] = pContext->Listener.Up[0]; rlm@0: pflValues[4] = pContext->Listener.Up[1]; rlm@0: pflValues[5] = pContext->Listener.Up[2]; rlm@0: break; rlm@0: rlm@0: default: rlm@0: alSetError(pContext, AL_INVALID_ENUM); rlm@0: break; rlm@0: } rlm@0: } rlm@0: else rlm@0: alSetError(pContext, AL_INVALID_VALUE); rlm@0: rlm@0: UnlockContext(pContext); rlm@0: } rlm@0: rlm@0: rlm@0: AL_API ALvoid AL_APIENTRY alGetListeneri(ALenum eParam, ALint *plValue) rlm@0: { rlm@0: ALCcontext *pContext; rlm@0: rlm@0: pContext = GetLockedContext(); rlm@0: if(!pContext) return; rlm@0: rlm@0: if(plValue) rlm@0: { rlm@0: switch(eParam) rlm@0: { rlm@0: default: rlm@0: alSetError(pContext, AL_INVALID_ENUM); rlm@0: break; rlm@0: } rlm@0: } rlm@0: else rlm@0: alSetError(pContext, AL_INVALID_VALUE); rlm@0: rlm@0: UnlockContext(pContext); rlm@0: } rlm@0: rlm@0: rlm@0: AL_API void AL_APIENTRY alGetListener3i(ALenum eParam, ALint *plValue1, ALint *plValue2, ALint *plValue3) rlm@0: { rlm@0: ALCcontext *pContext; rlm@0: rlm@0: pContext = GetLockedContext(); rlm@0: if(!pContext) return; rlm@0: rlm@0: if(plValue1 && plValue2 && plValue3) rlm@0: { rlm@0: switch (eParam) rlm@0: { rlm@0: case AL_POSITION: rlm@0: *plValue1 = (ALint)pContext->Listener.Position[0]; rlm@0: *plValue2 = (ALint)pContext->Listener.Position[1]; rlm@0: *plValue3 = (ALint)pContext->Listener.Position[2]; rlm@0: break; rlm@0: rlm@0: case AL_VELOCITY: rlm@0: *plValue1 = (ALint)pContext->Listener.Velocity[0]; rlm@0: *plValue2 = (ALint)pContext->Listener.Velocity[1]; rlm@0: *plValue3 = (ALint)pContext->Listener.Velocity[2]; rlm@0: break; rlm@0: rlm@0: default: rlm@0: alSetError(pContext, AL_INVALID_ENUM); rlm@0: break; rlm@0: } rlm@0: } rlm@0: else rlm@0: alSetError(pContext, AL_INVALID_VALUE); rlm@0: rlm@0: UnlockContext(pContext); rlm@0: } rlm@0: rlm@0: rlm@0: AL_API void AL_APIENTRY alGetListeneriv(ALenum eParam, ALint* plValues) rlm@0: { rlm@0: ALCcontext *pContext; rlm@0: rlm@0: switch(eParam) rlm@0: { rlm@0: case AL_POSITION: rlm@0: case AL_VELOCITY: rlm@0: alGetListener3i(eParam, plValues+0, plValues+1, plValues+2); rlm@0: return; rlm@0: } rlm@0: rlm@0: pContext = GetLockedContext(); rlm@0: if(!pContext) return; rlm@0: rlm@0: if(plValues) rlm@0: { rlm@0: switch(eParam) rlm@0: { rlm@0: case AL_ORIENTATION: rlm@0: // AT then UP rlm@0: plValues[0] = (ALint)pContext->Listener.Forward[0]; rlm@0: plValues[1] = (ALint)pContext->Listener.Forward[1]; rlm@0: plValues[2] = (ALint)pContext->Listener.Forward[2]; rlm@0: plValues[3] = (ALint)pContext->Listener.Up[0]; rlm@0: plValues[4] = (ALint)pContext->Listener.Up[1]; rlm@0: plValues[5] = (ALint)pContext->Listener.Up[2]; rlm@0: break; rlm@0: rlm@0: default: rlm@0: alSetError(pContext, AL_INVALID_ENUM); rlm@0: break; rlm@0: } rlm@0: } rlm@0: else rlm@0: alSetError(pContext, AL_INVALID_VALUE); rlm@0: rlm@0: UnlockContext(pContext); rlm@0: }