gr-osmosdr: fix sdrplay noise in gqrx

This commit is contained in:
Florian Tham
2017-06-24 23:35:41 +02:00
parent 93edf56920
commit c267579db3
3 changed files with 96 additions and 1 deletions

View File

@@ -0,0 +1,91 @@
--- a/lib/sdrplay/sdrplay_source_c.cc 2017-06-24 23:13:25.747061807 +0200
+++ b/lib/sdrplay/sdrplay_source_c.cc 2015-09-20 09:27:29.000000000 +0200
@@ -142,8 +142,11 @@
*/
sdrplay_source_c::~sdrplay_source_c ()
{
- free(_dev);
- _dev = NULL;
+ if (_dev != NULL)
+ {
+ free(_dev);
+ _dev = NULL;
+ }
_buf_mutex.lock();
if (_running)
{
@@ -214,10 +217,10 @@
gr_complex *out = (gr_complex *)output_items[0];
int cnt = noutput_items;
unsigned int sampNum;
+ unsigned int sampNumStart;
int grChanged;
int rfChanged;
int fsChanged;
-
if (_uninit)
{
return WORK_DONE;
@@ -230,27 +233,35 @@
}
_buf_mutex.lock();
-
- if (_buf_offset)
+ sampNumStart = sampNum;
+ int first_offset = _buf_offset;
+ if (_buf_offset > 0)
{
- for (int i = _buf_offset; i < _dev->samplesPerPacket; i++)
+ for (int i = _buf_offset; i < _dev->samplesPerPacket; i++)
{
*out++ = gr_complex( float(_bufi[i]) * (1.0f/2048.0f), float(_bufq[i]) * (1.0f/2048.0f) );
}
- cnt -= (_dev->samplesPerPacket - _buf_offset);
+ if (cnt > ( _dev ->samplesPerPacket - _buf_offset ))
+ {
+ cnt = cnt - (_dev->samplesPerPacket - _buf_offset);
+ }
+ else
+ {
+ _buf_offset = _buf_offset + cnt;
+ cnt = 0;
+ }
}
- while ((cnt - _dev->samplesPerPacket) >= 0)
+ while ((cnt - _dev->samplesPerPacket) > 0)
{
mir_sdr_ReadPacket(_bufi.data(), _bufq.data(), &sampNum, &grChanged, &rfChanged, &fsChanged);
for (int i = 0; i < _dev->samplesPerPacket; i++)
{
*out++ = gr_complex( float(_bufi[i]) * (1.0f/2048.0f), float(_bufq[i]) * (1.0f/2048.0f) );
}
- cnt -= _dev->samplesPerPacket;
+ cnt = cnt - _dev->samplesPerPacket;
}
-
- _buf_offset = 0;
+
if (cnt)
{
mir_sdr_ReadPacket(_bufi.data(), _bufq.data(), &sampNum, &grChanged, &rfChanged, &fsChanged);
@@ -258,10 +269,15 @@
{
*out++ = gr_complex( float(_bufi[i]) * (1.0f/2048.0f), float(_bufq[i]) * (1.0f/2048.0f) );
}
- _buf_offset = cnt;
- }
- _buf_mutex.unlock();
+ _buf_offset = cnt;
+ }
+ int items = sampNum - sampNumStart;
+ if ( (items + _dev->samplesPerPacket - first_offset - noutput_items) != (_dev->samplesPerPacket - cnt))
+ {
+ std::cerr << "Sampling Error! " << "cnt before return = " << cnt << " noutput_items = " << noutput_items << " first_offset = " << first_offset << " buffer_offset = " << _buf_offset << " Items = " << items << " SpP - _buf_offset = " << _dev->samplesPerPacket - _buf_offset << std::endl;
+ }
+ _buf_mutex.unlock();
return noutput_items;
}