change sample buffer to appear as shorts for performance reasons

gr3.6
Dimitri Stolnikov 11 years ago
parent 43c59ad2b9
commit e15b5cf6df
  1. 60
      lib/rtl_source_c.cc
  2. 3
      lib/rtl_source_c.h

@ -74,13 +74,18 @@ rtl_source_c::rtl_source_c (const std::string &args)
int ret;
int dev_index = 0;
_buf = boost::circular_buffer<unsigned char>(1024*1024);
_buf = boost::circular_buffer<unsigned short>(1024*1024);
// create a lookup table for gr_complex values
for (unsigned int i = 0; i <= 0xffff; i++)
{
#if 1 // little endian
_lut.push_back( gr_complex( (float(i & 0xff) - 127.0) * 0.00787,
(float(i >> 8) - 127.0) * 0.00787 ) );
#else // big endian
_lut.push_back( gr_complex( (float(i >> 8) - 127.0) * 0.00787,
(float(i & 0xff) - 127.0) * 0.00787 ) );
#endif
}
std::cout << "Opening " << rtlsdr_get_device_name(dev_index) << std::endl;
@ -94,9 +99,7 @@ rtl_source_c::rtl_source_c (const std::string &args)
if (ret < 0)
throw std::runtime_error("failed to reset usb buffers.");
rtlsdr_set_sample_rate( _dev, 2048000 );
_has_i_sample = false;
// rtlsdr_set_sample_rate( _dev, 2048000 );
_thread = gruel::thread(_rtlsdr_wait, this);
}
@ -122,17 +125,23 @@ void rtl_source_c::_rtlsdr_callback(unsigned char *buf, uint32_t len, void *ctx)
void rtl_source_c::rtlsdr_callback(unsigned char *buf, uint32_t len)
{
boost::mutex::scoped_lock lock( _buf_mutex );
for (int i = 0; i < len; i++) {
if (!_buf.full()) {
_buf.push_back(buf[i]);
_buf_cond.notify_one();
} else {
printf("O"); fflush(stdout);
break;
}
unsigned short * sbuf = (unsigned short *)buf;
if (len % 2 != 0) {
printf("len: %d\n", len); fflush(stdout);
}
boost::mutex::scoped_lock lock( _buf_mutex );
for (int i = 0; i < len/2; i++) {
if (!_buf.full()) {
_buf.push_back(sbuf[i]);
_buf_cond.notify_one();
} else {
printf("O"); fflush(stdout);
break;
}
}
}
void rtl_source_c::_rtlsdr_wait(rtl_source_c *obj)
@ -153,9 +162,7 @@ int rtl_source_c::work( int noutput_items,
gr_vector_const_void_star &input_items,
gr_vector_void_star &output_items )
{
gr_complex *out = (gr_complex *) output_items[0];
unsigned short index = 0;
gr_complex *out = (gr_complex *)output_items[0];
int items_left = noutput_items;
while ( items_left )
@ -168,21 +175,14 @@ int rtl_source_c::work( int noutput_items,
}
}
if (!_has_i_sample) {
index = _buf.front() << 8;
_buf.pop_front();
_has_i_sample = true;
} else {
index |= _buf.front();
_buf.pop_front();
_has_i_sample = false;
}
// convert samples to gr_complex type by using the lookup table
*out++ = _lut[ _buf.front() ];
if (_has_i_sample)
continue;
{
boost::mutex::scoped_lock lock( _buf_mutex );
// convert samples to gr_complex type by using the lookup table
*out++ = _lut[index];
_buf.pop_front();
}
items_left--;
}

@ -95,10 +95,9 @@ private:
rtlsdr_dev_t *_dev;
gruel::thread _thread;
boost::circular_buffer<unsigned char> _buf;
boost::circular_buffer<unsigned short> _buf;
boost::mutex _buf_mutex;
boost::condition_variable _buf_cond;
bool _has_i_sample;
};
#endif /* INCLUDED_RTLSDR_SOURCE_C_H */

Loading…
Cancel
Save