Revision 9449d057
| b/host/lib/usrp/usrp1/io_impl.cpp | ||
|---|---|---|
| 38 | 38 |
struct usrp1_send_state {
|
| 39 | 39 |
uhd::transport::managed_send_buffer::sptr send_buff; |
| 40 | 40 |
size_t bytes_written; |
| 41 |
size_t bytes_free; |
|
| 42 | 41 |
size_t underrun_poll_samp_count; |
| 42 |
|
|
| 43 |
size_t bytes_free() |
|
| 44 |
{
|
|
| 45 |
if (send_buff != NULL) |
|
| 46 |
return send_buff->size() - bytes_written; |
|
| 47 |
else |
|
| 48 |
return 0; |
|
| 49 |
} |
|
| 43 | 50 |
}; |
| 44 | 51 |
|
| 45 | 52 |
struct usrp1_recv_state {
|
| 46 | 53 |
uhd::transport::managed_recv_buffer::sptr recv_buff; |
| 47 | 54 |
size_t bytes_read; |
| 48 |
size_t bytes_avail; |
|
| 49 | 55 |
size_t overrun_poll_samp_count; |
| 56 |
|
|
| 57 |
size_t bytes_avail() |
|
| 58 |
{
|
|
| 59 |
if (recv_buff != NULL) |
|
| 60 |
return recv_buff->size() - bytes_read; |
|
| 61 |
else |
|
| 62 |
return 0; |
|
| 63 |
} |
|
| 50 | 64 |
}; |
| 51 | 65 |
|
| 52 | 66 |
/*********************************************************************** |
| ... | ... | |
| 113 | 127 |
if (send_state.send_buff == NULL) |
| 114 | 128 |
return false; |
| 115 | 129 |
|
| 116 |
send_state.bytes_free = send_state.send_buff->size(); |
|
| 117 | 130 |
send_state.bytes_written = 0; |
| 118 | 131 |
} |
| 119 | 132 |
|
| ... | ... | |
| 126 | 139 |
const io_type_t io_type, |
| 127 | 140 |
otw_type_t otw_type) |
| 128 | 141 |
{
|
| 129 |
UHD_ASSERT_THROW(send_state.bytes_free % otw_type.get_sample_size() == 0); |
|
| 142 |
UHD_ASSERT_THROW(send_state.bytes_free() % otw_type.get_sample_size() == 0);
|
|
| 130 | 143 |
|
| 131 |
size_t samps_free = send_state.bytes_free / otw_type.get_sample_size(); |
|
| 144 |
size_t samps_free = send_state.bytes_free() / otw_type.get_sample_size();
|
|
| 132 | 145 |
size_t copy_samps = std::min(num_samps - sample_offset, samps_free); |
| 133 | 146 |
|
| 134 | 147 |
const boost::uint8_t *io_mem = |
| ... | ... | |
| 143 | 156 |
copy_samps); |
| 144 | 157 |
|
| 145 | 158 |
send_state.bytes_written += copy_samps * otw_type.get_sample_size(); |
| 146 |
send_state.bytes_free -= copy_samps * otw_type.get_sample_size(); |
|
| 147 | 159 |
send_state.underrun_poll_samp_count += copy_samps; |
| 148 | 160 |
|
| 149 | 161 |
return copy_samps; |
| ... | ... | |
| 154 | 166 |
if (send_state.bytes_written % 512) |
| 155 | 167 |
return false; |
| 156 | 168 |
|
| 157 |
if (force || send_state.bytes_free == 0) {
|
|
| 169 |
if (force || send_state.bytes_free() == 0) {
|
|
| 158 | 170 |
send_state.send_buff->commit(send_state.bytes_written); |
| 159 | 171 |
send_state.send_buff = uhd::transport::managed_send_buffer::sptr(); |
| 160 | 172 |
return true; |
| ... | ... | |
| 223 | 235 |
**********************************************************************/ |
| 224 | 236 |
bool usrp1_impl::io_impl::get_recv_buffer(zero_copy_if::sptr zc_if) |
| 225 | 237 |
{
|
| 226 |
if ((recv_state.recv_buff == NULL) || (recv_state.bytes_avail == 0)) {
|
|
| 238 |
if ((recv_state.recv_buff == NULL) || (recv_state.bytes_avail() == 0)) {
|
|
| 227 | 239 |
|
| 228 | 240 |
recv_state.recv_buff = zc_if->get_recv_buff(); |
| 229 | 241 |
if (recv_state.recv_buff == NULL) |
| 230 | 242 |
return false; |
| 231 | 243 |
|
| 232 | 244 |
recv_state.bytes_read = 0; |
| 233 |
recv_state.bytes_avail = recv_state.recv_buff->size(); |
|
| 234 | 245 |
} |
| 235 | 246 |
|
| 236 | 247 |
return true; |
| ... | ... | |
| 242 | 253 |
const io_type_t io_type, |
| 243 | 254 |
otw_type_t otw_type) |
| 244 | 255 |
{
|
| 245 |
UHD_ASSERT_THROW(recv_state.bytes_avail % otw_type.get_sample_size() == 0); |
|
| 256 |
UHD_ASSERT_THROW(recv_state.bytes_avail() % otw_type.get_sample_size() == 0);
|
|
| 246 | 257 |
|
| 247 |
size_t samps_avail = recv_state.bytes_avail / otw_type.get_sample_size(); |
|
| 258 |
size_t samps_avail = recv_state.bytes_avail() / otw_type.get_sample_size();
|
|
| 248 | 259 |
size_t copy_samps = std::min(num_samps - sample_offset, samps_avail); |
| 249 | 260 |
|
| 250 | 261 |
const boost::uint8_t *otw_mem = |
| ... | ... | |
| 259 | 270 |
copy_samps); |
| 260 | 271 |
|
| 261 | 272 |
recv_state.bytes_read += copy_samps * otw_type.get_sample_size(); |
| 262 |
recv_state.bytes_avail -= copy_samps * otw_type.get_sample_size(); |
|
| 263 | 273 |
recv_state.overrun_poll_samp_count += copy_samps; |
| 264 | 274 |
|
| 265 | 275 |
return copy_samps; |
Also available in: Unified diff