Asterisk - The Open Source Telephony Project GIT-master-27fb039
All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Macros Modules Pages
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.
 
int ast_dsp_call_progress (struct ast_dsp *dsp, struct ast_frame *inf)
 Scans for progress indication in audio.
 
int ast_dsp_digitdetect (struct ast_dsp *dsp, struct ast_frame *f)
 Return non-zero if DTMF hit was found.
 
void ast_dsp_digitreset (struct ast_dsp *dsp)
 Reset DTMF detector.
 
void ast_dsp_free (struct ast_dsp *dsp)
 
int ast_dsp_get_features (struct ast_dsp *dsp)
 Get features.
 
unsigned int ast_dsp_get_sample_rate (const struct ast_dsp *dsp)
 Retrieve the sample rate this DSP structure was created with.
 
int ast_dsp_get_tcount (struct ast_dsp *dsp)
 Get tcount (Threshold counter)
 
int ast_dsp_get_threshold_from_settings (enum threshold which)
 Get silence threshold from dsp.conf.
 
int ast_dsp_get_tstate (struct ast_dsp *dsp)
 Get tstate (Tone State)
 
int ast_dsp_getdigits (struct ast_dsp *dsp, char *buf, int max)
 Get pending DTMF/MF digits.
 
struct ast_dspast_dsp_new (void)
 Allocates a new dsp, assumes 8khz for internal sample rate.
 
struct ast_dspast_dsp_new_with_rate (unsigned int sample_rate)
 Allocates a new dsp with a specific internal sample rate used during processing.
 
int ast_dsp_noise (struct ast_dsp *dsp, struct ast_frame *f, int *totalnoise)
 Process the audio frame for noise.
 
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.
 
void ast_dsp_reset (struct ast_dsp *dsp)
 Reset total silence count.
 
void ast_dsp_set_busy_count (struct ast_dsp *dsp, int cadences)
 Set number of required cadences for busy.
 
void ast_dsp_set_busy_pattern (struct ast_dsp *dsp, const struct ast_dsp_busy_pattern *cadence)
 Set expected lengths of the busy tone.
 
int ast_dsp_set_call_progress_zone (struct ast_dsp *dsp, char *zone)
 Set zone for doing progress detection.
 
int ast_dsp_set_digitmode (struct ast_dsp *dsp, int digitmode)
 Set digit mode.
 
int ast_dsp_set_faxmode (struct ast_dsp *dsp, int faxmode)
 Set fax mode.
 
void ast_dsp_set_features (struct ast_dsp *dsp, int features)
 Select feature set.
 
int ast_dsp_set_freqmode (struct ast_dsp *dsp, int freq, int dur, int db, int squelch)
 Set arbitrary frequency detection mode.
 
void ast_dsp_set_threshold (struct ast_dsp *dsp, int threshold)
 Set the minimum average magnitude threshold to determine talking by the DSP.
 
int ast_dsp_silence (struct ast_dsp *dsp, struct ast_frame *f, int *totalsilence)
 Process the audio frame for silence.
 
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.
 
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.
 

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

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

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

1224{
1225 if (inf->frametype != AST_FRAME_VOICE) {
1226 ast_log(LOG_WARNING, "Can't check call progress of non-voice frames\n");
1227 return 0;
1228 }
1230 ast_log(LOG_WARNING, "Can only check call progress in signed-linear frames, %s not supported\n",
1232 return 0;
1233 }
1234 return __ast_dsp_call_progress(dsp, inf->data.ptr, inf->datalen / 2);
1235}
#define ast_log
Definition astobj2.c:42
static int __ast_dsp_call_progress(struct ast_dsp *dsp, short *s, int len)
Definition dsp.c:1081
const char * ast_format_get_name(const struct ast_format *format)
Get the name associated with a format.
Definition format.c:334
int ast_format_cache_is_slinear(struct ast_format *format)
Determines if a format is one of the cached slin formats.
#define LOG_WARNING
struct ast_format * format
struct ast_frame_subclass subclass
enum ast_frame_type frametype
union ast_frame::@239 data

