summaryrefslogtreecommitdiff
path: root/orkbasecxx/filters
diff options
context:
space:
mode:
authorGerald Begumisa <ben_g@users.sourceforge.net>2008-12-18 08:07:04 +0000
committerGerald Begumisa <ben_g@users.sourceforge.net>2008-12-18 08:07:04 +0000
commit3f5c1d9c9358eb6d7a1f2c75b49446303157fcd4 (patch)
tree8bce4fff04918d60ed8bed2669f9c21220556d80 /orkbasecxx/filters
parent960e134a00df44a2cb3eda87f2d7dcde9fb5156e (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.am2
-rw-r--r--orkbasecxx/filters/audiogain/AudioGain.cpp170
-rw-r--r--orkbasecxx/filters/audiogain/AudioGain.h38
-rw-r--r--orkbasecxx/filters/audiogain/Makefile.am6
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