Asterisk - The Open Source Telephony Project  GIT-master-a24979a
Data Structures | Macros | Enumerations | Functions
dsp.h File Reference

Convenient Signal Processing routines. More...

This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

Data Structures

struct  ast_dsp_busy_pattern
 

Macros

#define DSP_DIGITMODE_DTMF   0
 
#define DSP_DIGITMODE_MF   1
 
#define DSP_DIGITMODE_MUTECONF   (1 << 9)
 
#define DSP_DIGITMODE_MUTEMAX   (1 << 10)
 
#define DSP_DIGITMODE_NOQUELCH   (1 << 8)
 
#define DSP_DIGITMODE_RELAXDTMF   (1 << 11)
 
#define DSP_FAXMODE_DETECT_ALL   (DSP_FAXMODE_DETECT_CNG | DSP_FAXMODE_DETECT_CED)
 
#define DSP_FAXMODE_DETECT_CED   (1 << 1)
 
#define DSP_FAXMODE_DETECT_CNG   (1 << 0)
 
#define DSP_FAXMODE_DETECT_SQUELCH   (1 << 2)
 
#define DSP_FEATURE_BUSY_DETECT   (1 << 1)
 
#define DSP_FEATURE_CALL_PROGRESS   (DSP_PROGRESS_TALK | DSP_PROGRESS_RINGING | DSP_PROGRESS_BUSY | DSP_PROGRESS_CONGESTION)
 
#define DSP_FEATURE_DIGIT_DETECT   (1 << 3)
 
#define DSP_FEATURE_FAX_DETECT   (1 << 4)
 
#define DSP_FEATURE_FREQ_DETECT   (1 << 21)
 
#define DSP_FEATURE_SILENCE_SUPPRESS   (1 << 0)
 
#define DSP_FEATURE_WAITDIALTONE   (1 << 20)
 
#define DSP_PROGRESS_BUSY   (1 << 18)
 
#define DSP_PROGRESS_CONGESTION   (1 << 19)
 
#define DSP_PROGRESS_RINGING   (1 << 17)
 
#define DSP_PROGRESS_TALK   (1 << 16)
 
#define DSP_TONE_STATE_BUSY   4
 
#define DSP_TONE_STATE_DIALTONE   2
 
#define DSP_TONE_STATE_HUNGUP   8
 
#define DSP_TONE_STATE_RINGING   1
 
#define DSP_TONE_STATE_SILENCE   0
 
#define DSP_TONE_STATE_SPECIAL1   5
 
#define DSP_TONE_STATE_SPECIAL2   6
 
#define DSP_TONE_STATE_SPECIAL3   7
 
#define DSP_TONE_STATE_TALKING   3
 

Enumerations

enum  threshold { THRESHOLD_SILENCE = 0 , THRESHOLD_MAX = 1 }
 

Functions

int ast_dsp_busydetect (struct ast_dsp *dsp)
 Return non-zero if historically this should be a busy, request that ast_dsp_silence has already been called. More...
 
int ast_dsp_call_progress (struct ast_dsp *dsp, struct ast_frame *inf)
 Scans for progress indication in audio. More...
 
int ast_dsp_digitdetect (struct ast_dsp *dsp, struct ast_frame *f)
 Return non-zero if DTMF hit was found. More...
 
void ast_dsp_digitreset (struct ast_dsp *dsp)
 Reset DTMF detector. More...
 
void ast_dsp_free (struct ast_dsp *dsp)
 
int ast_dsp_get_features (struct ast_dsp *dsp)
 Get features. More...
 
unsigned int ast_dsp_get_sample_rate (const struct ast_dsp *dsp)
 Retrieve the sample rate this DSP structure was created with. More...
 
int ast_dsp_get_tcount (struct ast_dsp *dsp)
 Get tcount (Threshold counter) More...
 
int ast_dsp_get_threshold_from_settings (enum threshold which)
 Get silence threshold from dsp.conf. More...
 
int ast_dsp_get_tstate (struct ast_dsp *dsp)
 Get tstate (Tone State) More...
 
int ast_dsp_getdigits (struct ast_dsp *dsp, char *buf, int max)
 Get pending DTMF/MF digits. More...
 
struct ast_dspast_dsp_new (void)
 Allocates a new dsp, assumes 8khz for internal sample rate. More...
 
struct ast_dspast_dsp_new_with_rate (unsigned int sample_rate)
 Allocates a new dsp with a specific internal sample rate used during processing. More...
 
int ast_dsp_noise (struct ast_dsp *dsp, struct ast_frame *f, int *totalnoise)
 Process the audio frame for noise. More...
 
struct ast_frameast_dsp_process (struct ast_channel *chan, struct ast_dsp *dsp, struct ast_frame *inf)
 Return AST_FRAME_NULL frames when there is silence, AST_FRAME_BUSY on busies, and call progress, all dependent upon which features are enabled. More...
 
void ast_dsp_reset (struct ast_dsp *dsp)
 Reset total silence count. More...
 
void ast_dsp_set_busy_count (struct ast_dsp *dsp, int cadences)
 Set number of required cadences for busy. More...
 
void ast_dsp_set_busy_pattern (struct ast_dsp *dsp, const struct ast_dsp_busy_pattern *cadence)
 Set expected lengths of the busy tone. More...
 
int ast_dsp_set_call_progress_zone (struct ast_dsp *dsp, char *zone)
 Set zone for doing progress detection. More...
 
int ast_dsp_set_digitmode (struct ast_dsp *dsp, int digitmode)
 Set digit mode. More...
 
int ast_dsp_set_faxmode (struct ast_dsp *dsp, int faxmode)
 Set fax mode. More...
 
void ast_dsp_set_features (struct ast_dsp *dsp, int features)
 Select feature set. More...
 
int ast_dsp_set_freqmode (struct ast_dsp *dsp, int freq, int dur, int db, int squelch)
 Set arbitrary frequency detection mode. More...
 
void ast_dsp_set_threshold (struct ast_dsp *dsp, int threshold)
 Set the minimum average magnitude threshold to determine talking by the DSP. More...
 
int ast_dsp_silence (struct ast_dsp *dsp, struct ast_frame *f, int *totalsilence)
 Process the audio frame for silence. More...
 
int ast_dsp_silence_with_energy (struct ast_dsp *dsp, struct ast_frame *f, int *totalsilence, int *frames_energy)
 Process the audio frame for silence. More...
 
int ast_dsp_was_muted (struct ast_dsp *dsp)
 Returns true if DSP code was muting any fragment of the last processed frame. Muting (squelching) happens when DSP code removes DTMF/MF/generic tones from the audio. More...
 

Detailed Description

Convenient Signal Processing routines.

Definition in file dsp.h.

Macro Definition Documentation

◆ DSP_DIGITMODE_DTMF

#define DSP_DIGITMODE_DTMF   0

Detect DTMF digits

Definition at line 31 of file dsp.h.

◆ DSP_DIGITMODE_MF

#define DSP_DIGITMODE_MF   1

Detect MF digits

Definition at line 32 of file dsp.h.

◆ DSP_DIGITMODE_MUTECONF

#define DSP_DIGITMODE_MUTECONF   (1 << 9)

