Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
runtime: add stream flags to io_signature
This adds a new parameter to the io_signature class to allow specifying
flags for each input or output port.  The initial use case for this
capability is to allow a block to indicate that it needs to own and supply
the stream buffer memory for one or more of its outputs, or that upstream
connected block outputs need to query this block to provide the stream
buffer memory for the connected input/output.
  • Loading branch information
jmcorgan committed Nov 6, 2013
1 parent 5f724cf commit aa6f59a
Show file tree
Hide file tree
Showing 3 changed files with 110 additions and 24 deletions.
42 changes: 33 additions & 9 deletions gnuradio-runtime/include/gnuradio/io_signature.h
@@ -1,6 +1,6 @@
/* -*- c++ -*- */
/*
* Copyright 2004,2007 Free Software Foundation, Inc.
* Copyright 2004,2007,2013 Free Software Foundation, Inc.
*
* This file is part of GNU Radio
*
Expand All @@ -25,6 +25,7 @@

#include <gnuradio/api.h>
#include <gnuradio/runtime_types.h>
#include <stdint.h>

namespace gr {

Expand All @@ -34,16 +35,23 @@ namespace gr {
*/
class GR_RUNTIME_API io_signature
{
int d_min_streams;
int d_max_streams;
std::vector<int> d_sizeof_stream_item;
int d_min_streams;
int d_max_streams;
std::vector<int> d_sizeof_stream_item;
std::vector<uint32_t> d_stream_flags;

io_signature(int min_streams, int max_streams,
const std::vector<int> &sizeof_stream_items);
const std::vector<int> &sizeof_stream_items,
const std::vector<uint32_t> &stream_flags);

public:
typedef boost::shared_ptr<io_signature> sptr;

typedef enum io_flags {
DEFAULT_FLAGS = 0,
MEM_BLOCK_OWNS = 1 << 0
} io_flags_t;

static const int IO_INFINITE = -1;

~io_signature();
Expand All @@ -55,9 +63,11 @@ namespace gr {
* \param min_streams specify minimum number of streams (>= 0)
* \param max_streams specify maximum number of streams (>= min_streams or -1 -> infinite)
* \param sizeof_stream_item specify the size of the items in each stream
* \param flags specify the io flags for the stream
*/
static sptr make(int min_streams, int max_streams,
int sizeof_stream_item);
int sizeof_stream_item,
uint32_t flags = DEFAULT_FLAGS);

/*!
* \brief Create an i/o signature
Expand All @@ -66,10 +76,14 @@ namespace gr {
* \param max_streams specify maximum number of streams (>= min_streams or -1 -> infinite)
* \param sizeof_stream_item1 specify the size of the items in the first stream
* \param sizeof_stream_item2 specify the size of the items in the second and subsequent streams
* \param flags1 specify the io flags for the first stream
* \param flags2 specify the io flags for the second and subsequent streams
*/
static sptr make2(int min_streams, int max_streams,
int sizeof_stream_item1,
int sizeof_stream_item2);
int sizeof_stream_item2,
uint32_t flags1 = DEFAULT_FLAGS,
uint32_t flags2 = DEFAULT_FLAGS);

/*!
* \brief Create an i/o signature
Expand All @@ -79,31 +93,41 @@ namespace gr {
* \param sizeof_stream_item1 specify the size of the items in the first stream
* \param sizeof_stream_item2 specify the size of the items in the second stream
* \param sizeof_stream_item3 specify the size of the items in the third and subsequent streams
* \param flags1 specify the io flags for the first stream
* \param flags2 specify the io flags for the second stream
* \param flags3 specify the io flags for the third and subsequent streams
*/
static sptr make3(int min_streams, int max_streams,
int sizeof_stream_item1,
int sizeof_stream_item2,
int sizeof_stream_item3);
int sizeof_stream_item3,
uint32_t flags1 = DEFAULT_FLAGS,
uint32_t flags2 = DEFAULT_FLAGS,
uint32_t flags3 = DEFAULT_FLAGS);

