From 3293212043a4fd9bd932dc9890da15e10ccaa347 Mon Sep 17 00:00:00 2001 From: max Date: Wed, 11 Sep 2013 01:47:15 +0000 Subject: [PATCH] software codec option, fix gruel incl git-svn-id: http://op25.osmocom.org/svn/trunk@321 65a5c917-d112-43f1-993d-58c26a4786be --- repeater/Makefile.common | 2 +- repeater/configure.ac | 2 ++ repeater/src/lib/Makefile.am | 4 +++- repeater/src/lib/repeater_vocoder.cc | 30 ++++++++++++++++++++++------ repeater/src/lib/repeater_vocoder.h | 5 +++++ 5 files changed, 35 insertions(+), 8 deletions(-) diff --git a/repeater/Makefile.common b/repeater/Makefile.common index cc4df0c..7dc0628 100644 --- a/repeater/Makefile.common +++ b/repeater/Makefile.common @@ -27,7 +27,7 @@ grincludedir = $(includedir)/gnuradio swigincludedir = $(grincludedir)/swig # gruel includes -gruelincludedir = $(includedir)/gruel +gruelincludedir = $(GRUEL_INCLUDEDIR)/gruel # Install this stuff in the appropriate subdirectory # This usually ends up at: diff --git a/repeater/configure.ac b/repeater/configure.ac index 3e2295d..454b0a1 100644 --- a/repeater/configure.ac +++ b/repeater/configure.ac @@ -87,6 +87,8 @@ GR_REQUIRE_BOOST_INCLUDES STD_DEFINES_AND_INCLUDES="$GNURADIO_CORE_CFLAGS $BOOST_CFLAGS" AC_SUBST(STD_DEFINES_AND_INCLUDES) + +PKG_CHECK_MODULES(GRUEL, gruel) AC_CONFIG_FILES([\ Makefile \ diff --git a/repeater/src/lib/Makefile.am b/repeater/src/lib/Makefile.am index dc860e4..088a298 100644 --- a/repeater/src/lib/Makefile.am +++ b/repeater/src/lib/Makefile.am @@ -85,7 +85,9 @@ _repeater_la_LDFLAGS = $(NO_UNDEFINED) -module -avoid-version -L../../../imbe_vo # c++ standard library _repeater_la_LIBADD = \ $(PYTHON_LDFLAGS) \ - -lstdc++ + -lstdc++ \ + ../../../blocks/src/lib/software_imbe_decoder.lo \ + ../../../blocks/src/lib/imbe_decoder.lo repeater.cc repeater.py: repeater.i $(ALL_IFILES) $(SWIG) $(SWIGPYTHONARGS) -module repeater -o repeater.cc $< diff --git a/repeater/src/lib/repeater_vocoder.cc b/repeater/src/lib/repeater_vocoder.cc index b7f3685..0a0cc8c 100644 --- a/repeater/src/lib/repeater_vocoder.cc +++ b/repeater/src/lib/repeater_vocoder.cc @@ -225,6 +225,12 @@ repeater_vocoder::repeater_vocoder (bool encode_flag, bool verbose_flag, int str init_sock(udp_host, opt_udp_port); clear_bits(f_body); + + const char *p = getenv("IMBE"); + if (p && strcasecmp(p, "soft") == 0) + d_software_imbe_decoder = true; + else + d_software_imbe_decoder = false; } /* @@ -313,14 +319,26 @@ void repeater_vocoder::rxchar(char c) rxbuf[rxbufp] = 0; sscanf(rxbuf, "%x %x %x %x %x %x %x %x", &u[0], &u[1], &u[2], &u[3], &u[4], &u[5], &u[6], &u[7]); rxbufp = 0; - for (int i=0; i < 8; i++) { - frame_vector[i] = u[i]; - } - /* TEST*/ frame_vector[7] >>= 1; // decode 88 bits, outputs 160 sound samples (8000 rate) - vocoder.imbe_decode(frame_vector, snd); + if (d_software_imbe_decoder) { + voice_codeword cw; + imbe_header_encode(cw, u[0], u[1], u[2], u[3], u[4], u[5], u[6], u[7]); + software_decoder.decode(cw); + audio_samples *samples = software_decoder.audio(); + assert (samples->size() == FRAME); + for (int i=0; i < FRAME; i++) { + snd[i] = (int16_t)(samples->front() * 32768.0); + samples->pop_front(); + } + } else { + for (int i=0; i < 8; i++) { + frame_vector[i] = u[i]; + } + /* TEST*/ frame_vector[7] >>= 1; + vocoder.imbe_decode(frame_vector, snd); + } if (opt_udp_port > 0) { - sendto(write_sock, snd, FRAME * sizeof(uint16_t), 0, (struct sockaddr*)&write_sock_addr, sizeof(write_sock_addr)); + sendto(write_sock, snd, FRAME * sizeof(int16_t), 0, (struct sockaddr*)&write_sock_addr, sizeof(write_sock_addr)); } else { // add generated samples to output queue for (int i = 0; i < FRAME; i++) { diff --git a/repeater/src/lib/repeater_vocoder.h b/repeater/src/lib/repeater_vocoder.h index 20c06d7..b9d76f4 100644 --- a/repeater/src/lib/repeater_vocoder.h +++ b/repeater/src/lib/repeater_vocoder.h @@ -32,6 +32,9 @@ typedef std::vector bit_vector; #include +#include +#include + class repeater_vocoder; /* @@ -115,6 +118,8 @@ private: uint8_t save_l; bit_vector f_body; imbe_vocoder vocoder; + software_imbe_decoder software_decoder; + bool d_software_imbe_decoder; std::deque output_queue; std::deque output_queue_decode;