diff options
Diffstat (limited to 'gr-vocoder/lib/freedv_tx_ss_impl.cc')
-rw-r--r-- | gr-vocoder/lib/freedv_tx_ss_impl.cc | 34 |
1 files changed, 13 insertions, 21 deletions
diff --git a/gr-vocoder/lib/freedv_tx_ss_impl.cc b/gr-vocoder/lib/freedv_tx_ss_impl.cc index 310a2137e6..1f3dadeb52 100644 --- a/gr-vocoder/lib/freedv_tx_ss_impl.cc +++ b/gr-vocoder/lib/freedv_tx_ss_impl.cc @@ -19,24 +19,6 @@ #include <iostream> #include <stdexcept> -extern "C" { -char get_next_tx_char(void* callback_state) -{ - char c; - struct freedv_tx_callback_state* pstate; - - pstate = (struct freedv_tx_callback_state*)callback_state; - c = *pstate->ptx_str++; - - if (*pstate->ptx_str == 0) { - pstate->ptx_str = pstate->tx_str; - c = 0x0d; // FreeDV uses Carriage Return termination - } - - return c; -} -} - namespace gr { namespace vocoder { @@ -69,9 +51,8 @@ freedv_tx_ss_impl::freedv_tx_ss_impl(int mode, if ((d_freedv = freedv_open(mode)) == NULL) throw std::runtime_error("freedv_tx_ss_impl: freedv_open failed"); #endif - snprintf(d_cb_state.tx_str, 79, "%s", d_msg_text.c_str()); - d_cb_state.ptx_str = d_cb_state.tx_str; - freedv_set_callback_txt(d_freedv, NULL, get_next_tx_char, (void*)&d_cb_state); + d_tx_str = msg_txt + "\r"; // FreeDV uses Carriage Return termination + freedv_set_callback_txt(d_freedv, NULL, get_next_tx_char, this); d_nom_modem_samples = freedv_get_n_nom_modem_samples(d_freedv); set_output_multiple(d_nom_modem_samples); } @@ -124,5 +105,16 @@ int freedv_tx_ss_impl::work(int noutput_items, return noutput_items; } +char freedv_tx_ss_impl::get_next_tx_char(void* callback_state) +{ + freedv_tx_ss_impl* instance = static_cast<freedv_tx_ss_impl*>(callback_state); + char c = instance->d_tx_str[instance->d_tx_str_offset++]; + + if (instance->d_tx_str_offset == instance->d_tx_str.length()) + instance->d_tx_str_offset = 0; + + return c; +} + } /* namespace vocoder */ } /* namespace gr */ |