diff options
-rw-r--r-- | usrp2/host/lib/usrp2_impl.cc | 16 | ||||
-rw-r--r-- | usrp2/host/lib/usrp2_impl.h | 33 |
2 files changed, 47 insertions, 2 deletions
diff --git a/usrp2/host/lib/usrp2_impl.cc b/usrp2/host/lib/usrp2_impl.cc index 956f2561e..50e96006b 100644 --- a/usrp2/host/lib/usrp2_impl.cc +++ b/usrp2/host/lib/usrp2_impl.cc @@ -130,7 +130,8 @@ namespace usrp2 { d_rx_seqno(-1), d_tx_seqno(0), d_next_rid(0), d_num_rx_frames(0), d_num_rx_missing(0), d_num_rx_overruns(0), d_num_rx_bytes(0), d_num_enqueued(0), d_enqueued_mutex(), d_bg_pending_cond(&d_enqueued_mutex), - d_channel_rings(NCHANS), d_tx_interp(0), d_rx_decim(0) + d_channel_rings(NCHANS), d_tx_interp(0), d_rx_decim(0), + d_rx_str_p(false), d_rx_str_channel(0), d_rx_str_items_per_frame(0) { if (!d_eth_buf->open(ifc, htons(U2_ETHERTYPE))) throw std::runtime_error("Unable to register USRP2 protocol"); @@ -480,6 +481,7 @@ namespace usrp2 { bool usrp2::impl::set_rx_center_freq(double frequency, tune_result *result) { + //without_streaming s(this); op_config_rx_v2_cmd cmd; op_config_rx_reply_v2_t reply; @@ -597,6 +599,11 @@ namespace usrp2 { return false; bool success = (ntohx(reply.ok) == 1); + if (success){ + d_rx_str_p = true; + d_rx_str_channel = channel; + d_rx_str_items_per_frame = items_per_frame; + } return success; } @@ -639,8 +646,12 @@ namespace usrp2 { return false; bool success = (ntohx(reply.ok) == 1); - if (success) + if (success){ d_channel_rings[channel].reset(); + d_rx_str_p = false; + d_rx_str_channel = 0; + d_rx_str_items_per_frame = 0; + } return success; } @@ -719,6 +730,7 @@ namespace usrp2 { bool usrp2::impl::set_tx_center_freq(double frequency, tune_result *result) { + //without_streaming s(this); op_config_tx_v2_cmd cmd; op_config_tx_reply_v2_t reply; diff --git a/usrp2/host/lib/usrp2_impl.h b/usrp2/host/lib/usrp2_impl.h index f513cf9d3..f6ba77acc 100644 --- a/usrp2/host/lib/usrp2_impl.h +++ b/usrp2/host/lib/usrp2_impl.h @@ -26,6 +26,7 @@ #include "control.h" #include "ring.h" #include <string> +#include <iostream> namespace usrp2 { @@ -83,6 +84,13 @@ namespace usrp2 { int d_tx_interp; // shadow tx interp int d_rx_decim; // shadow rx decim + // FIXME KLUDGE: shadow rx streaming state + bool d_rx_str_p; // Is the rx streaming? + unsigned int d_rx_str_channel; + unsigned int d_rx_str_items_per_frame; + + friend struct without_streaming; + void inc_enqueued() { omni_mutex_lock l(d_enqueued_mutex); d_num_enqueued++; @@ -107,6 +115,7 @@ namespace usrp2 { data_handler::result handle_data_packet(const void *base, size_t len); bool dboard_info(); + public: impl(const std::string &ifc, props *p); ~impl(); @@ -175,6 +184,30 @@ namespace usrp2 { bool burn_mac_addr(const std::string &new_addr); }; + + struct without_streaming { + usrp2::impl *d_impl; + bool d_was_streaming; + + without_streaming(usrp2::impl *p) + : d_impl(p), d_was_streaming(p->d_rx_str_p) + { + if (d_was_streaming){ + std::cerr << "without_streaming: stopping streaming\n"; + d_impl->stop_rx_streaming(d_impl->d_rx_str_channel); + } + } + + ~without_streaming() + { + if (d_was_streaming){ + std::cerr << "without_streaming: re-starting streaming\n"; + d_impl->start_rx_streaming(d_impl->d_rx_str_channel, d_impl->d_rx_str_items_per_frame); + } + } + }; + + } // namespace usrp2 #endif /* INCLUDED_USRP2_IMPL_H */ |