1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112
|
/* -*- 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 3, 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., 51 Franklin Street,
* Boston, MA 02110-1301, USA.
*/
/*
* config.h is generated by configure. It contains the results
* of probing for features, options etc. It should be the first
* file included in your .cc file.
*/
#ifdef HAVE_CONFIG_H
#include "config.h"
#endif
#include <gnuradio/io_signature.h>
#include "insert_null_symbol_impl.h"
namespace gr {
namespace dab {
insert_null_symbol::sptr
insert_null_symbol::make(int ns_length, int symbol_length)
{
return gnuradio::get_initial_sptr
(new insert_null_symbol_impl(ns_length, symbol_length));
}
insert_null_symbol_impl::insert_null_symbol_impl(int ns_length, int symbol_length)
: gr::block("insert_null_symbol",
gr::io_signature::make2 (2, 2, sizeof(gr_complex)*symbol_length, sizeof(char)),
gr::io_signature::make (1, 1, sizeof(gr_complex))),
d_ns_length(ns_length), d_symbol_length(symbol_length), d_ns_added(0)
{
/* note: setting output_multiple to a high value without setting the relative rate produces
*
* gr_vmcircbuf_sysv_shm: shmget (1): Invalid argument
* gr_buffer::allocate_buffer: failed to allocate buffer of size 102080 KB
* terminate called after throwing an instance of 'std::bad_alloc'
* what(): St9bad_alloc
*
* maybe the scheduler thinks that d_symbol_length input items are needed, which uses a lot of memory
**/
set_output_multiple(d_symbol_length);
set_relative_rate(d_symbol_length);
}
void
insert_null_symbol_impl::forecast (int noutput_items, gr_vector_int &ninput_items_required)
{
int in_req = noutput_items / d_symbol_length;
unsigned ninputs = ninput_items_required.size ();
for (unsigned i = 0; i < ninputs; i++)
ninput_items_required[i] = in_req;
}
int
insert_null_symbol_impl::general_work (int noutput_items,
gr_vector_int &ninput_items,
gr_vector_const_void_star &input_items,
gr_vector_void_star &output_items)
{
const gr_complex *iptr = (const gr_complex *) input_items[0];
const char *trigger = (const char *) input_items[1];
gr_complex *optr = (gr_complex *) output_items[0];
int produced_items=0;
int consumed_items=0;
int i;
while (noutput_items-produced_items>=d_symbol_length && consumed_items<ninput_items[0] && consumed_items<ninput_items[1]) {
if (*trigger==1 && d_ns_added<d_ns_length) {
for (i=0; i<d_ns_length-d_ns_added && i<noutput_items-produced_items; i++)
*optr++ = 0;
produced_items += i;
d_ns_added += i;
} else {
if (*trigger==0)
d_ns_added=0;
for (int i=0; i<d_symbol_length; i++)
*optr++ = *iptr++;
produced_items += d_symbol_length;
trigger++;
consumed_items++;
}
}
consume_each(consumed_items);
return produced_items;
}
}
}
|