diff options
-rw-r--r-- | gnuradio-runtime/lib/block_executor.cc | 21 |
1 files changed, 16 insertions, 5 deletions
diff --git a/gnuradio-runtime/lib/block_executor.cc b/gnuradio-runtime/lib/block_executor.cc index 7a14c17431..85cf4bb2ab 100644 --- a/gnuradio-runtime/lib/block_executor.cc +++ b/gnuradio-runtime/lib/block_executor.cc @@ -192,6 +192,7 @@ namespace gr { int max_noutput_items; int new_alignment = 0; int alignment_state = -1; + double rrate; block *m = d_block.get(); block_detail *d = m->detail().get(); @@ -450,17 +451,27 @@ namespace gr { m->set_is_unaligned(m->unaligned() != 0); } - if(!propagate_tags(m->tag_propagation_policy(), d, - d_start_nitems_read, m->relative_rate(), - d_returned_tags, m->unique_id())) - goto were_done; - if(n == block::WORK_DONE) goto were_done; if(n != block::WORK_CALLED_PRODUCE) d->produce_each (n); // advance write pointers + // Wait til after we've consumed and produced and recalculate + // the relative rate. + if(!d->sink_p() && !d->source_p()) { + rrate = ((double)m->nitems_written(0)) / ((double)m->nitems_read(0)); + if(rrate > 0) + m->set_relative_rate(rrate); + } + + // Now propagate the tags based on the new relative rate + if(!propagate_tags(m->tag_propagation_policy(), d, + d_start_nitems_read, m->relative_rate(), + d_returned_tags, m->unique_id())) + goto were_done; + + if(d->d_produce_or > 0) // block produced something return READY; |