Eric, some time ago (maybe April/May) I had sent you some patches on gr_packed_to_unpacked and gr_unpacked_to_packed
I was checking the CVS today and I saw that they are not updated. In case you lost this email, I am resending it to you, together with the attached files. Best, Achilleas ========================= All, I have fixed a bug that appeared when using multiple streams with these blocks. Thanks Achilleas
/* -*- c++ -*- */ /* * Copyright 2004,2006 Free Software Foundation, Inc. * * This file is part of GNU Radio * * GNU Radio is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2, or (at your option) * any later version. * * GNU Radio is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GNU Radio; see the file COPYING. If not, write to * the Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ // @WARNING@ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include <@[EMAIL PROTECTED]> #include <gr_io_signature.h> #include <assert.h> static const unsigned int BITS_PER_TYPE = sizeof(@O_TYPE@) * 8; @SPTR_NAME@ [EMAIL PROTECTED]@ (unsigned int bits_per_chunk, gr_endianness_t endianness) { return @SPTR_NAME@ (new @NAME@ (bits_per_chunk,endianness)); } @NAME@::@NAME@ (unsigned int bits_per_chunk, gr_endianness_t endianness) : gr_block ("@BASE_NAME@", gr_make_io_signature (1, -1, sizeof (@I_TYPE@)), gr_make_io_signature (1, -1, sizeof (@O_TYPE@))), d_bits_per_chunk(bits_per_chunk),d_endianness(endianness),d_index(0) { assert (bits_per_chunk <= BITS_PER_TYPE); assert (bits_per_chunk > 0); set_relative_rate (bits_per_chunk/(1.0 * BITS_PER_TYPE)); } void @NAME@::forecast(int noutput_items, gr_vector_int &ninput_items_required) { int input_required = (int) ceil( (d_index+noutput_items * 1.0 * BITS_PER_TYPE)/d_bits_per_chunk); unsigned ninputs = ninput_items_required.size(); for (unsigned int i = 0; i < ninputs; i++) { ninput_items_required[i] = input_required; } } unsigned int get_bit_be1 (const @I_TYPE@ *in_vector,unsigned int bit_addr, unsigned int bits_per_chunk) { unsigned int byte_addr = (int)bit_addr/bits_per_chunk; @I_TYPE@ x = in_vector[byte_addr]; unsigned int residue = bit_addr - byte_addr * bits_per_chunk; //printf("Bit addr %d byte addr %d residue %d val %d\n",bit_addr,byte_addr,residue,(x>>(bits_per_chunk-1-residue))&1); return (x >> (bits_per_chunk-1-residue))&1; } int @NAME@::general_work (int noutput_items, gr_vector_int &ninput_items, gr_vector_const_void_star &input_items, gr_vector_void_star &output_items) { unsigned int d_index_tmp; assert (input_items.size() == output_items.size()); int nstreams = input_items.size(); for (int m=0; m< nstreams; m++) { const @I_TYPE@ *in = (@I_TYPE@ *) input_items[m]; @O_TYPE@ *out = (@O_TYPE@ *) output_items[m]; d_index_tmp=d_index; // per stream processing //assert((ninput_items[m]-d_index)*d_bits_per_chunk >= noutput_items*BITS_PER_TYPE); switch(d_endianness){ case GR_MSB_FIRST: for(int i=0;i<noutput_items;i++) { @O_TYPE@ tmp=0; for(unsigned int j=0; j<BITS_PER_TYPE; j++) { tmp = (tmp<<1) | get_bit_be1(in,d_index_tmp,d_bits_per_chunk); d_index_tmp++; } out[i] = tmp; } break; case GR_LSB_FIRST: for(int i=0;i<noutput_items;i++) { unsigned long tmp=0; for(unsigned int j=0; j<BITS_PER_TYPE; j++) { tmp = (tmp>>1)| (get_bit_be1(in,d_index_tmp,d_bits_per_chunk)<<(BITS_PER_TYPE-1)); d_index_tmp++; } out[i] = tmp; } break; default: assert(0); } } d_index = d_index_tmp; consume_each ((int)(d_index/d_bits_per_chunk)); d_index = d_index%d_bits_per_chunk; return noutput_items; }
* src/lib/general/gr_packed_to_unpacked_XX.cc.t, src/lib/general/gr_unpacked_to_packed_XX.cc.t: fixed bug in multiple stream support. Patch submitted by Achilleas Anastasopoulos <[EMAIL PROTECTED]>.
? make.log ? my_diff.log ? gr-audio-alsa/src/audio_alsa.pyc ? gr-audio-oss/src/audio_oss.pyc ? gr-howto-write-a-block/src/lib/howto.pyc Index: buildit =================================================================== RCS file: /sources/gnuradio/gr-build/buildit,v retrieving revision 1.11 diff -u -r1.11 buildit --- buildit 23 Nov 2005 03:41:31 -0000 1.11 +++ buildit 27 Apr 2006 19:49:20 -0000 @@ -55,7 +55,9 @@ else: jobs_arg = '' - cmdline = '%s./configure --prefix=%s &&\nmake %s &&\nmake check &&\n%smake install' % ( + #cmdline = '%s./configure --prefix=%s &&\nmake %s &&\nmake check &&\n%smake install' % ( + # buildit without tests + cmdline = '%s./configure --prefix=%s &&\nmake %s &&\n%smake install' % ( bootstrap, options.prefix, jobs_arg, sudo) if options.verbose: Index: gnuradio-core/src/lib/general/gr_packed_to_unpacked_XX.cc.t =================================================================== RCS file: /sources/gnuradio/gnuradio-core/src/lib/general/gr_packed_to_unpacked_XX.cc.t,v retrieving revision 1.2 diff -u -r1.2 gr_packed_to_unpacked_XX.cc.t --- gnuradio-core/src/lib/general/gr_packed_to_unpacked_XX.cc.t 24 Apr 2006 21:37:40 -0000 1.2 +++ gnuradio-core/src/lib/general/gr_packed_to_unpacked_XX.cc.t 27 Apr 2006 19:49:20 -0000 @@ -87,12 +87,15 @@ gr_vector_const_void_star &input_items, gr_vector_void_star &output_items) { + unsigned int d_index_tmp; + assert (input_items.size() == output_items.size()); int nstreams = input_items.size(); for (int m=0; m < nstreams; m++){ const @I_TYPE@ *in = (@I_TYPE@ *) input_items[m]; @O_TYPE@ *out = (@O_TYPE@ *) output_items[m]; + d_index_tmp = d_index; // per stream processing @@ -102,8 +105,8 @@ for (int i = 0; i < noutput_items; i++){ //printf("here msb %d\n",i); @O_TYPE@ x = 0; - for(unsigned int j=0; j<d_bits_per_chunk; j++, d_index++) - x = (x<<1) | get_bit_be(in, d_index); + for(unsigned int j=0; j<d_bits_per_chunk; j++, d_index_tmp++) + x = (x<<1) | get_bit_be(in, d_index_tmp); out[i] = x; } break; @@ -112,8 +115,8 @@ for (int i = 0; i < noutput_items; i++){ //printf("here lsb %d\n",i); @O_TYPE@ x = 0; - for(unsigned int j=0; j<d_bits_per_chunk; j++, d_index++) - x = (x<<1) | get_bit_le(in, d_index); + for(unsigned int j=0; j<d_bits_per_chunk; j++, d_index_tmp++) + x = (x<<1) | get_bit_le(in, d_index_tmp); out[i] = x; } break; @@ -126,6 +129,7 @@ assert(ninput_items[m] >= (int) ((d_index+(BITS_PER_TYPE-1))>>LOG2_L_TYPE)); } + d_index = d_index_tmp; consume_each (d_index >> LOG2_L_TYPE); d_index = d_index & (BITS_PER_TYPE-1); //printf("got to end\n"); Index: gnuradio-core/src/lib/general/gr_unpacked_to_packed_XX.cc.t =================================================================== RCS file: /sources/gnuradio/gnuradio-core/src/lib/general/gr_unpacked_to_packed_XX.cc.t,v retrieving revision 1.2 diff -u -r1.2 gr_unpacked_to_packed_XX.cc.t --- gnuradio-core/src/lib/general/gr_unpacked_to_packed_XX.cc.t 24 Apr 2006 21:37:40 -0000 1.2 +++ gnuradio-core/src/lib/general/gr_unpacked_to_packed_XX.cc.t 27 Apr 2006 19:49:20 -0000 @@ -78,12 +78,15 @@ gr_vector_const_void_star &input_items, gr_vector_void_star &output_items) { + unsigned int d_index_tmp; + assert (input_items.size() == output_items.size()); int nstreams = input_items.size(); for (int m=0; m< nstreams; m++) { const @I_TYPE@ *in = (@I_TYPE@ *) input_items[m]; @O_TYPE@ *out = (@O_TYPE@ *) output_items[m]; + d_index_tmp=d_index; // per stream processing @@ -95,8 +98,8 @@ for(int i=0;i<noutput_items;i++) { @O_TYPE@ tmp=0; for(unsigned int j=0; j<BITS_PER_TYPE; j++) { - tmp = (tmp<<1) | get_bit_be1(in,d_index,d_bits_per_chunk); - d_index++; + tmp = (tmp<<1) | get_bit_be1(in,d_index_tmp,d_bits_per_chunk); + d_index_tmp++; } out[i] = tmp; } @@ -106,8 +109,8 @@ for(int i=0;i<noutput_items;i++) { unsigned long tmp=0; for(unsigned int j=0; j<BITS_PER_TYPE; j++) { - tmp = (tmp>>1)| (get_bit_be1(in,d_index,d_bits_per_chunk)<<(BITS_PER_TYPE-1)); - d_index++; + tmp = (tmp>>1)| (get_bit_be1(in,d_index_tmp,d_bits_per_chunk)<<(BITS_PER_TYPE-1)); + d_index_tmp++; } out[i] = tmp; } @@ -118,6 +121,7 @@ } } + d_index = d_index_tmp; consume_each ((int)(d_index/d_bits_per_chunk)); d_index = d_index%d_bits_per_chunk;
/* -*- c++ -*- */ /* * Copyright 2004 Free Software Foundation, Inc. * * This file is part of GNU Radio * * GNU Radio is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2, or (at your option) * any later version. * * GNU Radio is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GNU Radio; see the file COPYING. If not, write to * the Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ // @WARNING@ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include <@[EMAIL PROTECTED]> #include <gr_io_signature.h> #include <assert.h> #include <gr_log2_const.h> static const unsigned int BITS_PER_TYPE = sizeof(@I_TYPE@) * 8; static const unsigned int LOG2_L_TYPE = gr_log2_const<sizeof(@I_TYPE@) * 8>(); @SPTR_NAME@ [EMAIL PROTECTED]@ (unsigned int bits_per_chunk, gr_endianness_t endianness) { return @SPTR_NAME@ (new @NAME@ (bits_per_chunk,endianness)); } @NAME@::@NAME@ (unsigned int bits_per_chunk, gr_endianness_t endianness) : gr_block ("@BASE_NAME@", gr_make_io_signature (1, -1, sizeof (@I_TYPE@)), gr_make_io_signature (1, -1, sizeof (@O_TYPE@))), d_bits_per_chunk(bits_per_chunk),d_endianness(endianness),d_index(0) { assert (bits_per_chunk <= BITS_PER_TYPE); assert (bits_per_chunk > 0); set_relative_rate ((1.0 * BITS_PER_TYPE) / bits_per_chunk); } void @NAME@::forecast(int noutput_items, gr_vector_int &ninput_items_required) { int input_required = (int) ceil((d_index + noutput_items * d_bits_per_chunk) / (1.0 * BITS_PER_TYPE)); unsigned ninputs = ninput_items_required.size(); for (unsigned int i = 0; i < ninputs; i++) { ninput_items_required[i] = input_required; //printf("Forecast wants %d needs %d\n",noutput_items,ninput_items_required[i]); } } unsigned int get_bit_le (const @I_TYPE@ *in_vector,unsigned int bit_addr) { @I_TYPE@ x = in_vector[bit_addr>>LOG2_L_TYPE]; return (x>>(bit_addr&(BITS_PER_TYPE-1)))&1; } unsigned int get_bit_be (const @I_TYPE@ *in_vector,unsigned int bit_addr) { @I_TYPE@ x = in_vector[bit_addr>>LOG2_L_TYPE]; return (x>>((BITS_PER_TYPE-1)-(bit_addr&(BITS_PER_TYPE-1))))&1; } int @NAME@::general_work (int noutput_items, gr_vector_int &ninput_items, gr_vector_const_void_star &input_items, gr_vector_void_star &output_items) { unsigned int d_index_tmp; assert (input_items.size() == output_items.size()); int nstreams = input_items.size(); for (int m=0; m < nstreams; m++){ const @I_TYPE@ *in = (@I_TYPE@ *) input_items[m]; @O_TYPE@ *out = (@O_TYPE@ *) output_items[m]; d_index_tmp = d_index; // per stream processing switch (d_endianness){ case GR_MSB_FIRST: for (int i = 0; i < noutput_items; i++){ //printf("here msb %d\n",i); @O_TYPE@ x = 0; for(unsigned int j=0; j<d_bits_per_chunk; j++, d_index_tmp++) x = (x<<1) | get_bit_be(in, d_index_tmp); out[i] = x; } break; case GR_LSB_FIRST: for (int i = 0; i < noutput_items; i++){ //printf("here lsb %d\n",i); @O_TYPE@ x = 0; for(unsigned int j=0; j<d_bits_per_chunk; j++, d_index_tmp++) x = (x<<1) | get_bit_le(in, d_index_tmp); out[i] = x; } break; default: assert(0); } //printf("almost got to end\n"); assert(ninput_items[m] >= (int) ((d_index+(BITS_PER_TYPE-1))>>LOG2_L_TYPE)); } d_index = d_index_tmp; consume_each (d_index >> LOG2_L_TYPE); d_index = d_index & (BITS_PER_TYPE-1); //printf("got to end\n"); return noutput_items; }
_______________________________________________ Patch-gnuradio mailing list Patch-gnuradio@gnu.org http://lists.gnu.org/mailman/listinfo/patch-gnuradio