diff spandsp-0.0.3/spandsp-0.0.3/src/spandsp/sig_tone.h @ 5:f762bf195c4b

import spandsp-0.0.3
author Peter Meerwald <pmeerw@cosy.sbg.ac.at>
date Fri, 25 Jun 2010 16:00:21 +0200
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/spandsp-0.0.3/spandsp-0.0.3/src/spandsp/sig_tone.h	Fri Jun 25 16:00:21 2010 +0200
@@ -0,0 +1,195 @@
+/*
+ * SpanDSP - a series of DSP components for telephony
+ *
+ * sig_tone.h - Signalling tone processing for the 2280Hz, 2600Hz and similar
+ *              signalling tone used in older protocols.
+ *
+ * Written by Steve Underwood <steveu@coppice.org>
+ *
+ * Copyright (C) 2004 Steve Underwood
+ *
+ * All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2, as
+ * published by the Free Software Foundation.
+ *
+ * This program 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 this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ * $Id: sig_tone.h,v 1.7 2006/10/24 13:22:02 steveu Exp $
+ */
+
+/*! \file */
+
+/*! \page sig_tone_page The signaling tone processor
+\section sig_tone_sec_1 What does it do?
+The signaling tone processor handles the 2280Hz, 2400Hz and 2600Hz tones, used
+in many analogue signaling procotols, and digital ones derived from them.
+
+\section sig_tone_sec_2 How does it work?
+TBD
+*/
+
+#if !defined(_SIG_TONE_H_)
+#define _SIG_TONE_H_
+
+typedef int (*sig_tone_func_t)(void *user_data, int what);
+
+/* The optional tone sets */
+enum
+{
+    SIG_TONE_2280HZ = 1,
+    SIG_TONE_2600HZ,
+    SIG_TONE_2400HZ_2600HZ
+};
+
+#define SIG_TONE_1_PRESENT          0x001
+#define SIG_TONE_1_CHANGE           0x002
+#define SIG_TONE_2_PRESENT          0x004
+#define SIG_TONE_2_CHANGE           0x008
+#define SIG_TONE_TX_PASSTHROUGH     0x010
+#define SIG_TONE_RX_PASSTHROUGH     0x020
+#define SIG_TONE_UPDATE_REQUEST     0x100
+
+/*!
+    Signaling tone descriptor. This defines the working state for a
+    single instance of the transmit and receive sides of a signaling
+    tone processor.
+*/
+typedef struct
+{
+    /*! \brief The tones used. */
+    int tone_freq[2];
+    /*! \brief The high and low tone amplitudes. */
+    int tone_amp[2];
+
+    /*! \brief The delay, in audio samples, before the high level tone drops
+               to a low level tone. */
+    int high_low_timeout;
+
+    /*! \brief Some signaling tone detectors use a sharp initial filter,
+               changing to a broader band filter after some delay. This
+               parameter defines the delay. 0 means it never changes. */
+    int sharp_flat_timeout;
+
+    /*! \brief Parameters to control the behaviour of the notch filter, used
+               to remove the tone from the voice path in some protocols. */
+    int notch_lag_time;
+    int notch_allowed;
+
+    /*! \brief The tone on persistence check, in audio samples. */
+    int tone_on_check_time;
+    /*! \brief The tone off persistence check, in audio samples. */
+    int tone_off_check_time;
+
+    /*! \brief The coefficients for the cascaded bi-quads notch filter. */
+    int32_t notch_a1[3];
+    int32_t notch_b1[3];
+    int32_t notch_a2[3];
+    int32_t notch_b2[3];
+    int notch_postscale;
+
+    /*! \brief Flat mode bandpass bi-quad parameters */
+    int32_t broad_a[3];
+    int32_t broad_b[3];
+    int broad_postscale;
+
+    /*! \brief The coefficients for the post notch leaky integrator. */
+    int32_t notch_slugi;
+    int32_t notch_slugp;
+
+    /*! \brief The coefficients for the post modulus leaky integrator in the
+               unfiltered data path.  The prescale value incorporates the
+               detection ratio. This is called the guard ratio in some
+               protocols. */
+    int32_t unfiltered_slugi;
+    int32_t unfiltered_slugp;
+
+    /*! \brief The coefficients for the post modulus leaky integrator in the
+               bandpass filter data path. */
+    int32_t broad_slugi;
+    int32_t broad_slugp;
+
+    /*! \brief Masks which effectively threshold the notched, weighted and
+               bandpassed data. */
+    int32_t notch_threshold;
+    int32_t unfiltered_threshold;
+    int32_t broad_threshold;
+} sig_tone_descriptor_t;
+
+typedef struct
+{
+    /*! \brief The callback function used to handle signaling changes. */
+    sig_tone_func_t sig_update;
+    /*! \brief A user specified opaque pointer passed to the callback function. */
+    void *user_data;
+
+    /*! \brief Transmit side parameters */
+    sig_tone_descriptor_t *desc;
+    int32_t phase_rate[2];
+    int32_t tone_scaling[2];
+    uint32_t phase_acc[2];
+
+    int high_low_timer;
+
+    /*! \brief The z's for the notch filter */
+    int32_t notch_z1[3];
+    int32_t notch_z2[3];
+
+    /*! \brief The z's for the weighting/bandpass filter. */
+    int32_t broad_z[3];
+
+    /*! \brief The z's for the integrators. */
+    int32_t notch_zl;
+    int32_t broad_zl;
+
+    /*! \brief The thresholded data. */
+    int32_t mown_notch;
+    int32_t mown_bandpass;
+
+    int flat_mode;
+    int tone_present;
+    int notch_enabled;
+    int flat_mode_timeout;
+    int notch_insertion_timeout;
+    int tone_persistence_timeout;
+    
+    int current_tx_tone;
+    int current_tx_timeout;
+    int signaling_state_duration;
+} sig_tone_state_t;
+
+/*! Initialise a signaling tone context.
+    \brief Initialise a signaling tone context.
+    \param s The signaling tone context.
+    \param tone_type The type of signaling tone.
+    \param sig_update Callback function to handle signaling updates.
+    \param user_data An opaque pointer.
+    \return A pointer to the signalling tone context, or NULL if there was a problem. */
+sig_tone_state_t *sig_tone_init(sig_tone_state_t *s, int tone_type, sig_tone_func_t sig_update, void *user_data);
+
+/*! Process a block of received audio samples.
+    \brief Process a block of received audio samples.
+    \param s The signaling tone context.
+    \param amp The audio sample buffer.
+    \param len The number of samples in the buffer.
+    \return The number of samples unprocessed. */
+int sig_tone_rx(sig_tone_state_t *s, int16_t amp[], int len);
+
+/*! Generate a block of signaling tone audio samples.
+    \brief Generate a block of signaling tone audio samples.
+    \param s The signaling tone context.
+    \param amp The audio sample buffer.
+    \param len The number of samples to be generated.
+    \return The number of samples actually generated. */
+int sig_tone_tx(sig_tone_state_t *s, int16_t amp[], int len);
+
+#endif
+/*- End of file ------------------------------------------------------------*/

Repositories maintained by Peter Meerwald, pmeerw@pmeerw.net.