summaryrefslogtreecommitdiffstats
path: root/host/lib/usrp
diff options
context:
space:
mode:
authorJosh Blum <josh@joshknows.com>2010-05-17 18:47:33 -0700
committerJosh Blum <josh@joshknows.com>2010-05-17 18:47:33 -0700
commit101afd526de722b6d30381340a7ca8148aa9a6d7 (patch)
tree25c0dfeafe7bcbe5341cde715e164530a732e01e /host/lib/usrp
parentd9cc352ed14dbab04523f53e21f855b05c30eb3f (diff)
downloaduhd-101afd526de722b6d30381340a7ca8148aa9a6d7.tar.gz
uhd-101afd526de722b6d30381340a7ca8148aa9a6d7.tar.bz2
uhd-101afd526de722b6d30381340a7ca8148aa9a6d7.zip
Created inline send vrt packer function that also handles fragmentation.
Diffstat (limited to 'host/lib/usrp')
-rw-r--r--host/lib/usrp/usrp2/io_impl.cpp48
-rw-r--r--host/lib/usrp/usrp2/usrp2_impl.hpp7
2 files changed, 11 insertions, 44 deletions
diff --git a/host/lib/usrp/usrp2/io_impl.cpp b/host/lib/usrp/usrp2/io_impl.cpp
index 389460fe8..b26dbb8bd 100644
--- a/host/lib/usrp/usrp2/io_impl.cpp
+++ b/host/lib/usrp/usrp2/io_impl.cpp
@@ -67,49 +67,17 @@ void usrp2_impl::io_init(void){
**********************************************************************/
size_t usrp2_impl::send(
const asio::const_buffer &buff,
- const tx_metadata_t &metadata_,
+ const tx_metadata_t &metadata,
const io_type_t &io_type
){
- tx_metadata_t metadata = metadata_; //rw copy to change later
-
- transport::managed_send_buffer::sptr send_buff = _data_transport->get_send_buff();
- boost::uint32_t *tx_mem = send_buff->cast<boost::uint32_t *>();
- size_t num_samps = std::min(std::min(
- asio::buffer_size(buff)/io_type.size,
- size_t(max_tx_samps_per_packet())),
- send_buff->size()/io_type.size
- );
-
- //kill the end of burst flag if this is a fragment
- if (asio::buffer_size(buff)/io_type.size < num_samps)
- metadata.end_of_burst = false;
-
- size_t num_header_words32, num_packet_words32;
- size_t packet_count = _tx_stream_id_to_packet_seq[metadata.stream_id]++;
-
- //pack metadata into a vrt header
- vrt::pack(
- metadata, //input
- tx_mem, //output
- num_header_words32, //output
- num_samps, //input
- num_packet_words32, //output
- packet_count, //input
- get_master_clock_freq()
- );
-
- boost::uint32_t *items = tx_mem + num_header_words32; //offset for data
-
- //copy-convert the samples into the send buffer
- convert_io_type_to_otw_type(
- asio::buffer_cast<const void*>(buff), io_type,
- (void*)items, _tx_otw_type,
- num_samps
+ return vrt_packet_handler::send(
+ _packet_handler_send_state, //last state of the send handler
+ buff, metadata, //buffer to empty and samples metadata
+ io_type, _tx_otw_type, //input and output types to convert
+ get_master_clock_freq(), //master clock tick rate
+ _data_transport, //zero copy interface
+ max_tx_samps_per_packet()
);
-
- //send and return number of samples
- send_buff->done(num_packet_words32*sizeof(boost::uint32_t));
- return num_samps;
}
/***********************************************************************
diff --git a/host/lib/usrp/usrp2/usrp2_impl.hpp b/host/lib/usrp/usrp2/usrp2_impl.hpp
index 6958fc8ea..f98aa1938 100644
--- a/host/lib/usrp/usrp2/usrp2_impl.hpp
+++ b/host/lib/usrp/usrp2/usrp2_impl.hpp
@@ -122,8 +122,6 @@ private:
codec_ctrl::sptr _codec_ctrl;
serdes_ctrl::sptr _serdes_ctrl;
- uhd::dict<boost::uint32_t, size_t> _tx_stream_id_to_packet_seq;
-
/*******************************************************************
* Deal with the rx and tx packet sizes
******************************************************************/
@@ -139,13 +137,14 @@ private:
uhd::transport::vrt::max_header_words32*sizeof(boost::uint32_t)
;
size_t max_rx_samps_per_packet(void){
- return _max_rx_bytes_per_packet/(_rx_otw_type.width*2/8);
+ return _max_rx_bytes_per_packet/_rx_otw_type.get_sample_size();
}
size_t max_tx_samps_per_packet(void){
- return _max_tx_bytes_per_packet/(_tx_otw_type.width*2/8);
+ return _max_tx_bytes_per_packet/_tx_otw_type.get_sample_size();
}
vrt_packet_handler::recv_state _packet_handler_recv_state;
+ vrt_packet_handler::send_state _packet_handler_send_state;
uhd::otw_type_t _rx_otw_type, _tx_otw_type;
void io_init(void);