Asterisk - The Open Source Telephony Project  18.5.0
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 freq1, 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

◆ DSP_DIGITMODE_MF

#define DSP_DIGITMODE_MF   1

◆ DSP_DIGITMODE_MUTECONF

#define DSP_DIGITMODE_MUTECONF   (1 << 9)

Mute conference

Definition at line 35 of file dsp.h.

Referenced by ast_dsp_set_digitmode(), dahdi_setoption(), read_mf_exec(), and read_sf_exec().

◆ 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.

Referenced by ast_dsp_set_digitmode(), dahdi_setoption(), read_mf_exec(), and read_sf_exec().

◆ DSP_DIGITMODE_NOQUELCH

#define DSP_DIGITMODE_NOQUELCH   (1 << 8)

Do not quelch DTMF from in-band

Definition at line 34 of file dsp.h.

Referenced by ast_dsp_process(), mgcp_new(), read_mf_exec(), and read_sf_exec().

◆ DSP_DIGITMODE_RELAXDTMF

#define DSP_DIGITMODE_RELAXDTMF   (1 << 11)

"Radio" mode (relaxed DTMF)

Definition at line 37 of file dsp.h.

Referenced by ast_dsp_process(), dahdi_setoption(), enable_dsp_detect(), mbl_load_device(), ooh323_new(), process_dahdi(), read_mf_exec(), and read_sf_exec().

◆ 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.

Referenced by ast_dsp_process(), and ooh323_new().

◆ DSP_FAXMODE_DETECT_CNG

#define DSP_FAXMODE_DETECT_CNG   (1 << 0)

Definition at line 47 of file dsp.h.

Referenced by __ast_dsp_new(), ast_dsp_process(), fax_detect_new(), and ooh323_new().

◆ DSP_FAXMODE_DETECT_SQUELCH

#define DSP_FAXMODE_DETECT_SQUELCH   (1 << 2)

Definition at line 49 of file dsp.h.

Referenced by ast_fax_detect_init(), and fax_detect_new().

◆ DSP_FEATURE_BUSY_DETECT

#define DSP_FEATURE_BUSY_DETECT   (1 << 1)

Definition at line 27 of file dsp.h.

Referenced by ast_dsp_process(), and dahdi_new().

◆ 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.

Referenced by __ast_dsp_call_progress(), ast_dsp_process(), and dahdi_new().

◆ DSP_FEATURE_DIGIT_DETECT

#define DSP_FEATURE_DIGIT_DETECT   (1 << 3)

◆ DSP_FEATURE_FAX_DETECT

#define DSP_FEATURE_FAX_DETECT   (1 << 4)

◆ DSP_FEATURE_FREQ_DETECT

#define DSP_FEATURE_FREQ_DETECT   (1 << 21)

Enable arbitrary tone detection

Definition at line 45 of file dsp.h.

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

◆ DSP_FEATURE_SILENCE_SUPPRESS

#define DSP_FEATURE_SILENCE_SUPPRESS   (1 << 0)

Definition at line 26 of file dsp.h.

Referenced by __ast_dsp_new(), and ast_dsp_process().

◆ DSP_FEATURE_WAITDIALTONE

#define DSP_FEATURE_WAITDIALTONE   (1 << 20)

Enable dial tone detection

Definition at line 44 of file dsp.h.

Referenced by ast_dsp_process(), dahdi_new(), and dahdi_read().

◆ DSP_PROGRESS_BUSY

#define DSP_PROGRESS_BUSY   (1 << 18)

Enable busy tone detection

Definition at line 41 of file dsp.h.

Referenced by __ast_dsp_call_progress().

◆ DSP_PROGRESS_CONGESTION

#define DSP_PROGRESS_CONGESTION   (1 << 19)

Enable congestion tone detection

Definition at line 42 of file dsp.h.

Referenced by __ast_dsp_call_progress().

◆ DSP_PROGRESS_RINGING

#define DSP_PROGRESS_RINGING   (1 << 17)

Enable calling tone detection

Definition at line 40 of file dsp.h.

Referenced by __ast_dsp_call_progress().

◆ DSP_PROGRESS_TALK

#define DSP_PROGRESS_TALK   (1 << 16)

Enable talk detection

Definition at line 39 of file dsp.h.

Referenced by __ast_dsp_call_progress(), and dahdi_new().

◆ DSP_TONE_STATE_BUSY

#define DSP_TONE_STATE_BUSY   4

