Hi Eric, I actually forgot to mention one more thing.
I use N items of first stream and one item on second stream to produce N items on output stream. I am actually spreading data. If the spreading code is N-character bytes long, then each bit of data input byte (i.e. a total of 8 bits on input byte on second stream) will produce 8*N output items. The input to the spreading stream is uninterrupted from a sequence generator block. But the input to the data stream i.e. the second input stream can be from a file which will exhaust when file is read completely. So i want to check if any data is available on the second stream(i.e. the data stream) in the work function each time i am done with the previous data byte. I hope i make myself clear. Sorry for the confusion earlier. Thanks Ali On Wed, Jan 7, 2009 at 12:37 PM, Eric Blossom <e...@comsec.com> wrote: > On Wed, Jan 07, 2009 at 04:44:39AM -0600, Mir Ali wrote: > > Hi, > > I have a simple question. I have a block that has 2 input streams and the > > inputs are consumed at different rates. For each 1 input consumed on the > > first input stream N inputs are consumed in the second stream. > > > > The forecast function and set_multiple call of this block are as shown > > below, > > > > my_new_block::forecast(int noutput_items,gr_vector_int > > &ninput_items_required){ > > assert(noutput_items % N==0); # the > > > > > > int items_on_first_input_stream = noutput_items; > > int items_on_second_input_stream = noutput_items/(8*N); > > ninput_items_required[0]=items_on_first_input_stream; > > ninput_items_required[1]=items_on_data_input_stream; > > } > > > > > > { > > set_output_multiple(8*N); # the output items are a multiple of > 8*N. > > } > > > For each (8*N) inputs consumed on second stream 1 input is consumed on > first > > stream. > > If the first stream has uninterrupted supply but the second one doesn't > then > > how should I check if input is available on the second stream. Will the > > input_vector contain NULL values when nothing is in it? If it is true > should > > i just do > > > > if(second_stream[next_item]==null){ > > ....... > > } > > > > Please clarify. > > > > Thanks > > Ali > > You should be deriving your class from gr_block (you may already be doing > this). > There is no need to call set_output_multiple. > > If I understand you correctly, to produce a single output item, you > need a single item on the first input stream, and N (== 8) items on the > second stream. > > Assuming I'm understanding you correctly, then your forecast routine > should be: > > > static const int N = 8; > > void > my_new_block::forecast(int noutput_items, gr_vector_int > &ninput_items_required) > { > ninput_items_required[0] = noutput_items; > ninput_items_required[1] = noutput_items * N; > } > > You then need to override general_work, not work: > > (I'm assuming that your input and output types are float. Change as > required) > > > float f(const float *a, const float *b) > { > // Produce a single float value by using a[0] and b[0] through b[N-1]... > > return XXX; > } > > int > my_new_block::general_work(int noutput_items, > gr_vector_int &ninput_items, > gr_vector_const_void_star &input_items, > gr_vector_void_star &output_items) > { > const float *in0 = (const float *)input_items[0]; > const float *in1 = (const float *)input_items[1]; > float *out = (float *)output_items[0]; > > for (int i = 0; i < noutput_items; i++){ > > out[i] = f(&in0[i], &in1[i * N]); > > } > > consume(0, noutput_items); > consume(1, noutput_items * N); > > return noutput_items; > } > > > Eric > -- Mir Murtuza Ali Graduate Student Center for Wireless Communications University of Mississippi University, MS 38677
_______________________________________________ Discuss-gnuradio mailing list Discuss-gnuradio@gnu.org http://lists.gnu.org/mailman/listinfo/discuss-gnuradio