diff options
author | Gerald Begumisa <ben_g@users.sourceforge.net> | 2008-12-18 08:07:04 +0000 |
---|---|---|
committer | Gerald Begumisa <ben_g@users.sourceforge.net> | 2008-12-18 08:07:04 +0000 |
commit | 3f5c1d9c9358eb6d7a1f2c75b49446303157fcd4 (patch) | |
tree | 8bce4fff04918d60ed8bed2669f9c21220556d80 /orkbasecxx/filters | |
parent | 960e134a00df44a2cb3eda87f2d7dcde9fb5156e (diff) |
Added AudioGain filter that allows gain to be increased or reduced on all channels or a per-channel basis. Therefore 3 configuration parameters have been added, which are AudioGain, AudioGainChannel1 and AudioGainChannel2. These parameters take values in Db. Setting the AudioGain applies the gain to both channels. While setting AudioGainChannel1 and AudioGainChannel2 applies gain to channel 1 and channel 2 respectively.
git-svn-id: https://oreka.svn.sourceforge.net/svnroot/oreka/trunk@587 09dcff7a-b715-0410-9601-b79a96267cd0
Diffstat (limited to 'orkbasecxx/filters')
-rw-r--r-- | orkbasecxx/filters/Makefile.am | 2 | ||||
-rw-r--r-- | orkbasecxx/filters/audiogain/AudioGain.cpp | 170 | ||||
-rw-r--r-- | orkbasecxx/filters/audiogain/AudioGain.h | 38 | ||||
-rw-r--r-- | orkbasecxx/filters/audiogain/Makefile.am | 6 |
4 files changed, 215 insertions, 1 deletions
diff --git a/orkbasecxx/filters/Makefile.am b/orkbasecxx/filters/Makefile.am index 9de5d81..5bf40fd 100644 --- a/orkbasecxx/filters/Makefile.am +++ b/orkbasecxx/filters/Makefile.am @@ -1 +1 @@ -SUBDIRS = gsm ilbc +SUBDIRS = gsm ilbc audiogain diff --git a/orkbasecxx/filters/audiogain/AudioGain.cpp b/orkbasecxx/filters/audiogain/AudioGain.cpp new file mode 100644 index 0000000..59fec5d --- /dev/null +++ b/orkbasecxx/filters/audiogain/AudioGain.cpp @@ -0,0 +1,170 @@ +/*
+ * Oreka -- A media capture and retrieval platform
+ *
+ * Copyright (C) 2005, orecx LLC
+ *
+ * http://www.orecx.com
+ *
+ * This program is free software, distributed under the terms of
+ * the GNU General Public License.
+ * Please refer to http://www.gnu.org/copyleft/gpl.html
+ *
+ */
+#pragma warning( disable: 4786 ) // disables truncated symbols in browse-info warning
+
+#define _WINSOCKAPI_ // prevents the inclusion of winsock.h
+
+#include "AudioGain.h"
+#include "ConfigManager.h"
+
+AudioGainFilter::AudioGainFilter()
+{
+ m_log = Logger::getLogger("audiogain");
+ m_numEncodingErrors = 0;
+ LOG4CXX_INFO(this->m_log, "Initialized AudioGain filter");
+}
+
+AudioGainFilter::~AudioGainFilter()
+{
+ if(m_numEncodingErrors > 0)
+ {
+ CStdString logMsg;
+ logMsg.Format("Encoding error happened %d time(s)", m_numEncodingErrors);
+ LOG4CXX_WARN(m_log, logMsg);
+ }
+ LOG4CXX_INFO(this->m_log, "Decommissioned AudioGain filter");
+}
+
+FilterRef AudioGainFilter::Instanciate()
+{
+ FilterRef Filter(new AudioGainFilter());
+ return Filter;
+}
+
+void AudioGainFilter::AudioChunkIn(AudioChunkRef& inputAudioChunk)
+{
+ int r_samples = 0;
+ int i = 0;
+ AudioChunkDetails outputDetails;
+
+ m_outputAudioChunk.reset();
+ if(inputAudioChunk.get() == NULL) {
+ return;
+ }
+
+ if(inputAudioChunk->GetNumSamples() == 0) {
+ return;
+ }
+
+ outputDetails = *inputAudioChunk->GetDetails();
+ r_samples = inputAudioChunk->GetNumSamples();
+ m_outputAudioChunk.reset(new AudioChunk());
+
+ if(inputAudioChunk->GetEncoding() != PcmAudio)
+ {
+ if(m_numEncodingErrors == 0)
+ {
+ CStdString logMsg;
+
+ logMsg.Format("Unexpected encoding:%d expected:%d (PcmAudio), gain not applied", inputAudioChunk->GetEncoding(), PcmAudio);
+ LOG4CXX_WARN(m_log, logMsg);
+ }
+ m_numEncodingErrors++;
+ m_outputAudioChunk->SetBuffer(inputAudioChunk->m_pBuffer, outputDetails);
+ return;
+ }
+
+ short* outputBuffer = (short*)m_outputAudioChunk->CreateBuffer(outputDetails);
+ short* inputBuffer = (short*)inputAudioChunk->m_pBuffer;
+ int sample = 0;
+
+ for(i = 0; i < r_samples; i++) {
+ sample = inputBuffer[i];
+ if(CONFIG.m_audioGain != 0)
+ {
+ if(CONFIG.m_audioGain < 0)
+ {
+ sample = (int)((double)sample / sqrt(fabs(CONFIG.m_audioGain)));
+ }
+ else
+ {
+ sample = (int)((double)sample * sqrt(fabs(CONFIG.m_audioGain)));
+ }
+ }
+ if(CONFIG.m_audioGainChannel1 != 0)
+ {
+ if(outputDetails.m_channel == 1)
+ {
+ if(CONFIG.m_audioGainChannel1 < 0)
+ {
+ sample = (int)((double)sample / sqrt(fabs(CONFIG.m_audioGainChannel1)));
+ }
+ else
+ {
+ sample = (int)((double)sample * sqrt(fabs(CONFIG.m_audioGainChannel1)));
+ }
+ }
+ }
+ if(CONFIG.m_audioGainChannel2 != 0)
+ {
+ if(outputDetails.m_channel == 2)
+ {
+ if(CONFIG.m_audioGainChannel2 < 0)
+ {
+ sample = (int)((double)sample / sqrt(fabs(CONFIG.m_audioGainChannel2)));
+ }
+ else
+ {
+ sample = (int)((double)sample / sqrt(fabs(CONFIG.m_audioGainChannel2)));
+ }
+ }
+ }
+
+ if(sample < -32768)
+ {
+ sample = -32768;
+ }
+ if(sample > 32768)
+ {
+ sample = 32768;
+ }
+
+ outputBuffer[i] = sample;
+ }
+}
+
+void AudioGainFilter::AudioChunkOut(AudioChunkRef& chunk)
+{
+ chunk = m_outputAudioChunk;
+}
+
+AudioEncodingEnum AudioGainFilter::GetInputAudioEncoding()
+{
+ return PcmAudio;
+}
+
+AudioEncodingEnum AudioGainFilter::GetOutputAudioEncoding()
+{
+ return PcmAudio;
+}
+
+CStdString AudioGainFilter::GetName()
+{
+ return "AudioGain";
+}
+
+int AudioGainFilter::GetInputRtpPayloadType()
+{
+ return -1;
+}
+
+void AudioGainFilter::CaptureEventIn(CaptureEventRef& event)
+{
+ ;
+}
+
+void AudioGainFilter::CaptureEventOut(CaptureEventRef& event)
+{
+ ;
+}
+
diff --git a/orkbasecxx/filters/audiogain/AudioGain.h b/orkbasecxx/filters/audiogain/AudioGain.h new file mode 100644 index 0000000..2ba39c7 --- /dev/null +++ b/orkbasecxx/filters/audiogain/AudioGain.h @@ -0,0 +1,38 @@ +/*
+ * Oreka -- A media capture and retrieval platform
+ *
+ * Copyright (C) 2005, orecx LLC
+ *
+ * http://www.orecx.com
+ *
+ * This program is free software, distributed under the terms of
+ * the GNU General Public License.
+ * Please refer to http://www.gnu.org/copyleft/gpl.html
+ *
+ */
+#include "LogManager.h"
+#include "Filter.h"
+#include <math.h>
+
+class DLL_IMPORT_EXPORT_ORKBASE AudioGainFilter : public Filter
+{
+public:
+ AudioGainFilter();
+ ~AudioGainFilter();
+
+ FilterRef __CDECL__ Instanciate();
+ void __CDECL__ AudioChunkIn(AudioChunkRef& chunk);
+ void __CDECL__ AudioChunkOut(AudioChunkRef& chunk);
+ AudioEncodingEnum __CDECL__ GetInputAudioEncoding();
+ AudioEncodingEnum __CDECL__ GetOutputAudioEncoding();
+ CStdString __CDECL__ GetName();
+ int __CDECL__ GetInputRtpPayloadType();
+ inline void __CDECL__ CaptureEventIn(CaptureEventRef& event);
+ inline void __CDECL__ CaptureEventOut(CaptureEventRef& event);
+
+private:
+ AudioChunkRef m_outputAudioChunk;
+ LoggerPtr m_log;
+ int m_numEncodingErrors;
+};
+
diff --git a/orkbasecxx/filters/audiogain/Makefile.am b/orkbasecxx/filters/audiogain/Makefile.am new file mode 100644 index 0000000..2c377b5 --- /dev/null +++ b/orkbasecxx/filters/audiogain/Makefile.am @@ -0,0 +1,6 @@ +METASOURCES = AUTO +noinst_LTLIBRARIES = libaudiogain.la +libaudiogain_la_SOURCES = AudioGain.cpp + +INCLUDES = -I@top_srcdir@ +AM_CXXFLAGS = -D_REENTRANT |