Mute conference

Definition at line 35 of file dsp.h.

◆ DSP_DIGITMODE_MUTEMAX

#define DSP_DIGITMODE_MUTEMAX   (1 << 10)

Delay audio by a frame to try to extra quelch

Definition at line 36 of file dsp.h.

◆ DSP_DIGITMODE_NOQUELCH

#define DSP_DIGITMODE_NOQUELCH   (1 << 8)

Do not quelch DTMF from in-band

Definition at line 34 of file dsp.h.

◆ DSP_DIGITMODE_RELAXDTMF

#define DSP_DIGITMODE_RELAXDTMF   (1 << 11)

"Radio" mode (relaxed DTMF)

Definition at line 37 of file dsp.h.

◆ DSP_FAXMODE_DETECT_ALL

#define DSP_FAXMODE_DETECT_ALL   (DSP_FAXMODE_DETECT_CNG | DSP_FAXMODE_DETECT_CED)

Definition at line 50 of file dsp.h.

◆ DSP_FAXMODE_DETECT_CED

#define DSP_FAXMODE_DETECT_CED   (1 << 1)

Definition at line 48 of file dsp.h.

◆ DSP_FAXMODE_DETECT_CNG

#define DSP_FAXMODE_DETECT_CNG   (1 << 0)

Definition at line 47 of file dsp.h.

◆ DSP_FAXMODE_DETECT_SQUELCH

#define DSP_FAXMODE_DETECT_SQUELCH   (1 << 2)

Definition at line 49 of file dsp.h.

◆ DSP_FEATURE_BUSY_DETECT

#define DSP_FEATURE_BUSY_DETECT   (1 << 1)

Definition at line 27 of file dsp.h.

◆ DSP_FEATURE_CALL_PROGRESS

#define DSP_FEATURE_CALL_PROGRESS   (DSP_PROGRESS_TALK | DSP_PROGRESS_RINGING | DSP_PROGRESS_BUSY | DSP_PROGRESS_CONGESTION)

Definition at line 43 of file dsp.h.

◆ DSP_FEATURE_DIGIT_DETECT

#define DSP_FEATURE_DIGIT_DETECT   (1 << 3)

Definition at line 28 of file dsp.h.

◆ DSP_FEATURE_FAX_DETECT

#define DSP_FEATURE_FAX_DETECT   (1 << 4)

Definition at line 29 of file dsp.h.

◆ DSP_FEATURE_FREQ_DETECT

#define DSP_FEATURE_FREQ_DETECT   (1 << 21)

Enable arbitrary tone detection

Definition at line 45 of file dsp.h.

◆ DSP_FEATURE_SILENCE_SUPPRESS

#define DSP_FEATURE_SILENCE_SUPPRESS   (1 << 0)

Definition at line 26 of file dsp.h.

◆ DSP_FEATURE_WAITDIALTONE

#define DSP_FEATURE_WAITDIALTONE   (1 << 20)

Enable dial tone detection

Definition at line 44 of file dsp.h.

◆ DSP_PROGRESS_BUSY

#define DSP_PROGRESS_BUSY   (1 << 18)

Enable busy tone detection

Definition at line 41 of file dsp.h.

◆ DSP_PROGRESS_CONGESTION

#define DSP_PROGRESS_CONGESTION   (1 << 19)

Enable congestion tone detection

Definition at line 42 of file dsp.h.

◆ DSP_PROGRESS_RINGING

#define DSP_PROGRESS_RINGING   (1 << 17)

Enable calling tone detection

Definition at line 40 of file dsp.h.

◆ DSP_PROGRESS_TALK

#define DSP_PROGRESS_TALK   (1 << 16)

Enable talk detection

Definition at line 39 of file dsp.h.

◆ DSP_TONE_STATE_BUSY

#define DSP_TONE_STATE_BUSY   4

Definition at line 56 of file dsp.h.

◆ DSP_TONE_STATE_DIALTONE

#define DSP_TONE_STATE_DIALTONE   2

Definition at line 54 of file dsp.h.

◆ DSP_TONE_STATE_HUNGUP

#define DSP_TONE_STATE_HUNGUP   8

Definition at line 60 of file dsp.h.

◆ DSP_TONE_STATE_RINGING

#define DSP_TONE_STATE_RINGING   1

Definition at line 53 of file dsp.h.

◆ DSP_TONE_STATE_SILENCE

#define DSP_TONE_STATE_SILENCE   0

Definition at line 52 of file dsp.h.

◆ DSP_TONE_STATE_SPECIAL1

#define DSP_TONE_STATE_SPECIAL1   5

Definition at line 57 of file dsp.h.

◆ DSP_TONE_STATE_SPECIAL2

#define DSP_TONE_STATE_SPECIAL2   6

Definition at line 58 of file dsp.h.

◆ DSP_TONE_STATE_SPECIAL3

#define DSP_TONE_STATE_SPECIAL3   7

Definition at line 59 of file dsp.h.

◆ DSP_TONE_STATE_TALKING

#define DSP_TONE_STATE_TALKING   3

Definition at line 55 of file dsp.h.

Enumeration Type Documentation

◆ threshold

enum threshold
Enumerator
THRESHOLD_SILENCE 
THRESHOLD_MAX 

Definition at line 71 of file dsp.h.

71  {
72  /* Array offsets */
74  /* Always the last */
75  THRESHOLD_MAX = 1,
76 };
@ THRESHOLD_SILENCE
Definition: dsp.h:73
@ THRESHOLD_MAX
Definition: dsp.h:75

Function Documentation

◆ ast_dsp_busydetect()

int ast_dsp_busydetect ( struct ast_dsp dsp)

Return non-zero if historically this should be a busy, request that ast_dsp_silence has already been called.

Definition at line 1298 of file dsp.c.

