diff options
| -rw-r--r-- | host/lib/transport/vrt_packet_handler.hpp | 28 | ||||
| -rw-r--r-- | host/lib/usrp/usrp1/io_impl.cpp | 4 | ||||
| -rw-r--r-- | host/lib/usrp/usrp1/usrp1_impl.hpp | 4 | 
3 files changed, 22 insertions, 14 deletions
diff --git a/host/lib/transport/vrt_packet_handler.hpp b/host/lib/transport/vrt_packet_handler.hpp index 596989951..b603f1371 100644 --- a/host/lib/transport/vrt_packet_handler.hpp +++ b/host/lib/transport/vrt_packet_handler.hpp @@ -313,29 +313,32 @@ template <typename T> UHD_INLINE T get_context_code(          const uhd::otw_type_t &otw_type,          const vrt_packer_t &vrt_packer,          const get_send_buffs_t &get_send_buffs, -        size_t vrt_header_offset_words32 +        size_t vrt_header_offset_words32, +        size_t chans_per_otw_buff      ){          //load the rest of the if_packet_info in here -        if_packet_info.num_payload_words32 = (num_samps*otw_type.get_sample_size())/sizeof(boost::uint32_t); +        if_packet_info.num_payload_words32 = (num_samps*chans_per_otw_buff*otw_type.get_sample_size())/sizeof(boost::uint32_t);          if_packet_info.packet_count = state.next_packet_seq++;          //get send buffers for each channel -        managed_send_buffs_t send_buffs(buffs.size()); +        managed_send_buffs_t send_buffs(buffs.size()/chans_per_otw_buff);          UHD_ASSERT_THROW(get_send_buffs(send_buffs)); -        for (size_t i = 0; i < buffs.size(); i++){ +        std::vector<const void *> io_buffs(chans_per_otw_buff); +        for (size_t i = 0; i < buffs.size(); i+=chans_per_otw_buff){              //calculate pointers with offsets to io and otw memory -            const boost::uint8_t *io_mem = reinterpret_cast<const boost::uint8_t *>(buffs[i]) + offset_bytes; +            for (size_t j = 0; j < chans_per_otw_buff; j++){ +                io_buffs[j] = reinterpret_cast<const boost::uint8_t *>(buffs[i+j]) + offset_bytes; +            }              boost::uint32_t *otw_mem = send_buffs[i]->cast<boost::uint32_t *>() + vrt_header_offset_words32;              //pack metadata into a vrt header              vrt_packer(otw_mem, if_packet_info); +            otw_mem += if_packet_info.num_header_words32;              //copy-convert the samples into the send buffer              uhd::transport::convert_io_type_to_otw_type( -                io_mem, io_type, -                otw_mem + if_packet_info.num_header_words32, otw_type, -                num_samps +                io_buffs, io_type, otw_mem, otw_type, num_samps              );              //commit the samples to the zero-copy interface @@ -361,7 +364,8 @@ template <typename T> UHD_INLINE T get_context_code(          const vrt_packer_t &vrt_packer,          const get_send_buffs_t &get_send_buffs,          size_t max_samples_per_packet, -        size_t vrt_header_offset_words32 = 0 +        size_t vrt_header_offset_words32 = 0, +        size_t chans_per_otw_buff = 1      ){          //translate the metadata to vrt if packet info          uhd::transport::vrt::if_packet_info_t if_packet_info; @@ -393,7 +397,8 @@ template <typename T> UHD_INLINE T get_context_code(                  io_type, otw_type,                  vrt_packer,                  get_send_buffs, -                vrt_header_offset_words32 +                vrt_header_offset_words32, +                chans_per_otw_buff              );              return num_samps;          } @@ -424,7 +429,8 @@ template <typename T> UHD_INLINE T get_context_code(                      io_type, otw_type,                      vrt_packer,                      get_send_buffs, -                    vrt_header_offset_words32 +                    vrt_header_offset_words32, +                    chans_per_otw_buff                  );              }              return total_num_samps; diff --git a/host/lib/usrp/usrp1/io_impl.cpp b/host/lib/usrp/usrp1/io_impl.cpp index a813a0462..146038bd9 100644 --- a/host/lib/usrp/usrp1/io_impl.cpp +++ b/host/lib/usrp/usrp1/io_impl.cpp @@ -226,7 +226,9 @@ size_t usrp1_impl::send(          _clock_ctrl->get_master_clock_freq(),      //master clock tick rate          &usrp1_bs_vrt_packer,          boost::bind(&usrp1_impl::io_impl::get_send_buffs, _io_impl.get(), _1), -        get_max_send_samps_per_packet() +        get_max_send_samps_per_packet(), +        0,                                         //vrt header offset +        _tx_subdev_spec.size()                     //num channels      );      //Don't honor sob because it is normal to be always bursting... diff --git a/host/lib/usrp/usrp1/usrp1_impl.hpp b/host/lib/usrp/usrp1/usrp1_impl.hpp index 3ea35f970..20ae3c02a 100644 --- a/host/lib/usrp/usrp1/usrp1_impl.hpp +++ b/host/lib/usrp/usrp1/usrp1_impl.hpp @@ -94,11 +94,11 @@ public:      static const size_t BYTES_PER_PACKET = 512*4; //under the transfer size      size_t get_max_send_samps_per_packet(void) const { -        return BYTES_PER_PACKET/_tx_otw_type.get_sample_size(); +        return BYTES_PER_PACKET/_tx_otw_type.get_sample_size()/_tx_subdev_spec.size();      }      size_t get_max_recv_samps_per_packet(void) const { -        return BYTES_PER_PACKET/_rx_otw_type.get_sample_size(); +        return BYTES_PER_PACKET/_rx_otw_type.get_sample_size()/_rx_subdev_spec.size();      }      bool recv_async_msg(uhd::async_metadata_t &, size_t);  | 
