summaryrefslogtreecommitdiff
path: root/gr-vocoder/lib/freedv_tx_ss_impl.cc
diff options
context:
space:
mode:
authorClayton Smith <argilo@gmail.com>2020-10-19 07:02:25 -0400
committermormj <34754695+mormj@users.noreply.github.com>2020-10-20 05:55:15 -0400
commitddb282314af10949706596045c2711b67a0bc3f6 (patch)
tree870800343caf084949ba04e50e41aecd8dd73bd6 /gr-vocoder/lib/freedv_tx_ss_impl.cc
parentb38d43f388d8e30007b83736f329aa8aac1d1cb5 (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.cc23
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;
}