1299 {
1300  int res = 0, x;
1301 #ifndef BUSYDETECT_TONEONLY
1302  int avgsilence = 0, hitsilence = 0;
1303 #endif
1304  int avgtone = 0, hittone = 0;
1305 
1306  /* if we have a 4 length pattern, the way busymaybe is set doesn't help us. */
1307  if (dsp->busy_cadence.length != 4) {
1308  if (!dsp->busymaybe) {
1309  return res;
1310  }
1311  }
1312 
1313  for (x = DSP_HISTORY - dsp->busycount; x < DSP_HISTORY; x++) {
1314 #ifndef BUSYDETECT_TONEONLY
1315  avgsilence += dsp->historicsilence[x];
1316 #endif
1317  avgtone += dsp->historicnoise[x];
1318  }
1319 #ifndef BUSYDETECT_TONEONLY
1320  avgsilence /= dsp->busycount;
1321 #endif
1322  avgtone /= dsp->busycount;
1323  for (x = DSP_HISTORY - dsp->busycount; x < DSP_HISTORY; x++) {
1324 #ifndef BUSYDETECT_TONEONLY
1325  if (avgsilence > dsp->historicsilence[x]) {
1326  if (avgsilence - (avgsilence * BUSY_PERCENT / 100) <= dsp->historicsilence[x]) {
1327  hitsilence++;
1328  }
1329  } else {
1330  if (avgsilence + (avgsilence * BUSY_PERCENT / 100) >= dsp->historicsilence[x]) {
1331  hitsilence++;
1332  }
1333  }
1334 #endif
1335  if (avgtone > dsp->historicnoise[x]) {
1336  if (avgtone - (avgtone * BUSY_PERCENT / 100) <= dsp->historicnoise[x]) {
1337  hittone++;
1338  }
1339  } else {
1340  if (avgtone + (avgtone * BUSY_PERCENT / 100) >= dsp->historicnoise[x]) {
1341  hittone++;
1342  }
1343  }
1344  }
1345 #ifndef BUSYDETECT_TONEONLY
1346  if ((hittone >= dsp->busycount - 1) && (hitsilence >= dsp->busycount - 1) &&
1347  (avgtone >= BUSY_MIN && avgtone <= BUSY_MAX) &&
1348  (avgsilence >= BUSY_MIN && avgsilence <= BUSY_MAX))
1349 #else
1350  if ((hittone >= dsp->busycount - 1) && (avgtone >= BUSY_MIN && avgtone <= BUSY_MAX))
1351 #endif
1352  {
1353 #ifdef BUSYDETECT_COMPARE_TONE_AND_SILENCE
1354  if (avgtone > avgsilence) {
1355  if (avgtone - avgtone*BUSY_PERCENT/100 <= avgsilence) {
1356  res = 1;
1357  }
1358  } else {
1359  if (avgtone + avgtone*BUSY_PERCENT/100 >= avgsilence) {
1360  res = 1;
1361  }
1362  }
1363 #else
1364  res = 1;
1365 #endif
1366  }
1367 
1368  /* If we have a 4-length pattern, we can go ahead and just check it in a different way. */
1369  if (dsp->busy_cadence.length == 4) {
1370  int x;
1371  int errors = 0;
1372  int errors_max = ((4 * dsp->busycount) / 100.0) * BUSY_PAT_PERCENT;
1373 
1374  for (x = DSP_HISTORY - (dsp->busycount); x < DSP_HISTORY; x += 2) {
1375  int temp_error;
1376  temp_error = abs(dsp->historicnoise[x] - dsp->busy_cadence.pattern[0]);
1377  if ((temp_error * 100) / dsp->busy_cadence.pattern[0] > BUSY_PERCENT) {
1378  errors++;
1379  }
1380 
1381  temp_error = abs(dsp->historicnoise[x + 1] - dsp->busy_cadence.pattern[2]);
1382  if ((temp_error * 100) / dsp->busy_cadence.pattern[2] > BUSY_PERCENT) {
1383  errors++;
1384  }
1385 
1386  temp_error = abs(dsp->historicsilence[x] - dsp->busy_cadence.pattern[1]);
1387  if ((temp_error * 100) / dsp->busy_cadence.pattern[1] > BUSY_PERCENT) {
1388  errors++;
1389  }
1390 
1391  temp_error = abs(dsp->historicsilence[x + 1] - dsp->busy_cadence.pattern[3]);
1392  if ((temp_error * 100) / dsp->busy_cadence.pattern[3] > BUSY_PERCENT) {
1393  errors++;
1394  }
1395  }
1396 
1397  ast_debug(5, "errors = %d max = %d\n", errors, errors_max);
1398 
1399  if (errors <= errors_max) {
1400  return 1;
1401  }
1402  }
1403 
1404  /* If we know the expected busy tone length, check we are in the range */
1405  if (res && (dsp->busy_cadence.pattern[0] > 0)) {
1406  if (abs(avgtone - dsp->busy_cadence.pattern[0]) > MAX(dsp->busy_cadence.pattern[0]*BUSY_PAT_PERCENT/100, 20)) {
1407 #ifdef BUSYDETECT_DEBUG
1408  ast_debug(5, "busy detector: avgtone of %d not close enough to desired %d\n",
1409  avgtone, dsp->busy_cadence.pattern[0]);
1410 #endif
1411  res = 0;
1412  }
1413  }
1414 #ifndef BUSYDETECT_TONEONLY
1415  /* If we know the expected busy tone silent-period length, check we are in the range */
1416  if (res && (dsp->busy_cadence.pattern[1] > 0)) {
1417  if (abs(avgsilence - dsp->busy_cadence.pattern[1]) > MAX(dsp->busy_cadence.pattern[1]*BUSY_PAT_PERCENT/100, 20)) {
1418 #ifdef BUSYDETECT_DEBUG
1419  ast_debug(5, "busy detector: avgsilence of %d not close enough to desired %d\n",
1420  avgsilence, dsp->busy_cadence.pattern[1]);
1421 #endif
1422  res = 0;
1423  }
1424  }
1425 #endif
1426 #if !defined(BUSYDETECT_TONEONLY) && defined(BUSYDETECT_DEBUG)
1427  if (res) {
1428  ast_debug(5, "ast_dsp_busydetect detected busy, avgtone: %d, avgsilence %d\n", avgtone, avgsilence);
1429  } else {
1430  ast_debug(5, "busy detector: FAILED with avgtone: %d, avgsilence %d\n", avgtone, avgsilence);
1431  }
1432 #endif
1433  return res;
1434 }
@ BUSY_MAX
Definition: dsp.c:147
@ BUSY_PAT_PERCENT
Definition: dsp.c:144
@ BUSY_MIN
Definition: dsp.c:146
@ BUSY_PERCENT
Definition: dsp.c:143
#define DSP_HISTORY
Definition: dsp.c:151
#define abs(x)
Definition: f2c.h:195
#define ast_debug(level,...)
Log a DEBUG message.
int pattern[4]
Definition: dsp.h:68
int historicnoise[DSP_HISTORY]
Definition: dsp.c:419
int busymaybe
Definition: dsp.c:416
int busycount
Definition: dsp.c:417
int historicsilence[DSP_HISTORY]
Definition: dsp.c:420
struct ast_dsp_busy_pattern busy_cadence
Definition: dsp.c:418
#define MAX(a, b)
Definition: utils.h:228

References abs, ast_debug, ast_dsp::busy_cadence, BUSY_MAX, BUSY_MIN, BUSY_PAT_PERCENT, BUSY_PERCENT, ast_dsp::busycount, ast_dsp::busymaybe, DSP_HISTORY, ast_dsp::historicnoise, ast_dsp::historicsilence, ast_dsp_busy_pattern::length, MAX, and ast_dsp_busy_pattern::pattern.

Referenced by ast_dsp_process().

◆ ast_dsp_call_progress()

int ast_dsp_call_progress ( struct ast_dsp dsp,
struct ast_frame inf 
)

Scans for progress indication in audio.

Definition at line 1219 of file dsp.c.

1220 {
1221  if (inf->frametype != AST_FRAME_VOICE) {
1222  ast_log(LOG_WARNING, "Can't check call progress of non-voice frames\n");
1223  return 0;
1224  }
1226  ast_log(LOG_WARNING, "Can only check call progress in signed-linear frames\n");
1227  return 0;
1228  }
1229  return __ast_dsp_call_progress(dsp, inf->data.ptr, inf->datalen / 2);
1230 }
#define ast_log
Definition: astobj2.c:42
static int __ast_dsp_call_progress(struct ast_dsp *dsp, short *s, int len)
Definition: dsp.c:1077
int ast_format_cache_is_slinear(struct ast_format *format)
Determines if a format is one of the cached slin formats.
Definition: format_cache.c:534
@ AST_FRAME_VOICE
#define LOG_WARNING
struct ast_format * format
struct ast_frame_subclass subclass
union ast_frame::@254 data
enum ast_frame_type frametype

