diff options
Diffstat (limited to 'gr-analog/lib/squelch_base_ff_impl.cc')
-rw-r--r-- | gr-analog/lib/squelch_base_ff_impl.cc | 105 |
1 files changed, 61 insertions, 44 deletions
diff --git a/gr-analog/lib/squelch_base_ff_impl.cc b/gr-analog/lib/squelch_base_ff_impl.cc index a729fedb24..ea2d29bd97 100644 --- a/gr-analog/lib/squelch_base_ff_impl.cc +++ b/gr-analog/lib/squelch_base_ff_impl.cc @@ -26,14 +26,18 @@ #include "squelch_base_ff_impl.h" #include <gnuradio/io_signature.h> +#include <pmt/pmt.h> namespace gr { namespace analog { squelch_base_ff_impl::squelch_base_ff_impl(const char *name, int ramp, bool gate) : block(name, - io_signature::make(1, 1, sizeof(float)), - io_signature::make(1, 1, sizeof(float))) + io_signature::make(1, 1, sizeof(float)), + io_signature::make(1, 1, sizeof(float))), + d_sob_key(pmt::intern("squelch_sob")), + d_eob_key(pmt::intern("squelch_eob")), + d_tag_next_unmuted(true) { set_ramp(ramp); set_gate(gate); @@ -88,48 +92,61 @@ namespace gr { int j = 0; for(int i = 0; i < noutput_items; i++) { - update_state(in[i]); - - // Adjust envelope based on current state - switch(d_state) { - case ST_MUTED: - if(!mute()) - // If not ramping, go straight to unmuted - d_state = d_ramp ? ST_ATTACK : ST_UNMUTED; - break; - - case ST_UNMUTED: - if(mute()) - // If not ramping, go straight to muted - d_state = d_ramp ? ST_DECAY : ST_MUTED; - break; - - case ST_ATTACK: - // FIXME: precalculate window for speed - d_envelope = 0.5-std::cos(M_PI*(++d_ramped)/d_ramp)/2.0; - - // use >= in case d_ramp is set to lower value elsewhere - if(d_ramped >= d_ramp) { - d_state = ST_UNMUTED; - d_envelope = 1.0; - } - break; - - case ST_DECAY: - // FIXME: precalculate window for speed - d_envelope = 0.5-std::cos(M_PI*(--d_ramped)/d_ramp)/2.0; - if(d_ramped == 0.0) - d_state = ST_MUTED; - break; - }; - - // If unmuted, copy input times envelope to output - // Otherwise, if not gating, copy zero to output - if(d_state != ST_MUTED) - out[j++] = in[i]*d_envelope; - else - if(!d_gate) - out[j++] = 0.0; + update_state(in[i]); + + // Adjust envelope based on current state + switch(d_state) { + case ST_MUTED: + if(!mute()) { + // If not ramping, go straight to unmuted + d_state = d_ramp ? ST_ATTACK : ST_UNMUTED; + if(d_state == ST_UNMUTED) + d_tag_next_unmuted = true; + } + break; + + case ST_UNMUTED: + if(d_tag_next_unmuted) { + d_tag_next_unmuted = false; + add_item_tag(0, nitems_written(0) + j, d_sob_key, pmt::PMT_NIL); + } + if(mute()) { + // If not ramping, go straight to muted + d_state = d_ramp ? ST_DECAY : ST_MUTED; + if(d_state == ST_MUTED) + add_item_tag(0, nitems_written(0) + j, d_eob_key, pmt::PMT_NIL); + } + break; + + case ST_ATTACK: + // FIXME: precalculate window for speed + d_envelope = 0.5-std::cos(M_PI*(++d_ramped)/d_ramp)/2.0; + + // use >= in case d_ramp is set to lower value elsewhere + if(d_ramped >= d_ramp) { + d_state = ST_UNMUTED; + d_tag_next_unmuted = true; + d_envelope = 1.0; + } + break; + + case ST_DECAY: + // FIXME: precalculate window for speed + d_envelope = 0.5-std::cos(M_PI*(--d_ramped)/d_ramp)/2.0; + if(d_ramped == 0.0) { + d_state = ST_MUTED; + add_item_tag(0, nitems_written(0) + j, d_eob_key, pmt::PMT_NIL); + } + break; + }; + + // If unmuted, copy input times envelope to output + // Otherwise, if not gating, copy zero to output + if(d_state != ST_MUTED) + out[j++] = in[i]*d_envelope; + else + if(!d_gate) + out[j++] = 0.0; } consume_each(noutput_items); // Use all the inputs |