diff options
Diffstat (limited to 'gr-vocoder/lib')
-rw-r--r-- | gr-vocoder/lib/CMakeLists.txt | 1 | ||||
-rw-r--r-- | gr-vocoder/lib/codec2.cc | 33 | ||||
-rw-r--r-- | gr-vocoder/lib/codec2_decode_ps_impl.cc | 44 | ||||
-rw-r--r-- | gr-vocoder/lib/codec2_decode_ps_impl.h | 5 | ||||
-rw-r--r-- | gr-vocoder/lib/codec2_encode_sp_impl.cc | 35 | ||||
-rw-r--r-- | gr-vocoder/lib/codec2_encode_sp_impl.h | 5 |
6 files changed, 91 insertions, 32 deletions
diff --git a/gr-vocoder/lib/CMakeLists.txt b/gr-vocoder/lib/CMakeLists.txt index 08ff4108d3..e8368f702c 100644 --- a/gr-vocoder/lib/CMakeLists.txt +++ b/gr-vocoder/lib/CMakeLists.txt @@ -44,6 +44,7 @@ link_directories(${LOG4CPP_LIBRARY_DIRS}) list(APPEND gr_vocoder_sources alaw_decode_bs_impl.cc alaw_encode_sb_impl.cc + codec2.cc codec2_decode_ps_impl.cc codec2_encode_sp_impl.cc cvsd_decode_bs_impl.cc diff --git a/gr-vocoder/lib/codec2.cc b/gr-vocoder/lib/codec2.cc new file mode 100644 index 0000000000..6d0ef61352 --- /dev/null +++ b/gr-vocoder/lib/codec2.cc @@ -0,0 +1,33 @@ +/* -*- c++ -*- */ +/* + * Copyright 2002,2007,2008,2012,2013 Free Software Foundation, Inc. + * + * This file is part of GNU Radio + * + * GNU Radio 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, or (at your option) + * any later version. + * + * GNU Radio 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 GNU Radio; see the file COPYING. If not, write to + * the Free Software Foundation, Inc., 51 Franklin Street, + * Boston, MA 02110-1301, USA. + */ + +#ifdef HAVE_CONFIG_H +#include <config.h> +#endif + +#include <gnuradio/vocoder/codec2.h> + +namespace gr { + namespace vocoder { + + } /* namespace vocoder */ +} /* namespace gr */ diff --git a/gr-vocoder/lib/codec2_decode_ps_impl.cc b/gr-vocoder/lib/codec2_decode_ps_impl.cc index a4f7cccf82..fa4c1839d0 100644 --- a/gr-vocoder/lib/codec2_decode_ps_impl.cc +++ b/gr-vocoder/lib/codec2_decode_ps_impl.cc @@ -24,12 +24,12 @@ #include "config.h" #endif -#include "codec2_decode_ps_impl.h" - extern "C" { #include "codec2/codec2.h" } +#include "codec2_decode_ps_impl.h" + #include <gnuradio/io_signature.h> #include <stdexcept> #include <assert.h> @@ -38,22 +38,34 @@ namespace gr { namespace vocoder { codec2_decode_ps::sptr - codec2_decode_ps::make() + codec2_decode_ps::make(int mode) { + CODEC2 *codec2; + int samples_per_frame, bits_per_frame; + + // Check the number of input samples and output bits per frame. + codec2 = codec2_create(mode); + samples_per_frame = codec2_samples_per_frame(codec2); + bits_per_frame = codec2_bits_per_frame(codec2); + codec2_destroy(codec2); + return gnuradio::get_initial_sptr - (new codec2_decode_ps_impl()); + (new codec2_decode_ps_impl(mode, samples_per_frame, bits_per_frame)); } - codec2_decode_ps_impl::codec2_decode_ps_impl () + codec2_decode_ps_impl::codec2_decode_ps_impl (int mode, int samples_per_frame, int bits_per_frame) : sync_interpolator("vocoder_codec2_decode_ps", - io_signature::make(1, 1, CODEC2_BITS_PER_FRAME * sizeof(char)), + io_signature::make(1, 1, bits_per_frame * sizeof(char)), io_signature::make (1, 1, sizeof(short)), - CODEC2_SAMPLES_PER_FRAME), - d_frame_buf(CODEC2_BYTES_PER_FRAME, 0) + samples_per_frame), + d_frame_buf((bits_per_frame + 7) / 8, 0) { - if((d_codec2 = codec2_create()) == 0) + if((d_codec2 = codec2_create(mode)) == 0) throw std::runtime_error("codec2_decode_ps_impl: codec2_create failed"); + d_samples_per_frame = samples_per_frame; + d_bits_per_frame = bits_per_frame; + d_bytes_per_frame = (bits_per_frame + 7) / 8; } codec2_decode_ps_impl::~codec2_decode_ps_impl() @@ -69,13 +81,13 @@ namespace gr { const unsigned char *in = (const unsigned char*)input_items[0]; short *out = (short *) output_items[0]; - assert((noutput_items % CODEC2_SAMPLES_PER_FRAME) == 0); + assert((noutput_items % d_samples_per_frame) == 0); - for(int i = 0; i < noutput_items; i += CODEC2_SAMPLES_PER_FRAME) { + for(int i = 0; i < noutput_items; i += d_samples_per_frame) { pack_frame(in, &d_frame_buf[0]); - codec2_decode (d_codec2, out, const_cast<unsigned char*>(&d_frame_buf[0])); - in += CODEC2_BITS_PER_FRAME * sizeof (char); - out += CODEC2_SAMPLES_PER_FRAME; + codec2_decode (d_codec2, out, const_cast<unsigned char*>(&d_frame_buf[0]), 0.0); + in += d_bits_per_frame * sizeof (char); + out += d_samples_per_frame; } return noutput_items; @@ -84,10 +96,10 @@ namespace gr { void codec2_decode_ps_impl::pack_frame(const unsigned char *in_unpacked, unsigned char *out_packed) { - memset((void *) &d_frame_buf[0], 0x00, CODEC2_BYTES_PER_FRAME); + memset((void *) &d_frame_buf[0], 0x00, d_bytes_per_frame); int byte_idx = 0, bit_idx = 0; - for(int k = 0; k < CODEC2_BITS_PER_FRAME; k++) { + for(int k = 0; k < d_bits_per_frame; k++) { out_packed[byte_idx] |= ((in_unpacked[k] & 0x01) << (7-bit_idx)); bit_idx = (bit_idx + 1) % 8; if (bit_idx == 0) { diff --git a/gr-vocoder/lib/codec2_decode_ps_impl.h b/gr-vocoder/lib/codec2_decode_ps_impl.h index b9591dce74..db5ba2eef1 100644 --- a/gr-vocoder/lib/codec2_decode_ps_impl.h +++ b/gr-vocoder/lib/codec2_decode_ps_impl.h @@ -31,13 +31,14 @@ namespace gr { class codec2_decode_ps_impl : public codec2_decode_ps { private: - void *d_codec2; + CODEC2 *d_codec2; + int d_samples_per_frame, d_bits_per_frame, d_bytes_per_frame; std::vector<unsigned char> d_frame_buf; //!< Store 1 packed frame for decoding void pack_frame(const unsigned char *in_unpacked, unsigned char *out_packed); //!< Pack the bytes from unpacked bits for codec2 public: - codec2_decode_ps_impl(); + codec2_decode_ps_impl(int mode, int samples_per_frame, int bits_per_frame); ~codec2_decode_ps_impl(); int work(int noutput_items, diff --git a/gr-vocoder/lib/codec2_encode_sp_impl.cc b/gr-vocoder/lib/codec2_encode_sp_impl.cc index fc0b3eee19..ae76b09472 100644 --- a/gr-vocoder/lib/codec2_encode_sp_impl.cc +++ b/gr-vocoder/lib/codec2_encode_sp_impl.cc @@ -24,12 +24,12 @@ #include "config.h" #endif -#include "codec2_encode_sp_impl.h" - extern "C" { #include "codec2/codec2.h" } +#include "codec2_encode_sp_impl.h" + #include <gnuradio/io_signature.h> #include <stdexcept> #include <iostream> @@ -39,21 +39,32 @@ namespace gr { namespace vocoder { codec2_encode_sp::sptr - codec2_encode_sp::make() + codec2_encode_sp::make(int mode) { + CODEC2 *codec2; + int samples_per_frame, bits_per_frame; + + // Check the number of input samples and output bits per frame. + codec2 = codec2_create(mode); + samples_per_frame = codec2_samples_per_frame(codec2); + bits_per_frame = codec2_bits_per_frame(codec2); + codec2_destroy(codec2); + return gnuradio::get_initial_sptr - (new codec2_encode_sp_impl()); + (new codec2_encode_sp_impl(mode, samples_per_frame, bits_per_frame)); } - codec2_encode_sp_impl::codec2_encode_sp_impl() + codec2_encode_sp_impl::codec2_encode_sp_impl(int mode, int samples_per_frame, int bits_per_frame) : sync_decimator("vocoder_codec2_encode_sp", io_signature::make(1, 1, sizeof(short)), - io_signature::make(1, 1, CODEC2_BITS_PER_FRAME * sizeof(char)), - CODEC2_SAMPLES_PER_FRAME), - d_frame_buf(CODEC2_BYTES_PER_FRAME, 0) + io_signature::make(1, 1, bits_per_frame * sizeof(char)), + samples_per_frame), + d_frame_buf((bits_per_frame + 7) / 8, 0) { - if((d_codec2 = codec2_create()) == 0) + if((d_codec2 = codec2_create(mode)) == 0) throw std::runtime_error("codec2_encode_sp_impl: codec2_create failed"); + d_samples_per_frame = samples_per_frame; + d_bits_per_frame = bits_per_frame; } codec2_encode_sp_impl::~codec2_encode_sp_impl() @@ -72,8 +83,8 @@ namespace gr { for(int i = 0; i < noutput_items; i++) { codec2_encode(d_codec2, &d_frame_buf[0], const_cast<short*>(in)); unpack_frame((const unsigned char *) &d_frame_buf[0], out); - in += CODEC2_SAMPLES_PER_FRAME; - out += CODEC2_BITS_PER_FRAME * sizeof(char); + in += d_samples_per_frame; + out += d_bits_per_frame * sizeof(char); } return noutput_items; @@ -83,7 +94,7 @@ namespace gr { codec2_encode_sp_impl::unpack_frame(const unsigned char *packed, unsigned char *out) { int byte_idx = 0, bit_idx = 0; - for(int k = 0; k < CODEC2_BITS_PER_FRAME; k++) { + for(int k = 0; k < d_bits_per_frame; k++) { out[k] = (packed[byte_idx] >> (7-bit_idx)) & 0x01; bit_idx = (bit_idx + 1) % 8; if (bit_idx == 0) { diff --git a/gr-vocoder/lib/codec2_encode_sp_impl.h b/gr-vocoder/lib/codec2_encode_sp_impl.h index 7402d09f90..17d6f4e2a1 100644 --- a/gr-vocoder/lib/codec2_encode_sp_impl.h +++ b/gr-vocoder/lib/codec2_encode_sp_impl.h @@ -31,13 +31,14 @@ namespace gr { class codec2_encode_sp_impl : public codec2_encode_sp { private: - void *d_codec2; + CODEC2 *d_codec2; + int d_samples_per_frame, d_bits_per_frame; std::vector<unsigned char> d_frame_buf; //!< Save 1 CODEC2 frame void unpack_frame(const unsigned char *packed, unsigned char *out); //!< Unpack the bytes from codec2 into unpacked bits public: - codec2_encode_sp_impl(); + codec2_encode_sp_impl(int mode, int samples_per_frame, int bits_per_frame); ~codec2_encode_sp_impl(); int work(int noutput_items, |