References __ast_dsp_call_progress(), ast_format_cache_is_slinear(), ast_format_get_name(), 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 1814 of file dsp.c.

1815{
1816 int i;
1817
1818 dsp->dtmf_began = 0;
1819 if (dsp->digitmode & DSP_DIGITMODE_MF) {
1821 /* Reinitialise the detector for the next block */
1822 for (i = 0; i < 6; i++) {
1823 goertzel_reset(&s->tone_out[i]);
1824 }
1825 s->hits[4] = s->hits[3] = s->hits[2] = s->hits[1] = s->hits[0] = 0;
1826 s->current_hit = 0;
1827 s->current_sample = 0;
1828 } else {
1830 /* Reinitialise the detector for the next block */
1831 for (i = 0; i < 4; i++) {
1832 goertzel_reset(&s->row_out[i]);
1833 goertzel_reset(&s->col_out[i]);
1834 }
1835 s->lasthit = 0;
1836 s->current_hit = 0;
1837 s->energy = 0.0;
1838 s->current_sample = 0;
1839 s->hits = 0;
1840 s->misses = 0;
1841 }
1842
1843 dsp->digit_state.digits[0] = '\0';
1844 dsp->digit_state.current_digits = 0;
1845}
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
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
union digit_detect_state_t::@372 td
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 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 1781 of file dsp.c.

1782{
1783 return (dsp->features);
1784}
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 1734 of file dsp.c.

1735{
1736 return dsp->sample_rate;
1737}
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 1920 of file dsp.c.

1921{
1922 return dsp->tcount;
1923}
int tcount
Definition dsp.c:427

References ast_dsp::tcount.

Referenced by dahdi_read(), detect_callback(), and scan_exec().

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

2014{
2015 return thresholds[which];
2016}
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(), 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 1915 of file dsp.c.

1916{
1917 return dsp->tstate;
1918}
int tstate
Definition dsp.c:426

References ast_dsp::tstate.

Referenced by dahdi_read(), detect_callback(), and scan_exec().

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

1768{
1769 return __ast_dsp_new(sample_rate);
1770}

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

1498{
1499 return ast_dsp_silence_noise_with_energy(dsp, f, totalnoise, NULL, 1);
1500}
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:1441
#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 1503 of file dsp.c.

