use clip method provided by range class to pick gain values

This commit is contained in:
Dimitri Stolnikov 2012-07-01 11:38:46 +02:00
parent 1ea5a90b19
commit 604a9d79b0
3 changed files with 3 additions and 60 deletions

View File

@ -407,31 +407,12 @@ bool osmosdr_src_c::get_gain_mode( size_t chan )
return _auto_gain;
}
static double pick_closest_gain(osmosdr::gain_range_t &gains, double required)
{
double result = required;
double distance = 100;
BOOST_FOREACH(osmosdr::range_t gain, gains)
{
double diff = fabs(gain.start() - required);
if (diff < distance) {
distance = diff;
result = gain.start();
}
}
return result;
}
double osmosdr_src_c::set_gain( double gain, size_t chan )
{
osmosdr::gain_range_t gains = osmosdr_src_c::get_gain_range( chan );
double picked_gain = pick_closest_gain( gains, gain );
if (_dev)
osmosdr_set_tuner_gain( _dev, int(picked_gain * 10.0) );
osmosdr_set_tuner_gain( _dev, int(gains.clip(gain) * 10.0) );
return get_gain( chan );
}

View File

@ -438,31 +438,12 @@ bool rtl_source_c::get_gain_mode( size_t chan )
return _auto_gain;
}
static double pick_closest_gain(osmosdr::gain_range_t &gains, double required)
{
double result = required;
double distance = 100;
BOOST_FOREACH(osmosdr::range_t gain, gains)
{
double diff = fabs(gain.start() - required);
if (diff < distance) {
distance = diff;
result = gain.start();
}
}
return result;
}
double rtl_source_c::set_gain( double gain, size_t chan )
{
osmosdr::gain_range_t gains = rtl_source_c::get_gain_range( chan );
double picked_gain = pick_closest_gain( gains, gain );
if (_dev)
rtlsdr_set_tuner_gain( _dev, int(picked_gain * 10.0) );
rtlsdr_set_tuner_gain( _dev, int(gains.clip(gain) * 10.0) );
return get_gain( chan );
}

View File

@ -239,30 +239,11 @@ bool rtl_tcp_source_c::get_gain_mode( size_t chan )
return _auto_gain;
}
static double pick_closest_gain(osmosdr::gain_range_t &gains, double required)
{
double result = required;
double distance = 100;
BOOST_FOREACH(osmosdr::range_t gain, gains)
{
double diff = fabs(gain.start() - required);
if (diff < distance) {
distance = diff;
result = gain.start();
}
}
return result;
}
double rtl_tcp_source_c::set_gain( double gain, size_t chan )
{
osmosdr::gain_range_t gains = rtl_tcp_source_c::get_gain_range( chan );
double picked_gain = pick_closest_gain( gains, gain );
_src->set_gain( int(picked_gain * 10.0) );
_src->set_gain( int(gains.clip(gain) * 10.0) );
_gain = gain;