Dear Marcus, 1). The line 299 of gnuradio-runtime/lib/block_executor.cc is: noutput_items = min_available_space(d, m->output_multiple(), m->min_noutput_items());
If this line shows that set_min_output_items() works on the fly, does this also shows set_out_multiple() works on the fly? (just to confirm because I do not fully understand the source code). 2). Regarding the returning 0 issue, let me share my experience of experiments. I am creating a custom interpolation block with its interpolation factor can be changed on the fly. Hence it is inherited from gr::block. It has one input port and one output port. During runtime, there will be no problem if the general_work() return 0, provided it consume a non-zero value. The flow graph may become unresponsive when the general_work() return 0 and consume zero. My explanation: Says, the instantaneous interpolation factor is 800. The general_work() is now called with noutput_items=699 and ninput_items[0]=3. In this case the only correct thing that general_work() should do is to consume 0 and return 0. But later the general_work() will be repeatedly called again with the same arguments, i.e. noutput_items=699 and ninput_items[0]=3. In this case again the general_work() has to consume 0 and return 0. This may repeat few thousand rounds, or infinite rounds. When this happens the flow graph becomes unresponsive (hang). That's why it is important to set_min_output_items() to the instantaneous interpolation factor (which is 800), if the set_output_multiple() doesn't work on the fly. If there is no better workaround, we have to stick to this trick at the moment. Regards, Activecat On Fri, Mar 7, 2014 at 6:00 PM, Marcus Müller <mar...@hostalia.de> wrote: > Hi Activecat, > > to answer question 1): > grepping for "min_noutput_items" instantly shows that in > gnuradio-runtime/lib/block_executor.cc line 299, your block's > min_noutput_items() is called every iteration. If there isn't enough space, > the block thread sleeps until there is more. So yes, it works on the fly. > > I remember there was something with returning 0, and I know that producing > 0 items used to mark a source as done, but this mechanism was commented out > about a year ago (l. 483ff, I think for some good reason), but I can't > remember that being an issue for a non-source block; have you tried it and > did you run into problems? > > Greetings, > Marcus > > > > On 03/07/2014 02:26 AM, Activecat wrote: > > Dear Sir, > > Let me explain the reason of why to use the function: > set_min_noutput_items(). > > I am creating a custom interpolator block. > Says, the interpolation factor is 1000. Hence it is important to call > set_output_multiple(1000). > > Meanwhile, for this block the interpolation factor depends on Sample > Rate (samp_rate). In this flow-graph the samp_rate could be changed by the > user during runtime. This means the interpolation factor may change during > runtime, and hence we need to call set_output_multile() with different > values during runtime ! > > The problem arisen when there is no guarantee that set_output_multiple() > will work if you change it on the fly. > (Refer > http://lists.gnu.org/archive/html/discuss-gnuradio/2010-11/msg00504.html) > > The workaround is to use set_min_noutput_items() if it work on the fly. > Says, after changing samp_rate, the new interpolation factor is > recalculated as 800. > If the set_output_multiple(800) doesn't work, the general_work() can still > consume 1 input and produce 800 output if the noutput_items is at least > 800. This enables the flow graph continue to work. > > If the noutput_items is less than 800, the only correct thing the > general_work() can do is to consume_each(0) and return 0. This may be > problematic and can cause unforeseen behavior. So it is important to make > sure the noutput_items is at least 800. Hence I call: > set_min_noutput_items(800) > > This means we can make use of set_min_noutput_items() as a workaround, > if set_output_multiple() doesn't change on the fly. > > The questions are: > 1). Can we use this to change setting on the fly: > set_min_noutput_items() > 2). Is there any better workaround for this? > > Regards, > Activecat > > > > > > > > On Thu, Mar 6, 2014 at 11:36 PM, Tom Rondeau <t...@trondeau.com> wrote: > >> On Thu, Mar 6, 2014 at 2:12 AM, Activecat <active...@gmail.com> wrote: >> > Dear Sir, >> > >> > In c++ we have: set_min_noutput_items() >> > What is it equivalent syntax in python ? >> > >> > I try this: >> > self.set_min_noutput_items() >> > >> > Error message: >> > AttributeError: 'quadrator_upconverter_python1' object has no >> attribute >> > 'set_min_noutput_items' >> > >> > Note: >> > The self.set_output_multiple() in python seems accepted, is it >> functional >> > ..? >> > >> > Regards, >> > Activecat >> >> Looks like when this feature was added, it didn't make it into the >> block.i swig file. I'll push a patch for this soon. >> >> But before you try and use this, be very careful. This is an advanced >> issue that's really only meant to be used if you a) really really need >> it and b) really really know what you are doing and why. >> >> Tom >> > > > > _______________________________________________ > Discuss-gnuradio mailing > listDiscuss-gnuradio@gnu.orghttps://lists.gnu.org/mailman/listinfo/discuss-gnuradio > > > > _______________________________________________ > Discuss-gnuradio mailing list > Discuss-gnuradio@gnu.org > https://lists.gnu.org/mailman/listinfo/discuss-gnuradio > >
_______________________________________________ Discuss-gnuradio mailing list Discuss-gnuradio@gnu.org https://lists.gnu.org/mailman/listinfo/discuss-gnuradio