summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gr-blocks/include/gnuradio/blocks/deinterleave.h6
-rw-r--r--gr-blocks/include/gnuradio/blocks/interleave.h6
-rw-r--r--gr-blocks/lib/deinterleave_impl.cc27
-rw-r--r--gr-blocks/lib/deinterleave_impl.h9
-rw-r--r--gr-blocks/lib/interleave_impl.cc33
-rw-r--r--gr-blocks/lib/interleave_impl.h8
6 files changed, 55 insertions, 34 deletions
diff --git a/gr-blocks/include/gnuradio/blocks/deinterleave.h b/gr-blocks/include/gnuradio/blocks/deinterleave.h
index a3b5480089..8e29873945 100644
--- a/gr-blocks/include/gnuradio/blocks/deinterleave.h
+++ b/gr-blocks/include/gnuradio/blocks/deinterleave.h
@@ -67,8 +67,12 @@ namespace gr {
*
* \param itemsize stream itemsize
* \param blocksize size of block to deinterleave
+ * \param set_rel_rate should the block set the relative_rate
+ * - changes tags locations and may not be appropriate
+ * for all circumstances.
*/
- static sptr make(size_t itemsize, unsigned int blocksize = 1);
+ static sptr make(size_t itemsize, unsigned int blocksize = 1,
+ bool set_rel_rate=true);
};
} /* namespace blocks */
diff --git a/gr-blocks/include/gnuradio/blocks/interleave.h b/gr-blocks/include/gnuradio/blocks/interleave.h
index 7f7587d267..8e68ce97c0 100644
--- a/gr-blocks/include/gnuradio/blocks/interleave.h
+++ b/gr-blocks/include/gnuradio/blocks/interleave.h
@@ -68,8 +68,12 @@ namespace gr {
*
* \param itemsize stream itemsize
* \param blocksize size of block of samples to interleave
+ * \param set_rel_rate should the block set the relative_rate
+ * - changes tags locations and may not be appropriate
+ * for all circumstances.
*/
- static sptr make(size_t itemsize, unsigned int blocksize = 1);
+ static sptr make(size_t itemsize, unsigned int blocksize = 1,
+ bool set_rel_rate=true);
};
} /* namespace blocks */
diff --git a/gr-blocks/lib/deinterleave_impl.cc b/gr-blocks/lib/deinterleave_impl.cc
index 5e1cc5221d..025e2b62c5 100644
--- a/gr-blocks/lib/deinterleave_impl.cc
+++ b/gr-blocks/lib/deinterleave_impl.cc
@@ -1,6 +1,6 @@
/* -*- c++ -*- */
/*
- * Copyright 2012 Free Software Foundation, Inc.
+ * Copyright 2012,2014 Free Software Foundation, Inc.
*
* This file is part of GNU Radio
*
@@ -30,16 +30,20 @@
namespace gr {
namespace blocks {
- deinterleave::sptr deinterleave::make(size_t itemsize, unsigned int blocksize)
+ deinterleave::sptr deinterleave::make(size_t itemsize, unsigned int blocksize,
+ bool set_rel_rate)
{
- return gnuradio::get_initial_sptr(new deinterleave_impl(itemsize, blocksize));
+ return gnuradio::get_initial_sptr
+ (new deinterleave_impl(itemsize, blocksize, set_rel_rate));
}
-
- deinterleave_impl::deinterleave_impl(size_t itemsize, unsigned int blocksize)
+
+ deinterleave_impl::deinterleave_impl(size_t itemsize, unsigned int blocksize,
+ bool set_rel_rate)
: block("deinterleave",
io_signature::make (1, 1, itemsize),
io_signature::make (1, io_signature::IO_INFINITE, itemsize)),
- d_itemsize(itemsize), d_blocksize(blocksize), d_current_output(0)
+ d_itemsize(itemsize), d_blocksize(blocksize), d_current_output(0),
+ d_set_rel_rate(set_rel_rate)
{
set_output_multiple(blocksize);
}
@@ -47,11 +51,12 @@ namespace gr {
bool
deinterleave_impl::check_topology(int ninputs, int noutputs)
{
- set_relative_rate((double)noutputs);
+ if(d_set_rel_rate)
+ set_relative_rate(1.0/static_cast<double>(noutputs));
d_noutputs = noutputs;
return true;
}
-
+
int
deinterleave_impl::general_work(int noutput_items,
gr_vector_int& ninput_items,
@@ -60,14 +65,14 @@ namespace gr {
{
const char *in = (const char*)input_items[0];
char **out = (char**)&output_items[0];
-
+
memcpy(out[d_current_output], in, d_itemsize * d_blocksize);
consume_each(d_blocksize);
produce(d_current_output, d_blocksize);
d_current_output = (d_current_output + 1) % d_noutputs;
return WORK_CALLED_PRODUCE;
}
-
-
+
+
} /* namespace blocks */
} /* namespace gr */
diff --git a/gr-blocks/lib/deinterleave_impl.h b/gr-blocks/lib/deinterleave_impl.h
index a7a9e0a8fa..8ca61e5023 100644
--- a/gr-blocks/lib/deinterleave_impl.h
+++ b/gr-blocks/lib/deinterleave_impl.h
@@ -30,15 +30,16 @@ namespace gr {
class BLOCKS_API deinterleave_impl : public deinterleave
{
-
+
size_t d_itemsize;
unsigned int d_blocksize;
unsigned int d_current_output;
unsigned int d_noutputs;
-
+ bool d_set_rel_rate;
public:
- deinterleave_impl(size_t itemsize, unsigned int blocksize);
+ deinterleave_impl(size_t itemsize, unsigned int blocksize,
+ bool set_rel_rate=true);
bool check_topology(int ninputs, int noutputs);
@@ -51,6 +52,6 @@ namespace gr {
} /* namespace blocks */
} /* namespace gr */
-
+
#endif /* INCLUDED_DEINTERLEAVE_IMPL_H */
diff --git a/gr-blocks/lib/interleave_impl.cc b/gr-blocks/lib/interleave_impl.cc
index 22d6488f7a..5584eec601 100644
--- a/gr-blocks/lib/interleave_impl.cc
+++ b/gr-blocks/lib/interleave_impl.cc
@@ -1,6 +1,6 @@
/* -*- c++ -*- */
/*
- * Copyright 2012 Free Software Foundation, Inc.
+ * Copyright 2012,2014 Free Software Foundation, Inc.
*
* This file is part of GNU Radio
*
@@ -29,17 +29,21 @@
namespace gr {
namespace blocks {
-
- interleave::sptr interleave::make(size_t itemsize, unsigned int blocksize)
+
+ interleave::sptr interleave::make(size_t itemsize, unsigned int blocksize,
+ bool set_rel_rate)
{
- return gnuradio::get_initial_sptr(new interleave_impl(itemsize, blocksize));
+ return gnuradio::get_initial_sptr
+ (new interleave_impl(itemsize, blocksize, set_rel_rate));
}
-
- interleave_impl::interleave_impl(size_t itemsize, unsigned int blocksize)
+
+ interleave_impl::interleave_impl(size_t itemsize, unsigned int blocksize,
+ bool set_rel_rate)
: block("interleave",
io_signature::make (1, io_signature::IO_INFINITE, itemsize),
io_signature::make (1, 1, itemsize)),
- d_itemsize(itemsize), d_blocksize(blocksize)
+ d_itemsize(itemsize), d_blocksize(blocksize),
+ d_set_rel_rate(set_rel_rate)
{
set_fixed_rate(true);
set_output_multiple(d_blocksize);
@@ -48,13 +52,14 @@ namespace gr {
bool
interleave_impl::check_topology(int ninputs, int noutputs)
{
- set_relative_rate((double)ninputs);
+ if(d_set_rel_rate)
+ set_relative_rate(static_cast<double>(ninputs));
d_ninputs = ninputs;
set_output_multiple(d_blocksize * d_ninputs);
return true;
}
-
-
+
+
int
interleave_impl::fixed_rate_ninput_to_noutput(int ninput)
{
@@ -66,7 +71,7 @@ namespace gr {
{
return (int) ((noutput / d_ninputs) + .5);
}
-
+
void
interleave_impl::forecast(int noutput_items,
gr_vector_int& ninput_items_required)
@@ -85,7 +90,7 @@ namespace gr {
size_t noutput_blocks = (size_t) ((noutput_items/d_blocksize) + .5);
const char **in = (const char**)&input_items[0];
char *out = (char*)output_items[0];
-
+
for (unsigned int i = 0; i < noutput_blocks; i += d_ninputs) {
for (unsigned int n = 0; n < d_ninputs; n++){
memcpy(out, in[n], d_itemsize * d_blocksize);
@@ -98,7 +103,7 @@ namespace gr {
}
-
-
+
+
} /* namespace blocks */
} /* namespace gr */
diff --git a/gr-blocks/lib/interleave_impl.h b/gr-blocks/lib/interleave_impl.h
index c74127fca5..a54dfe7e78 100644
--- a/gr-blocks/lib/interleave_impl.h
+++ b/gr-blocks/lib/interleave_impl.h
@@ -1,6 +1,6 @@
/* -*- c++ -*- */
/*
- * Copyright 2012 Free Software Foundation, Inc.
+ * Copyright 2012,2014 Free Software Foundation, Inc.
*
* This file is part of GNU Radio
*
@@ -33,9 +33,11 @@ namespace gr {
size_t d_itemsize;
unsigned int d_blocksize;
unsigned int d_ninputs;
+ bool d_set_rel_rate;
public:
- interleave_impl(size_t itemsize, unsigned int blocksize);
+ interleave_impl(size_t itemsize, unsigned int blocksize,
+ bool set_rel_rate=true);
bool check_topology(int ninputs, int noutputs);
@@ -58,6 +60,6 @@ namespace gr {
} /* namespace blocks */
} /* namespace gr */
-
+
#endif /* INCLUDED_INTERLEAVE_IMPL_H */