References __ast_dsp_call_progress(), ast_format_cache_is_slinear(), AST_FRAME_VOICE, ast_log, ast_frame::data, ast_frame::datalen, ast_frame_subclass::format, ast_frame::frametype, LOG_WARNING, ast_frame::ptr, and ast_frame::subclass.

◆ ast_dsp_digitdetect()

int ast_dsp_digitdetect ( struct ast_dsp dsp,
struct ast_frame f 
)

Return non-zero if DTMF hit was found.

◆ ast_dsp_digitreset()

void ast_dsp_digitreset ( struct ast_dsp dsp)

Reset DTMF detector.

Definition at line 1800 of file dsp.c.

1801 {
1802  int i;
1803 
1804  dsp->dtmf_began = 0;
1805  if (dsp->digitmode & DSP_DIGITMODE_MF) {
1806  mf_detect_state_t *s = &dsp->digit_state.td.mf;
1807  /* Reinitialise the detector for the next block */
1808  for (i = 0; i < 6; i++) {
1809  goertzel_reset(&s->tone_out[i]);
1810  }
1811  s->hits[4] = s->hits[3] = s->hits[2] = s->hits[1] = s->hits[0] = 0;
1812  s->current_hit = 0;
1813  s->current_sample = 0;
1814  } else {
1816  /* Reinitialise the detector for the next block */
1817  for (i = 0; i < 4; i++) {
1818  goertzel_reset(&s->row_out[i]);
1819  goertzel_reset(&s->col_out[i]);
1820  }
1821  s->lasthit = 0;
1822  s->current_hit = 0;
1823  s->energy = 0.0;
1824  s->current_sample = 0;
1825  s->hits = 0;
1826  s->misses = 0;
1827  }
1828 
1829  dsp->digit_state.digits[0] = '\0';
1830  dsp->digit_state.current_digits = 0;
1831 }
static void goertzel_reset(goertzel_state_t *s)
Definition: dsp.c:384
#define DSP_DIGITMODE_MF
Definition: dsp.h:32
digit_detect_state_t digit_state
Definition: dsp.c:437
int digitmode
Definition: dsp.c:428
int dtmf_began
Definition: dsp.c:431
union digit_detect_state_t::@375 td
mf_detect_state_t mf
Definition: dsp.c:315
dtmf_detect_state_t dtmf
Definition: dsp.c:314
char digits[MAX_DTMF_DIGITS+1]
Definition: dsp.c:307
int current_digits
Definition: dsp.c:309
float energy
Definition: dsp.c:291
goertzel_state_t row_out[DTMF_MATRIX_SIZE]
Definition: dsp.c:285
goertzel_state_t col_out[DTMF_MATRIX_SIZE]
Definition: dsp.c:286
int current_sample
Definition: dsp.c:292
int hits[5]
Definition: dsp.c:300
goertzel_state_t tone_out[6]
Definition: dsp.c:298
int current_hit
Definition: dsp.c:299
int current_sample
Definition: dsp.c:301

References dtmf_detect_state_t::col_out, digit_detect_state_t::current_digits, dtmf_detect_state_t::current_hit, mf_detect_state_t::current_hit, dtmf_detect_state_t::current_sample, mf_detect_state_t::current_sample, ast_dsp::digit_state, ast_dsp::digitmode, digit_detect_state_t::digits, DSP_DIGITMODE_MF, digit_detect_state_t::dtmf, ast_dsp::dtmf_began, dtmf_detect_state_t::energy, goertzel_reset(), dtmf_detect_state_t::hits, mf_detect_state_t::hits, dtmf_detect_state_t::lasthit, digit_detect_state_t::mf, dtmf_detect_state_t::misses, dtmf_detect_state_t::row_out, digit_detect_state_t::td, and mf_detect_state_t::tone_out.

Referenced by analog_ss_thread(), mbl_new(), and my_dsp_reset_and_flush_digits().

◆ ast_dsp_free()

void ast_dsp_free ( struct ast_dsp dsp)

◆ ast_dsp_get_features()

int ast_dsp_get_features ( struct ast_dsp dsp)

Get features.

Definition at line 1767 of file dsp.c.

1768 {
1769  return (dsp->features);
1770 }
int features
Definition: dsp.c:414

References ast_dsp::features.

Referenced by chan_pjsip_cng_tone_detected(), chan_pjsip_read_stream(), pjsip_acf_dtmf_mode_write(), and set_caps().

◆ ast_dsp_get_sample_rate()

unsigned int ast_dsp_get_sample_rate ( const struct ast_dsp dsp)

Retrieve the sample rate this DSP structure was created with.

Definition at line 1720 of file dsp.c.

1721 {
1722  return dsp->sample_rate;
1723 }
unsigned int sample_rate
Definition: dsp.c:435

References ast_dsp::sample_rate.

◆ ast_dsp_get_tcount()

int ast_dsp_get_tcount ( struct ast_dsp dsp)

Get tcount (Threshold counter)

Definition at line 1906 of file dsp.c.

1907 {
1908  return dsp->tcount;
1909 }
int tcount
Definition: dsp.c:427

References ast_dsp::tcount.

Referenced by dahdi_read(), and detect_callback().

◆ ast_dsp_get_threshold_from_settings()

int ast_dsp_get_threshold_from_settings ( enum threshold  which)

Get silence threshold from dsp.conf.

Since
1.6.1

Definition at line 1999 of file dsp.c.

2000 {
2001  return thresholds[which];
2002 }
static int thresholds[THRESHOLD_MAX]
Definition: dsp.c:330

References thresholds.

Referenced by actual_load_config(), app_exec(), ast_record_review(), conf_rec_name(), conf_run(), do_waiting(), handle_recordfile(), load_config(), record_exec(), setup_privacy_args(), and talk_detect_fn_write().

◆ ast_dsp_get_tstate()

int ast_dsp_get_tstate ( struct ast_dsp dsp)

Get tstate (Tone State)

Definition at line 1901 of file dsp.c.

1902 {
1903  return dsp->tstate;
1904 }
int tstate
Definition: dsp.c:426

References ast_dsp::tstate.

Referenced by dahdi_read(), and detect_callback().

◆ ast_dsp_getdigits()

int ast_dsp_getdigits ( struct ast_dsp dsp,
char *  buf,
int  max 
)

Get pending DTMF/MF digits.

◆ ast_dsp_new()

struct ast_dsp* ast_dsp_new ( void  )

Allocates a new dsp, assumes 8khz for internal sample rate.

Definition at line 1748 of file dsp.c.

1749 {
1751 }
static struct ast_dsp * __ast_dsp_new(unsigned int sample_rate)
Definition: dsp.c:1725
#define DEFAULT_SAMPLE_RATE
Definition: dsp.c:223

References __ast_dsp_new(), and DEFAULT_SAMPLE_RATE.

