cAudio 2.3.0
3d Audio Engine
Loading...
Searching...
No Matches
cFilter.cpp
1// Copyright (c) 2008-2011 Raynaldo (Wildicv) Rivera, Joshua (Dark_Kilauea) Jones, Murat (wolfmanfx) Sari
2// This file is part of the "cAudio Engine"
3// For conditions of distribution and use, see copyright notice in cAudio.h
4
5#include "cFilter.h"
6#include "cLogger.h"
7#include "cUtils.h"
8#include "cAudio.h"
9
10#if CAUDIO_EFX_ENABLED == 1
11
12namespace cAudio
13{
14 cFilter::cFilter(cEFXFunctions* oALFunctions) : EFX(oALFunctions), Type(EFT_NULL),
15 Volume(1.0f), LowFreqVolume(1.0f), HighFreqVolume(1.0f), LastUpdated(0),
16 Valid(false), Filter(0)
17 {
18 cAudioMutexBasicLock lock(Mutex);
19 if(EFX)
20 Valid = EFX->Supported;
21
22 if(Valid)
23 {
24 cAudioMutexBasicLock lock(EFX->Mutex);
25 EFX->alGenFilters(1, &Filter);
26 Valid = !CheckError();
27 if(!Valid)
28 Filter = 0;
29 }
30 }
31
32 cFilter::~cFilter()
33 {
34 cAudioMutexBasicLock lock(Mutex);
35 if(Filter && EFX && EFX->Supported)
36 {
37 cAudioMutexBasicLock lock(EFX->Mutex);
38 EFX->alDeleteFilters(1, &Filter);
39 }
40 }
41
42 const FilterTypes& cFilter::getType() const
43 {
44 return Type;
45 }
46
47 void cFilter::setType(const FilterTypes& type)
48 {
49 cAudioMutexBasicLock lock(Mutex);
50 Type = type;
51 UpdateFilter();
52 }
53
54 float cFilter::getVolume() const
55 {
56 return Volume;
57 }
58
59 void cFilter::setVolume(const float& volume)
60 {
61 cAudioMutexBasicLock lock(Mutex);
62 Volume = volume;
63 UpdateFilter();
64 }
65
66 float cFilter::getLowFrequencyVolume() const
67 {
68 return LowFreqVolume;
69 }
70
71 void cFilter::setLowFrequencyVolume(const float& volumeLF)
72 {
73 cAudioMutexBasicLock lock(Mutex);
74 LowFreqVolume = volumeLF;
75 UpdateFilter();
76 }
77
78 float cFilter::getHighFrequencyVolume() const
79 {
80 return HighFreqVolume;
81 }
82
83 void cFilter::setHighFrequencyVolume(const float& volumeHF)
84 {
85 cAudioMutexBasicLock lock(Mutex);
86 HighFreqVolume = volumeHF;
87 UpdateFilter();
88 }
89
90 unsigned int cFilter::getLastUpdated() const
91 {
92 return LastUpdated;
93 }
94
95 bool cFilter::isValid() const
96 {
97 return Valid;
98 }
99
100 ALuint cFilter::getOpenALFilter() const
101 {
102 return Filter;
103 }
104
105 bool cFilter::UpdateFilter()
106 {
107 ++LastUpdated;
108
109 ALenum alFilterType = ConvertFilterEnum(Type);
110
111 if(Filter && EFX && EFX->Supported)
112 {
113 cAudioMutexBasicLock lock(EFX->Mutex);
114 EFX->alFilteri(Filter, AL_FILTER_TYPE, alFilterType);
115 Valid = !CheckError();
116 if(!Valid)
117 return false;
118
119 if(Type == EFT_LOWPASS)
120 {
121 EFX->alFilterf(Filter, AL_LOWPASS_GAIN, Volume);
122 EFX->alFilterf(Filter, AL_LOWPASS_GAINHF, HighFreqVolume);
123 Valid = !CheckError();
124 return Valid;
125 }
126 else if(Type == EFT_HIGHPASS)
127 {
128 EFX->alFilterf(Filter, AL_HIGHPASS_GAIN, Volume);
129 EFX->alFilterf(Filter, AL_HIGHPASS_GAINLF, LowFreqVolume);
130 Valid = !CheckError();
131 return Valid;
132 }
133 else if(Type == EFT_BANDPASS)
134 {
135 EFX->alFilterf(Filter, AL_BANDPASS_GAIN, Volume);
136 EFX->alFilterf(Filter, AL_BANDPASS_GAINLF, LowFreqVolume);
137 EFX->alFilterf(Filter, AL_BANDPASS_GAINHF, HighFreqVolume);
138 Valid = !CheckError();
139 return Valid;
140 }
141 else
142 {
143 return true;
144 }
145 }
146 return false;
147 }
148
149 bool cFilter::CheckError()
150 {
151 int error = alGetError();
152 const char* errorString;
153
154 if (error != AL_NO_ERROR)
155 {
156 errorString = alGetString(error);
157 if(error == AL_OUT_OF_MEMORY)
158 getLogger()->logCritical("Audio Filter", "OpenAL Error: %s.", errorString);
159 else
160 getLogger()->logError("Audio Filter", "OpenAL Error: %s.", errorString);
161 return true;
162 }
163 return false;
164 }
165
166 ALenum cFilter::ConvertFilterEnum(FilterTypes type)
167 {
168 switch(type)
169 {
170 case EFT_NULL:
171 return AL_FILTER_NULL;
172 case EFT_LOWPASS:
173 return AL_FILTER_LOWPASS;
174 case EFT_HIGHPASS:
175 return AL_FILTER_HIGHPASS;
176 case EFT_BANDPASS:
177 return AL_FILTER_BANDPASS;
178 default:
179 return AL_FILTER_NULL;
180 };
181 }
182};
183
184#endif
virtual void logCritical(const char *sender, const char *msg,...)=0
Used to log a critical error message to the logging system.
virtual void logError(const char *sender, const char *msg,...)=0
Used to log an error message to the logging system.
Main namespace for the entire cAudio library.
Definition: cAudioCapture.h:16
CAUDIO_API ILogger * getLogger()
Gets the interface to the logger.
Definition: cAudio.cpp:45