Definition at line 56 of file dsp.h.

Referenced by __ast_dsp_call_progress().

◆ DSP_TONE_STATE_DIALTONE

#define DSP_TONE_STATE_DIALTONE   2

Definition at line 54 of file dsp.h.

Referenced by __ast_dsp_call_progress(), and dahdi_read().

◆ DSP_TONE_STATE_HUNGUP

#define DSP_TONE_STATE_HUNGUP   8

Definition at line 60 of file dsp.h.

Referenced by __ast_dsp_call_progress().

◆ DSP_TONE_STATE_RINGING

#define DSP_TONE_STATE_RINGING   1

Definition at line 53 of file dsp.h.

Referenced by __ast_dsp_call_progress(), and dahdi_read().

◆ DSP_TONE_STATE_SILENCE

#define DSP_TONE_STATE_SILENCE   0

Definition at line 52 of file dsp.h.

Referenced by __ast_dsp_call_progress().

◆ DSP_TONE_STATE_SPECIAL1

#define DSP_TONE_STATE_SPECIAL1   5

Definition at line 57 of file dsp.h.

Referenced by __ast_dsp_call_progress().

◆ DSP_TONE_STATE_SPECIAL2

#define DSP_TONE_STATE_SPECIAL2   6

Definition at line 58 of file dsp.h.

Referenced by __ast_dsp_call_progress().

◆ DSP_TONE_STATE_SPECIAL3

#define DSP_TONE_STATE_SPECIAL3   7

Definition at line 59 of file dsp.h.

Referenced by __ast_dsp_call_progress().

◆ DSP_TONE_STATE_TALKING

#define DSP_TONE_STATE_TALKING   3

Definition at line 55 of file dsp.h.

Referenced by __ast_dsp_call_progress().

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 };

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 1295 of file dsp.c.

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().

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

◆ 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 1216 of file dsp.c.

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.

1217 {
1218  if (inf->frametype != AST_FRAME_VOICE) {
1219  ast_log(LOG_WARNING, "Can't check call progress of non-voice frames\n");
1220  return 0;
1221  }
1223  ast_log(LOG_WARNING, "Can only check call progress in signed-linear frames\n");
1224  return 0;
1225  }
1226  return __ast_dsp_call_progress(dsp, inf->data.ptr, inf->datalen / 2);
1227 }
#define LOG_WARNING
Definition: logger.h:274
static int __ast_dsp_call_progress(struct ast_dsp *dsp, short *s, int len)
Definition: dsp.c:1074
struct ast_frame_subclass subclass
#define ast_log
Definition: astobj2.c:42
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:542
union ast_frame::@263 data
enum ast_frame_type frametype
struct ast_format * format

◆ 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 1797 of file dsp.c.

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(), my_dsp_reset_and_flush_digits(), test_dtmf_amplitude_sweep(), and test_dtmf_twist_sweep().

1798 {
1799  int i;
1800 
1801  dsp->dtmf_began = 0;
1802  if (dsp->digitmode & DSP_DIGITMODE_MF) {
1803  mf_detect_state_t *s = &dsp->digit_state.td.mf;
1804  /* Reinitialise the detector for the next block */
1805  for (i = 0; i < 6; i++) {
1806  goertzel_reset(&s->tone_out[i]);
1807  }
1808  s->hits[4] = s->hits[3] = s->hits[2] = s->hits[1] = s->hits[0] = 0;
1809  s->current_hit = 0;
1810  s->current_sample = 0;
1811  } else {
1813  /* Reinitialise the detector for the next block */
1814  for (i = 0; i < 4; i++) {
1815  goertzel_reset(&s->row_out[i]);
1816  goertzel_reset(&s->col_out[i]);
1817  }
1818  s->lasthit = 0;
1819  s->current_hit = 0;
1820  s->energy = 0.0;
1821  s->current_sample = 0;
1822  s->hits = 0;
1823  s->misses = 0;
1824  }
1825 
1826  dsp->digit_state.digits[0] = '\0';
1827  dsp->digit_state.current_digits = 0;
1828 }
union digit_detect_state_t::@383 td
#define DSP_DIGITMODE_MF
Definition: dsp.h:32
int current_digits
Definition: dsp.c:307
goertzel_state_t tone_out[6]
Definition: dsp.c:296
static void goertzel_reset(goertzel_state_t *s)
Definition: dsp.c:382
digit_detect_state_t digit_state
Definition: dsp.c:435
char digits[MAX_DTMF_DIGITS+1]
Definition: dsp.c:305
dtmf_detect_state_t dtmf
Definition: dsp.c:312
int current_sample
Definition: dsp.c:290
goertzel_state_t col_out[4]
Definition: dsp.c:284
int hits[5]
Definition: dsp.c:298
int dtmf_began
Definition: dsp.c:429
int digitmode
Definition: dsp.c:426
int current_sample
Definition: dsp.c:299
float energy
Definition: dsp.c:289
int current_hit
Definition: dsp.c:297
mf_detect_state_t mf
Definition: dsp.c:313
goertzel_state_t row_out[4]
Definition: dsp.c:283

