diff options
Diffstat (limited to 'lib/source_impl.cc')
-rw-r--r-- | lib/source_impl.cc | 199 |
1 files changed, 111 insertions, 88 deletions
diff --git a/lib/source_impl.cc b/lib/source_impl.cc index 8f2028b..f9a7e64 100644 --- a/lib/source_impl.cc +++ b/lib/source_impl.cc @@ -32,6 +32,10 @@ #include <gnuradio/blocks/throttle.h> #include <gnuradio/constants.h> +#ifdef ENABLE_OSMOSDR +#include <osmosdr_src_c.h> +#endif + #ifdef ENABLE_FCD #include <fcd_source_c.h> #endif @@ -52,6 +56,10 @@ #include <uhd_source_c.h> #endif +#ifdef ENABLE_MIRI +#include <miri_source_c.h> +#endif + #ifdef ENABLE_SDRPLAY #include <sdrplay_source_c.h> #endif @@ -72,10 +80,6 @@ #include <airspy_source_c.h> #endif -#ifdef ENABLE_AIRSPYHF -#include <airspyhf_source_c.h> -#endif - #ifdef ENABLE_SOAPY #include <soapy_source_c.h> #endif @@ -88,10 +92,6 @@ #include <freesrp_source_c.h> #endif -#ifdef ENABLE_XTRX -#include <xtrx_source_c.h> -#endif - #include "arg_helpers.h" #include "source_impl.h" @@ -124,6 +124,9 @@ source_impl::source_impl( const std::string &args ) #ifdef ENABLE_FILE dev_types.push_back("file"); #endif +#ifdef ENABLE_OSMOSDR + dev_types.push_back("osmosdr"); +#endif #ifdef ENABLE_FCD dev_types.push_back("fcd"); #endif @@ -136,6 +139,9 @@ source_impl::source_impl( const std::string &args ) #ifdef ENABLE_UHD dev_types.push_back("uhd"); #endif +#ifdef ENABLE_MIRI + dev_types.push_back("miri"); +#endif #ifdef ENABLE_SDRPLAY dev_types.push_back("sdrplay"); #endif @@ -151,9 +157,6 @@ source_impl::source_impl( const std::string &args ) #ifdef ENABLE_AIRSPY dev_types.push_back("airspy"); #endif -#ifdef ENABLE_AIRSPYHF - dev_types.push_back("airspyhf"); -#endif #ifdef ENABLE_SOAPY dev_types.push_back("soapy"); #endif @@ -163,14 +166,11 @@ source_impl::source_impl( const std::string &args ) #ifdef ENABLE_FREESRP dev_types.push_back("freesrp"); #endif -#ifdef ENABLE_XTRX - dev_types.push_back("xtrx"); -#endif std::cerr << "gr-osmosdr " << GR_OSMOSDR_VERSION << " (" << GR_OSMOSDR_LIBVER << ") " << "gnuradio " << gr::version() << std::endl; std::cerr << "built-in source types: "; - for (std::string dev_type : dev_types) + BOOST_FOREACH(std::string dev_type, dev_types) std::cerr << dev_type << " "; std::cerr << std::endl; @@ -181,9 +181,9 @@ source_impl::source_impl( const std::string &args ) dev_types.push_back("cloudiq"); #endif - for (std::string arg : arg_list) { + BOOST_FOREACH(std::string arg, arg_list) { dict_t dict = params_to_dict(arg); - for (std::string dev_type : dev_types) { + BOOST_FOREACH(std::string dev_type, dev_types) { if ( dict.count( dev_type ) ) { device_specified = true; break; @@ -191,63 +191,76 @@ source_impl::source_impl( const std::string &args ) } } + bool force_arg = false; + int force_val = 0; + + if (arg_list.size() <= 2) { + BOOST_FOREACH(std::string arg, arg_list) { + if ( arg.find( "numchan=" ) == 0 ) { + pair_t pair = param_to_pair( arg ); + force_arg = true; + force_val = boost::lexical_cast<size_t>( pair.second ); + } + } + } + if ( ! device_specified ) { std::vector< std::string > dev_list; +#ifdef ENABLE_OSMOSDR + BOOST_FOREACH( std::string dev, osmosdr_src_c::get_devices() ) + dev_list.push_back( dev ); +#endif #ifdef ENABLE_FCD - for (std::string dev : fcd_source_c::get_devices()) + BOOST_FOREACH( std::string dev, fcd_source_c::get_devices() ) dev_list.push_back( dev ); #endif #ifdef ENABLE_RTL - for (std::string dev : rtl_source_c::get_devices()) + BOOST_FOREACH( std::string dev, rtl_source_c::get_devices() ) dev_list.push_back( dev ); #endif #ifdef ENABLE_UHD - for (std::string dev : uhd_source_c::get_devices()) + BOOST_FOREACH( std::string dev, uhd_source_c::get_devices() ) + dev_list.push_back( dev ); +#endif +#ifdef ENABLE_MIRI + BOOST_FOREACH( std::string dev, miri_source_c::get_devices() ) dev_list.push_back( dev ); #endif #ifdef ENABLE_SDRPLAY - for (std::string dev : sdrplay_source_c::get_devices()) + BOOST_FOREACH( std::string dev, sdrplay_source_c::get_devices() ) dev_list.push_back( dev ); #endif #ifdef ENABLE_BLADERF - for (std::string dev : bladerf_source_c::get_devices()) + BOOST_FOREACH( std::string dev, bladerf_source_c::get_devices() ) dev_list.push_back( dev ); #endif #ifdef ENABLE_RFSPACE - for (std::string dev : rfspace_source_c::get_devices()) + BOOST_FOREACH( std::string dev, rfspace_source_c::get_devices() ) dev_list.push_back( dev ); #endif #ifdef ENABLE_HACKRF - for (std::string dev : hackrf_source_c::get_devices()) + BOOST_FOREACH( std::string dev, hackrf_source_c::get_devices() ) dev_list.push_back( dev ); #endif #ifdef ENABLE_AIRSPY - for (std::string dev : airspy_source_c::get_devices()) - dev_list.push_back( dev ); -#endif -#ifdef ENABLE_AIRSPYHF - for (std::string dev : airspyhf_source_c::get_devices()) + BOOST_FOREACH( std::string dev, airspy_source_c::get_devices() ) dev_list.push_back( dev ); #endif #ifdef ENABLE_SOAPY - for (std::string dev : soapy_source_c::get_devices()) + BOOST_FOREACH( std::string dev, soapy_source_c::get_devices() ) dev_list.push_back( dev ); #endif #ifdef ENABLE_REDPITAYA - for (std::string dev : redpitaya_source_c::get_devices()) + BOOST_FOREACH( std::string dev, redpitaya_source_c::get_devices() ) dev_list.push_back( dev ); #endif #ifdef ENABLE_FREESRP - for (std::string dev : freesrp_source_c::get_devices()) - dev_list.push_back( dev ); -#endif -#ifdef ENABLE_XTRX - for (std::string dev : xtrx_source_c::get_devices()) + BOOST_FOREACH( std::string dev, freesrp_source_c::get_devices() ) dev_list.push_back( dev ); #endif // std::cerr << std::endl; -// for (std::string dev : dev_list) +// BOOST_FOREACH( std::string dev, dev_list ) // std::cerr << "'" << dev << "'" << std::endl; if ( dev_list.size() ) @@ -256,17 +269,27 @@ source_impl::source_impl( const std::string &args ) throw std::runtime_error("No supported devices found (check the connection and/or udev rules)."); } - for (std::string arg : arg_list) { + BOOST_FOREACH(std::string arg, arg_list) { + + if(force_arg) + arg += ",nchan=" + std::to_string(force_val); dict_t dict = params_to_dict(arg); // std::cerr << std::endl; -// for (dict_t::value_type &entry : dict) +// BOOST_FOREACH( dict_t::value_type &entry, dict ) // std::cerr << "'" << entry.first << "' = '" << entry.second << "'" << std::endl; source_iface *iface = NULL; gr::basic_block_sptr block; +#ifdef ENABLE_OSMOSDR + if ( dict.count("osmosdr") ) { + osmosdr_src_c_sptr src = osmosdr_make_src_c( arg ); + block = src; iface = src.get(); + } +#endif + #ifdef ENABLE_FCD if ( dict.count("fcd") ) { fcd_source_c_sptr src = make_fcd_source_c( arg ); @@ -302,6 +325,13 @@ source_impl::source_impl( const std::string &args ) } #endif +#ifdef ENABLE_MIRI + if ( dict.count("miri") ) { + miri_source_c_sptr src = make_miri_source_c( arg ); + block = src; iface = src.get(); + } +#endif + #ifdef ENABLE_SDRPLAY if ( dict.count("sdrplay") ) { sdrplay_source_c_sptr src = make_sdrplay_source_c( arg ); @@ -341,13 +371,6 @@ source_impl::source_impl( const std::string &args ) } #endif -#ifdef ENABLE_AIRSPYHF - if ( dict.count("airspyhf") ) { - airspyhf_source_c_sptr src = make_airspyhf_source_c( arg ); - block = src; iface = src.get(); - } -#endif - #ifdef ENABLE_SOAPY if ( dict.count("soapy") ) { soapy_source_c_sptr src = make_soapy_source_c( arg ); @@ -369,13 +392,6 @@ source_impl::source_impl( const std::string &args ) } #endif -#ifdef ENABLE_XTRX - if ( dict.count("xtrx") ) { - xtrx_source_c_sptr src = make_xtrx_source_c( arg ); - block = src; iface = src.get(); - } -#endif - if ( iface != NULL && long(block.get()) != 0 ) { _devs.push_back( iface ); @@ -403,13 +419,20 @@ source_impl::source_impl( const std::string &args ) if (!_devs.size()) throw std::runtime_error("No devices specified via device arguments."); + + /* Populate the _gain and _gain_mode arrays with the hardware state */ + BOOST_FOREACH( source_iface *dev, _devs ) + for (size_t dev_chan = 0; dev_chan < dev->get_num_channels(); dev_chan++) { + _gain_mode[dev_chan] = dev->get_gain_mode(dev_chan); + _gain[dev_chan] = dev->get_gain(dev_chan); + } } size_t source_impl::get_num_channels() { size_t channels = 0; - for (source_iface *dev : _devs) + BOOST_FOREACH( source_iface *dev, _devs ) channels += dev->get_num_channels(); return channels; @@ -418,7 +441,7 @@ size_t source_impl::get_num_channels() bool source_impl::seek( long seek_point, int whence, size_t chan ) { size_t channel = 0; - for (source_iface *dev : _devs) + BOOST_FOREACH( source_iface *dev, _devs ) for (size_t dev_chan = 0; dev_chan < dev->get_num_channels(); dev_chan++) if ( chan == channel++ ) return dev->seek( seek_point, whence, dev_chan ); @@ -448,12 +471,12 @@ double source_impl::set_sample_rate(double rate) if (_devs.empty()) throw std::runtime_error(NO_DEVICES_MSG); #endif - for (source_iface *dev : _devs) + BOOST_FOREACH( source_iface *dev, _devs ) sample_rate = dev->set_sample_rate(rate); #ifdef HAVE_IQBALANCE size_t channel = 0; - for (source_iface *dev : _devs) { + BOOST_FOREACH( source_iface *dev, _devs ) { for (size_t dev_chan = 0; dev_chan < dev->get_num_channels(); dev_chan++) { if ( channel < _iq_opt.size() ) { gr::iqbalance::optimize_c *opt = _iq_opt[channel]; @@ -472,7 +495,7 @@ double source_impl::set_sample_rate(double rate) _sample_rate = sample_rate; } - return _sample_rate; + return sample_rate; } double source_impl::get_sample_rate() @@ -491,7 +514,7 @@ double source_impl::get_sample_rate() osmosdr::freq_range_t source_impl::get_freq_range( size_t chan ) { size_t channel = 0; - for (source_iface *dev : _devs) + BOOST_FOREACH( source_iface *dev, _devs ) for (size_t dev_chan = 0; dev_chan < dev->get_num_channels(); dev_chan++) if ( chan == channel++ ) return dev->get_freq_range( dev_chan ); @@ -502,7 +525,7 @@ osmosdr::freq_range_t source_impl::get_freq_range( size_t chan ) double source_impl::set_center_freq( double freq, size_t chan ) { size_t channel = 0; - for (source_iface *dev : _devs) + BOOST_FOREACH( source_iface *dev, _devs ) for (size_t dev_chan = 0; dev_chan < dev->get_num_channels(); dev_chan++) if ( chan == channel++ ) { if ( _center_freq[ chan ] != freq ) { @@ -517,7 +540,7 @@ double source_impl::set_center_freq( double freq, size_t chan ) double source_impl::get_center_freq( size_t chan ) { size_t channel = 0; - for (source_iface *dev : _devs) + BOOST_FOREACH( source_iface *dev, _devs ) for (size_t dev_chan = 0; dev_chan < dev->get_num_channels(); dev_chan++) if ( chan == channel++ ) return dev->get_center_freq( dev_chan ); @@ -528,7 +551,7 @@ double source_impl::get_center_freq( size_t chan ) double source_impl::set_freq_corr( double ppm, size_t chan ) { size_t channel = 0; - for (source_iface *dev : _devs) + BOOST_FOREACH( source_iface *dev, _devs ) for (size_t dev_chan = 0; dev_chan < dev->get_num_channels(); dev_chan++) if ( chan == channel++ ) { if ( _freq_corr[ chan ] != ppm ) { @@ -543,7 +566,7 @@ double source_impl::set_freq_corr( double ppm, size_t chan ) double source_impl::get_freq_corr( size_t chan ) { size_t channel = 0; - for (source_iface *dev : _devs) + BOOST_FOREACH( source_iface *dev, _devs ) for (size_t dev_chan = 0; dev_chan < dev->get_num_channels(); dev_chan++) if ( chan == channel++ ) return dev->get_freq_corr( dev_chan ); @@ -554,7 +577,7 @@ double source_impl::get_freq_corr( size_t chan ) std::vector<std::string> source_impl::get_gain_names( size_t chan ) { size_t channel = 0; - for (source_iface *dev : _devs) + BOOST_FOREACH( source_iface *dev, _devs ) for (size_t dev_chan = 0; dev_chan < dev->get_num_channels(); dev_chan++) if ( chan == channel++ ) return dev->get_gain_names( dev_chan ); @@ -565,7 +588,7 @@ std::vector<std::string> source_impl::get_gain_names( size_t chan ) osmosdr::gain_range_t source_impl::get_gain_range( size_t chan ) { size_t channel = 0; - for (source_iface *dev : _devs) + BOOST_FOREACH( source_iface *dev, _devs ) for (size_t dev_chan = 0; dev_chan < dev->get_num_channels(); dev_chan++) if ( chan == channel++ ) return dev->get_gain_range( dev_chan ); @@ -576,7 +599,7 @@ osmosdr::gain_range_t source_impl::get_gain_range( size_t chan ) osmosdr::gain_range_t source_impl::get_gain_range( const std::string & name, size_t chan ) { size_t channel = 0; - for (source_iface *dev : _devs) + BOOST_FOREACH( source_iface *dev, _devs ) for (size_t dev_chan = 0; dev_chan < dev->get_num_channels(); dev_chan++) if ( chan == channel++ ) return dev->get_gain_range( name, dev_chan ); @@ -587,7 +610,7 @@ osmosdr::gain_range_t source_impl::get_gain_range( const std::string & name, siz bool source_impl::set_gain_mode( bool automatic, size_t chan ) { size_t channel = 0; - for (source_iface *dev : _devs) + BOOST_FOREACH( source_iface *dev, _devs ) for (size_t dev_chan = 0; dev_chan < dev->get_num_channels(); dev_chan++) if ( chan == channel++ ) { if ( _gain_mode[ chan ] != automatic ) { @@ -605,7 +628,7 @@ bool source_impl::set_gain_mode( bool automatic, size_t chan ) bool source_impl::get_gain_mode( size_t chan ) { size_t channel = 0; - for (source_iface *dev : _devs) + BOOST_FOREACH( source_iface *dev, _devs ) for (size_t dev_chan = 0; dev_chan < dev->get_num_channels(); dev_chan++) if ( chan == channel++ ) return dev->get_gain_mode( dev_chan ); @@ -616,7 +639,7 @@ bool source_impl::get_gain_mode( size_t chan ) double source_impl::set_gain( double gain, size_t chan ) { size_t channel = 0; - for (source_iface *dev : _devs) + BOOST_FOREACH( source_iface *dev, _devs ) for (size_t dev_chan = 0; dev_chan < dev->get_num_channels(); dev_chan++) if ( chan == channel++ ) { if ( _gain[ chan ] != gain ) { @@ -631,7 +654,7 @@ double source_impl::set_gain( double gain, size_t chan ) double source_impl::set_gain( double gain, const std::string & name, size_t chan) { size_t channel = 0; - for (source_iface *dev : _devs) + BOOST_FOREACH( source_iface *dev, _devs ) for (size_t dev_chan = 0; dev_chan < dev->get_num_channels(); dev_chan++) if ( chan == channel++ ) return dev->set_gain( gain, name, dev_chan ); @@ -642,7 +665,7 @@ double source_impl::set_gain( double gain, const std::string & name, size_t chan double source_impl::get_gain( size_t chan ) { size_t channel = 0; - for (source_iface *dev : _devs) + BOOST_FOREACH( source_iface *dev, _devs ) for (size_t dev_chan = 0; dev_chan < dev->get_num_channels(); dev_chan++) if ( chan == channel++ ) return dev->get_gain( dev_chan ); @@ -653,7 +676,7 @@ double source_impl::get_gain( size_t chan ) double source_impl::get_gain( const std::string & name, size_t chan ) { size_t channel = 0; - for (source_iface *dev : _devs) + BOOST_FOREACH( source_iface *dev, _devs ) for (size_t dev_chan = 0; dev_chan < dev->get_num_channels(); dev_chan++) if ( chan == channel++ ) return dev->get_gain( name, dev_chan ); @@ -664,7 +687,7 @@ double source_impl::get_gain( const std::string & name, size_t chan ) double source_impl::set_if_gain( double gain, size_t chan ) { size_t channel = 0; - for (source_iface *dev : _devs) + BOOST_FOREACH( source_iface *dev, _devs ) for (size_t dev_chan = 0; dev_chan < dev->get_num_channels(); dev_chan++) if ( chan == channel++ ) { if ( _if_gain[ chan ] != gain ) { @@ -679,7 +702,7 @@ double source_impl::set_if_gain( double gain, size_t chan ) double source_impl::set_bb_gain( double gain, size_t chan ) { size_t channel = 0; - for (source_iface *dev : _devs) + BOOST_FOREACH( source_iface *dev, _devs ) for (size_t dev_chan = 0; dev_chan < dev->get_num_channels(); dev_chan++) if ( chan == channel++ ) { if ( _bb_gain[ chan ] != gain ) { @@ -694,7 +717,7 @@ double source_impl::set_bb_gain( double gain, size_t chan ) std::vector< std::string > source_impl::get_antennas( size_t chan ) { size_t channel = 0; - for (source_iface *dev : _devs) + BOOST_FOREACH( source_iface *dev, _devs ) for (size_t dev_chan = 0; dev_chan < dev->get_num_channels(); dev_chan++) if ( chan == channel++ ) return dev->get_antennas( dev_chan ); @@ -705,7 +728,7 @@ std::vector< std::string > source_impl::get_antennas( size_t chan ) std::string source_impl::set_antenna( const std::string & antenna, size_t chan ) { size_t channel = 0; - for (source_iface *dev : _devs) + BOOST_FOREACH( source_iface *dev, _devs ) for (size_t dev_chan = 0; dev_chan < dev->get_num_channels(); dev_chan++) if ( chan == channel++ ) { if ( _antenna[ chan ] != antenna ) { @@ -720,7 +743,7 @@ std::string source_impl::set_antenna( const std::string & antenna, size_t chan ) std::string source_impl::get_antenna( size_t chan ) { size_t channel = 0; - for (source_iface *dev : _devs) + BOOST_FOREACH( source_iface *dev, _devs ) for (size_t dev_chan = 0; dev_chan < dev->get_num_channels(); dev_chan++) if ( chan == channel++ ) return dev->get_antenna( dev_chan ); @@ -731,7 +754,7 @@ std::string source_impl::get_antenna( size_t chan ) void source_impl::set_dc_offset_mode( int mode, size_t chan ) { size_t channel = 0; - for (source_iface *dev : _devs) + BOOST_FOREACH( source_iface *dev, _devs ) for (size_t dev_chan = 0; dev_chan < dev->get_num_channels(); dev_chan++) if ( chan == channel++ ) dev->set_dc_offset_mode( mode, dev_chan ); @@ -740,7 +763,7 @@ void source_impl::set_dc_offset_mode( int mode, size_t chan ) void source_impl::set_dc_offset( const std::complex<double> &offset, size_t chan ) { size_t channel = 0; - for (source_iface *dev : _devs) + BOOST_FOREACH( source_iface *dev, _devs ) for (size_t dev_chan = 0; dev_chan < dev->get_num_channels(); dev_chan++) if ( chan == channel++ ) dev->set_dc_offset( offset, dev_chan ); @@ -750,7 +773,7 @@ void source_impl::set_iq_balance_mode( int mode, size_t chan ) { size_t channel = 0; #ifdef HAVE_IQBALANCE - for (source_iface *dev : _devs) { + BOOST_FOREACH( source_iface *dev, _devs ) { for (size_t dev_chan = 0; dev_chan < dev->get_num_channels(); dev_chan++) { if ( chan == channel++ ) { if ( chan < _iq_opt.size() && chan < _iq_fix.size() ) { @@ -780,7 +803,7 @@ void source_impl::set_iq_balance_mode( int mode, size_t chan ) } } #else - for (source_iface *dev : _devs) + BOOST_FOREACH( source_iface *dev, _devs ) for (size_t dev_chan = 0; dev_chan < dev->get_num_channels(); dev_chan++) if ( chan == channel++ ) return dev->set_iq_balance_mode( mode, dev_chan ); @@ -791,7 +814,7 @@ void source_impl::set_iq_balance( const std::complex<double> &balance, size_t ch { size_t channel = 0; #ifdef HAVE_IQBALANCE - for (source_iface *dev : _devs) { + BOOST_FOREACH( source_iface *dev, _devs ) { for (size_t dev_chan = 0; dev_chan < dev->get_num_channels(); dev_chan++) { if ( chan == channel++ ) { if ( chan < _iq_opt.size() && chan < _iq_fix.size() ) { @@ -807,7 +830,7 @@ void source_impl::set_iq_balance( const std::complex<double> &balance, size_t ch } } #else - for (source_iface *dev : _devs) + BOOST_FOREACH( source_iface *dev, _devs ) for (size_t dev_chan = 0; dev_chan < dev->get_num_channels(); dev_chan++) if ( chan == channel++ ) return dev->set_iq_balance( balance, dev_chan ); @@ -817,7 +840,7 @@ void source_impl::set_iq_balance( const std::complex<double> &balance, size_t ch double source_impl::set_bandwidth( double bandwidth, size_t chan ) { size_t channel = 0; - for (source_iface *dev : _devs) + BOOST_FOREACH( source_iface *dev, _devs ) for (size_t dev_chan = 0; dev_chan < dev->get_num_channels(); dev_chan++) if ( chan == channel++ ) { if ( _bandwidth[ chan ] != bandwidth || 0.0f == bandwidth ) { @@ -832,7 +855,7 @@ double source_impl::set_bandwidth( double bandwidth, size_t chan ) double source_impl::get_bandwidth( size_t chan ) { size_t channel = 0; - for (source_iface *dev : _devs) + BOOST_FOREACH( source_iface *dev, _devs ) for (size_t dev_chan = 0; dev_chan < dev->get_num_channels(); dev_chan++) if ( chan == channel++ ) return dev->get_bandwidth( dev_chan ); @@ -843,7 +866,7 @@ double source_impl::get_bandwidth( size_t chan ) osmosdr::freq_range_t source_impl::get_bandwidth_range( size_t chan ) { size_t channel = 0; - for (source_iface *dev : _devs) + BOOST_FOREACH( source_iface *dev, _devs ) for (size_t dev_chan = 0; dev_chan < dev->get_num_channels(); dev_chan++) if ( chan == channel++ ) return dev->get_bandwidth_range( dev_chan ); @@ -936,7 +959,7 @@ void source_impl::set_time_now(const osmosdr::time_spec_t &time_spec, size_t mbo void source_impl::set_time_next_pps(const osmosdr::time_spec_t &time_spec) { - for (source_iface *dev : _devs) + BOOST_FOREACH( source_iface *dev, _devs ) { dev->set_time_next_pps( time_spec ); } @@ -944,7 +967,7 @@ void source_impl::set_time_next_pps(const osmosdr::time_spec_t &time_spec) void source_impl::set_time_unknown_pps(const osmosdr::time_spec_t &time_spec) { - for (source_iface *dev : _devs) + BOOST_FOREACH( source_iface *dev, _devs ) { dev->set_time_unknown_pps( time_spec ); } |