diff options
-rw-r--r-- | orkaudio/OrkAudio.cpp | 5 | ||||
-rw-r--r-- | orkaudio/OrkAudio.dsp | 4 | ||||
-rw-r--r-- | orkbasecxx/AudioCapture.h | 3 | ||||
-rw-r--r-- | orkbasecxx/filters/gsm/GsmFilters.cpp | 102 | ||||
-rw-r--r-- | orkbasecxx/filters/gsm/GsmFilters.h | 38 |
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 |