Referenced by __ast_play_and_record(), ast_sip_session_alloc(), background_detect_exec(), conf_run(), dahdi_new(), detect_write(), do_waiting(), enable_dsp_detect(), fax_detect_new(), fax_session_new(), handle_recordfile(), isAnsweringMachine(), mbl_load_device(), mgcp_new(), my_dsp_set_digitmode(), ooh323_new(), pjsip_acf_dtmf_mode_write(), read_mf_digits(), read_sf_digits(), record_exec(), and wait_exec().

◆ ast_dsp_new_with_rate()

struct ast_dsp* ast_dsp_new_with_rate ( unsigned int  sample_rate)

Allocates a new dsp with a specific internal sample rate used during processing.

Definition at line 1753 of file dsp.c.

1754 {
1755  return __ast_dsp_new(sample_rate);
1756 }

References __ast_dsp_new(), and ast_dsp::sample_rate.

Referenced by set_softmix_bridge_data(), and set_talk_detect().

◆ ast_dsp_noise()

int ast_dsp_noise ( struct ast_dsp dsp,
struct ast_frame f,
int *  totalnoise 
)

Process the audio frame for noise.

Since
1.6.1
Parameters
dspDSP processing audio media.
fAudio frame to process.
totalnoiseVariable to set to the total accumulated noise in ms seen by the DSP since the last silence.
Returns
Non-zero if the frame is silence.

Definition at line 1491 of file dsp.c.

1492 {
1493  return ast_dsp_silence_noise_with_energy(dsp, f, totalnoise, NULL, 1);
1494 }
static int ast_dsp_silence_noise_with_energy(struct ast_dsp *dsp, struct ast_frame *f, int *total, int *frames_energy, int noise)
Definition: dsp.c:1436
#define NULL
Definition: resample.c:96

References ast_dsp_silence_noise_with_energy(), and NULL.

◆ ast_dsp_process()

struct ast_frame* ast_dsp_process ( struct ast_channel chan,
struct ast_dsp dsp,
struct ast_frame inf 
)

Return AST_FRAME_NULL frames when there is silence, AST_FRAME_BUSY on busies, and call progress, all dependent upon which features are enabled.

Definition at line 1497 of file dsp.c.