◆ 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 1764 of file dsp.c.

References ast_dsp::features.

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

1765 {
1766  return (dsp->features);
1767 }
int features
Definition: dsp.c:412

◆ 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 1717 of file dsp.c.

References ast_dsp::sample_rate.

1718 {
1719  return dsp->sample_rate;
1720 }
unsigned int sample_rate
Definition: dsp.c:433

◆ ast_dsp_get_tcount()

int ast_dsp_get_tcount ( struct ast_dsp dsp)

Get tcount (Threshold counter)

Definition at line 1903 of file dsp.c.

References ast_dsp::tcount.

Referenced by dahdi_read().

1904 {
1905  return dsp->tcount;
1906 }
int tcount
Definition: dsp.c:425

◆ 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
Examples:
/usr/src/asterisk-18.5.0/main/app.c.

Definition at line 1996 of file dsp.c.

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().

1997 {
1998  return thresholds[which];
1999 }
static int thresholds[THRESHOLD_MAX]
Definition: dsp.c:328

◆ ast_dsp_get_tstate()

int ast_dsp_get_tstate ( struct ast_dsp dsp)

Get tstate (Tone State)

Definition at line 1898 of file dsp.c.

References ast_dsp::tstate.

Referenced by dahdi_read().

1899 {
1900  return dsp->tstate;
1901 }
int tstate
Definition: dsp.c:424

◆ 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  )

◆ 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 1750 of file dsp.c.

References __ast_dsp_new().

Referenced by set_softmix_bridge_data(), and set_talk_detect().

1751 {
1752  return __ast_dsp_new(sample_rate);
1753 }
static struct ast_dsp * __ast_dsp_new(unsigned int sample_rate)
Definition: dsp.c:1722

◆ 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 1488 of file dsp.c.

References ast_dsp_silence_noise_with_energy(), and NULL.

1489 {
1490  return ast_dsp_silence_noise_with_energy(dsp, f, totalnoise, NULL, 1);
1491 }
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:1433
#define NULL
Definition: resample.c:96

◆ 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 1494 of file dsp.c.

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, ast_frame::len, 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(), process_ast_dsp(), read_mf_digits(), read_sf_digits(), sip_rtp_read(), and wait_exec().

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

◆ ast_dsp_reset()

void ast_dsp_reset ( struct ast_dsp dsp)

Reset total silence count.

Definition at line 1830 of file dsp.c.

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().

1831 {
1832  int x;
1833 
1834  dsp->totalsilence = 0;
1835  dsp->gsamps = 0;
1836  for (x = 0; x < 4; x++) {
1837  dsp->freqs[x].v2 = dsp->freqs[x].v3 = 0.0;
1838  }
1839  memset(dsp->historicsilence, 0, sizeof(dsp->historicsilence));
1840  memset(dsp->historicnoise, 0, sizeof(dsp->historicnoise));
1841  dsp->ringtimeout = 0;
1842 }
goertzel_state_t freqs[FREQ_ARRAY_SIZE]
Definition: dsp.c:419
int historicsilence[DSP_HISTORY]
Definition: dsp.c:418
int historicnoise[DSP_HISTORY]
Definition: dsp.c:417
int totalsilence
Definition: dsp.c:409
int gsamps
Definition: dsp.c:421
int ringtimeout
Definition: dsp.c:413

◆ 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 1780 of file dsp.c.

References ast_dsp::busycount, cadences, and DSP_HISTORY.

Referenced by dahdi_new().

1781 {
1782  if (cadences < 4) {
1783  cadences = 4;
1784  }
1785  if (cadences > DSP_HISTORY) {
1787  }
1788  dsp->busycount = cadences;
1789 }
int busycount
Definition: dsp.c:415
static struct dahdi_ring_cadence cadences[NUM_CADENCE_MAX]
Definition: chan_dahdi.c:569
#define DSP_HISTORY
Definition: dsp.c:151

