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/lib/buffer.cc | |
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/lib/buffer.cc')
-rw-r--r-- | gnuradio-runtime/lib/buffer.cc | 44 |
1 files changed, 36 insertions, 8 deletions
diff --git a/gnuradio-runtime/lib/buffer.cc b/gnuradio-runtime/lib/buffer.cc index cd6feefe34..b266c250c9 100644 --- a/gnuradio-runtime/lib/buffer.cc +++ b/gnuradio-runtime/lib/buffer.cc @@ -80,7 +80,7 @@ namespace gr { buffer::buffer(int nitems, size_t sizeof_item, block_sptr link) - : d_base(0), d_bufsize(0), d_vmcircbuf(0), + : d_base(0), d_bufsize(0), d_max_reader_delay(0), d_vmcircbuf(0), d_sizeof_item(sizeof_item), d_link(link), d_write_index(0), d_abs_write_offset(0), d_done(false), d_last_min_items_read(0) @@ -194,7 +194,7 @@ namespace gr { } 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) { if(nzero_preload < 0) throw std::invalid_argument("buffer_add_reader: nzero_preload must be >= 0"); @@ -203,6 +203,7 @@ namespace gr { buf->index_sub(buf->d_write_index, nzero_preload), link)); + r->set_group_delay(delay); buf->d_readers.push_back(r.get ()); return r; @@ -224,7 +225,13 @@ namespace gr { buffer::add_item_tag(const tag_t &tag) { gr::thread::scoped_lock guard(*mutex()); - d_item_tags.push_back(tag); + if(d_readers.size()) { + tag_t t = tag; + d_item_tags.push_back(t); + } + else { + d_item_tags.push_back(tag); + } } void @@ -261,7 +268,7 @@ namespace gr { // therefore lose little time this way. while(itr != d_item_tags.end()) { item_time = (*itr).offset; - if(item_time < max_time) { + if(item_time+d_max_reader_delay < max_time) { d_item_tags.erase(itr); itr = d_item_tags.begin(); } @@ -280,9 +287,12 @@ namespace gr { buffer_reader::buffer_reader(buffer_sptr buffer, unsigned int read_index, block_sptr link) - : d_buffer(buffer), d_read_index(read_index), d_abs_read_offset(0), d_link(link) + : d_buffer(buffer), d_read_index(read_index), d_abs_read_offset(0), d_link(link), + d_group_delay(0) { s_buffer_reader_count++; + + buffer->d_max_reader_delay = 0; } buffer_reader::~buffer_reader() @@ -291,6 +301,20 @@ namespace gr { s_buffer_reader_count--; } + void + buffer_reader::set_group_delay(unsigned delay) + { + d_group_delay = delay; + d_buffer->d_max_reader_delay = std::max(d_group_delay, + d_buffer->d_max_reader_delay); + } + + unsigned + buffer_reader::group_delay() const + { + return d_group_delay; + } + int buffer_reader::items_available() const { @@ -324,13 +348,17 @@ namespace gr { uint64_t item_time; while(itr != d_buffer->get_tags_end()) { - item_time = (*itr).offset; + item_time = (*itr).offset + d_group_delay; if((item_time >= abs_start) && (item_time < abs_end)) { std::vector<long>::iterator id_itr; id_itr = std::find(itr->marked_deleted.begin(), itr->marked_deleted.end(), id); - if (id_itr == itr->marked_deleted.end()) { // If id is not in the vector of marked blocks - v.push_back(*itr); + + // If id is not in the vector of marked blocks + if(id_itr == itr->marked_deleted.end()) { + tag_t t = *itr; + t.offset += d_group_delay; + v.push_back(t); v.back().marked_deleted.clear(); } } |