summaryrefslogtreecommitdiff
path: root/gr-vocoder/lib
diff options
context:
space:
mode:
Diffstat (limited to 'gr-vocoder/lib')
-rw-r--r--gr-vocoder/lib/CMakeLists.txt1
-rw-r--r--gr-vocoder/lib/codec2.cc33
-rw-r--r--gr-vocoder/lib/codec2_decode_ps_impl.cc44
-rw-r--r--gr-vocoder/lib/codec2_decode_ps_impl.h5
-rw-r--r--gr-vocoder/lib/codec2_encode_sp_impl.cc35
-rw-r--r--gr-vocoder/lib/codec2_encode_sp_impl.h5
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,