cAudio  2.3.0
3d Audio Engine
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 
12 namespace 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
cAudio::ILogger::logError
virtual void logError(const char *sender, const char *msg,...)=0
Used to log an error message to the logging system.
cAudio::ILogger::logCritical
virtual void logCritical(const char *sender, const char *msg,...)=0
Used to log a critical error message to the logging system.
cAudio::cAudioSourceBase::Mutex
cAudioMutex Mutex
Mutex for thread synchronization.
Definition: cAudioSource.h:96
cAudio
Main namespace for the entire cAudio library.
Definition: cAudioCapture.h:16
cAudio::getLogger
CAUDIO_API ILogger * getLogger()
Gets the interface to the logger.
Definition: cAudio.cpp:45