Asterisk - The Open Source Telephony Project GIT-master-7e7a603
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 1299 of file dsp.c.

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

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, %s not supported\n",
1228 return 0;
1229 }
1230 return __ast_dsp_call_progress(dsp, inf->data.ptr, inf->datalen / 2);
1231}
#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
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.
Definition: format_cache.c:534
@ AST_FRAME_VOICE
#define LOG_WARNING
struct ast_format * format
struct ast_frame_subclass subclass
union ast_frame::@226 data
enum ast_frame_type frametype

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

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

1778{
1779 return (dsp->features);
1780}
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 1730 of file dsp.c.

1731{
1732 return dsp->sample_rate;
1733}
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 1916 of file dsp.c.

1917{
1918 return dsp->tcount;
1919}
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 2009 of file dsp.c.

2010{
2011 return thresholds[which];
2012}
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 1911 of file dsp.c.

1912{
1913 return dsp->tstate;
1914}
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 1763 of file dsp.c.

1764{
1765 return __ast_dsp_new(sample_rate);
1766}

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

1494{
1495 return ast_dsp_silence_noise_with_energy(dsp, f, totalnoise, NULL, 1);
1496}
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:1437
#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 1499 of file dsp.c.

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

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

1794{
1795 if (cadences < 4) {
1796 cadences = 4;
1797 }
1798 if (cadences > DSP_HISTORY) {
1800 }
1801 dsp->busycount = cadences;
1802}
static struct dahdi_ring_cadence cadences[NUM_CADENCE_MAX]
Definition: chan_dahdi.c:690

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

1805{
1806 dsp->busy_cadence = *cadence;
1807 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);
1808}

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

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

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

1858{
1859 int new;
1860 int old;
1861
1864 if (old != new) {
1865 /* Must initialize structures if switching from MF to DTMF or vice-versa */
1867 }
1868 dsp->digitmode = digitmode;
1869 return 0;
1870}
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 1883 of file dsp.c.

1884{
1885 if (dsp->faxmode != faxmode) {
1886 dsp->faxmode = faxmode;
1888 }
1889 return 0;
1890}
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 1872 of file dsp.c.

1873{
1874 if (freq > 0) {
1875 dsp->freqmode = 1;
1876 ast_freq_detect_init(dsp, freq, dur, db, squelch);
1877 } else {
1878 dsp->freqmode = 0;
1879 }
1880 return 0;
1881}
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 1788 of file dsp.c.

1789{
1790 dsp->threshold = threshold;
1791}
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 1488 of file dsp.c.

1489{
1490 return ast_dsp_silence_noise_with_energy(dsp, f, totalsilence, NULL, 0);
1491}

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

1484{
1485 return ast_dsp_silence_noise_with_energy(dsp, f, totalsilence, frames_energy, 0);
1486}

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

1907{
1908 return (dsp->mute_fragments > 0);
1909}

References ast_dsp::mute_fragments.

Referenced by dahdi_read().