summaryrefslogtreecommitdiff
path: root/gnuradio-runtime/lib/buffer.cc
diff options
context:
space:
mode:
authorTom Rondeau <tom@trondeau.com>2013-09-17 15:32:44 -0400
committerTom Rondeau <tom@trondeau.com>2013-10-29 12:21:42 -0400
commitf3f5a5ae0ae0093277494b2380a77c8eed439035 (patch)
treeda68cfb94397c80d018c8e9e206de8742cbdf913 /gnuradio-runtime/lib/buffer.cc
parent4d71f048b2cb2ded5e4527559770a0d371d969f5 (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.cc44
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();
}
}