aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--CMakeLists.txt1
-rw-r--r--OpenAL32/Include/alFilter.h44
-rw-r--r--OpenAL32/alExtension.c20
-rw-r--r--OpenAL32/alFilter.c348
4 files changed, 413 insertions, 0 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt
index f1a49945..6ea010a0 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -163,6 +163,7 @@ ENDIF()
SET(OPENAL_OBJS OpenAL32/alBuffer.c
OpenAL32/alError.c
OpenAL32/alExtension.c
+ OpenAL32/alFilter.c
OpenAL32/alListener.c
OpenAL32/alSource.c
OpenAL32/alState.c
diff --git a/OpenAL32/Include/alFilter.h b/OpenAL32/Include/alFilter.h
new file mode 100644
index 00000000..a223a5aa
--- /dev/null
+++ b/OpenAL32/Include/alFilter.h
@@ -0,0 +1,44 @@
+#ifndef _AL_FILTER_H_
+#define _AL_FILTER_H_
+
+#include "AL/al.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#define AL_FILTER_NULL 0x0000
+#define AL_FILTER_LOWPASS 0x0001
+#define AL_FILTER_HIGHPASS 0x0002
+#define AL_FILTER_BANDPASS 0x0003
+
+typedef struct ALfilter_struct
+{
+ // Filter type (AL_FILTER_NULL, ...)
+ ALenum type;
+
+ // Index to itself
+ ALuint filter;
+
+ struct ALfilter_struct *next;
+} ALfilter;
+
+AL_API ALvoid AL_APIENTRY alGenFilters(ALsizei n, ALuint *filters);
+AL_API ALvoid AL_APIENTRY alDeleteFilters(ALsizei n, ALuint *filters);
+AL_API ALboolean AL_APIENTRY alIsFilter(ALuint filter);
+
+AL_API ALvoid AL_APIENTRY alFilteri(ALuint filter, ALenum param, ALint iValue);
+AL_API ALvoid AL_APIENTRY alFilteriv(ALuint filter, ALenum param, ALint *piValues);
+AL_API ALvoid AL_APIENTRY alFilterf(ALuint filter, ALenum param, ALfloat flValue);
+AL_API ALvoid AL_APIENTRY alFilterfv(ALuint filter, ALenum param, ALfloat *pflValues);
+
+AL_API ALvoid AL_APIENTRY alGetFilteri(ALuint filter, ALenum param, ALint *piValue);
+AL_API ALvoid AL_APIENTRY alGetFilteriv(ALuint filter, ALenum param, ALint *piValues);
+AL_API ALvoid AL_APIENTRY alGetFilterf(ALuint filter, ALenum param, ALfloat *pflValue);
+AL_API ALvoid AL_APIENTRY alGetFilterfv(ALuint filter, ALenum param, ALfloat *pflValues);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/OpenAL32/alExtension.c b/OpenAL32/alExtension.c
index 269590e9..b31f7c14 100644
--- a/OpenAL32/alExtension.c
+++ b/OpenAL32/alExtension.c
@@ -24,6 +24,7 @@
#include "alExtension.h"
#include "alError.h"
#include "alMain.h"
+#include "alFilter.h"
#include "AL/al.h"
#include "AL/alc.h"
@@ -101,6 +102,19 @@ static ALfunction function[]= {
{ "alDopplerVelocity", (ALvoid *) alDopplerVelocity },
{ "alSpeedOfSound", (ALvoid *) alSpeedOfSound },
{ "alDistanceModel", (ALvoid *) alDistanceModel },
+
+ { "alGenFilters", (ALvoid *) alGenFilters },
+ { "alDeleteFilters", (ALvoid *) alDeleteFilters },
+ { "alIsFilter", (ALvoid *) alIsFilter },
+ { "alFilteri", (ALvoid *) alFilteri },
+ { "alFilteriv", (ALvoid *) alFilteriv },
+ { "alFilterf", (ALvoid *) alFilterf },
+ { "alFilterfv", (ALvoid *) alFilterfv },
+ { "alGetFilteri", (ALvoid *) alGetFilteri },
+ { "alGetFilteriv", (ALvoid *) alGetFilteriv },
+ { "alGetFilterf", (ALvoid *) alGetFilterf },
+ { "alGetFilterfv", (ALvoid *) alGetFilterfv },
+
{ NULL, (ALvoid *) NULL } };
static ALenums enumeration[]={
@@ -196,6 +210,12 @@ static ALenums enumeration[]={
{ (ALchar *)"AL_EXPONENT_DISTANCE", AL_EXPONENT_DISTANCE },
{ (ALchar *)"AL_EXPONENT_DISTANCE_CLAMPED", AL_EXPONENT_DISTANCE_CLAMPED },
+ // Filter types
+ { (ALchar *)"AL_FILTER_NULL", AL_FILTER_NULL },
+ { (ALchar *)"AL_FILTER_LOWPASS", AL_FILTER_LOWPASS },
+ { (ALchar *)"AL_FILTER_HIGHPASS", AL_FILTER_HIGHPASS },
+ { (ALchar *)"AL_FILTER_BANDPASS", AL_FILTER_BANDPASS },
+
// Default
{ (ALchar *)NULL, (ALenum ) 0 } };
diff --git a/OpenAL32/alFilter.c b/OpenAL32/alFilter.c
new file mode 100644
index 00000000..dae7dcf7
--- /dev/null
+++ b/OpenAL32/alFilter.c
@@ -0,0 +1,348 @@
+/**
+ * OpenAL cross platform audio library
+ * Copyright (C) 1999-2007 by authors.
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ * Or go to http://www.gnu.org/copyleft/lgpl.html
+ */
+
+#include <stdlib.h>
+
+#include "config.h"
+
+#include "AL/al.h"
+#include "AL/alc.h"
+
+#include "alMain.h"
+#include "alFilter.h"
+
+static ALfilter *g_FilterList;
+static ALuint g_FilterCount;
+
+static void InitFilterParams(ALfilter *filter, ALenum type);
+
+
+AL_API ALvoid AL_APIENTRY alGenFilters(ALsizei n, ALuint *filters)
+{
+ ALCcontext *Context;
+ ALsizei i;
+
+ Context = alcGetCurrentContext();
+ SuspendContext(Context);
+
+ if (n > 0)
+ {
+ // Check that enough memory has been allocted in the 'sources' array for n Sources
+ if (!IsBadWritePtr((void*)filters, n * sizeof(ALuint)))
+ {
+ ALfilter **list = &g_FilterList;
+ while(*list)
+ list = &(*list)->next;
+
+ i = 0;
+ while(i < n)
+ {
+ *list = calloc(1, sizeof(ALfilter));
+ if(!(*list))
+ {
+ // We must have run out or memory
+ alDeleteFilters(i, filters);
+ alSetError(AL_OUT_OF_MEMORY);
+ break;
+ }
+
+ filters[i] = (ALuint)ALTHUNK_ADDENTRY(*list);
+ (*list)->filter = filters[i];
+
+ InitFilterParams(*list, AL_FILTER_NULL);
+ g_FilterCount++;
+ i++;
+ }
+ }
+ }
+
+ ProcessContext(Context);
+}
+
+AL_API ALvoid AL_APIENTRY alDeleteFilters(ALsizei n, ALuint *filters)
+{
+ ALCcontext *Context;
+ ALfilter *ALFilter;
+ ALsizei i;
+
+ Context = alcGetCurrentContext();
+ SuspendContext(Context);
+
+ if (n >= 0)
+ {
+ // Check that all filters are valid
+ for (i = 0; i < n; i++)
+ {
+ if (!alIsFilter(filters[i]))
+ {
+ alSetError(AL_INVALID_NAME);
+ break;
+ }
+ }
+
+ if (i == n)
+ {
+ // All filters are valid
+ for (i = 0; i < n; i++)
+ {
+ // Recheck that the filter is valid, because there could be duplicated names
+ if (alIsFilter(filters[i]))
+ {
+ ALfilter **list;
+
+ ALFilter = ((ALfilter*)ALTHUNK_LOOKUPENTRY(filters[i]));
+
+ // Remove Source from list of Sources
+ list = &g_FilterList;
+ while(*list && *list != ALFilter)
+ list = &(*list)->next;
+
+ if(*list)
+ *list = (*list)->next;
+ ALTHUNK_REMOVEENTRY(ALFilter->filter);
+
+ memset(ALFilter, 0, sizeof(ALfilter));
+ free(ALFilter);
+
+ g_FilterCount--;
+ }
+ }
+ }
+ }
+ else
+ alSetError(AL_INVALID_VALUE);
+
+ ProcessContext(Context);
+}
+
+AL_API ALboolean AL_APIENTRY alIsFilter(ALuint filter)
+{
+ ALCcontext *Context;
+ ALfilter **list;
+
+ Context = alcGetCurrentContext();
+ SuspendContext(Context);
+
+ list = &g_FilterList;
+ while(*list && (*list)->filter != filter)
+ list = &(*list)->next;
+
+ ProcessContext(Context);
+
+ return (*list ? AL_TRUE : AL_FALSE);
+}
+
+AL_API ALvoid AL_APIENTRY alFilteri(ALuint filter, ALenum param, ALint iValue)
+{
+ ALCcontext *Context;
+
+ (void)iValue;
+
+ Context = alcGetCurrentContext();
+ SuspendContext(Context);
+
+ if (alIsFilter(filter))
+ {
+ switch(param)
+ {
+ default:
+ alSetError(AL_INVALID_ENUM);
+ break;
+ }
+ }
+ else
+ alSetError(AL_INVALID_NAME);
+
+ ProcessContext(Context);
+}
+
+AL_API ALvoid AL_APIENTRY alFilteriv(ALuint filter, ALenum param, ALint *piValues)
+{
+ ALCcontext *Context;
+
+ (void)piValues;
+
+ Context = alcGetCurrentContext();
+ SuspendContext(Context);
+
+ if (alIsFilter(filter))
+ {
+ switch(param)
+ {
+ default:
+ alSetError(AL_INVALID_ENUM);
+ break;
+ }
+ }
+ else
+ alSetError(AL_INVALID_NAME);
+
+ ProcessContext(Context);
+}
+
+AL_API ALvoid AL_APIENTRY alFilterf(ALuint filter, ALenum param, ALfloat flValue)
+{
+ ALCcontext *Context;
+
+ (void)flValue;
+
+ Context = alcGetCurrentContext();
+ SuspendContext(Context);
+
+ if (alIsFilter(filter))
+ {
+ switch(param)
+ {
+ default:
+ alSetError(AL_INVALID_ENUM);
+ break;
+ }
+ }
+ else
+ alSetError(AL_INVALID_NAME);
+
+ ProcessContext(Context);
+}
+
+AL_API ALvoid AL_APIENTRY alFilterfv(ALuint filter, ALenum param, ALfloat *pflValues)
+{
+ ALCcontext *Context;
+
+ (void)pflValues;
+
+ Context = alcGetCurrentContext();
+ SuspendContext(Context);
+
+ if (alIsFilter(filter))
+ {
+ switch(param)
+ {
+ default:
+ alSetError(AL_INVALID_ENUM);
+ break;
+ }
+ }
+ else
+ alSetError(AL_INVALID_NAME);
+
+ ProcessContext(Context);
+}
+
+AL_API ALvoid AL_APIENTRY alGetFilteri(ALuint filter, ALenum param, ALint *piValue)
+{
+ ALCcontext *Context;
+
+ (void)piValue;
+
+ Context = alcGetCurrentContext();
+ SuspendContext(Context);
+
+ if (alIsFilter(filter))
+ {
+ switch(param)
+ {
+ default:
+ alSetError(AL_INVALID_ENUM);
+ break;
+ }
+ }
+ else
+ alSetError(AL_INVALID_NAME);
+
+ ProcessContext(Context);
+}
+
+AL_API ALvoid AL_APIENTRY alGetFilteriv(ALuint filter, ALenum param, ALint *piValues)
+{
+ ALCcontext *Context;
+
+ (void)piValues;
+
+ Context = alcGetCurrentContext();
+ SuspendContext(Context);
+
+ if (alIsFilter(filter))
+ {
+ switch(param)
+ {
+ default:
+ alSetError(AL_INVALID_ENUM);
+ break;
+ }
+ }
+ else
+ alSetError(AL_INVALID_NAME);
+
+ ProcessContext(Context);
+}
+
+AL_API ALvoid AL_APIENTRY alGetFilterf(ALuint filter, ALenum param, ALfloat *pflValue)
+{
+ ALCcontext *Context;
+
+ (void)pflValue;
+
+ Context = alcGetCurrentContext();
+ SuspendContext(Context);
+
+ if (alIsFilter(filter))
+ {
+ switch(param)
+ {
+ default:
+ alSetError(AL_INVALID_ENUM);
+ break;
+ }
+ }
+ else
+ alSetError(AL_INVALID_NAME);
+
+ ProcessContext(Context);
+}
+
+AL_API ALvoid AL_APIENTRY alGetFilterfv(ALuint filter, ALenum param, ALfloat *pflValues)
+{
+ ALCcontext *Context;
+
+ (void)pflValues;
+
+ Context = alcGetCurrentContext();
+ SuspendContext(Context);
+
+ if (alIsFilter(filter))
+ {
+ switch(param)
+ {
+ default:
+ alSetError(AL_INVALID_ENUM);
+ break;
+ }
+ }
+ else
+ alSetError(AL_INVALID_NAME);
+
+ ProcessContext(Context);
+}
+
+
+static void InitFilterParams(ALfilter *filter, ALenum type)
+{
+ filter->type = type;
+}