1504{
1505 int silence;
1506 int res;
1507 int digit = 0, fax_digit = 0, custom_freq_digit = 0;
1508 int x;
1509 short *shortdata;
1510 unsigned char *odata;
1511 int len;
1512 struct ast_frame *outf = NULL;
1513
1514 if (!af) {
1515 return NULL;
1516 }
1517 if (af->frametype != AST_FRAME_VOICE) {
1518 return af;
1519 }
1520
1521 odata = af->data.ptr;
1522 len = af->datalen;
1523 /* Make sure we have short data */
1524 if (ast_format_cache_is_slinear(af->subclass.format)) {
1525 shortdata = af->data.ptr;
1526 len = af->datalen / 2;
1527 } else if (ast_format_cmp(af->subclass.format, ast_format_ulaw) == AST_FORMAT_CMP_EQUAL) {
1528 shortdata = ast_alloca(af->datalen * 2);
1529 for (x = 0; x < len; x++) {
1530 shortdata[x] = AST_MULAW(odata[x]);
1531 }
1532 } else if (ast_format_cmp(af->subclass.format, ast_format_alaw) == AST_FORMAT_CMP_EQUAL) {
1533 shortdata = ast_alloca(af->datalen * 2);
1534 for (x = 0; x < len; x++) {
1535 shortdata[x] = AST_ALAW(odata[x]);
1536 }
1537 } else {
1538 /* Display warning only once. Otherwise you would get hundreds of warnings every second */
1539 if (dsp->display_inband_dtmf_warning) {
1540 /* If DTMF is enabled for the DSP, try to be helpful and warn about that specifically,
1541 * otherwise emit a more generic message that covers all other cases. */
1543 ast_log(LOG_WARNING, "Inband DTMF is not supported on codec %s. Use RFC2833\n",
1544 ast_format_get_name(af->subclass.format));
1545 } else {
1546 ast_log(LOG_WARNING, "Can only do DSP on signed-linear, alaw or ulaw frames (%s not supported)\n",
1547 ast_format_get_name(af->subclass.format));
1548 }
1549 }
1551 return af;
1552 }
1553
1554 /* Initially we do not want to mute anything */
1555 dsp->mute_fragments = 0;
1556
1557 /* Need to run the silence detection stuff for silence suppression and busy detection */
1559 res = __ast_dsp_silence_noise(dsp, shortdata, len, &silence, NULL, NULL);
1560 }
1561
1562 if ((dsp->features & DSP_FEATURE_SILENCE_SUPPRESS) && silence) {
1563 memset(&dsp->f, 0, sizeof(dsp->f));
1564 dsp->f.frametype = AST_FRAME_NULL;
1565 ast_frfree(af);
1566 return ast_frisolate(&dsp->f);
1567 }
1570 memset(&dsp->f, 0, sizeof(dsp->f));
1573 ast_frfree(af);
1574 ast_debug(1, "Requesting Hangup because the busy tone was detected on channel %s\n", ast_channel_name(chan));
1575 return ast_frisolate(&dsp->f);
1576 }
1577
1578 if ((dsp->features & DSP_FEATURE_FAX_DETECT)) {
1579 if ((dsp->faxmode & DSP_FAXMODE_DETECT_CNG) && tone_detect(dsp, &dsp->cng_tone_state, shortdata, len)) {
1580 fax_digit = 'f';
1581 }
1582
1583 if ((dsp->faxmode & DSP_FAXMODE_DETECT_CED) && tone_detect(dsp, &dsp->ced_tone_state, shortdata, len)) {
1584 fax_digit = 'e';
1585 }
1586 }
1587
1588 if ((dsp->features & DSP_FEATURE_FREQ_DETECT)) {
1589 if ((dsp->freqmode) && tone_detect(dsp, &dsp->cng_tone_state, shortdata, len)) {
1590 custom_freq_digit = 'q';
1591 }
1592 }
1593
1595 if (dsp->digitmode & DSP_DIGITMODE_MF) {
1596 digit = mf_detect(dsp, &dsp->digit_state, shortdata, len, (dsp->digitmode & DSP_DIGITMODE_NOQUELCH) == 0, (dsp->digitmode & DSP_DIGITMODE_RELAXDTMF));
1597 } else {
1598 digit = dtmf_detect(dsp, &dsp->digit_state, shortdata, len, (dsp->digitmode & DSP_DIGITMODE_NOQUELCH) == 0, (dsp->digitmode & DSP_DIGITMODE_RELAXDTMF));
1599 }
1600
1601 if (dsp->digit_state.current_digits) {
1602 int event = 0, event_len = 0;
1603 char event_digit = 0;
1604
1605 if (!dsp->dtmf_began) {
1606 /* We have not reported DTMF_BEGIN for anything yet */
1607
1609 event = AST_FRAME_DTMF_BEGIN;
1610 event_digit = dsp->digit_state.digits[0];
1611 }
1612 dsp->dtmf_began = 1;
1613
1614 } else if (dsp->digit_state.current_digits > 1 || digit != dsp->digit_state.digits[0]) {
1615 /* Digit changed. This means digit we have reported with DTMF_BEGIN ended */
1617 event = AST_FRAME_DTMF_END;
1618 event_digit = dsp->digit_state.digits[0];
1619 event_len = dsp->digit_state.digitlen[0] * 1000 / dsp->sample_rate;
1620 }
1621 memmove(&dsp->digit_state.digits[0], &dsp->digit_state.digits[1], dsp->digit_state.current_digits);
1622 memmove(&dsp->digit_state.digitlen[0], &dsp->digit_state.digitlen[1], dsp->digit_state.current_digits * sizeof(dsp->digit_state.digitlen[0]));
1624 dsp->dtmf_began = 0;
1625
1626 if (dsp->features & DSP_FEATURE_BUSY_DETECT) {
1627 /* Reset Busy Detector as we have some confirmed activity */
1628 memset(dsp->historicsilence, 0, sizeof(dsp->historicsilence));
1629 memset(dsp->historicnoise, 0, sizeof(dsp->historicnoise));
1630 ast_debug(1, "DTMF Detected - Reset busydetector\n");
1631 }
1632 }
1633
1634 if (event) {
1635 memset(&dsp->f, 0, sizeof(dsp->f));
1636 dsp->f.frametype = event;
1637 dsp->f.subclass.integer = event_digit;
1638 dsp->f.len = event_len;
1639 outf = &dsp->f;
1640 goto done;
1641 }
1642 }
1643 }
1644
1645 if (fax_digit) {
1646 /* Fax was detected - digit is either 'f' or 'e' */
1647
1648 memset(&dsp->f, 0, sizeof(dsp->f));
1649 dsp->f.frametype = AST_FRAME_DTMF;
1650 dsp->f.subclass.integer = fax_digit;
1651 outf = &dsp->f;
1652 goto done;
1653 }
1654
1655 if (custom_freq_digit) {
1656 /* Custom frequency was detected - digit is 'q' */
1657
1658 memset(&dsp->f, 0, sizeof(dsp->f));
1659 dsp->f.frametype = AST_FRAME_DTMF;
1660 dsp->f.subclass.integer = custom_freq_digit;
1661 outf = &dsp->f;
1662 goto done;
1663 }
1664
1665 if ((dsp->features & DSP_FEATURE_CALL_PROGRESS)) {
1666 res = __ast_dsp_call_progress(dsp, shortdata, len);
1667 if (res) {
1668 switch (res) {
1669 case AST_CONTROL_ANSWER:
1670 case AST_CONTROL_BUSY:
1673 case AST_CONTROL_HANGUP:
1674 memset(&dsp->f, 0, sizeof(dsp->f));
1676 dsp->f.subclass.integer = res;
1677 dsp->f.src = "dsp_progress";
1678 if (chan) {
1679 ast_queue_frame(chan, &dsp->f);
1680 }
1681 break;
1682 default:
1683 ast_log(LOG_WARNING, "Don't know how to represent call progress message %d\n", res);
1684 }
1685 }
1686 } else if ((dsp->features & DSP_FEATURE_WAITDIALTONE)) {
1687 res = __ast_dsp_call_progress(dsp, shortdata, len);
1688 }
1689
1690done:
1691 /* Mute fragment of the frame */
1692 for (x = 0; x < dsp->mute_fragments; x++) {
1693 memset(shortdata + dsp->mute_data[x].start, 0, sizeof(int16_t) * (dsp->mute_data[x].end - dsp->mute_data[x].start));
1694 }
1695
1696 if (ast_format_cmp(af->subclass.format, ast_format_ulaw) == AST_FORMAT_CMP_EQUAL) {
1697 for (x = 0; x < len; x++) {
1698 odata[x] = AST_LIN2MU((unsigned short) shortdata[x]);
1699 }
1700 } else if (ast_format_cmp(af->subclass.format, ast_format_alaw) == AST_FORMAT_CMP_EQUAL) {
1701 for (x = 0; x < len; x++) {
1702 odata[x] = AST_LIN2A((unsigned short) shortdata[x]);
1703 }
1704 }
1705
1706 if (outf) {
1707 if (chan) {
1708 ast_queue_frame(chan, af);
1709 }
1710 ast_frfree(af);
1711 return ast_frisolate(outf);
1712 } else {
1713 return af;
1714 }
1715}
#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
const char * ast_channel_name(const struct ast_channel *chan)
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:1170
void ast_channel_softhangup_internal_flag_add(struct ast_channel *chan, int value)
@ AST_SOFTHANGUP_DEV
Definition channel.h:1141
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:907
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:699
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:1303
static int __ast_dsp_silence_noise(struct ast_dsp *dsp, short *s, int len, int *totalsilence, int *totalnoise, int *frames_energy)
Definition dsp.c:1237
#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_DTMF
Definition dsp.h:31
#define DSP_DIGITMODE_RELAXDTMF
Definition dsp.h:37
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.
struct ast_format * ast_format_alaw
Built-in cached alaw format.
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_DTMF_END
@ AST_FRAME_DTMF_BEGIN
@ AST_FRAME_CONTROL
@ 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.
int digitlen[MAX_DTMF_DIGITS+1]
Definition dsp.c:308
int start
Definition dsp.c:390
int end
Definition dsp.c:391
int done
#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_DTMF, 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(), ooh323_rtp_read(), read_mf_digits(), read_sf_digits(), scan_exec(), and wait_exec().

