diff options
author | Tom Rondeau <tom@trondeau.com> | 2013-09-17 15:32:44 -0400 |
---|---|---|
committer | Tom Rondeau <tom@trondeau.com> | 2013-10-29 12:21:42 -0400 |
commit | f3f5a5ae0ae0093277494b2380a77c8eed439035 (patch) | |
tree | da68cfb94397c80d018c8e9e206de8742cbdf913 /gnuradio-runtime/include/gnuradio/buffer.h | |
parent | 4d71f048b2cb2ded5e4527559770a0d371d969f5 (diff) |
runtime: for blocks with a group delay, tag location should be moved according to the delay. Since group delay is often unknown, we have added a new function set_group_delay to allow the user to set the value once delay is calculated.
Also added ability to set the tag propagation delay, which is required for how the blocks::delay works.
Diffstat (limited to 'gnuradio-runtime/include/gnuradio/buffer.h')
-rw-r--r-- | gnuradio-runtime/include/gnuradio/buffer.h | 34 |
1 files changed, 29 insertions, 5 deletions
diff --git a/gnuradio-runtime/include/gnuradio/buffer.h b/gnuradio-runtime/include/gnuradio/buffer.h index adf00d14ac..e8e142028a 100644 --- a/gnuradio-runtime/include/gnuradio/buffer.h +++ b/gnuradio-runtime/include/gnuradio/buffer.h @@ -133,11 +133,16 @@ namespace gr { private: friend class buffer_reader; friend GR_RUNTIME_API buffer_sptr make_buffer(int nitems, size_t sizeof_item, block_sptr link); - friend GR_RUNTIME_API buffer_reader_sptr buffer_add_reader(buffer_sptr buf, int nzero_preload, block_sptr link); + friend GR_RUNTIME_API buffer_reader_sptr buffer_add_reader + (buffer_sptr buf, int nzero_preload, block_sptr link, int delay); protected: char *d_base; // base address of buffer unsigned int d_bufsize; // in items + + // Keep track of maximum group delay of any reader; Only prune tags past this. + unsigned d_max_reader_delay; + private: gr::vmcircbuf *d_vmcircbuf; size_t d_sizeof_item; // in bytes @@ -152,7 +157,7 @@ namespace gr { unsigned int d_write_index; // in items [0,d_bufsize) uint64_t d_abs_write_offset; // num items written since the start bool d_done; - std::deque<tag_t> d_item_tags; + std::deque<tag_t> d_item_tags; uint64_t d_last_min_items_read; unsigned index_add(unsigned a, unsigned b) @@ -205,9 +210,10 @@ namespace gr { * \param buf is the buffer the \p gr::buffer_reader reads from. * \param nzero_preload -- number of zero items to "preload" into buffer. * \param link is the block that reads from the buffer using this gr::buffer_reader. + * \param delay Optional setting for the buffer's group delay. */ GR_RUNTIME_API buffer_reader_sptr - buffer_add_reader(buffer_sptr buf, int nzero_preload, block_sptr link=block_sptr()); + buffer_add_reader(buffer_sptr buf, int nzero_preload, block_sptr link=block_sptr(), int delay=0); //! returns # of buffers currently allocated GR_RUNTIME_API long buffer_ncurrently_allocated(); @@ -225,6 +231,22 @@ namespace gr { ~buffer_reader(); /*! + * Set group delay for this reader. + * + * See gr::block::set_group_delay for details. + * + * \param delay The new group delay + */ + void set_group_delay(unsigned delay); + + /*! + * Gets the group delay for this reader. + * + * See gr::block::group_delay for details. + */ + unsigned group_delay() const; + + /*! * \brief Return number of items available for reading. */ int items_available() const; @@ -290,15 +312,17 @@ namespace gr { private: friend class buffer; friend GR_RUNTIME_API buffer_reader_sptr - buffer_add_reader(buffer_sptr buf, int nzero_preload, block_sptr link); + buffer_add_reader(buffer_sptr buf, int nzero_preload, block_sptr link, int delay); buffer_sptr d_buffer; unsigned int d_read_index; // in items [0,d->buffer.d_bufsize) uint64_t d_abs_read_offset; // num items seen since the start boost::weak_ptr<block> d_link; // block that reads via this buffer reader + unsigned d_group_delay; // group delay for tag propagation //! constructor is private. Use gr::buffer::add_reader to create instances - buffer_reader(buffer_sptr buffer, unsigned int read_index, block_sptr link); + buffer_reader(buffer_sptr buffer, unsigned int read_index, + block_sptr link); }; //! returns # of buffer_readers currently allocated |