/*!
* \brief Create an i/o signature
*
* \param min_streams specify minimum number of streams (>= 0)
* \param max_streams specify maximum number of streams (>= min_streams or -1 -> infinite)
* \param sizeof_stream_items specify the size of the items in the streams
* \param stream_flags specify the io flags for the streams
*
* If there are more streams than there are entries in
* sizeof_stream_items, the value of the last entry in
* sizeof_stream_items is used for the missing values.
* sizeof_stream_items must contain at least 1 entry.
*/
static sptr makev(int min_streams, int max_streams,
const std::vector<int> &sizeof_stream_items);
const std::vector<int> &sizeof_stream_items,
const std::vector<uint32_t> &stream_flags = std::vector<uint32_t>(0));

int min_streams() const { return d_min_streams; }
int max_streams() const { return d_max_streams; }
int sizeof_stream_item(int index) const;
uint32_t stream_flags(int index) const;
std::vector<int> sizeof_stream_items() const;
std::vector<uint32_t> stream_flags() const;
};

} /* namespace gr */
Expand Down
67 changes: 57 additions & 10 deletions gnuradio-runtime/lib/io_signature.cc
Expand Up @@ -32,54 +32,71 @@ namespace gr {

gr::io_signature::sptr
io_signature::makev(int min_streams, int max_streams,
const std::vector<int> &sizeof_stream_items)
const std::vector<int> &sizeof_stream_items,
const std::vector<uint32_t> &stream_flags)
{
return gr::io_signature::sptr
(new io_signature(min_streams, max_streams,
sizeof_stream_items));
sizeof_stream_items, stream_flags));
}

gr::io_signature::sptr
io_signature::make(int min_streams, int max_streams,
int sizeof_stream_item)
int sizeof_stream_item,
uint32_t flags)
{
std::vector<int> sizeof_items(1);
std::vector<uint32_t> stream_flags(1);
sizeof_items[0] = sizeof_stream_item;
return io_signature::makev(min_streams, max_streams, sizeof_items);
stream_flags[0] = flags;
return io_signature::makev(min_streams, max_streams, sizeof_items, stream_flags);
}

gr::io_signature::sptr
io_signature::make2(int min_streams, int max_streams,
int sizeof_stream_item1,
int sizeof_stream_item2)
int sizeof_stream_item2,
uint32_t flags1,
uint32_t flags2)
{
std::vector<int> sizeof_items(2);
std::vector<uint32_t> stream_flags(2);
sizeof_items[0] = sizeof_stream_item1;
sizeof_items[1] = sizeof_stream_item2;
return io_signature::makev(min_streams, max_streams, sizeof_items);
stream_flags[0] = flags1;
stream_flags[1] = flags2;
return io_signature::makev(min_streams, max_streams, sizeof_items, stream_flags);
}

gr::io_signature::sptr
io_signature::make3(int min_streams, int max_streams,
int sizeof_stream_item1,
int sizeof_stream_item2,
int sizeof_stream_item3)
int sizeof_stream_item3,
uint32_t flags1,
uint32_t flags2,
uint32_t flags3)
{
std::vector<int> sizeof_items(3);
std::vector<uint32_t> stream_flags(3);
sizeof_items[0] = sizeof_stream_item1;
sizeof_items[1] = sizeof_stream_item2;
sizeof_items[2] = sizeof_stream_item3;
return io_signature::makev(min_streams, max_streams, sizeof_items);
stream_flags[0] = flags1;
stream_flags[1] = flags2;
stream_flags[2] = flags3;
return io_signature::makev(min_streams, max_streams, sizeof_items, stream_flags);
}

// ------------------------------------------------------------------------

