summaryrefslogtreecommitdiff
path: root/gr-vocoder/lib
diff options
context:
space:
mode:
authorClayton Smith <argilo@gmail.com>2016-09-16 14:33:46 -0600
committerA. Maitland Bottoms <bottoms@debian.org>2016-11-15 22:03:38 -0500
commit0c05efd72c3c727f51974fa8c7eb04afe76f1b7c (patch)
treecec85ca4af8309384d157f3cba66a2b40196a3d4 /gr-vocoder/lib
parent1d71c257e3be6a10c8addf5661fd07c81c1bf65b (diff)
Get the FreeDV demodulator working.
Diffstat (limited to 'gr-vocoder/lib')
-rw-r--r--gr-vocoder/lib/freedv_rx_ss_impl.cc31
1 files changed, 11 insertions, 20 deletions
diff --git a/gr-vocoder/lib/freedv_rx_ss_impl.cc b/gr-vocoder/lib/freedv_rx_ss_impl.cc
index 06a896733d..748a5c10aa 100644
--- a/gr-vocoder/lib/freedv_rx_ss_impl.cc
+++ b/gr-vocoder/lib/freedv_rx_ss_impl.cc
@@ -67,7 +67,7 @@ namespace gr {
d_speech_samples = freedv_get_n_speech_samples(d_freedv);
d_max_modem_samples = freedv_get_n_max_modem_samples(d_freedv);
d_nin = freedv_nin(d_freedv);
- //set_output_multiple(d_max_modem_samples);
+ set_output_multiple(d_max_modem_samples);
}
freedv_rx_ss_impl::~freedv_rx_ss_impl()
@@ -89,7 +89,7 @@ namespace gr {
{
unsigned ninputs = ninput_items_required.size();
for(unsigned i = 0; i < ninputs; i++)
- ninput_items_required[i] = noutput_items;
+ ninput_items_required[i] = std::max(d_nin, noutput_items);
}
int
@@ -100,32 +100,23 @@ namespace gr {
{
short *in = (short *) input_items[0];
short *out = (short *) output_items[0];
- int i,n;
- d_nin = freedv_nin(d_freedv);
- if (ninput_items[0] < d_nin) {
- consume_each(0);
- return(0);
- }
- for (i=0,n=0; ((n+d_nin) <= noutput_items)&&(i <= ninput_items[0]);) {
- d_nout = freedv_rx(d_freedv, out, in);
- i += d_nin;
- n += d_nout;
- out = &(out[d_nout]);
- in = &(in[d_nin]);
+ int in_offset = 0, out_offset = 0;
+
+ while ((noutput_items - out_offset) >= d_max_modem_samples
+ && (ninput_items[0] - in_offset) >= d_nin) {
+ d_nout = freedv_rx(d_freedv, out + out_offset, in + in_offset);
+ out_offset += d_nout;
+ in_offset += d_nin;
d_nin = freedv_nin(d_freedv);
}
- if ((i > ninput_items[0])||((n+d_nin) > noutput_items)) {
- i -= d_nin;
- n -= d_nout;
- } // back up to where we left off processing freedv_rx
freedv_get_modem_stats(d_freedv, &d_sync, &d_snr_est);
freedv_get_modem_extended_stats(d_freedv, &d_stats);
d_total_bit_errors = freedv_get_total_bit_errors(d_freedv);
- consume_each(i);
- return(n);
+ consume_each(in_offset);
+ return out_offset;
}
void put_next_rx_proto(void *callback_state,char *proto_bits) {