◆ ast_dsp_reset()

void ast_dsp_reset ( struct ast_dsp dsp)

Reset total silence count.

Definition at line 1847 of file dsp.c.

1848{
1849 int x;
1850
1851 dsp->totalsilence = 0;
1852 dsp->gsamps = 0;
1853 for (x = 0; x < 4; x++) {
1854 dsp->freqs[x].v2 = dsp->freqs[x].v3 = 0.0;
1855 }
1856 memset(dsp->historicsilence, 0, sizeof(dsp->historicsilence));
1857 memset(dsp->historicnoise, 0, sizeof(dsp->historicnoise));
1858 dsp->ringtimeout = 0;
1859}
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 1797 of file dsp.c.

1798{
1799 if (cadences < 4) {
1800 cadences = 4;
1801 }
1802 if (cadences > DSP_HISTORY) {
1804 }
1805 dsp->busycount = cadences;
1806}
static struct dahdi_ring_cadence cadences[NUM_CADENCE_MAX]
Definition chan_dahdi.c:820

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

1809{
1810 dsp->busy_cadence = *cadence;
1811 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);
1812}

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

1897{
1898 int x;
1899
1900 for (x = 0; x < ARRAY_LEN(aliases); x++) {
1901 if (!strcasecmp(aliases[x].name, zone)) {
1902 dsp->progmode = aliases[x].mode;
1903 ast_dsp_prog_reset(dsp);
1904 return 0;
1905 }
1906 }
1907 return -1;
1908}
static struct progalias aliases[]
static void ast_dsp_prog_reset(struct ast_dsp *dsp)
Definition dsp.c:1717
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:706

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

