summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--orkaudio/OrkAudio.cpp5
-rw-r--r--orkaudio/OrkAudio.dsp4
-rw-r--r--orkbasecxx/AudioCapture.h3
-rw-r--r--orkbasecxx/filters/gsm/GsmFilters.cpp102
-rw-r--r--orkbasecxx/filters/gsm/GsmFilters.h38
5 files changed, 149 insertions, 3 deletions
diff --git a/orkaudio/OrkAudio.cpp b/orkaudio/OrkAudio.cpp
index c27cbbb..acc94c0 100644
--- a/orkaudio/OrkAudio.cpp
+++ b/orkaudio/OrkAudio.cpp
@@ -37,6 +37,7 @@
#include "CapturePluginProxy.h"
#include "AudioCapturePlugin.h"
#include "Filter.h"
+#include "GsmFilters.h"
#include "TapeProcessor.h"
#include <list>
@@ -128,6 +129,8 @@ void Transcode(CStdString &file)
FilterRegistry::instance()->RegisterFilter(filter);
filter.reset(new UlawToPcmFilter());
FilterRegistry::instance()->RegisterFilter(filter);
+ filter.reset(new GsmToPcmFilter());
+ FilterRegistry::instance()->RegisterFilter(filter);
// Register in-built tape processors and build the processing chain
BatchProcessing::Initialize();
@@ -191,6 +194,8 @@ void MainThread()
FilterRegistry::instance()->RegisterFilter(filter);
filter.reset(new UlawToPcmFilter());
FilterRegistry::instance()->RegisterFilter(filter);
+ filter.reset(new GsmToPcmFilter());
+ FilterRegistry::instance()->RegisterFilter(filter);
// Register in-built tape processors and build the processing chain
BatchProcessing::Initialize();
diff --git a/orkaudio/OrkAudio.dsp b/orkaudio/OrkAudio.dsp
index 96d8d75..5afc08f 100644
--- a/orkaudio/OrkAudio.dsp
+++ b/orkaudio/OrkAudio.dsp
@@ -41,7 +41,7 @@ RSC=rc.exe
# PROP Intermediate_Dir "Release"
# PROP Target_Dir ""
# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c
-# ADD CPP /nologo /MD /W3 /GX /Zi /O2 /Op /Ob0 /I "." /I "..\OrkBaseCxx" /I "C:\devExt\boost\boost_1_32_0\\" /I "C:\devExt\ACE_wrappers" /I "C:\devExt\log4cxx\log4cxx-0.9.7\include" /I "C:\devExt\xerces++\xerces-c_2_6_0-windows_nt-msvc_60\include" /I "C:\devExt\libsndfile\src" /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /FD /c
+# ADD CPP /nologo /MD /W3 /GX /Zi /O2 /Op /Ob0 /I "." /I "..\OrkBaseCxx" /I "..\OrkBaseCxx\filters\gsm" /I "C:\devExt\libsndfile\src\GSM610" /I "C:\devExt\boost\boost_1_32_0\\" /I "C:\devExt\ACE_wrappers" /I "C:\devExt\log4cxx\log4cxx-0.9.7\include" /I "C:\devExt\xerces++\xerces-c_2_6_0-windows_nt-msvc_60\include" /I "C:\devExt\libsndfile\src" /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /FD /c
# SUBTRACT CPP /YX
# ADD BASE RSC /l 0x809 /d "NDEBUG"
# ADD RSC /l 0x809 /d "NDEBUG"
@@ -66,7 +66,7 @@ LINK32=link.exe
# PROP Ignore_Export_Lib 0
# PROP Target_Dir ""
# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c
-# ADD CPP /nologo /MDd /W3 /Gm /GX /ZI /Od /I "." /I "..\OrkBaseCxx" /I "C:\devExt\boost\boost_1_32_0\\" /I "C:\devExt\ACE_wrappers" /I "C:\devExt\log4cxx\log4cxx-0.9.7\include" /I "C:\devExt\xerces++\xerces-c_2_6_0-windows_nt-msvc_60\include" /I "C:\devExt\libsndfile\src" /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /FR /FD /GZ /c
+# ADD CPP /nologo /MDd /W3 /Gm /GX /ZI /Od /I "." /I "..\OrkBaseCxx" /I "..\OrkBaseCxx\filters\gsm" /I "C:\devExt\libsndfile\src\GSM610" /I "C:\devExt\boost\boost_1_32_0\\" /I "C:\devExt\ACE_wrappers" /I "C:\devExt\log4cxx\log4cxx-0.9.7\include" /I "C:\devExt\xerces++\xerces-c_2_6_0-windows_nt-msvc_60\include" /I "C:\devExt\libsndfile\src" /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /FR /FD /GZ /c
# ADD BASE RSC /l 0x809 /d "_DEBUG"
# ADD RSC /l 0x809 /d "_DEBUG"
BSC32=bscmake.exe
diff --git a/orkbasecxx/AudioCapture.h b/orkbasecxx/AudioCapture.h
index 35734e5..9690ba3 100644
--- a/orkbasecxx/AudioCapture.h
+++ b/orkbasecxx/AudioCapture.h
@@ -28,7 +28,8 @@ typedef enum
PcmAudio = 1,
AlawAudio = 2,
UlawAudio = 3,
- InvalidAudio = 4
+ GsmAudio = 4,
+ InvalidAudio = 5
} AudioEncodingEnum;
/**
diff --git a/orkbasecxx/filters/gsm/GsmFilters.cpp b/orkbasecxx/filters/gsm/GsmFilters.cpp
new file mode 100644
index 0000000..e35017c
--- /dev/null
+++ b/orkbasecxx/filters/gsm/GsmFilters.cpp
@@ -0,0 +1,102 @@
+/*
+ * 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
+
+#include "GsmFilters.h"
+
+GsmToPcmFilter::GsmToPcmFilter()
+{
+ CStdString logMsg;
+
+ gsmState = gsm_create();
+ if(!gsmState)
+ {
+ logMsg = "gsm_create() returned memory allocation problem";
+ throw(logMsg);
+ }
+}
+
+GsmToPcmFilter::~GsmToPcmFilter()
+{
+ gsm_destroy(gsmState);
+}
+
+FilterRef GsmToPcmFilter::Instanciate()
+{
+ FilterRef Filter(new GsmToPcmFilter());
+ return Filter;
+}
+
+void GsmToPcmFilter::AudioChunkIn(AudioChunkRef& inputAudioChunk)
+{
+ m_outputAudioChunk.reset();
+
+ if(inputAudioChunk.get() == NULL)
+ {
+ return;
+ }
+ if(inputAudioChunk->GetNumSamples() == 0)
+ {
+ return;
+ }
+ AudioChunkDetails outputDetails = *inputAudioChunk->GetDetails();
+ if(outputDetails.m_rtpPayloadType != GetInputRtpPayloadType())
+ {
+ return;
+ }
+
+ // Create output buffer
+ m_outputAudioChunk.reset(new AudioChunk());
+ outputDetails.m_rtpPayloadType = -1; // Override details that this filter changes
+ outputDetails.m_encoding = PcmAudio;
+
+ int numSamples = 160; // standard GSM frame is 33 bytes for 160 PCM samples (20 ms)
+ short* outputBuffer = (short*)m_outputAudioChunk->CreateBuffer(numSamples*2, outputDetails);
+ unsigned char* inputBuffer = (unsigned char*)inputAudioChunk->m_pBuffer;
+ gsm_decode(gsmState, inputBuffer, outputBuffer);
+}
+
+void GsmToPcmFilter::AudioChunkOut(AudioChunkRef& chunk)
+{
+ chunk = m_outputAudioChunk;
+}
+
+AudioEncodingEnum GsmToPcmFilter::GetInputAudioEncoding()
+{
+ return GsmAudio;
+}
+
+AudioEncodingEnum GsmToPcmFilter::GetOutputAudioEncoding()
+{
+ return PcmAudio;
+}
+
+CStdString GsmToPcmFilter::GetName()
+{
+ return "GsmToPcm";
+}
+
+int GsmToPcmFilter::GetInputRtpPayloadType()
+{
+ return 0x3;
+}
+
+void GsmToPcmFilter::CaptureEventIn(CaptureEventRef& event)
+{
+ ;
+}
+
+void GsmToPcmFilter::CaptureEventOut(CaptureEventRef& event)
+{
+ ;
+} \ No newline at end of file
diff --git a/orkbasecxx/filters/gsm/GsmFilters.h b/orkbasecxx/filters/gsm/GsmFilters.h
new file mode 100644
index 0000000..b030fb0
--- /dev/null
+++ b/orkbasecxx/filters/gsm/GsmFilters.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 "Filter.h"
+extern "C"
+{
+#include "gsm.h"
+}
+
+class DLL_IMPORT_EXPORT_ORKBASE GsmToPcmFilter : public Filter
+{
+public:
+ GsmToPcmFilter();
+ ~GsmToPcmFilter();
+
+ 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();
+ void __CDECL__ CaptureEventIn(CaptureEventRef& event);
+ void __CDECL__ CaptureEventOut(CaptureEventRef& event);
+
+private:
+ AudioChunkRef m_outputAudioChunk;
+ struct gsm_state * gsmState;
+}; \ No newline at end of file