diff --git a/src/mod/codec/mod_codec_gsm/Makefile b/src/mod/codec/mod_codec_gsm/Makefile new file mode 100644 index 0000000000..85e90af497 --- /dev/null +++ b/src/mod/codec/mod_codec_gsm/Makefile @@ -0,0 +1,12 @@ +CFLAGS += -I/usr/local/include/libgsm +LDFLAGS +=-lgsm + +$(MOD).so: $(MOD).c + $(CC) $(CFLAGS) -fPIC -c $(MOD).c -o $(MOD).o + $(CC) $(SOLINK) $(MOD).o -o $(MOD).so $(LDFLAGS) -lspeex + +all: $(MOD).so + +clean: + rm -fr *.so *.o *~ + diff --git a/src/mod/codec/mod_codec_gsm/mod_codec_gsm.c b/src/mod/codec/mod_codec_gsm/mod_codec_gsm.c new file mode 100644 index 0000000000..e3eeb48cba --- /dev/null +++ b/src/mod/codec/mod_codec_gsm/mod_codec_gsm.c @@ -0,0 +1,175 @@ +/* + * FreeSWITCH Modular Media Switching Software Library / Soft-Switch Application + * Copyright (C) 2005/2006, Anthony Minessale II <anthmct@yahoo.com> + * + * Version: MPL 1.1 + * + * The contents of this file are subject to the Mozilla Public License Version + * 1.1 (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * Software distributed under the License is distributed on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License + * for the specific language governing rights and limitations under the + * License. + * + * The Original Code is FreeSWITCH Modular Media Switching Software Library / Soft-Switch Application + * + * The Initial Developer of the Original Code is + * Anthony Minessale II <anthmct@yahoo.com> + * Portions created by the Initial Developer are Copyright (C) + * the Initial Developer. All Rights Reserved. + * + * Contributor(s): + * + * Anthony Minessale II <anthmct@yahoo.com> + * Michael Jerris <mike@jerris.com> + * + * mod_codec_gsm.c -- gsm Codec Module + * + */ +#include "switch.h" +#include "gsm.h" + +static const char modname[] = "mod_codec_gsm"; + + +static switch_status switch_gsm_init(switch_codec *codec, switch_codec_flag flags, const struct switch_codec_settings *codec_settings) +{ + gsm context; + int encoding, decoding; + + encoding = (flags & SWITCH_CODEC_FLAG_ENCODE); + decoding = (flags & SWITCH_CODEC_FLAG_DECODE); + + if (!(encoding || decoding)) { + return SWITCH_STATUS_FALSE; + } else { + context = gsm_create(); + } + + codec->private = context; + + return SWITCH_STATUS_SUCCESS; + +} + +static switch_status switch_gsm_destroy(switch_codec *codec) +{ + gsm_destroy((gsm)codec->private); + codec->private = NULL; + return SWITCH_STATUS_SUCCESS; +} + + +static switch_status switch_gsm_encode(switch_codec *codec, + switch_codec *other_codec, + void *decoded_data, + size_t decoded_data_len, + void *encoded_data, + size_t *encoded_data_len, + unsigned int *flag) +{ + gsm context = codec->private; + int cbret = 0; + + if (!context) { + return SWITCH_STATUS_FALSE; + } + gsm_encode(context, (void *)decoded_data, (void *)encoded_data); + *encoded_data_len = 33; + + return SWITCH_STATUS_SUCCESS; +} + + +static switch_status switch_gsm_decode(switch_codec *codec, + switch_codec *other_codec, + void *encoded_data, + size_t encoded_data_len, + void *decoded_data, + size_t *decoded_data_len, + unsigned int *flag) +{ + struct gsm_context *context = codec->private; + + if (!context) { + return SWITCH_STATUS_FALSE; + } + + + if (encoded_data_len % 33 == 0) { + int loops = (int) encoded_data_len / 33; + char *edp = encoded_data; + short *ddp = decoded_data; + int x; + unsigned int new_len = 0; + for(x = 0; x < loops && new_len < *decoded_data_len; x++) { + gsm_decode(&context, ddp, edp, 33); + ddp += 80; + edp += 10; + new_len += 320; + } + if (new_len <= *decoded_data_len) { + *decoded_data_len = new_len; + } else { + switch_console_printf(SWITCH_CHANNEL_CONSOLE, "buffer overflow!!!\n"); + return SWITCH_STATUS_FALSE; + } + } else { + switch_console_printf(SWITCH_CHANNEL_CONSOLE, "yo this frame is an odd size [%d]\n", encoded_data_len); + } + + + return SWITCH_STATUS_SUCCESS; +} + +/* Registration */ + +static const switch_codec_implementation gsm_8k_implementation = { + /*.samples_per_second*/ 8000, + /*.bits_per_second*/ 13200, + /*.microseconds_per_frame*/ 20000, + /*.samples_per_frame*/ 160, + /*.bytes_per_frame*/ 320, + /*.encoded_bytes_per_frame*/ 33, + /*.number_of_channels*/ 1, + /*.pref_frames_per_packet*/ 1, + /*.max_frames_per_packet*/ 7, + /*.init*/ switch_gsm_init, + /*.encode*/ switch_gsm_encode, + /*.decode*/ switch_gsm_decode, + /*.destroy*/ switch_gsm_destroy, +}; + +static const switch_codec_interface gsm_codec_interface = { + /*.interface_name*/ "gsm", + /*.codec_type*/ SWITCH_CODEC_TYPE_AUDIO, + /*.ianacode*/ 3, + /*.iananame*/ "gsm", + /*.implementations*/ &gsm_8k_implementation, +}; + +static switch_loadable_module_interface gsm_module_interface = { + /*.module_name*/ modname, + /*.endpoint_interface*/ NULL, + /*.timer_interface*/ NULL, + /*.dialplan_interface*/ NULL, + /*.codec_interface*/ &gsm_codec_interface, + /*.application_interface*/ NULL +}; + + +SWITCH_MOD_DECLARE(switch_status) switch_module_load(const switch_loadable_module_interface **interface, char *filename) { + /* connect my internal structure to the blank pointer passed to me */ + *interface = &gsm_module_interface; + + /* indicate that the module should continue to be loaded */ + return SWITCH_STATUS_SUCCESS; +} + + + + + diff --git a/src/mod/codec/mod_codec_gsm/mod_codec_gsm.vcproj b/src/mod/codec/mod_codec_gsm/mod_codec_gsm.vcproj new file mode 100644 index 0000000000..452decbd66 --- /dev/null +++ b/src/mod/codec/mod_codec_gsm/mod_codec_gsm.vcproj @@ -0,0 +1,212 @@ +<?xml version="1.0" encoding="Windows-1252"?> +<VisualStudioProject + ProjectType="Visual C++" + Version="8.00" + Name="mod_codec_gsm" + ProjectGUID="{4926323F-4EA8-4B7D-A3D3-65488725988F}" + RootNamespace="mod_codec_gsm" + Keyword="Win32Proj" + > + <Platforms> + <Platform + Name="Win32" + /> + </Platforms> + <ToolFiles> + </ToolFiles> + <Configurations> + <Configuration + Name="Debug|Win32" + OutputDirectory="Debug" + IntermediateDirectory="Debug" + ConfigurationType="2" + InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops" + CharacterSet="2" + > + <Tool + Name="VCPreBuildEventTool" + CommandLine="cscript /nologo $(InputDir)..\..\..\..\w32\vsnet\getlibs.vbs Mod_Codecgsm Debug" + /> + <Tool + Name="VCCustomBuildTool" + /> + <Tool + Name="VCXMLDataGeneratorTool" + /> + <Tool + Name="VCWebServiceProxyGeneratorTool" + /> + <Tool + Name="VCMIDLTool" + /> + <Tool + Name="VCCLCompilerTool" + Optimization="0" + AdditionalIncludeDirectories=""$(InputDir)..\..\..\include";"$(InputDir)..\..\..\..\libs\include";"$(InputDir)..\..\..\..\libs\codec\gsm\inc"" + PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;_USRDLL;MOD_EXPORTS" + MinimalRebuild="true" + BasicRuntimeChecks="3" + RuntimeLibrary="3" + UsePrecompiledHeader="0" + WarningLevel="3" + Detect64BitPortabilityProblems="true" + DebugInformationFormat="4" + /> + <Tool + Name="VCManagedResourceCompilerTool" + /> + <Tool + Name="VCResourceCompilerTool" + /> + <Tool + Name="VCPreLinkEventTool" + /> + <Tool + Name="VCLinkerTool" + AdditionalDependencies="libgsm.lib FreeSwitchCore.lib" + OutputFile="..\..\..\..\w32\vsnet\$(OutDir)/mod/mod_codec_gsm.dll" + LinkIncremental="2" + AdditionalLibraryDirectories="..\..\..\..\libs\codec\gsm\Debug;..\..\..\..\w32\vsnet\Debug" + GenerateDebugInformation="true" + ProgramDatabaseFile="$(OutDir)/mod_codec_gsm.pdb" + SubSystem="2" + ImportLibrary="$(OutDir)/mod_codec_gsm.lib" + TargetMachine="1" + /> + <Tool + Name="VCALinkTool" + /> + <Tool + Name="VCManifestTool" + /> + <Tool + Name="VCXDCMakeTool" + /> + <Tool + Name="VCBscMakeTool" + /> + <Tool + Name="VCFxCopTool" + /> + <Tool + Name="VCAppVerifierTool" + /> + <Tool + Name="VCWebDeploymentTool" + /> + <Tool + Name="VCPostBuildEventTool" + /> + </Configuration> + <Configuration + Name="Release|Win32" + OutputDirectory="Release" + IntermediateDirectory="Release" + ConfigurationType="2" + InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops" + CharacterSet="2" + > + <Tool + Name="VCPreBuildEventTool" + CommandLine="cscript /nologo $(InputDir)..\..\..\..\w32\vsnet\getlibs.vbs Mod_Codecgsm Release" + /> + <Tool + Name="VCCustomBuildTool" + /> + <Tool + Name="VCXMLDataGeneratorTool" + /> + <Tool + Name="VCWebServiceProxyGeneratorTool" + /> + <Tool + Name="VCMIDLTool" + /> + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories=""$(InputDir)..\..\..\include";"$(InputDir)..\..\..\..\libs\include";"$(InputDir)..\..\..\..\libs\codec\gsm\inc"" + PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS;_USRDLL;MOD_EXPORTS" + RuntimeLibrary="2" + UsePrecompiledHeader="0" + WarningLevel="3" + Detect64BitPortabilityProblems="true" + DebugInformationFormat="3" + /> + <Tool + Name="VCManagedResourceCompilerTool" + /> + <Tool + Name="VCResourceCompilerTool" + /> + <Tool + Name="VCPreLinkEventTool" + /> + <Tool + Name="VCLinkerTool" + AdditionalDependencies="libgsm.lib FreeSwitchCore.lib" + OutputFile="..\..\..\..\w32\vsnet\$(OutDir)/mod/mod_codec_gsm.dll" + LinkIncremental="1" + AdditionalLibraryDirectories="..\..\..\..\libs\codec\gsm\Release;..\..\..\..\w32\vsnet\Release" + GenerateDebugInformation="true" + SubSystem="2" + OptimizeReferences="2" + EnableCOMDATFolding="2" + LinkTimeCodeGeneration="1" + ImportLibrary="$(OutDir)/mod_codec_gsm.lib" + TargetMachine="1" + /> + <Tool + Name="VCALinkTool" + /> + <Tool + Name="VCManifestTool" + /> + <Tool + Name="VCXDCMakeTool" + /> + <Tool + Name="VCBscMakeTool" + /> + <Tool + Name="VCFxCopTool" + /> + <Tool + Name="VCAppVerifierTool" + /> + <Tool + Name="VCWebDeploymentTool" + /> + <Tool + Name="VCPostBuildEventTool" + /> + </Configuration> + </Configurations> + <References> + </References> + <Files> + <Filter + Name="Source Files" + Filter="cpp;c;cxx;def;odl;idl;hpj;bat;asm;asmx" + UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}" + > + <File + RelativePath="mod_codec_gsm.c" + > + </File> + </Filter> + <Filter + Name="Header Files" + Filter="h;hpp;hxx;hm;inl;inc;xsd" + UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}" + > + </Filter> + <Filter + Name="Resource Files" + Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx" + UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}" + > + </Filter> + </Files> + <Globals> + </Globals> +</VisualStudioProject> diff --git a/w32/vsnet/FreeSwitchCore.vcproj b/w32/vsnet/FreeSwitchCore.vcproj index ffcfa9d626..88e6b0a5d7 100644 --- a/w32/vsnet/FreeSwitchCore.vcproj +++ b/w32/vsnet/FreeSwitchCore.vcproj @@ -99,7 +99,7 @@ /> <Tool Name="VCPostBuildEventTool" - CommandLine="xcopy $(Projectdir)..\..\conf\*.* $(Outdir)\conf\ /C /D /Y
" + CommandLine="xcopy $(Projectdir)..\..\conf\*.* $(Outdir)\conf\ /C /D /Y
md $(Outdir)\db" /> </Configuration> <Configuration @@ -181,7 +181,7 @@ /> <Tool Name="VCPostBuildEventTool" - CommandLine="xcopy $(Projectdir)..\..\conf\*.* $(Outdir)\conf\ /C /D /Y
" + CommandLine="xcopy $(Projectdir)..\..\conf\*.* $(Outdir)\conf\ /C /D /Y
md $(Outdir)\db" /> </Configuration> </Configurations> diff --git a/w32/vsnet/GetLibs.vbs b/w32/vsnet/GetLibs.vbs index 894b0a3bf8..326d488cd7 100644 --- a/w32/vsnet/GetLibs.vbs +++ b/w32/vsnet/GetLibs.vbs @@ -14,6 +14,7 @@ BuildModIaxChan=False BuildModPortAudio=False BuildModSpeexCodec=False BuildModCodecG729=False +BuildModCodecGSM=False BuildModXMPPEvent=False quote=Chr(34) ScriptDir=Left(WScript.ScriptFullName,Len(WScript.ScriptFullName)-Len(WScript.ScriptName)) @@ -49,6 +50,8 @@ If objArgs.Count >=1 Then BuildModSpeexCodec=True Case "Mod_CodecG729" BuildModCodecG729=True + Case "Mod_CodecGSM" + BuildModCodecGSM=True Case "Mod_XMPPEvent" BuildModXMPPEvent=True Case Else @@ -95,6 +98,10 @@ If BuildModCodecG729 Then BuildLibs_ModCodecG729 BuildDebug, BuildRelease End If +If BuildModCodecGSM Then + BuildLibs_ModCodecGSM BuildDebug, BuildRelease +End If + If BuildModXMPPEvent Then BuildLibs_ModXMPPEvent BuildDebug, BuildRelease End If @@ -445,6 +452,23 @@ Sub BuildLibs_ModCodecG729(BuildDebug, BuildRelease) End If End Sub +Sub BuildLibs_ModCodecGSM(BuildDebug, BuildRelease) + If FSO.FolderExists(LibDestDir & "codec\gsm") Then + If BuildDebug Then + If Not FSO.FileExists(LibDestDir & "codec\gsm\Debug\libgsm.lib") Then + BuildViaVCBuild LibDestDir & "codec\gsm\libgsm.vcproj", "Debug" + End If + End If + If BuildRelease Then + If Not FSO.FileExists(LibDestDir & "codec\gsm\Release\libgsm.lib") Then + BuildViaVCBuild LibDestDir & "codec\gsm\libgsm.vcproj", "Release" + End If + End If + Else + Wscript.echo "Unable to download libgsm" + End If +End Sub + Sub UpgradeViaDevEnv(ProjectFile) Set oExec = WshShell.Exec(quote & DevEnv & quote & " " & quote & ProjectFile & quote & " /Upgrade ") Do While oExec.Status <> 1