This is merely a historical archive of years 2008-2021, before the migration to mailman3.
A maintained and still updated list archive can be found at https://lists.osmocom.org/hyperkitty/list/osmocom-sdr@lists.osmocom.org/.
Karl Semich 0xloem at gmail.comCallback now stores and makes use of rtlsdr data length, preventing corruption in the case of short reads. --- lib/rtl/rtl_source_c.cc | 13 +++++++------ lib/rtl/rtl_source_c.h | 2 +- 2 files changed, 8 insertions(+), 7 deletions(-) diff --git a/lib/rtl/rtl_source_c.cc b/lib/rtl/rtl_source_c.cc index a371464..215500e 100644 --- a/lib/rtl/rtl_source_c.cc +++ b/lib/rtl/rtl_source_c.cc @@ -173,8 +173,6 @@ rtl_source_c::rtl_source_c (const std::string &args) << std::endl; } - _samp_avail = _buf_len / BYTES_PER_SAMPLE; - // create a lookup table for gr_complex values for (unsigned int i = 0; i < 0x100; i++) _lut.push_back((i - 127.4f) / 128.0f); @@ -232,6 +230,7 @@ rtl_source_c::rtl_source_c (const std::string &args) set_if_gain( 24 ); /* preset to a reasonable default (non-GRC use case) */ _buf = (unsigned char **)malloc(_buf_num * sizeof(unsigned char *)); + _samp_avails = (int *)malloc(_buf_num * sizeof(uint32_t)); if (_buf) { for(unsigned int i = 0; i < _buf_num; ++i) @@ -261,6 +260,8 @@ rtl_source_c::~rtl_source_c () free(_buf[i]); } + free(_samp_avails); + _samp_avails = NULL; free(_buf); _buf = NULL; } @@ -302,6 +303,7 @@ void rtl_source_c::rtlsdr_callback(unsigned char *buf, uint32_t len) int buf_tail = (_buf_head + _buf_used) % _buf_num; memcpy(_buf[buf_tail], buf, len); + _samp_avails[buf_tail] = len / BYTES_PER_SAMPLE; if (_buf_used == _buf_num) { std::cerr << "O" << std::flush; @@ -348,23 +350,22 @@ int rtl_source_c::work( int noutput_items, return WORK_DONE; while (noutput_items && _buf_used) { - const int nout = std::min(noutput_items, _samp_avail); + const int nout = std::min(noutput_items, _samp_avails[_buf_head]); const unsigned char *buf = _buf[_buf_head] + _buf_offset * 2; for (int i = 0; i < nout; ++i) *out++ = gr_complex(_lut[buf[i * 2]], _lut[buf[i * 2 + 1]]); noutput_items -= nout; - _samp_avail -= nout; + _samp_avails[_buf_head] -= nout; - if (!_samp_avail) { + if (!_samp_avails[_buf_head]) { { boost::mutex::scoped_lock lock( _buf_mutex ); _buf_head = (_buf_head + 1) % _buf_num; _buf_used--; } - _samp_avail = _buf_len / BYTES_PER_SAMPLE; _buf_offset = 0; } else { _buf_offset += nout; diff --git a/lib/rtl/rtl_source_c.h b/lib/rtl/rtl_source_c.h index 902b386..8e537a5 100644 --- a/lib/rtl/rtl_source_c.h +++ b/lib/rtl/rtl_source_c.h @@ -127,6 +127,7 @@ private: rtlsdr_dev_t *_dev; gr::thread::thread _thread; unsigned char **_buf; + int *_samp_avails; unsigned int _buf_num; unsigned int _buf_len; unsigned int _buf_head; @@ -136,7 +137,6 @@ private: bool _running; unsigned int _buf_offset; - int _samp_avail; bool _no_tuner; bool _auto_gain; -- 2.11.0