From 24d54c369ffaf29c3bb8a98a0cfa0f15e8ed7853 Mon Sep 17 00:00:00 2001 From: Dimitri Stolnikov Date: Mon, 10 Mar 2014 17:16:05 +0100 Subject: [PATCH] file: expose seek function in public API --- include/osmosdr/osmosdr_source_c.h | 9 +++++++++ lib/file/file_source_c.cc | 16 ++++++++++------ lib/file/file_source_c.h | 5 +++++ lib/osmosdr_source_c_impl.cc | 11 +++++++++++ lib/osmosdr_source_c_impl.h | 2 ++ lib/osmosdr_src_iface.h | 9 +++++++++ 6 files changed, 46 insertions(+), 6 deletions(-) diff --git a/include/osmosdr/osmosdr_source_c.h b/include/osmosdr/osmosdr_source_c.h index adc31d4..c3bf87c 100644 --- a/include/osmosdr/osmosdr_source_c.h +++ b/include/osmosdr/osmosdr_source_c.h @@ -63,6 +63,15 @@ public: */ virtual size_t get_num_channels( void ) = 0; + /*! + * \brief seek file to \p seek_point relative to \p whence + * + * \param seek_point sample offset in file + * \param whence one of SEEK_SET, SEEK_CUR, SEEK_END (man fseek) + * \return true on success + */ + virtual bool seek( long seek_point, int whence, size_t chan = 0 ) = 0; + /*! * Get the possible sample rates for the underlying radio hardware. * \return a range of rates in Sps diff --git a/lib/file/file_source_c.cc b/lib/file/file_source_c.cc index ceb6dd1..fedf2f9 100644 --- a/lib/file/file_source_c.cc +++ b/lib/file/file_source_c.cc @@ -26,7 +26,6 @@ #include #include -#include #include "file_source_c.h" @@ -78,17 +77,17 @@ file_source_c::file_source_c(const std::string &args) : _file_rate = _rate; - gr_file_source_sptr src = gr_make_file_source( sizeof(gr_complex), - filename.c_str(), - repeat ); + _source = gr_make_file_source( sizeof(gr_complex), + filename.c_str(), + repeat ); _throttle = gr_make_throttle( sizeof(gr_complex), _file_rate ); if (throttle) { - connect( src, 0, _throttle, 0 ); + connect( _source, 0, _throttle, 0 ); connect( _throttle, 0, self(), 0 ); } else { - connect( src, 0, self(), 0 ); + connect( _source, 0, self(), 0 ); } } @@ -121,6 +120,11 @@ size_t file_source_c::get_num_channels( void ) return 1; } +bool file_source_c::seek( long seek_point, int whence , size_t chan ) +{ + return _source->seek( seek_point, whence ); +} + osmosdr::meta_range_t file_source_c::get_sample_rates( void ) { osmosdr::meta_range_t range; diff --git a/lib/file/file_source_c.h b/lib/file/file_source_c.h index e7bc067..8d8fb56 100644 --- a/lib/file/file_source_c.h +++ b/lib/file/file_source_c.h @@ -21,6 +21,7 @@ #define FILE_SOURCE_C_H #include +#include #include #include "osmosdr_src_iface.h" @@ -49,6 +50,8 @@ public: size_t get_num_channels( void ); + bool seek( long seek_point, int whence, size_t chan ); + osmosdr::meta_range_t get_sample_rates( void ); double set_sample_rate( double rate ); double get_sample_rate( void ); @@ -72,7 +75,9 @@ public: std::string get_antenna( size_t chan = 0 ); private: + gr_file_source_sptr _source; gr_throttle::sptr _throttle; + double _file_rate; double _freq, _rate; }; diff --git a/lib/osmosdr_source_c_impl.cc b/lib/osmosdr_source_c_impl.cc index 2eb7101..33ed3db 100644 --- a/lib/osmosdr_source_c_impl.cc +++ b/lib/osmosdr_source_c_impl.cc @@ -375,6 +375,17 @@ size_t osmosdr_source_c_impl::get_num_channels() return channels; } +bool source_impl::seek( long seek_point, int whence, size_t chan ) +{ + size_t channel = 0; + 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 ); + + return false; +} + #define NO_DEVICES_MSG "FATAL: No device(s) available to work with." osmosdr::meta_range_t osmosdr_source_c_impl::get_sample_rates() diff --git a/lib/osmosdr_source_c_impl.h b/lib/osmosdr_source_c_impl.h index 53bdc2e..9cd71c6 100644 --- a/lib/osmosdr_source_c_impl.h +++ b/lib/osmosdr_source_c_impl.h @@ -36,6 +36,8 @@ class osmosdr_source_c_impl : public osmosdr_source_c public: size_t get_num_channels( void ); + bool seek( long seek_point, int whence, size_t chan ); + osmosdr::meta_range_t get_sample_rates( void ); double set_sample_rate( double rate ); double get_sample_rate( void ); diff --git a/lib/osmosdr_src_iface.h b/lib/osmosdr_src_iface.h index 4520ac4..2828787 100644 --- a/lib/osmosdr_src_iface.h +++ b/lib/osmosdr_src_iface.h @@ -41,6 +41,15 @@ public: */ virtual size_t get_num_channels( void ) = 0; + /*! + * \brief seek file to \p seek_point relative to \p whence + * + * \param seek_point sample offset in file + * \param whence one of SEEK_SET, SEEK_CUR, SEEK_END (man fseek) + * \return true on success + */ + virtual bool seek( long seek_point, int whence, size_t chan = 0 ) { return false; } + /*! * Get the possible sample rates for the underlying radio hardware. * \return a range of rates in Sps