summaryrefslogtreecommitdiff
path: root/gr-analog/lib/squelch_base_ff_impl.cc
diff options
context:
space:
mode:
Diffstat (limited to 'gr-analog/lib/squelch_base_ff_impl.cc')
-rw-r--r--gr-analog/lib/squelch_base_ff_impl.cc105
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