1498 {
1499  int silence;
1500  int res;
1501  int digit = 0, fax_digit = 0, custom_freq_digit = 0;
1502  int x;
1503  short *shortdata;
1504  unsigned char *odata;
1505  int len;
1506  struct ast_frame *outf = NULL;
1507 
1508  if (!af) {
1509  return NULL;
1510  }
1511  if (af->frametype != AST_FRAME_VOICE) {
1512  return af;
1513  }
1514 
1515  odata = af->data.ptr;
1516  len = af->datalen;
1517  /* Make sure we have short data */
1518  if (ast_format_cache_is_slinear(af->subclass.format)) {
1519  shortdata = af->data.ptr;
1520  len = af->datalen / 2;
1521  } else if (ast_format_cmp(af->subclass.format, ast_format_ulaw) == AST_FORMAT_CMP_EQUAL) {
1522  shortdata = ast_alloca(af->datalen * 2);
1523  for (x = 0; x < len; x++) {
1524  shortdata[x] = AST_MULAW(odata[x]);
1525  }
1526  } else if (ast_format_cmp(af->subclass.format, ast_format_alaw) == AST_FORMAT_CMP_EQUAL) {
1527  shortdata = ast_alloca(af->datalen * 2);
1528  for (x = 0; x < len; x++) {
1529  shortdata[x] = AST_ALAW(odata[x]);
1530  }
1531  } else {
1532  /*Display warning only once. Otherwise you would get hundreds of warnings every second */
1533  if (dsp->display_inband_dtmf_warning) {
1534  ast_log(LOG_WARNING, "Inband DTMF is not supported on codec %s. Use RFC2833\n", ast_format_get_name(af->subclass.format));
1535  }
1536  dsp->display_inband_dtmf_warning = 0;
1537  return af;
1538  }
1539 
1540  /* Initially we do not want to mute anything */
1541  dsp->mute_fragments = 0;
1542 
1543  /* Need to run the silence detection stuff for silence suppression and busy detection */
1545  res = __ast_dsp_silence_noise(dsp, shortdata, len, &silence, NULL, NULL);
1546  }
1547 
1548  if ((dsp->features & DSP_FEATURE_SILENCE_SUPPRESS) && silence) {
1549  memset(&dsp->f, 0, sizeof(dsp->f));
1550  dsp->f.frametype = AST_FRAME_NULL;
1551  ast_frfree(af);
1552  return ast_frisolate(&dsp->f);
1553  }
1554  if ((dsp->features & DSP_FEATURE_BUSY_DETECT) && ast_dsp_busydetect(dsp)) {
1556  memset(&dsp->f, 0, sizeof(dsp->f));
1557  dsp->f.frametype = AST_FRAME_CONTROL;
1559  ast_frfree(af);
1560  ast_debug(1, "Requesting Hangup because the busy tone was detected on channel %s\n", ast_channel_name(chan));
1561  return ast_frisolate(&dsp->f);
1562  }
1563 
1564  if ((dsp->features & DSP_FEATURE_FAX_DETECT)) {
1565  if ((dsp->faxmode & DSP_FAXMODE_DETECT_CNG) && tone_detect(dsp, &dsp->cng_tone_state, shortdata, len)) {
1566  fax_digit = 'f';
1567  }
1568 
1569  if ((dsp->faxmode & DSP_FAXMODE_DETECT_CED) && tone_detect(dsp, &dsp->ced_tone_state, shortdata, len)) {
1570  fax_digit = 'e';
1571  }
1572  }
1573 
1574  if ((dsp->features & DSP_FEATURE_FREQ_DETECT)) {
1575  if ((dsp->freqmode) && tone_detect(dsp, &dsp->cng_tone_state, shortdata, len)) {
1576  custom_freq_digit = 'q';
1577  }
1578  }
1579 
1581  if (dsp->digitmode & DSP_DIGITMODE_MF) {
1582  digit = mf_detect(dsp, &dsp->digit_state, shortdata, len, (dsp->digitmode & DSP_DIGITMODE_NOQUELCH) == 0, (dsp->digitmode & DSP_DIGITMODE_RELAXDTMF));
1583  } else {
1584  digit = dtmf_detect(dsp, &dsp->digit_state, shortdata, len, (dsp->digitmode & DSP_DIGITMODE_NOQUELCH) == 0, (dsp->digitmode & DSP_DIGITMODE_RELAXDTMF));
1585  }
1586 
1587  if (dsp->digit_state.current_digits) {
1588  int event = 0, event_len = 0;
1589  char event_digit = 0;
1590 
1591  if (!dsp->dtmf_began) {
1592  /* We have not reported DTMF_BEGIN for anything yet */
1593 
1594  if (dsp->features & DSP_FEATURE_DIGIT_DETECT) {
1595  event = AST_FRAME_DTMF_BEGIN;
1596  event_digit = dsp->digit_state.digits[0];
1597  }
1598  dsp->dtmf_began = 1;
1599 
1600  } else if (dsp->digit_state.current_digits > 1 || digit != dsp->digit_state.digits[0]) {
1601  /* Digit changed. This means digit we have reported with DTMF_BEGIN ended */
1602  if (dsp->features & DSP_FEATURE_DIGIT_DETECT) {
1603  event = AST_FRAME_DTMF_END;
1604  event_digit = dsp->digit_state.digits[0];
1605  event_len = dsp->digit_state.digitlen[0] * 1000 / dsp->sample_rate;
1606  }
1607  memmove(&dsp->digit_state.digits[0], &dsp->digit_state.digits[1], dsp->digit_state.current_digits);
1608  memmove(&dsp->digit_state.digitlen[0], &dsp->digit_state.digitlen[1], dsp->digit_state.current_digits * sizeof(dsp->digit_state.digitlen[0]));
1609  dsp->digit_state.current_digits--;
1610  dsp->dtmf_began = 0;
1611 
1612  if (dsp->features & DSP_FEATURE_BUSY_DETECT) {
1613  /* Reset Busy Detector as we have some confirmed activity */
1614  memset(dsp->historicsilence, 0, sizeof(dsp->historicsilence));
1615  memset(dsp->historicnoise, 0, sizeof(dsp->historicnoise));
1616  ast_debug(1, "DTMF Detected - Reset busydetector\n");
1617  }
1618  }
1619 
1620  if (event) {
1621  memset(&dsp->f, 0, sizeof(dsp->f));
1622  dsp->f.frametype = event;
1623  dsp->f.subclass.integer = event_digit;
1624  dsp->f.len = event_len;
1625  outf = &dsp->f;
1626  goto done;
1627  }
1628  }
1629  }
1630 
1631  if (fax_digit) {
1632  /* Fax was detected - digit is either 'f' or 'e' */
1633 
1634  memset(&dsp->f, 0, sizeof(dsp->f));
1635  dsp->f.frametype = AST_FRAME_DTMF;
1636  dsp->f.subclass.integer = fax_digit;
1637  outf = &dsp->f;
1638  goto done;
1639  }
1640 
1641  if (custom_freq_digit) {
1642  /* Custom frequency was detected - digit is 'q' */
1643 
1644  memset(&dsp->f, 0, sizeof(dsp->f));
1645  dsp->f.frametype = AST_FRAME_DTMF;
1646  dsp->f.subclass.integer = custom_freq_digit;
1647  outf = &dsp->f;
1648  goto done;
1649  }
1650 
1651  if ((dsp->features & DSP_FEATURE_CALL_PROGRESS)) {
1652  res = __ast_dsp_call_progress(dsp, shortdata, len);
1653  if (res) {
1654  switch (res) {
1655  case AST_CONTROL_ANSWER:
1656  case AST_CONTROL_BUSY:
1657  case AST_CONTROL_RINGING:
1659  case AST_CONTROL_HANGUP:
1660  memset(&dsp->f, 0, sizeof(dsp->f));
1661  dsp->f.frametype = AST_FRAME_CONTROL;
1662  dsp->f.subclass.integer = res;
1663  dsp->f.src = "dsp_progress";
1664  if (chan) {
1665  ast_queue_frame(chan, &dsp->f);
1666  }
1667  break;
1668  default:
1669  ast_log(LOG_WARNING, "Don't know how to represent call progress message %d\n", res);
1670  }
1671  }
1672  } else if ((dsp->features & DSP_FEATURE_WAITDIALTONE)) {
1673  res = __ast_dsp_call_progress(dsp, shortdata, len);
1674  }
1675 
1676 done:
1677  /* Mute fragment of the frame */
1678  for (x = 0; x < dsp->mute_fragments; x++) {
1679  memset(shortdata + dsp->mute_data[x].start, 0, sizeof(int16_t) * (dsp->mute_data[x].end - dsp->mute_data[x].start));
1680  }
1681 
1682  if (ast_format_cmp(af->subclass.format, ast_format_ulaw) == AST_FORMAT_CMP_EQUAL) {
1683  for (x = 0; x < len; x++) {
1684  odata[x] = AST_LIN2MU((unsigned short) shortdata[x]);
1685  }
1686  } else if (ast_format_cmp(af->subclass.format, ast_format_alaw) == AST_FORMAT_CMP_EQUAL) {
1687  for (x = 0; x < len; x++) {
1688  odata[x] = AST_LIN2A((unsigned short) shortdata[x]);
1689  }
1690  }
1691 
1692  if (outf) {
1693  if (chan) {
1694  ast_queue_frame(chan, af);
1695  }
1696  ast_frfree(af);
1697  return ast_frisolate(outf);
1698  } else {
1699  return af;
1700  }
1701 }
#define AST_LIN2A(a)
Definition: alaw.h:50
#define AST_ALAW(a)
Definition: alaw.h:84
char digit
#define ast_alloca(size)
call __builtin_alloca to ensure we get gcc builtin semantics
Definition: astmm.h:288
@ AST_SOFTHANGUP_DEV
Definition: channel.h:1121
int ast_queue_frame(struct ast_channel *chan, struct ast_frame *f)
Queue one or more frames to a channel's frame queue.
Definition: channel.c:1133
const char * ast_channel_name(const struct ast_channel *chan)
void ast_channel_softhangup_internal_flag_add(struct ast_channel *chan, int value)
short int16_t
Definition: db.h:59
static int tone_detect(struct ast_dsp *dsp, tone_detect_state_t *s, int16_t *amp, int samples)
Definition: dsp.c:575
static int mf_detect(struct ast_dsp *dsp, digit_detect_state_t *s, int16_t amp[], int samples, int squelch, int relax)
Definition: dsp.c:903
static int dtmf_detect(struct ast_dsp *dsp, digit_detect_state_t *s, int16_t amp[], int samples, int squelch, int relax)
Definition: dsp.c:695
int ast_dsp_busydetect(struct ast_dsp *dsp)
Return non-zero if historically this should be a busy, request that ast_dsp_silence has already been ...
Definition: dsp.c:1298
static int __ast_dsp_silence_noise(struct ast_dsp *dsp, short *s, int len, int *totalsilence, int *totalnoise, int *frames_energy)
Definition: dsp.c:1232
#define DSP_FEATURE_WAITDIALTONE
Definition: dsp.h:44
#define DSP_FEATURE_BUSY_DETECT
Definition: dsp.h:27
#define DSP_DIGITMODE_NOQUELCH
Definition: dsp.h:34
#define DSP_FEATURE_DIGIT_DETECT
Definition: dsp.h:28
#define DSP_FEATURE_FAX_DETECT
Definition: dsp.h:29
#define DSP_FAXMODE_DETECT_CED
Definition: dsp.h:48
#define DSP_FEATURE_CALL_PROGRESS
Definition: dsp.h:43
#define DSP_FAXMODE_DETECT_CNG
Definition: dsp.h:47
#define DSP_FEATURE_SILENCE_SUPPRESS
Definition: dsp.h:26
#define DSP_FEATURE_FREQ_DETECT
Definition: dsp.h:45
#define DSP_DIGITMODE_RELAXDTMF
Definition: dsp.h:37
const char * ast_format_get_name(const struct ast_format *format)
Get the name associated with a format.
Definition: format.c:334
enum ast_format_cmp_res ast_format_cmp(const struct ast_format *format1, const struct ast_format *format2)
Compare two formats.
Definition: format.c:201
@ AST_FORMAT_CMP_EQUAL
Definition: format.h:36
struct ast_format * ast_format_ulaw
Built-in cached ulaw format.
Definition: format_cache.c:86
struct ast_format * ast_format_alaw
Built-in cached alaw format.
Definition: format_cache.c:91
static int len(struct ast_channel *chan, const char *cmd, char *data, char *buf, size_t buflen)
#define AST_FRAME_DTMF
#define ast_frisolate(fr)
Makes a frame independent of any static storage.
#define ast_frfree(fr)
@ AST_FRAME_NULL
@ AST_FRAME_DTMF_END
@ AST_FRAME_DTMF_BEGIN
@ AST_FRAME_CONTROL
@ AST_CONTROL_BUSY
@ AST_CONTROL_CONGESTION
@ AST_CONTROL_ANSWER
@ AST_CONTROL_RINGING
@ AST_CONTROL_HANGUP
fragment_t mute_data[5]
Definition: dsp.c:436
int faxmode
Definition: dsp.c:429
int mute_fragments
Definition: dsp.c:434
struct ast_frame f
Definition: dsp.c:408
tone_detect_state_t ced_tone_state
Definition: dsp.c:439
int display_inband_dtmf_warning
Definition: dsp.c:432
int freqmode
Definition: dsp.c:430
tone_detect_state_t cng_tone_state
Definition: dsp.c:438
Data structure associated with a single frame of data.
const char * src
int digitlen[MAX_DTMF_DIGITS+1]
Definition: dsp.c:308
Definition: astman.c:222
int start
Definition: dsp.c:390
int end
Definition: dsp.c:391
int done
Definition: test_amihooks.c:48
#define AST_MULAW(a)
Definition: ulaw.h:85
#define AST_LIN2MU(a)
Definition: ulaw.h:49