io_signature::io_signature(int min_streams, int max_streams,
const std::vector<int> &sizeof_stream_items)
const std::vector<int> &sizeof_stream_items,
const std::vector<uint32_t> &stream_flags)
{
if(min_streams < 0
|| (max_streams != IO_INFINITE && max_streams < min_streams))
throw std::invalid_argument ("gr::io_signature(1)");
throw std::invalid_argument("gr::io_signature(1)");

if(sizeof_stream_items.size() < 1)
throw std::invalid_argument("gr::io_signature(2)");
Expand All @@ -92,6 +109,20 @@ namespace gr {
d_min_streams = min_streams;
d_max_streams = max_streams;
d_sizeof_stream_item = sizeof_stream_items;

// If user doesn't supply stream flags, make vector of defaults
// of the same size as sizeof_stream_items
if(stream_flags.size() == 0) {
for (size_t i = 0; i < sizeof_stream_items.size(); i++)
d_stream_flags.push_back(io_signature::DEFAULT_FLAGS);
}
else {
// Make sure user supplied vector matches
if(sizeof_stream_items.size() != stream_flags.size())
throw std::invalid_argument("gr::io_signature(4)");

d_stream_flags = stream_flags;
}
}

io_signature::~io_signature()
Expand All @@ -108,10 +139,26 @@ namespace gr {
return d_sizeof_stream_item[std::min(index, d_sizeof_stream_item.size() - 1)];
}

uint32_t
io_signature::stream_flags(int _index) const
{
if(_index < 0)
throw std::invalid_argument("gr::io_signature::sizeof_stream_item");

size_t index = _index;
return d_stream_flags[std::min(index, d_stream_flags.size() - 1)];
}

std::vector<int>
io_signature::sizeof_stream_items() const
{
return d_sizeof_stream_item;
}

std::vector<uint32_t>
io_signature::stream_flags() const
{
return d_stream_flags;
}

} /* namespace gr */
25 changes: 20 additions & 5 deletions gnuradio-runtime/swig/io_signature.i
Expand Up @@ -25,11 +25,17 @@ namespace gr {
class GR_RUNTIME_API io_signature
{
io_signature(int min_streams, int max_streams,
const std::vector<int> &sizeof_stream_items);
const std::vector<int> &sizeof_stream_items,
const std::vector<uint32_t> &stream_flags);

public:
typedef boost::shared_ptr<io_signature> sptr;

typedef enum io_flags {
DEFAULT_FLAGS = 0,
MEM_BLOCK_OWNS = 1 << 0
} io_flags_t;

// Avoids a swig warning, otherwise we could just
// #include <gnuradio/io_signature.h> instead of redoing this
// #entire class
Expand All @@ -39,21 +45,30 @@ namespace gr {


static sptr make(int min_streams, int max_streams,
int sizeof_stream_item);
int sizeof_stream_item,
uint32_t flags = DEFAULT_FLAGS);
static sptr make2(int min_streams, int max_streams,
int sizeof_stream_item1,
int sizeof_stream_item2);
int sizeof_stream_item2,
uint32_t flags1 = DEFAULT_FLAGS,
uint32_t flags2 = DEFAULT_FLAGS);
static sptr make3(int min_streams, int max_streams,
int sizeof_stream_item1,
int sizeof_stream_item2,
int sizeof_stream_item3);
int sizeof_stream_item3,
uint32_t flags1 = DEFAULT_FLAGS,
uint32_t flags2 = DEFAULT_FLAGS,
uint32_t flags3 = DEFAULT_FLAGS);
static sptr makev(int min_streams, int max_streams,
const std::vector<int> &sizeof_stream_items);
const std::vector<int> &sizeof_stream_items,
const std::vector<uint32_t> &stream_flags = std::vector<uint32_t>(0));

int min_streams() const { return d_min_streams; }
int max_streams() const { return d_max_streams; }
int sizeof_stream_item(int index) const;
uint32_t stream_flags(int index) const;
std::vector<int> sizeof_stream_items() const;
std::vector<uint32_t> stream_flags() const;
};

} /* namespace gr */
Expand Down

0 comments on commit aa6f59a

Please sign in to comment.