Referenced by dahdi_new(), and scan_exec().

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

1862{
1863 int new;
1864 int old;
1865
1868 if (old != new) {
1869 /* Must initialize structures if switching from MF to DTMF or vice-versa */
1871 }
1872 dsp->digitmode = digitmode;
1873 return 0;
1874}
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

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(), mbl_load_device(), 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 1887 of file dsp.c.

1888{
1889 if (dsp->faxmode != faxmode) {
1890 dsp->faxmode = faxmode;
1892 }
1893 return 0;
1894}
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(), ooh323_new(), and scan_exec().

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

1877{
1878 if (freq > 0) {
1879 dsp->freqmode = 1;
1880 ast_freq_detect_init(dsp, freq, dur, db, squelch);
1881 } else {
1882 dsp->freqmode = 0;
1883 }
1884 return 0;
1885}
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(), scan_exec(), 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 1792 of file dsp.c.

1793{
1794 dsp->threshold = threshold;
1795}
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 1492 of file dsp.c.

1493{
1494 return ast_dsp_silence_noise_with_energy(dsp, f, totalsilence, NULL, 0);
1495}

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

1488{
1489 return ast_dsp_silence_noise_with_energy(dsp, f, totalsilence, frames_energy, 0);
1490}

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

1911{
1912 return (dsp->mute_fragments > 0);
1913}

References ast_dsp::mute_fragments.

Referenced by dahdi_read().