summaryrefslogtreecommitdiff
path: root/gr-analog/lib/squelch_base_cc_impl.cc
diff options
context:
space:
mode:
Diffstat (limited to 'gr-analog/lib/squelch_base_cc_impl.cc')
-rw-r--r--gr-analog/lib/squelch_base_cc_impl.cc101
1 files changed, 57 insertions, 44 deletions
diff --git a/gr-analog/lib/squelch_base_cc_impl.cc b/gr-analog/lib/squelch_base_cc_impl.cc
index 3255d3bde4..b5c153558b 100644
--- a/gr-analog/lib/squelch_base_cc_impl.cc
+++ b/gr-analog/lib/squelch_base_cc_impl.cc
@@ -32,8 +32,11 @@ namespace gr {
squelch_base_cc_impl::squelch_base_cc_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);
@@ -92,48 +95,58 @@ namespace gr {
gr::thread::scoped_lock l(d_setlock);
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()) {
- d_state = d_ramp ? ST_ATTACK : ST_UNMUTED; // If not ramping, go straight to unmuted
- }
- break;
-
- case ST_UNMUTED:
- if(mute()) {
- d_state = d_ramp ? ST_DECAY : ST_MUTED; // If not ramping, go straight to muted
- }
- break;
-
- case ST_ATTACK:
- d_envelope = 0.5-std::cos(M_PI*(++d_ramped)/d_ramp)/2.0; // FIXME: precalculate window for speed
- if(d_ramped >= d_ramp) { // use >= in case d_ramp is set to lower value elsewhere
- d_state = ST_UNMUTED;
- d_envelope = 1.0;
- }
- break;
-
- case ST_DECAY:
- d_envelope = 0.5-std::cos(M_PI*(--d_ramped)/d_ramp)/2.0; // FIXME: precalculate window for speed
- 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]*gr_complex(d_envelope, 0.0);
- }
- 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()) {
+ d_state = d_ramp ? ST_ATTACK : ST_UNMUTED; // If not ramping, go straight to 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()) {
+ d_state = d_ramp ? ST_DECAY : ST_MUTED; // If not ramping, go straight to muted
+ if(d_state == ST_MUTED)
+ add_item_tag(0, nitems_written(0) + j, d_eob_key, pmt::PMT_NIL);
+ }
+ break;
+
+ case ST_ATTACK:
+ d_envelope = 0.5-std::cos(M_PI*(++d_ramped)/d_ramp)/2.0; // FIXME: precalculate window for speed
+ if(d_ramped >= d_ramp) { // use >= in case d_ramp is set to lower value elsewhere
+ d_state = ST_UNMUTED;
+ d_tag_next_unmuted = true;
+ d_envelope = 1.0;
+ }
+ break;
+
+ case ST_DECAY:
+ d_envelope = 0.5-std::cos(M_PI*(--d_ramped)/d_ramp)/2.0; // FIXME: precalculate window for speed
+ 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]*gr_complex(d_envelope, 0.0);
+ }
+ else {
+ if(!d_gate) {
+ out[j++] = 0.0;
+ }
+ }
}
consume_each(noutput_items); // Use all the inputs