References __ast_dsp_call_progress(), __ast_dsp_silence_noise(), AST_ALAW, ast_alloca, ast_channel_name(), ast_channel_softhangup_internal_flag_add(), AST_CONTROL_ANSWER, AST_CONTROL_BUSY, AST_CONTROL_CONGESTION, AST_CONTROL_HANGUP, AST_CONTROL_RINGING, ast_debug, ast_dsp_busydetect(), ast_format_alaw, ast_format_cache_is_slinear(), ast_format_cmp(), AST_FORMAT_CMP_EQUAL, ast_format_get_name(), ast_format_ulaw, AST_FRAME_CONTROL, AST_FRAME_DTMF, AST_FRAME_DTMF_BEGIN, AST_FRAME_DTMF_END, AST_FRAME_NULL, AST_FRAME_VOICE, ast_frfree, ast_frisolate, AST_LIN2A, AST_LIN2MU, ast_log, AST_MULAW, ast_queue_frame(), AST_SOFTHANGUP_DEV, ast_dsp::ced_tone_state, ast_dsp::cng_tone_state, digit_detect_state_t::current_digits, ast_frame::data, ast_frame::datalen, digit, ast_dsp::digit_state, digit_detect_state_t::digitlen, ast_dsp::digitmode, digit_detect_state_t::digits, ast_dsp::display_inband_dtmf_warning, done, DSP_DIGITMODE_MF, DSP_DIGITMODE_NOQUELCH, DSP_DIGITMODE_RELAXDTMF, DSP_FAXMODE_DETECT_CED, DSP_FAXMODE_DETECT_CNG, DSP_FEATURE_BUSY_DETECT, DSP_FEATURE_CALL_PROGRESS, DSP_FEATURE_DIGIT_DETECT, DSP_FEATURE_FAX_DETECT, DSP_FEATURE_FREQ_DETECT, DSP_FEATURE_SILENCE_SUPPRESS, DSP_FEATURE_WAITDIALTONE, ast_dsp::dtmf_began, dtmf_detect(), fragment_t::end, ast_dsp::f, ast_dsp::faxmode, ast_dsp::features, ast_frame_subclass::format, ast_frame::frametype, ast_dsp::freqmode, ast_dsp::historicnoise, ast_dsp::historicsilence, ast_frame_subclass::integer, len(), ast_frame::len, LOG_WARNING, mf_detect(), ast_dsp::mute_data, ast_dsp::mute_fragments, NULL, ast_frame::ptr, ast_dsp::sample_rate, ast_frame::src, fragment_t::start, ast_frame::subclass, and tone_detect().

Referenced by chan_pjsip_read_stream(), dahdi_read(), detect_callback(), fax_detect_framehook(), mbl_read(), mgcp_rtp_read(), ooh323_rtp_read(), read_mf_digits(), read_sf_digits(), sip_rtp_read(), and wait_exec().

◆ ast_dsp_reset()

void ast_dsp_reset ( struct ast_dsp dsp)

Reset total silence count.

Definition at line 1833 of file dsp.c.

1834 {
1835  int x;
1836 
1837  dsp->totalsilence = 0;
1838  dsp->gsamps = 0;
1839  for (x = 0; x < 4; x++) {
1840  dsp->freqs[x].v2 = dsp->freqs[x].v3 = 0.0;
1841  }
1842  memset(dsp->historicsilence, 0, sizeof(dsp->historicsilence));
1843  memset(dsp->historicnoise, 0, sizeof(dsp->historicnoise));
1844  dsp->ringtimeout = 0;
1845 }
int totalsilence
Definition: dsp.c:411
goertzel_state_t freqs[FREQ_ARRAY_SIZE]
Definition: dsp.c:421
int gsamps
Definition: dsp.c:423
int ringtimeout
Definition: dsp.c:415

References ast_dsp::freqs, ast_dsp::gsamps, ast_dsp::historicnoise, ast_dsp::historicsilence, ast_dsp::ringtimeout, ast_dsp::totalsilence, goertzel_state_t::v2, and goertzel_state_t::v3.

Referenced by debug_check_frame_for_silence().

◆ ast_dsp_set_busy_count()

void ast_dsp_set_busy_count ( struct ast_dsp dsp,
int  cadences 
)

Set number of required cadences for busy.

Definition at line 1783 of file dsp.c.

1784 {
1785  if (cadences < 4) {
1786  cadences = 4;
1787  }
1788  if (cadences > DSP_HISTORY) {
1790  }
1791  dsp->busycount = cadences;
1792 }
static struct dahdi_ring_cadence cadences[NUM_CADENCE_MAX]
Definition: chan_dahdi.c:622

References ast_dsp::busycount, cadences, and DSP_HISTORY.

Referenced by dahdi_new().

◆ ast_dsp_set_busy_pattern()

void ast_dsp_set_busy_pattern ( struct ast_dsp dsp,
const struct ast_dsp_busy_pattern cadence 
)

Set expected lengths of the busy tone.

Definition at line 1794 of file dsp.c.

1795 {
1796  dsp->busy_cadence = *cadence;
1797  ast_debug(1, "dsp busy pattern set to %d,%d,%d,%d\n", cadence->pattern[0], cadence->pattern[1], (cadence->length == 4) ? cadence->pattern[2] : 0, (cadence->length == 4) ? cadence->pattern[3] : 0);
1798 }

