aboutsummaryrefslogtreecommitdiffstats
path: root/lib/sink_impl.cc
diff options
context:
space:
mode:
authorDimitri Stolnikov <horiz0n@gmx.net>2014-05-06 22:37:10 +0200
committerDimitri Stolnikov <horiz0n@gmx.net>2014-05-07 14:59:18 +0200
commitd94645c17c1d3a5ea0915d64d603b291d99f4874 (patch)
tree1fb0b45e851f82dd9126cd3c65c701361284ee19 /lib/sink_impl.cc
parent16c32a9fe0cae142877166d23e43e607ad4969f3 (diff)
wip: dynamic signatureswip-signat
Diffstat (limited to 'lib/sink_impl.cc')
-rw-r--r--lib/sink_impl.cc33
1 files changed, 29 insertions, 4 deletions
diff --git a/lib/sink_impl.cc b/lib/sink_impl.cc
index 3f4db4b..9d3cdbe 100644
--- a/lib/sink_impl.cc
+++ b/lib/sink_impl.cc
@@ -64,7 +64,7 @@ osmosdr::sink::make( const std::string &args )
*/
sink_impl::sink_impl( const std::string &args )
: gr::hier_block2 ("sink_impl",
- args_to_io_signature(args),
+ gr::io_signature::make(1, 1, sizeof(gr_complex)),
gr::io_signature::make(0, 0, 0)),
_sample_rate(NAN)
{
@@ -129,6 +129,10 @@ sink_impl::sink_impl( const std::string &args )
throw std::runtime_error("No supported devices found to pick from.");
}
+ int min_streams = 0, max_streams = 0;
+ std::vector<int> stream_items;
+ std::vector< gr::basic_block_sptr > blocks;
+
BOOST_FOREACH(std::string arg, arg_list) {
dict_t dict = params_to_dict(arg);
@@ -161,15 +165,36 @@ sink_impl::sink_impl( const std::string &args )
if ( iface != NULL && long(block.get()) != 0 ) {
_devs.push_back( iface );
+ blocks.push_back( block );
- for (size_t i = 0; i < iface->get_num_channels(); i++) {
- connect(self(), channel++, block, i);
- }
+ min_streams += block->input_signature()->min_streams();
+ max_streams += block->input_signature()->max_streams();
+
+ if ( stream_items.empty() )
+ stream_items.push_back( block->input_signature()->sizeof_stream_item(0) );
+
+// BOOST_FOREACH(int size, block->input_signature()->sizeof_stream_items())
+// {
+// stream_items.push_back( size );
+// }
} else if ( (iface != NULL) || (long(block.get()) != 0) )
throw std::runtime_error("Eitner iface or block are NULL.");
}
+ set_input_signature( gr::io_signature::makev( min_streams,
+ max_streams,
+ stream_items ) );
+
+ for (size_t k = 0; k < _devs.size(); k++)
+ {
+ gr::basic_block_sptr block = blocks[k];
+
+ for (size_t i = 0; i < _devs[k]->get_num_channels(); i++) {
+ connect(self(), channel++, block, i);
+ }
+ }
+
if (!_devs.size())
throw std::runtime_error("No devices specified via device arguments.");
#ifdef WORKAROUND_GR_HIER_BLOCK2_BUG