diff options
author | Clayton Smith <argilo@gmail.com> | 2016-09-16 14:33:46 -0600 |
---|---|---|
committer | A. Maitland Bottoms <bottoms@debian.org> | 2016-11-15 22:03:38 -0500 |
commit | 0c05efd72c3c727f51974fa8c7eb04afe76f1b7c (patch) | |
tree | cec85ca4af8309384d157f3cba66a2b40196a3d4 /gr-vocoder/lib | |
parent | 1d71c257e3be6a10c8addf5661fd07c81c1bf65b (diff) |
Get the FreeDV demodulator working.
Diffstat (limited to 'gr-vocoder/lib')
-rw-r--r-- | gr-vocoder/lib/freedv_rx_ss_impl.cc | 31 |
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) { |