References ast_debug, ast_dsp::busy_cadence, ast_dsp_busy_pattern::length, and ast_dsp_busy_pattern::pattern.

Referenced by dahdi_new().

◆ ast_dsp_set_call_progress_zone()

int ast_dsp_set_call_progress_zone ( struct ast_dsp dsp,
char *  zone 
)

Set zone for doing progress detection.

Definition at line 1882 of file dsp.c.

1883 {
1884  int x;
1885 
1886  for (x = 0; x < ARRAY_LEN(aliases); x++) {
1887  if (!strcasecmp(aliases[x].name, zone)) {
1888  dsp->progmode = aliases[x].mode;
1889  ast_dsp_prog_reset(dsp);
1890  return 0;
1891  }
1892  }
1893  return -1;
1894 }
static struct progalias aliases[]
static void ast_dsp_prog_reset(struct ast_dsp *dsp)
Definition: dsp.c:1703
static const char name[]
Definition: format_mp3.c:68
enum prog_mode progmode
Definition: dsp.c:425
enum prog_mode mode
Definition: dsp.c:106
#define ARRAY_LEN(a)
Definition: utils.h:661

References aliases, ARRAY_LEN, ast_dsp_prog_reset(), progalias::mode, name, and ast_dsp::progmode.

Referenced by dahdi_new().

◆ ast_dsp_set_digitmode()

int ast_dsp_set_digitmode ( struct ast_dsp dsp,
int  digitmode 
)

Set digit mode.

Version
1.6.1 renamed from ast_dsp_digitmode to ast_dsp_set_digitmode

Definition at line 1847 of file dsp.c.

1848 {
1849  int new;
1850  int old;
1851 
1854  if (old != new) {
1855  /* Must initialize structures if switching from MF to DTMF or vice-versa */
1857  }
1858  dsp->digitmode = digitmode;
1859  return 0;
1860 }
static void ast_digit_detect_init(digit_detect_state_t *s, int mf, unsigned int sample_rate)
Definition: dsp.c:561
#define DSP_DIGITMODE_MUTEMAX
Definition: dsp.h:36
#define DSP_DIGITMODE_MUTECONF
Definition: dsp.h:35
#define DSP_DIGITMODE_DTMF
Definition: dsp.h:31

References ast_digit_detect_init(), ast_dsp::digit_state, ast_dsp::digitmode, DSP_DIGITMODE_DTMF, DSP_DIGITMODE_MF, DSP_DIGITMODE_MUTECONF, DSP_DIGITMODE_MUTEMAX, and ast_dsp::sample_rate.

Referenced by analog_ss_thread(), dahdi_hangup(), dahdi_new(), dahdi_setoption(), enable_dsp_detect(), mbl_load_device(), mgcp_new(), mkintf(), my_dsp_set_digitmode(), ooh323_new(), and read_mf_digits().

◆ ast_dsp_set_faxmode()

int ast_dsp_set_faxmode ( struct ast_dsp dsp,
int  faxmode 
)

Set fax mode.

Definition at line 1873 of file dsp.c.

1874 {
1875  if (dsp->faxmode != faxmode) {
1876  dsp->faxmode = faxmode;
1877  ast_fax_detect_init(dsp);
1878  }
1879  return 0;
1880 }
static void ast_fax_detect_init(struct ast_dsp *s)
Definition: dsp.c:513

References ast_fax_detect_init(), and ast_dsp::faxmode.

Referenced by fax_detect_new(), and ooh323_new().

◆ ast_dsp_set_features()

void ast_dsp_set_features ( struct ast_dsp dsp,
int  features 
)

◆ ast_dsp_set_freqmode()

int ast_dsp_set_freqmode ( struct ast_dsp dsp,
int  freq,
int  dur,
int  db,
int  squelch 
)

Set arbitrary frequency detection mode.

Definition at line 1862 of file dsp.c.

1863 {
1864  if (freq > 0) {
1865  dsp->freqmode = 1;
1866  ast_freq_detect_init(dsp, freq, dur, db, squelch);
1867  } else {
1868  dsp->freqmode = 0;
1869  }
1870  return 0;
1871 }
static sqlite3 * db
static void ast_freq_detect_init(struct ast_dsp *s, int freq, int dur, int db, int squelch)
Definition: dsp.c:524

References ast_freq_detect_init(), db, and ast_dsp::freqmode.

Referenced by detect_write(), read_sf_digits(), and wait_exec().

◆ ast_dsp_set_threshold()

void ast_dsp_set_threshold ( struct ast_dsp dsp,
int  threshold 
)

Set the minimum average magnitude threshold to determine talking by the DSP.

Definition at line 1778 of file dsp.c.

1779 {
1780  dsp->threshold = threshold;
1781 }
threshold
Definition: dsp.h:71
int threshold
Definition: dsp.c:409

References ast_dsp::threshold.

Referenced by __ast_play_and_record(), do_waiting(), fax_session_new(), handle_recordfile(), isAnsweringMachine(), record_exec(), set_softmix_bridge_data(), and set_talk_detect().

◆ ast_dsp_silence()

int ast_dsp_silence ( struct ast_dsp dsp,
struct ast_frame f,
int *  totalsilence 
)

Process the audio frame for silence.

Parameters
dspDSP processing audio media.
fAudio frame to process.
totalsilenceVariable to set to the total accumulated silence in ms seen by the DSP since the last noise.
Returns
Non-zero if the frame is silence.

Definition at line 1486 of file dsp.c.

1487 {
1488  return ast_dsp_silence_noise_with_energy(dsp, f, totalsilence, NULL, 0);
1489 }

References ast_dsp_silence_noise_with_energy(), and NULL.

Referenced by __ast_play_and_record(), background_detect_exec(), conf_run(), debug_check_frame_for_silence(), handle_recordfile(), isAnsweringMachine(), record_exec(), and talk_detect_audiohook_cb().

◆ ast_dsp_silence_with_energy()

int ast_dsp_silence_with_energy ( struct ast_dsp dsp,
struct ast_frame f,
int *  totalsilence,
int *  frames_energy 
)

Process the audio frame for silence.

Parameters
dspDSP processing audio media.
fAudio frame to process.
totalsilenceVariable to set to the total accumulated silence in ms seen by the DSP since the last noise.
frames_energyVariable to set to the average energy of the samples in the frame.
Returns
Non-zero if the frame is silence.

Definition at line 1481 of file dsp.c.

1482 {
1483  return ast_dsp_silence_noise_with_energy(dsp, f, totalsilence, frames_energy, 0);
1484 }

References ast_dsp_silence_noise_with_energy().

Referenced by softmix_bridge_write_voice().

◆ ast_dsp_was_muted()

int ast_dsp_was_muted ( struct ast_dsp dsp)

Returns true if DSP code was muting any fragment of the last processed frame. Muting (squelching) happens when DSP code removes DTMF/MF/generic tones from the audio.

Since
1.6.1

Definition at line 1896 of file dsp.c.

1897 {
1898  return (dsp->mute_fragments > 0);
1899 }

References ast_dsp::mute_fragments.

Referenced by dahdi_read().