diff --git a/src/audio/codecs/Makefile.am b/src/audio/codecs/Makefile.am index c9e5b11ed2f64d4dd67c700fc02bfe5e821ca9c6..0644c65bbc7560f18f72621fce7a8dc31c74100f 100644 --- a/src/audio/codecs/Makefile.am +++ b/src/audio/codecs/Makefile.am @@ -22,6 +22,15 @@ libcodec_speex_nb_so_LDFLAGS = --shared -lc -lspeex $(SPEEX_NIMP) INSTALL_SPEEX_NB_RULE = install-libcodec_speex_nb_so endif +if BUILD_SPEEX +SPEEX_WB_LIB = libcodec_speex_wb.so +libcodec_speex_wb_so_SOURCES = speexcodec_wb.cpp +libcodec_speex_wb_so_CFLAGS = -fPIC -g -Wall +libcodec_speex_wb_so_CXXFLAGS = -fPIC -g -Wall $(SPEEXDSP) +libcodec_speex_wb_so_LDFLAGS = --shared -lc -lspeex $(SPEEX_NIMP) +INSTALL_SPEEX_WB_RULE = install-libcodec_speex_wb_so +endif + if BUILD_ILBC ILBC_LIB = libcodec_ilbc.so libcodec_ilbc_so_SOURCES = ilbc.cpp @@ -32,7 +41,7 @@ INSTALL_ILBC_RULE = install-libcodec_ilbc_so SUBDIRS = ilbc endif -noinst_PROGRAMS = libcodec_ulaw.so libcodec_alaw.so $(GSM_LIB) $(SPEEX_NB_LIB) $(ILBC_LIB) +noinst_PROGRAMS = libcodec_ulaw.so libcodec_alaw.so $(GSM_LIB) $(SPEEX_NB_LIB) $(SPEEX_WB_LIB) $(ILBC_LIB) noinst_HEADERS = audiocodec.h @@ -48,8 +57,8 @@ libcodec_alaw_so_LDFLAGS = --shared -lc -install-exec-local: install-libcodec_ulaw_so install-libcodec_alaw_so $(INSTALL_GSM_RULE) $(INSTALL_SPEEX_NB_RULE) $(INSTALL_ILBC_RULE) -uninstall-local: uninstall-libcodec_ulaw_so uninstall-libcodec_alaw_so uninstall-libcodec_gsm_so uninstall-libcodec_speex_nb_so +install-exec-local: install-libcodec_ulaw_so install-libcodec_alaw_so $(INSTALL_GSM_RULE) $(INSTALL_SPEEX_NB_RULE) $(INSTALL_SPEEX_WB_RULE) $(INSTALL_ILBC_RULE) +uninstall-local: uninstall-libcodec_ulaw_so uninstall-libcodec_alaw_so uninstall-libcodec_gsm_so uninstall-libcodec_speex_nb_so uninstall-libcodec_speex_wb_so install-libcodec_ulaw_so: libcodec_ulaw.so mkdir -p $(sflcodecdir) @@ -60,6 +69,8 @@ install-libcodec_gsm_so: libcodec_gsm.so $(INSTALL_PROGRAM) libcodec_gsm.so $(sflcodecdir) install-libcodec_speex_nb_so: libcodec_speex_nb.so $(INSTALL_PROGRAM) libcodec_speex_nb.so $(sflcodecdir) +install-libcodec_speex_wb_so: libcodec_speex_wb.so + $(INSTALL_PROGRAM) libcodec_speex_wb.so $(sflcodecdir) install-libcodec_ilbc_so: libcodec_ilbc.so $(INSTALL_PROGRAM) libcodec_ilbc.so $(sflcodecdir) @@ -72,6 +83,8 @@ uninstall-libcodec_gsm_so: rm -f $(sflcodecdir)/libcodec_gsm.so uninstall-libcodec_speex_nb_so: rm -f $(sflcodecdir)/libcodec_speex_nb.so +uninstall-libcodec_speex_wb_so: + rm -f $(sflcodecdir)/libcodec_speex_wb.so rm -rf $(sflcodecdir) uninstall-libcodec_ilbc_so: rm -f $(sflcodecdir)/libcodec_ilbc.so diff --git a/src/audio/codecs/speexcodec_nb.cpp b/src/audio/codecs/speexcodec_nb.cpp index 8fa934b16b47663af8155dd6c833324f7adbfef3..72b3c36d0dadff319f236358b05be1e389f49ca4 100644 --- a/src/audio/codecs/speexcodec_nb.cpp +++ b/src/audio/codecs/speexcodec_nb.cpp @@ -145,7 +145,7 @@ class Speex : public AudioCodec{ // the class factories extern "C" AudioCodec* create() { - return new Speex(111); + return new Speex(110); } extern "C" void destroy(AudioCodec* a) { diff --git a/src/audio/codecs/speexcodec_wb.cpp b/src/audio/codecs/speexcodec_wb.cpp new file mode 100644 index 0000000000000000000000000000000000000000..e86b3d724ef7b21040f7da61af96461fbd899685 --- /dev/null +++ b/src/audio/codecs/speexcodec_wb.cpp @@ -0,0 +1,154 @@ +/* + * Copyright (C) 2007-2009 Savoir-Faire Linux inc. + * Author: Alexandre Savard <alexandre.savard@savoirfairelinux.com> + * Author: Emmanuel Milou <emmanuel.milou@savoirfairelinux.com> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + */ + +#include "audiocodec.h" +#include <cstdio> +#include <speex/speex.h> +#include <speex/speex_preprocess.h> + +class Speex : public AudioCodec{ + public: + Speex(int payload=0) + : AudioCodec(payload, "speex"), + _speexModePtr(NULL), + _speex_dec_bits(), + _speex_enc_bits(), + _speex_dec_state(), + _speex_enc_state(), + _speex_frame_size(), + _preprocess_state() + { + _clockRate = 16000; + _channel = 1; + _bitrate = 0; + _bandwidth = 0; + initSpeex(); + } + + Speex( const Speex& ); + Speex& operator=(const Speex&); + + void initSpeex() { + + int _samplingRate = 16000; + + // 8000 HZ --> Narrow-band mode + // TODO Manage the other modes + _speexModePtr = &speex_wb_mode; + // _speexModePtr = &speex_wb_mode; + + // Init the decoder struct + speex_bits_init(&_speex_dec_bits); + _speex_dec_state = speex_decoder_init(_speexModePtr); + + // Init the encoder struct + speex_bits_init(&_speex_enc_bits); + _speex_enc_state = speex_encoder_init(_speexModePtr); + + speex_encoder_ctl(_speex_enc_state,SPEEX_SET_SAMPLING_RATE,&_clockRate); + + speex_decoder_ctl(_speex_dec_state, SPEEX_GET_FRAME_SIZE, &_speex_frame_size); + +#ifdef HAVE_SPEEXDSP_LIB + + int enable = 1; + int quality = 10; + int complex = 10; + int attenuation = -10; + + speex_encoder_ctl(_speex_enc_state, SPEEX_SET_VAD, &enable); + speex_encoder_ctl(_speex_enc_state, SPEEX_SET_DTX, &enable); + speex_encoder_ctl(_speex_enc_state, SPEEX_SET_VBR_QUALITY, &quality); + speex_encoder_ctl(_speex_enc_state, SPEEX_SET_COMPLEXITY, &complex); + + // Init the decoder struct + speex_decoder_ctl(_speex_dec_state, SPEEX_GET_FRAME_SIZE, &_speex_frame_size); + + // Init the preprocess struct + _preprocess_state = speex_preprocess_state_init(_speex_frame_size,_clockRate); + speex_preprocess_ctl(_preprocess_state, SPEEX_PREPROCESS_SET_DENOISE, &enable); + speex_preprocess_ctl(_preprocess_state, SPEEX_PREPROCESS_SET_NOISE_SUPPRESS, &attenuation); + speex_preprocess_ctl(_preprocess_state, SPEEX_PREPROCESS_SET_VAD, &enable); + speex_preprocess_ctl(_preprocess_state, SPEEX_PREPROCESS_SET_AGC, &enable); +#endif + + } + + ~Speex() + { + terminateSpeex(); + } + + void terminateSpeex() { + // Destroy the decoder struct + speex_bits_destroy(&_speex_dec_bits); + speex_decoder_destroy(_speex_dec_state); + _speex_dec_state = 0; + + // Destroy the encoder struct + speex_bits_destroy(&_speex_enc_bits); + speex_encoder_destroy(_speex_enc_state); + _speex_enc_state = 0; + } + + virtual int codecDecode (short *dst, unsigned char *src, unsigned int size) + { + + int ratio = 320 / _speex_frame_size; + speex_bits_read_from(&_speex_dec_bits, (char*)src, size); + speex_decode_int(_speex_dec_state, &_speex_dec_bits, dst); + + return 2 * _speex_frame_size * ratio; + } + + virtual int codecEncode (unsigned char *dst, short *src, unsigned int size) + { + speex_bits_reset(&_speex_enc_bits); + +#ifdef HAVE_SPEEXDSP_LIB + + speex_preprocess_run(_preprocess_state, src); +#endif + + speex_encode_int(_speex_enc_state, src, &_speex_enc_bits); + int nbBytes = speex_bits_write(&_speex_enc_bits, (char*)dst, size); + printf("Codec::codecEncode() nbBytes: %i \n",nbBytes); + return nbBytes; + } + + private: + const SpeexMode* _speexModePtr; + SpeexBits _speex_dec_bits; + SpeexBits _speex_enc_bits; + void *_speex_dec_state; + void *_speex_enc_state; + int _speex_frame_size; + SpeexPreprocessState *_preprocess_state; +}; + +// the class factories +extern "C" AudioCodec* create() { + return new Speex(111); +} + +extern "C" void destroy(AudioCodec* a) { + delete a; +} +