summaryrefslogtreecommitdiff
path: root/gr-analog/lib
diff options
context:
space:
mode:
Diffstat (limited to 'gr-analog/lib')
-rw-r--r--gr-analog/lib/squelch_base_cc_impl.cc101
-rw-r--r--gr-analog/lib/squelch_base_cc_impl.h2
-rw-r--r--gr-analog/lib/squelch_base_ff_impl.cc105
-rw-r--r--gr-analog/lib/squelch_base_ff_impl.h3
4 files changed, 123 insertions, 88 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
diff --git a/gr-analog/lib/squelch_base_cc_impl.h b/gr-analog/lib/squelch_base_cc_impl.h
index 58802df91c..68ed1bb2b8 100644
--- a/gr-analog/lib/squelch_base_cc_impl.h
+++ b/gr-analog/lib/squelch_base_cc_impl.h
@@ -36,6 +36,8 @@ namespace gr {
bool d_gate;
double d_envelope;
enum { ST_MUTED, ST_ATTACK, ST_UNMUTED, ST_DECAY } d_state;
+ const pmt::pmt_t d_sob_key, d_eob_key;
+ bool d_tag_next_unmuted;
protected:
virtual void update_state(const gr_complex &sample) {};
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
diff --git a/gr-analog/lib/squelch_base_ff_impl.h b/gr-analog/lib/squelch_base_ff_impl.h
index 343dc5f610..b6a7efe609 100644
--- a/gr-analog/lib/squelch_base_ff_impl.h
+++ b/gr-analog/lib/squelch_base_ff_impl.h
@@ -24,6 +24,7 @@
#define INCLUDED_GR_SQUELCH_BASE_FF_IMPL_H
#include <gnuradio/analog/squelch_base_ff.h>
+#include <pmt/pmt.h>
namespace gr {
namespace analog {
@@ -36,6 +37,8 @@ namespace gr {
bool d_gate;
double d_envelope;
enum { ST_MUTED, ST_ATTACK, ST_UNMUTED, ST_DECAY } d_state;
+ const pmt::pmt_t d_sob_key, d_eob_key;
+ bool d_tag_next_unmuted;
protected:
virtual void update_state(const float &sample) {};