diff options
author | Clayton Smith <argilo@gmail.com> | 2020-10-19 07:02:25 -0400 |
---|---|---|
committer | mormj <34754695+mormj@users.noreply.github.com> | 2020-10-20 05:55:15 -0400 |
commit | ddb282314af10949706596045c2711b67a0bc3f6 (patch) | |
tree | 870800343caf084949ba04e50e41aecd8dd73bd6 /gr-vocoder/lib/freedv_tx_ss_impl.cc | |
parent | b38d43f388d8e30007b83736f329aa8aac1d1cb5 (diff) |
vocoder: allow input & output rates to differ
The input & output rates of the FreeDV modulator aren't necessarily the
same. In particular, the 2400A and 2400B modes have an input rate of
8000 sps and an output rate of 48000 sps. To allow for arbitrary input &
output rates, I've changed freedv_tx_ss from sync_block to block.
Diffstat (limited to 'gr-vocoder/lib/freedv_tx_ss_impl.cc')
-rw-r--r-- | gr-vocoder/lib/freedv_tx_ss_impl.cc | 23 |
1 files changed, 15 insertions, 8 deletions
diff --git a/gr-vocoder/lib/freedv_tx_ss_impl.cc b/gr-vocoder/lib/freedv_tx_ss_impl.cc index 1f3dadeb52..b1160d1ac9 100644 --- a/gr-vocoder/lib/freedv_tx_ss_impl.cc +++ b/gr-vocoder/lib/freedv_tx_ss_impl.cc @@ -31,9 +31,9 @@ freedv_tx_ss::make(int mode, const std::string msg_txt, int interleave_frames) freedv_tx_ss_impl::freedv_tx_ss_impl(int mode, const std::string msg_txt, int interleave_frames) - : sync_block("vocoder_freedv_tx_ss", - io_signature::make(1, 1, sizeof(short)), - io_signature::make(1, 1, sizeof(short))), + : block("vocoder_freedv_tx_ss", + io_signature::make(1, 1, sizeof(short)), + io_signature::make(1, 1, sizeof(short))), d_mode(mode), d_msg_text(msg_txt), d_interleave_frames(interleave_frames) @@ -53,6 +53,7 @@ freedv_tx_ss_impl::freedv_tx_ss_impl(int mode, #endif d_tx_str = msg_txt + "\r"; // FreeDV uses Carriage Return termination freedv_set_callback_txt(d_freedv, NULL, get_next_tx_char, this); + d_speech_samples = freedv_get_n_speech_samples(d_freedv); d_nom_modem_samples = freedv_get_n_nom_modem_samples(d_freedv); set_output_multiple(d_nom_modem_samples); } @@ -91,17 +92,23 @@ void freedv_tx_ss_impl::set_tx_bpf(bool val) freedv_tx_ss_impl::set_tx_bpf(0); } -int freedv_tx_ss_impl::work(int noutput_items, - gr_vector_const_void_star& input_items, - gr_vector_void_star& output_items) +void freedv_tx_ss_impl::forecast(int noutput_items, gr_vector_int& ninput_items_required) +{ + ninput_items_required[0] = (noutput_items / d_nom_modem_samples) * d_speech_samples; +} + +int freedv_tx_ss_impl::general_work(int noutput_items, + gr_vector_int& ninput_items, + gr_vector_const_void_star& input_items, + gr_vector_void_star& output_items) { short* in = (short*)input_items[0]; short* out = (short*)output_items[0]; int i; for (i = 0; i < (noutput_items / d_nom_modem_samples); i++) - freedv_tx( - d_freedv, &(out[i * d_nom_modem_samples]), &(in[i * d_nom_modem_samples])); + freedv_tx(d_freedv, &(out[i * d_nom_modem_samples]), &(in[i * d_speech_samples])); + consume_each(i * d_speech_samples); return noutput_items; } |