From 9d48d89998bb9b4c36615bc7bab622f9b5c066dd Mon Sep 17 00:00:00 2001
From: Clayton Smith <argilo@gmail.com>
Date: Sun, 6 Apr 2014 08:56:50 -0400
Subject: Bring codec2 up to the latest version, and add support for all six
 bit rates.

---
 gr-vocoder/lib/codec2_encode_sp_impl.cc | 35 ++++++++++++++++++++++-----------
 1 file changed, 23 insertions(+), 12 deletions(-)

(limited to 'gr-vocoder/lib/codec2_encode_sp_impl.cc')

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) {
-- 
cgit v1.2.3