diff options
Diffstat (limited to 'gr-vocoder')
-rw-r--r-- | gr-vocoder/include/gnuradio/vocoder/freedv_tx_ss.h | 6 | ||||
-rw-r--r-- | gr-vocoder/lib/freedv_tx_ss_impl.cc | 23 | ||||
-rw-r--r-- | gr-vocoder/lib/freedv_tx_ss_impl.h | 9 | ||||
-rw-r--r-- | gr-vocoder/python/vocoder/bindings/freedv_tx_ss_python.cc | 7 |
4 files changed, 26 insertions, 19 deletions
diff --git a/gr-vocoder/include/gnuradio/vocoder/freedv_tx_ss.h b/gr-vocoder/include/gnuradio/vocoder/freedv_tx_ss.h index b2b42b4bba..9030f0186f 100644 --- a/gr-vocoder/include/gnuradio/vocoder/freedv_tx_ss.h +++ b/gr-vocoder/include/gnuradio/vocoder/freedv_tx_ss.h @@ -22,12 +22,12 @@ namespace vocoder { * \brief FreeDV modulator * \ingroup audio_blk * - * Input: Speech (audio) signal as 16-bit shorts, sampling rate 8 kHz. + * Input: Speech (audio) signal as 16-bit shorts. * - * Output: Signal (audio) as 16-bit shorts, sampling rate 8 kHz. + * Output: Signal (audio) as 16-bit shorts. * */ -class VOCODER_API freedv_tx_ss : virtual public gr::sync_block +class VOCODER_API freedv_tx_ss : virtual public gr::block { public: typedef std::shared_ptr<freedv_tx_ss> sptr; 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; } diff --git a/gr-vocoder/lib/freedv_tx_ss_impl.h b/gr-vocoder/lib/freedv_tx_ss_impl.h index f4f341b97e..bf4c0ccef1 100644 --- a/gr-vocoder/lib/freedv_tx_ss_impl.h +++ b/gr-vocoder/lib/freedv_tx_ss_impl.h @@ -50,9 +50,12 @@ public: void set_tx_bpf(int val); // Where all the action really happens - int work(int noutput_items, - gr_vector_const_void_star& input_items, - gr_vector_void_star& output_items); + void forecast(int noutput_items, gr_vector_int& ninput_items_required); + + int general_work(int noutput_items, + gr_vector_int& ninput_items, + gr_vector_const_void_star& input_items, + gr_vector_void_star& output_items); }; } /* namespace vocoder */ diff --git a/gr-vocoder/python/vocoder/bindings/freedv_tx_ss_python.cc b/gr-vocoder/python/vocoder/bindings/freedv_tx_ss_python.cc index a770bb6bfb..8da2a4aa6b 100644 --- a/gr-vocoder/python/vocoder/bindings/freedv_tx_ss_python.cc +++ b/gr-vocoder/python/vocoder/bindings/freedv_tx_ss_python.cc @@ -25,11 +25,8 @@ void bind_freedv_tx_ss(py::module& m) using freedv_tx_ss = ::gr::vocoder::freedv_tx_ss; - py::class_<freedv_tx_ss, - gr::sync_block, - gr::block, - gr::basic_block, - std::shared_ptr<freedv_tx_ss>>(m, "freedv_tx_ss", D(freedv_tx_ss)) + py::class_<freedv_tx_ss, gr::block, gr::basic_block, std::shared_ptr<freedv_tx_ss>>( + m, "freedv_tx_ss", D(freedv_tx_ss)) .def(py::init(&freedv_tx_ss::make), py::arg("mode") = gr::vocoder::freedv_api::MODE_1600, |