◆ 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 1791 of file dsp.c.

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

Referenced by dahdi_new().

1792 {
1793  dsp->busy_cadence = *cadence;
1794  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);
1795 }
int pattern[4]
Definition: dsp.h:68
#define ast_debug(level,...)
Log a DEBUG message.
Definition: logger.h:452
struct ast_dsp_busy_pattern busy_cadence
Definition: dsp.c:416

◆ 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 1879 of file dsp.c.

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

Referenced by dahdi_new().

1880 {
1881  int x;
1882 
1883  for (x = 0; x < ARRAY_LEN(aliases); x++) {
1884  if (!strcasecmp(aliases[x].name, zone)) {
1885  dsp->progmode = aliases[x].mode;
1886  ast_dsp_prog_reset(dsp);
1887  return 0;
1888  }
1889  }
1890  return -1;
1891 }
#define ARRAY_LEN(a)
Definition: isdn_lib.c:42
static void ast_dsp_prog_reset(struct ast_dsp *dsp)
Definition: dsp.c:1700
static struct progalias aliases[]
static const char name[]
Definition: cdr_mysql.c:74
enum prog_mode mode
Definition: dsp.c:106
enum prog_mode progmode
Definition: dsp.c:423

◆ 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 1844 of file dsp.c.

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().

1845 {
1846  int new;
1847  int old;
1848 
1851  if (old != new) {
1852  /* Must initialize structures if switching from MF to DTMF or vice-versa */
1854  }
1855  dsp->digitmode = digitmode;
1856  return 0;
1857 }
static void ast_digit_detect_init(digit_detect_state_t *s, int mf, unsigned int sample_rate)
Definition: dsp.c:559
#define DSP_DIGITMODE_DTMF
Definition: dsp.h:31
#define DSP_DIGITMODE_MF
Definition: dsp.h:32
#define DSP_DIGITMODE_MUTECONF
Definition: dsp.h:35
digit_detect_state_t digit_state
Definition: dsp.c:435
unsigned int sample_rate
Definition: dsp.c:433
#define DSP_DIGITMODE_MUTEMAX
Definition: dsp.h:36
int digitmode
Definition: dsp.c:426

◆ ast_dsp_set_faxmode()

int ast_dsp_set_faxmode ( struct ast_dsp dsp,
int  faxmode 
)

Set fax mode.

Definition at line 1870 of file dsp.c.

References ast_fax_detect_init(), and ast_dsp::faxmode.

Referenced by fax_detect_new(), and ooh323_new().

1871 {
1872  if (dsp->faxmode != faxmode) {
1873  dsp->faxmode = faxmode;
1874  ast_fax_detect_init(dsp);
1875  }
1876  return 0;
1877 }
int faxmode
Definition: dsp.c:427
static void ast_fax_detect_init(struct ast_dsp *s)
Definition: dsp.c:511

◆ 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  freq1,
int  dur,
int  db,
int  squelch 
)

Set arbitrary frequency detection mode.

Definition at line 1859 of file dsp.c.

References ast_freq_detect_init(), and ast_dsp::freqmode.

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

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

◆ 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.

Examples:
/usr/src/asterisk-18.5.0/main/app.c.

Definition at line 1775 of file dsp.c.

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().

1776 {
1777  dsp->threshold = threshold;
1778 }
threshold
Definition: dsp.h:71
int threshold
Definition: dsp.c:407

◆ 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.
Examples:
/usr/src/asterisk-18.5.0/main/app.c.

Definition at line 1483 of file dsp.c.

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().

1484 {
1485  return ast_dsp_silence_noise_with_energy(dsp, f, totalsilence, NULL, 0);
1486 }
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:1433
#define NULL
Definition: resample.c:96

◆ 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 1478 of file dsp.c.

References ast_dsp_silence_noise_with_energy().

Referenced by softmix_bridge_write_voice().

1479 {
1480  return ast_dsp_silence_noise_with_energy(dsp, f, totalsilence, frames_energy, 0);
1481 }
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:1433

◆ 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 1893 of file dsp.c.

References ast_dsp::mute_fragments.

Referenced by dahdi_read().

1894 {
1895  return (dsp->mute_fragments > 0);
1896 }
int mute_fragments
Definition: dsp.c:432