Mercurial > hg > audiostuff
comparison spandsp-0.0.6pre17/src/spandsp/dtmf.h @ 4:26cd8f1ef0b1
import spandsp-0.0.6pre17
| author | Peter Meerwald <pmeerw@cosy.sbg.ac.at> | 
|---|---|
| date | Fri, 25 Jun 2010 15:50:58 +0200 | 
| parents | |
| children | 
   comparison
  equal
  deleted
  inserted
  replaced
| 3:c6c5a16ce2f2 | 4:26cd8f1ef0b1 | 
|---|---|
| 1 /* | |
| 2 * SpanDSP - a series of DSP components for telephony | |
| 3 * | |
| 4 * dtmf.h - DTMF tone generation and detection. | |
| 5 * | |
| 6 * Written by Steve Underwood <steveu@coppice.org> | |
| 7 * | |
| 8 * Copyright (C) 2001, 2005 Steve Underwood | |
| 9 * | |
| 10 * All rights reserved. | |
| 11 * | |
| 12 * This program is free software; you can redistribute it and/or modify | |
| 13 * it under the terms of the GNU Lesser General Public License version 2.1, | |
| 14 * as published by the Free Software Foundation. | |
| 15 * | |
| 16 * This program is distributed in the hope that it will be useful, | |
| 17 * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
| 18 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
| 19 * GNU Lesser General Public License for more details. | |
| 20 * | |
| 21 * You should have received a copy of the GNU Lesser General Public | |
| 22 * License along with this program; if not, write to the Free Software | |
| 23 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | |
| 24 * | |
| 25 * $Id: dtmf.h,v 1.32 2009/02/10 13:06:47 steveu Exp $ | |
| 26 */ | |
| 27 | |
| 28 #if !defined(_SPANDSP_DTMF_H_) | |
| 29 #define _SPANDSP_DTMF_H_ | |
| 30 | |
| 31 /*! \page dtmf_rx_page DTMF receiver | |
| 32 \section dtmf_rx_page_sec_1 What does it do? | |
| 33 The DTMF receiver detects the standard DTMF digits. It is compliant with | |
| 34 ITU-T Q.23, ITU-T Q.24, and the local DTMF specifications of most administrations. | |
| 35 Its passes the test suites. It also scores *very* well on the standard | |
| 36 talk-off tests. | |
| 37 | |
| 38 The current design uses floating point extensively. It is not tolerant of DC. | |
| 39 It is expected that a DC restore stage will be placed before the DTMF detector. | |
| 40 Unless the dial tone filter is switched on, the detector has poor tolerance | |
| 41 of dial tone. Whether this matter depends on your application. If you are using | |
| 42 the detector in an IVR application you will need proper echo cancellation to | |
| 43 get good performance in the presence of speech prompts, so dial tone will not | |
| 44 exist. If you do need good dial tone tolerance, a dial tone filter can be | |
| 45 enabled in the detector. | |
| 46 | |
| 47 The DTMF receiver's design assumes the channel is free of any DC component. | |
| 48 | |
| 49 \section dtmf_rx_page_sec_2 How does it work? | |
| 50 Like most other DSP based DTMF detector's, this one uses the Goertzel algorithm | |
| 51 to look for the DTMF tones. What makes each detector design different is just how | |
| 52 that algorithm is used. | |
| 53 | |
| 54 Basic DTMF specs: | |
| 55 - Minimum tone on = 40ms | |
| 56 - Minimum tone off = 50ms | |
| 57 - Maximum digit rate = 10 per second | |
| 58 - Normal twist <= 8dB accepted | |
| 59 - Reverse twist <= 4dB accepted | |
| 60 - S/N >= 15dB will detect OK | |
| 61 - Attenuation <= 26dB will detect OK | |
| 62 - Frequency tolerance +- 1.5% will detect, +-3.5% will reject | |
| 63 | |
| 64 TODO: | |
| 65 */ | |
| 66 | |
| 67 /*! \page dtmf_tx_page DTMF tone generation | |
| 68 \section dtmf_tx_page_sec_1 What does it do? | |
| 69 | |
| 70 The DTMF tone generation module provides for the generation of the | |
| 71 repertoire of 16 DTMF dual tones. | |
| 72 | |
| 73 \section dtmf_tx_page_sec_2 How does it work? | |
| 74 */ | |
| 75 | |
| 76 #define MAX_DTMF_DIGITS 128 | |
| 77 | |
| 78 typedef void (*digits_rx_callback_t)(void *user_data, const char *digits, int len); | |
| 79 | |
| 80 /*! | |
| 81 DTMF generator state descriptor. This defines the state of a single | |
| 82 working instance of a DTMF generator. | |
| 83 */ | |
| 84 typedef struct dtmf_tx_state_s dtmf_tx_state_t; | |
| 85 | |
| 86 /*! | |
| 87 DTMF digit detector descriptor. | |
| 88 */ | |
| 89 typedef struct dtmf_rx_state_s dtmf_rx_state_t; | |
| 90 | |
| 91 #if defined(__cplusplus) | |
| 92 extern "C" | |
| 93 { | |
| 94 #endif | |
| 95 | |
| 96 /*! \brief Generate a buffer of DTMF tones. | |
| 97 \param s The DTMF generator context. | |
| 98 \param amp The buffer for the generated signal. | |
| 99 \param max_samples The required number of generated samples. | |
| 100 \return The number of samples actually generated. This may be less than | |
| 101 max_samples if the input buffer empties. */ | |
| 102 SPAN_DECLARE(int) dtmf_tx(dtmf_tx_state_t *s, int16_t amp[], int max_samples); | |
| 103 | |
| 104 /*! \brief Put a string of digits in a DTMF generator's input buffer. | |
| 105 \param s The DTMF generator context. | |
| 106 \param digits The string of digits to be added. | |
| 107 \param len The length of the string of digits. If negative, the string is | |
| 108 assumed to be a NULL terminated string. | |
| 109 \return The number of digits actually added. This may be less than the | |
| 110 length of the digit string, if the buffer fills up. */ | |
| 111 SPAN_DECLARE(int) dtmf_tx_put(dtmf_tx_state_t *s, const char *digits, int len); | |
| 112 | |
| 113 /*! \brief Change the transmit level for a DTMF tone generator context. | |
| 114 \param s The DTMF generator context. | |
| 115 \param level The level of the low tone, in dBm0. | |
| 116 \param twist The twist, in dB. */ | |
| 117 SPAN_DECLARE(void) dtmf_tx_set_level(dtmf_tx_state_t *s, int level, int twist); | |
| 118 | |
| 119 /*! \brief Change the transmit on and off time for a DTMF tone generator context. | |
| 120 \param s The DTMF generator context. | |
| 121 \param on-time The on time, in ms. | |
| 122 \param off_time The off time, in ms. */ | |
| 123 SPAN_DECLARE(void) dtmf_tx_set_timing(dtmf_tx_state_t *s, int on_time, int off_time); | |
| 124 | |
| 125 /*! \brief Initialise a DTMF tone generator context. | |
| 126 \param s The DTMF generator context. | |
| 127 \return A pointer to the DTMF generator context. */ | |
| 128 SPAN_DECLARE(dtmf_tx_state_t *) dtmf_tx_init(dtmf_tx_state_t *s); | |
| 129 | |
| 130 /*! \brief Release a DTMF tone generator context. | |
| 131 \param s The DTMF tone generator context. | |
| 132 \return 0 for OK, else -1. */ | |
| 133 SPAN_DECLARE(int) dtmf_tx_release(dtmf_tx_state_t *s); | |
| 134 | |
| 135 /*! \brief Free a DTMF tone generator context. | |
| 136 \param s The DTMF tone generator context. | |
| 137 \return 0 for OK, else -1. */ | |
| 138 SPAN_DECLARE(int) dtmf_tx_free(dtmf_tx_state_t *s); | |
| 139 | |
| 140 /*! Set a optional realtime callback for a DTMF receiver context. This function | |
| 141 is called immediately a confirmed state change occurs in the received DTMF. It | |
| 142 is called with the ASCII value for a DTMF tone pair, or zero to indicate no tone | |
| 143 is being received. | |
| 144 \brief Set a realtime callback for a DTMF receiver context. | |
| 145 \param s The DTMF receiver context. | |
| 146 \param callback Callback routine used to report the start and end of digits. | |
| 147 \param user_data An opaque pointer which is associated with the context, | |
| 148 and supplied in callbacks. */ | |
| 149 SPAN_DECLARE(void) dtmf_rx_set_realtime_callback(dtmf_rx_state_t *s, | |
| 150 tone_report_func_t callback, | |
| 151 void *user_data); | |
| 152 | |
| 153 /*! \brief Adjust a DTMF receiver context. | |
| 154 \param s The DTMF receiver context. | |
| 155 \param filter_dialtone TRUE to enable filtering of dialtone, FALSE | |
| 156 to disable, < 0 to leave unchanged. | |
| 157 \param twist Acceptable twist, in dB. < 0 to leave unchanged. | |
| 158 \param reverse_twist Acceptable reverse twist, in dB. < 0 to leave unchanged. | |
| 159 \param threshold The minimum acceptable tone level for detection, in dBm0. | |
| 160 <= -99 to leave unchanged. */ | |
| 161 SPAN_DECLARE(void) dtmf_rx_parms(dtmf_rx_state_t *s, | |
| 162 int filter_dialtone, | |
| 163 int twist, | |
| 164 int reverse_twist, | |
| 165 int threshold); | |
| 166 | |
| 167 /*! Process a block of received DTMF audio samples. | |
| 168 \brief Process a block of received DTMF audio samples. | |
| 169 \param s The DTMF receiver context. | |
| 170 \param amp The audio sample buffer. | |
| 171 \param samples The number of samples in the buffer. | |
| 172 \return The number of samples unprocessed. */ | |
| 173 SPAN_DECLARE(int) dtmf_rx(dtmf_rx_state_t *s, const int16_t amp[], int samples); | |
| 174 | |
| 175 /*! Get the status of DTMF detection during processing of the last audio | |
| 176 chunk. | |
| 177 \brief Get the status of DTMF detection during processing of the last | |
| 178 audio chunk. | |
| 179 \param s The DTMF receiver context. | |
| 180 \return The current digit status. Either 'x' for a "maybe" condition, or the | |
| 181 digit being detected. */ | |
| 182 SPAN_DECLARE(int) dtmf_rx_status(dtmf_rx_state_t *s); | |
| 183 | |
| 184 /*! \brief Get a string of digits from a DTMF receiver's output buffer. | |
| 185 \param s The DTMF receiver context. | |
| 186 \param digits The buffer for the received digits. | |
| 187 \param max The maximum number of digits to be returned, | |
| 188 \return The number of digits actually returned. */ | |
| 189 SPAN_DECLARE(size_t) dtmf_rx_get(dtmf_rx_state_t *s, char *digits, int max); | |
| 190 | |
| 191 /*! \brief Initialise a DTMF receiver context. | |
| 192 \param s The DTMF receiver context. | |
| 193 \param callback An optional callback routine, used to report received digits. If | |
| 194 no callback routine is set, digits may be collected, using the dtmf_rx_get() | |
| 195 function. | |
| 196 \param user_data An opaque pointer which is associated with the context, | |
| 197 and supplied in callbacks. | |
| 198 \return A pointer to the DTMF receiver context. */ | |
| 199 SPAN_DECLARE(dtmf_rx_state_t *) dtmf_rx_init(dtmf_rx_state_t *s, | |
| 200 digits_rx_callback_t callback, | |
| 201 void *user_data); | |
| 202 | |
| 203 /*! \brief Release a DTMF receiver context. | |
| 204 \param s The DTMF receiver context. | |
| 205 \return 0 for OK, else -1. */ | |
| 206 SPAN_DECLARE(int) dtmf_rx_release(dtmf_rx_state_t *s); | |
| 207 | |
| 208 /*! \brief Free a DTMF receiver context. | |
| 209 \param s The DTMF receiver context. | |
| 210 \return 0 for OK, else -1. */ | |
| 211 SPAN_DECLARE(int) dtmf_rx_free(dtmf_rx_state_t *s); | |
| 212 | |
| 213 #if defined(__cplusplus) | |
| 214 } | |
| 215 #endif | |
| 216 | |
| 217 #endif | |
| 218 /*- End of file ------------------------------------------------------------*/ | 
