diff options
Diffstat (limited to 'gr-blocks/lib/interleave_impl.cc')
-rw-r--r-- | gr-blocks/lib/interleave_impl.cc | 78 |
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 */ |