# FreeSWITCH

FreeSWITCH es una plataforma de comunicaciones de software libre y código abierto para la creación de productos de voz, mensajería instantánea y video disponible bajo la Licencia Pública de Mozilla. La biblioteca principal, denominada "libfreeswitch", puede ser incluida en programas externos así como en aplicaciones independientes.

## Historia

El proyecto FreeSWITCH fue anunciado por primera vez en enero de 2006 en la conferencia ETEL de O'Reilly. En junio de 2007, FreeSWITCH fue seleccionado por la empresa Truphone para uso de "carrier grade", y en agosto de 2007, Gaboogie anunció que seleccionó a FreeSWITCH para sus servicios de conferencias.
El primer lanzamiento oficial de FreeSWITCH 1.0.0 (Fénix) se realizó el 26 de mayo de 2008. El 24 de julio de 2008, fue lanzada la versión 1.0.1 que es un "parche menor". La versión actual de FreeSWITCH es la 1.2.15 que ha sido liberada el 14 de noviembre de 2013.

## Diseño

Según el desarrollador principal, Anthony Minessale, FreeSWITCH es un conmutador de software (soft-switch) construido sobre una máquina de estados. El objetivo principal del proyecto incluye estabilidad, escalabilidad y abstracción.
Una versión anterior del sitio web de FreeSWITCH mostraba a un cavernicola moldeando una rueda de piedra, con un mensaje que decía, “Hay muchas ruedas, y nosotros también podríamos hacer uso de ellas”. Al parecer los desarrolladores de FreeSWITCH no tienen la intención de reinventar las ruedas que pueden provenir de otras fuentes. Una manera de eliminar las complejidades innecesarias es usando bibliotecas de software libre que están a disposición para realizar las funciones necesarias—aunque, por supuesto, esto puede hacer que la instalación sea más complicada (véase DLL Hell). FreeSWITCH lista los siguientes paquetes de software entre sus dependencias primarias:
* Apache Portable Runtime
* SQLite
* PCRE
* Sofia-SIP
* libspeex
* SpanDSP
* libsrtp
No todas estas dependencias son necesarias para construir el núcleo de la aplicación FreeSWITCH, sino que son dependencias de los diversos módulos externos, como los codecs. FreeSWITCH es una aplicación modular y los módulos pueden extender la funcionalidad de FreeSWITCH. Además, la capa de abstracción evita a que los módulos no dependan entre sí. La meta es asegurar que el núcleo no dependa de los módulos para ser iniciado y que los módulos no dependan de otros módulos para ser cargados.

## Características

FreeSWITCH incluye varios módulos que proveen aplicaciones por defecto como conferencias, XML-RPC para controlar llamadas en tiempo real, Respuesta de Voz Interactiva (IVR), Conversor texto-voz / Reconocimiento Automático de Voz (CTV/RAH), Red Telefónica Conmutada (RTC), la capacidad de interconexión con circuitos analógicos y digitales, protocolos Voz sobre IP como SIP, SCCP, H.323, XMPP, Google Talk, entre otros.
Las aplicaciones que utilizan la biblioteca de FreeSWITCH pueden ser escritas en C/C++, Python, Perl, Lua, JavaScript usando el motor SpiderMonkey de Mozilla, Java y Microsoft .NET a través del Microsoft CLR o a través de Mono. Además de eso, FreeSWITCH expone APIs y aplicaciones para el control de llamadas y funcionalidad IVR para el uso del programador.
El manejo de llamadas puede realizarse a través del Dialplan XML o mediante la interfaz Event Socket, la cual es una conexión socket al servidor FreeSWITCH. Cualquier lenguaje de programación o software capaz de comunicarse vía socket puede ser usado para controlar la actividad del servidor FreeSWITCH. FreeSWITCH también viene con una biblioteca para el Event Socket (ESL) o "Envoltorio de ESL" para Erlang, JavaScript, Lua, Perl, PHP, Python y Ruby. Esta biblioteca se encarga de abstraer los aspectos triviales de la programación con sockets.

## Codecs soportados

FreeSWITCH soporta los siguientes codecs de audio:
* PCMU – G.711 µ-law
* PCMA – G.711 A-law
* G.722
* G.722.1
* G.722.1c
* G.726
* G.726 with AAL2 packing
* G.729 (passthrough)
* G.729 (requiere de licencia, $10/canal)
* GSM
* CELT
* iLBC
* DVI4 (IMA ADPCM)
* BroadVoice
* SILK
* Speex
* CODEC2
* Siren
* LPC-10
* G.723.1 (passthrough only)
* AMR (passthrough only)
FreeSWITCH también soporta una serie de codecs de video:
* H.261
* H.263
* H.263+ (H.263-1998)
* H.263++ (H.263-2000)
* H.264
* Theora (passthrough)
* MP4 (passthrough)
Algunos de estos codecs están implementados en modo passthrough, lo que significa que los datos viajan sin compresión y sin ningún procesamiento entre las personas que llaman, esto permite que los codecs con problemas de licencias o patentes puedan ser implementados, ya que los datos no son codificados o decodificados. Sin embargo, estos codecs no pueden ser transcodificados (i.e. ambas personas que llaman deben usar el mismo codec al usar un codec en modo passthrough, y algunas funciones de grabación y reproducción, tales como IVR no son compatibles)
También hay soporte para tarjetas de hardware de transcodificación, como los que produce la empresa Sangoma. Estas tarjetas implementan los codecs en el hardware, de esta forma reduciendo el uso de CPU en el servidor. Algunos de estos codecs requieren licencia, proporcionando una alternativa a los codecs passthrough mencionados anteriormente.

## Plataformas soportadas

* AuroraUX (LLVM+Clang/gmake)
* Sun Solaris 10 UNIX (Sun Studio)
* FreeBSD (gmake)
* Mac OS X (gmake)
* RHEL/CentOS Linux
* Debian/Ubuntu GNU/Linux
* Windows (Nativo)

## Comparación con otros motores de telefonía

FreeSWITCH ocupa un espacio entre los conmutadores puros que simplemente encaminan llamadas, como GnuGK y SER, y los que son principalmente PBX o IVR, como Asterisk y sus derivados. FreeSWITCH proporciona bloques para el desarrollo de aplicaciones – tales como una central telefónica, un sistema de buzón de voz, conferencias, o tarjetas telefónicas – todo esto puede ser desarrollado utilizando cualquiera de los lenguajes soportados.