summaryrefslogtreecommitdiff
path: root/gr-blocks/lib/interleave_impl.cc
diff options
context:
space:
mode:
Diffstat (limited to 'gr-blocks/lib/interleave_impl.cc')
-rw-r--r--gr-blocks/lib/interleave_impl.cc78
1 files changed, 53 insertions, 25 deletions
diff --git a/gr-blocks/lib/interleave_impl.cc b/gr-blocks/lib/interleave_impl.cc
index 1f68cfc512..22d6488f7a 100644
--- a/gr-blocks/lib/interleave_impl.cc
+++ b/gr-blocks/lib/interleave_impl.cc
@@ -29,48 +29,76 @@
namespace gr {
namespace blocks {
-
- interleave::sptr interleave::make(size_t itemsize)
+
+ interleave::sptr interleave::make(size_t itemsize, unsigned int blocksize)
{
- return gnuradio::get_initial_sptr(new interleave_impl(itemsize));
+ return gnuradio::get_initial_sptr(new interleave_impl(itemsize, blocksize));
}
-
- interleave_impl::interleave_impl(size_t itemsize)
- : sync_interpolator("interleave",
- io_signature::make (1, io_signature::IO_INFINITE, itemsize),
- io_signature::make (1, 1, itemsize),
- 1),
- d_itemsize(itemsize)
+
+ interleave_impl::interleave_impl(size_t itemsize, unsigned int blocksize)
+ : block("interleave",
+ io_signature::make (1, io_signature::IO_INFINITE, itemsize),
+ io_signature::make (1, 1, itemsize)),
+ d_itemsize(itemsize), d_blocksize(blocksize)
{
+ set_fixed_rate(true);
+ set_output_multiple(d_blocksize);
}
bool
interleave_impl::check_topology(int ninputs, int noutputs)
{
- set_interpolation(ninputs);
+ set_relative_rate((double)ninputs);
+ d_ninputs = ninputs;
+ set_output_multiple(d_blocksize * d_ninputs);
return true;
}
+
+
+ int
+ interleave_impl::fixed_rate_ninput_to_noutput(int ninput)
+ {
+ return ninput * d_ninputs;
+ }
int
- interleave_impl::work(int noutput_items,
- gr_vector_const_void_star &input_items,
- gr_vector_void_star &output_items)
+ interleave_impl::fixed_rate_noutput_to_ninput(int noutput)
{
- size_t nchan = input_items.size();
- size_t itemsize = d_itemsize;
- const char **in = (const char **)&input_items[0];
- char *out = (char *)output_items[0];
-
- for (int i = 0; i < noutput_items; i += nchan) {
- for (unsigned int n = 0; n < nchan; n++) {
- memcpy (out, in[n], itemsize);
- out += itemsize;
- in[n] += itemsize;
- }
+ return (int) ((noutput / d_ninputs) + .5);
+ }
+
+ void
+ interleave_impl::forecast(int noutput_items,
+ gr_vector_int& ninput_items_required)
+ {
+ for(unsigned int i = 0; i < ninput_items_required.size(); ++i) {
+ ninput_items_required[i] = (int) ((noutput_items / ninput_items_required.size()) + .5);
}
+ }
+ int
+ interleave_impl::general_work(int noutput_items,
+ gr_vector_int& ninput_items,
+ gr_vector_const_void_star &input_items,
+ gr_vector_void_star &output_items)
+ {
+ 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);
+ out += d_itemsize * d_blocksize;
+ in[n] += d_itemsize * d_blocksize;
+ }
+ }
+ consume_each((int)((noutput_items/d_ninputs) + .5));
return noutput_items;
}
+
+
+
} /* namespace blocks */
} /* namespace gr */