Changeset 3164

Changed DSP_FEATURES_FAX_DETECT into DSP_FEATURES_FAX_CED_DETECT and
DSP_FEATURE_FAX_CNG_DETECT, so we are prepared for better T.38 management.

Don't consider this a long term solution. Its a quickie. I just love
spontaneous quickies.

Committed by:  coppice
Date:  Jun 26 2007 * 16:21 (about 1 year ago)

Affected files:

callweaver/trunk/apps/app_backgrounddetect.c (unified diff)

r3018r3164
165165 if (!ignoretalk)
166166 ; // features |= DSP_FEATURE_SILENCE_SUPPRESS;
167167 if (!ignorefax)
168 features |= DSP_FEATURE_FAX_DETECT;
168 features |= DSP_FEATURE_FAX_CNG_DETECT;
169169 //if (!ignoredtmf)
170170 features |= DSP_FEATURE_DTMF_DETECT;
171171

callweaver/trunk/apps/app_faxdetect.c (unified diff)

r2956r3164
207207 if (!ignoretalk)
208208 ; /* features |= DSP_FEATURE_SILENCE_SUPPRESS; */
209209 if (!ignorefax)
210 features |= DSP_FEATURE_FAX_DETECT;
210 features |= DSP_FEATURE_FAX_CNG_DETECT;
211211
212212 features |= DSP_FEATURE_DTMF_DETECT;
213213

callweaver/trunk/apps/app_rxfax.c (unified diff)

r3105r3164
410410 opbx_log(LOG_WARNING, "Unable to allocate DSP!\n");
411411 else {
412412 opbx_dsp_set_threshold(dsp, 256);
413 opbx_dsp_set_features (dsp, DSP_FEATURE_DTMF_DETECT | DSP_FEATURE_FAX_DETECT);
413 opbx_dsp_set_features (dsp, DSP_FEATURE_DTMF_DETECT | DSP_FEATURE_FAX_CNG_DETECT);
414414 opbx_dsp_digitmode (dsp, DSP_DIGITMODE_DTMF | DSP_DIGITMODE_RELAXDTMF);
415415 }
416416

callweaver/trunk/apps/app_t38gateway.c (unified diff)

r3102r3164
111111 else
112112 {
113113 opbx_dsp_set_threshold(dsp, 256);
114 opbx_dsp_set_features(dsp, DSP_FEATURE_DTMF_DETECT | DSP_FEATURE_FAX_DETECT);
114 opbx_dsp_set_features(dsp, DSP_FEATURE_DTMF_DETECT | DSP_FEATURE_FAX_CNG_DETECT);
115115 opbx_dsp_digitmode(dsp, DSP_DIGITMODE_DTMF | DSP_DIGITMODE_RELAXDTMF);
116116 }
117117

callweaver/trunk/channels/chan_sip.c (unified diff)

r3118r3164
37883788 if (opbx_test_flag(i, SIP_DTMF) == SIP_DTMF_INBAND)
37893789 {
37903790 i->vad = opbx_dsp_new();
3791 opbx_dsp_set_features(i->vad, DSP_FEATURE_DTMF_DETECT | DSP_FEATURE_FAX_DETECT);
3791 opbx_dsp_set_features(i->vad, DSP_FEATURE_DTMF_DETECT | DSP_FEATURE_FAX_CNG_DETECT);
37923792 i->vadtx = opbx_dsp_new();
3793 opbx_dsp_set_features(i->vadtx, DSP_FEATURE_DTMF_DETECT | DSP_FEATURE_FAX_DETECT);
3793 opbx_dsp_set_features(i->vadtx, DSP_FEATURE_DTMF_DETECT | DSP_FEATURE_FAX_CNG_DETECT);
37943794 if (relaxdtmf)
37953795 {
37963796 opbx_dsp_digitmode(i->vad , DSP_DIGITMODE_DTMF | DSP_DIGITMODE_RELAXDTMF);

callweaver/trunk/channels/chan_zap.c (unified diff)

r3110r3164
50505050 }
50515051 if ((!i->outgoing && (i->callprogress & 4)) ||
50525052 (i->outgoing && (i->callprogress & 2))) {
5053 features |= DSP_FEATURE_FAX_DETECT;
5053 features |= DSP_FEATURE_FAX_CNG_DETECT;
50545054 }
50555055 #ifdef ZT_TONEDETECT
50565056 x = ZT_TONEDETECT_ON | ZT_TONEDETECT_MUTE;

callweaver/trunk/channels/misdn/chan_misdn.c (unified diff)

r3111r3164
18871887 if (!ch->dsp)
18881888 ch->dsp = opbx_dsp_new();
18891889 if (ch->dsp)
1890 opbx_dsp_set_features(ch->dsp, DSP_FEATURE_DTMF_DETECT | DSP_FEATURE_FAX_DETECT);
1890 opbx_dsp_set_features(ch->dsp, DSP_FEATURE_DTMF_DETECT | DSP_FEATURE_FAX_CNG_DETECT);
18911891 if (!ch->trans)
18921892 ch->trans=opbx_translator_build_path(OPBX_FORMAT_SLINEAR, OPBX_FORMAT_ALAW);
18931893 }
------
49804980 config_jitterbuffer(ch);
49814981
49824982
4983 if (ch->faxdetect || ch->opbx_dsp) {
4984 if (!ch->dsp) ch->dsp = opbx_dsp_new();
4985 if (ch->dsp) opbx_dsp_set_features(ch->dsp, DSP_FEATURE_DTMF_DETECT| DSP_FEATURE_FAX_DETECT);
4986 if (!ch->trans) ch->trans=opbx_translator_build_path(OPBX_FORMAT_SLINEAR, OPBX_FORMAT_ALAW);
4983 if (ch->faxdetect || ch->opbx_dsp)
4984 {
4985 if (!ch->dsp)
4986 ch->dsp = opbx_dsp_new();
4987 if (ch->dsp)
4988 opbx_dsp_set_features(ch->dsp, DSP_FEATURE_DTMF_DETECT | DSP_FEATURE_FAX_CNG_DETECT);
4989 if (!ch->trans)
4990 ch->trans=opbx_translator_build_path(OPBX_FORMAT_SLINEAR, OPBX_FORMAT_ALAW);
49874991 }
49884992
49894993 if (ch->opbx_dsp) {

callweaver/trunk/corelib/dsp.c (unified diff)

r3029r3164
5050 /* Number of goertzels for progress detect */
5151 #define GSAMP_SIZE_NA 183 /* North America - 350, 440, 480, 620, 950, 1400, 1800 Hz */
5252 #define GSAMP_SIZE_CR 188 /* Costa Rica, Brazil - Only care about 425 Hz */
53 #define GSAMP_SIZE_UK 160 /* UK disconnect goertzel feed - should trigger 400hz */
53 #define GSAMP_SIZE_UK 160 /* UK disconnect goertzel feed - should trigger 400Hz */
5454
5555 #define PROG_MODE_NA 0
5656 #define PROG_MODE_CR 1
------
122122 int totalsilence;
123123 int totalnoise;
124124 int features;
125 int busymaybe;
125 int busy_maybe;
126126 int busycount;
127127 int busy_tonelength;
128128 int busy_quietlength;
------
140140 int mute_lag;
141141 float genergy;
142142 dtmf_rx_state_t dtmf_rx;
143 modem_connect_tones_rx_state_t fax_ced_rx;
143144 modem_connect_tones_rx_state_t fax_cng_rx;
144145 bell_mf_rx_state_t bell_mf_rx;
145146 };
------
164165 return 1;
165166 }
166167
167 static int __opbx_dsp_call_progress(struct opbx_dsp *dsp, short *s, int len)
168 static int __opbx_dsp_call_progress(struct opbx_dsp *dsp, int16_t *s, int len)
168169 {
169170 int x;
170171 int y;
------
235236 newstate = DSP_TONE_STATE_TALKING;
236237 }
237238 else
239 {
238240 newstate = DSP_TONE_STATE_SILENCE;
241 }
239242 break;
240243 case PROG_MODE_CR:
241244 if (hz[HZ_425] > TONE_MIN_THRESH * TONE_THRESH)
------
324327 return __opbx_dsp_call_progress(dsp, inf->data, inf->datalen / 2);
325328 }
326329
327 static int __opbx_dsp_silence(struct opbx_dsp *dsp, short *s, int len, int *totalsilence)
330 static int __opbx_dsp_silence(struct opbx_dsp *dsp, int16_t amp[], int len, int *totalsilence)
328331 {
329332 int accum;
330333 int x;
331 int res = 0;
334 int res;
332335
333336 if (!len)
334337 return 0;
335338 accum = 0;
336339 for (x = 0; x < len; x++)
337 accum += abs(s[x]);
340 accum += abs(amp[x]);
338341 accum /= len;
339342 if (accum < dsp->threshold)
340343 {
------
345348 /* Move and save history */
346349 memmove(dsp->historicnoise + DSP_HISTORY - dsp->busycount, dsp->historicnoise + DSP_HISTORY - dsp->busycount +1, dsp->busycount*sizeof(dsp->historicnoise[0]));
347350 dsp->historicnoise[DSP_HISTORY - 1] = dsp->totalnoise;
348 /* we don't want to check for busydetect that frequently */
351 /* We don't want to check for busydetect that frequently */
349352 }
350353 dsp->totalnoise = 0;
351 res = 1;
354 res = TRUE;
352355 }
353356 else
354357 {
------
363366 dsp->historicsilence[DSP_HISTORY - 1] = dsp->totalsilence;
364367 /* check if the previous sample differs only by BUSY_PERCENT from the one before it */
365368 if (silence1 < silence2)
366 {
367 if (silence1 + silence1*BUSY_PERCENT/100 >= silence2)
368 dsp->busymaybe = 1;
369 else
370 dsp->busymaybe = 0;
371 }
369 dsp->busy_maybe = (silence1 + silence1*BUSY_PERCENT/100 >= silence2);
372370 else
373 {
374 if (silence1 - silence1*BUSY_PERCENT/100 <= silence2)
375 dsp->busymaybe = 1;
376 else
377 dsp->busymaybe = 0;
378 }
371 dsp->busy_maybe = (silence1 - silence1*BUSY_PERCENT/100 <= silence2);
379372 }
380373 dsp->totalsilence = 0;
374 res = FALSE;
381375 }
382376 if (totalsilence)
383377 *totalsilence = dsp->totalsilence;
------
396390 int avgtone = 0;
397391 int hittone = 0;
398392
399 if (!dsp->busymaybe)
393 if (!dsp->busy_maybe)
400394 return res;
401395 for (x = DSP_HISTORY - dsp->busycount; x < DSP_HISTORY; x++)
402396 {
------
494488 int min;
495489
496490 res = 0;
497 if (dsp->busymaybe)
491 if (dsp->busy_maybe)
498492 {
499 dsp->busymaybe = 0;
493 dsp->busy_maybe = FALSE;
500494 min = 9999;
501495 max = 0;
502496 for (x = DSP_HISTORY - dsp->busycount; x < DSP_HISTORY; x++)
------
519513
520514 int opbx_dsp_silence(struct opbx_dsp *dsp, struct opbx_frame *f, int *totalsilence)
521515 {
522 short *s;
516 int16_t *amp;
517 uint8_t *data;
523518 int len;
524
519 int x;
520
525521 if (f->frametype != OPBX_FRAME_VOICE)
526522 {
527523 opbx_log(LOG_WARNING, "Can't calculate silence on a non-voice frame\n");
528524 return 0;
529525 }
530 if (f->subclass != OPBX_FORMAT_SLINEAR)
526 data = f->data;
527 switch (f->subclass)
531528 {
532 opbx_log(LOG_WARNING, "Can only calculate silence on signed-linear frames :(\n");
529 case OPBX_FORMAT_SLINEAR:
530 amp = f->data;
531 len = f->datalen/2;
532 break;
533 case OPBX_FORMAT_ULAW:
534 amp = alloca(f->datalen*sizeof(int16_t));
535 for (x = 0; x < len; x++)
536 amp[x] = OPBX_MULAW(data[x]);
537 break;
538 case OPBX_FORMAT_ALAW:
539 amp = alloca(f->datalen*sizeof(int16_t));
540 for (x = 0; x < len; x++)
541 amp[x] = OPBX_ALAW(data[x]);
542 break;
543 default:
544 opbx_log(LOG_WARNING, "Silence detection is not supported on codec %s. Use RFC2833\n", opbx_getformatname(f->subclass));
533545 return 0;
534546 }
535 s = f->data;
536 len = f->datalen/2;
537 return __opbx_dsp_silence(dsp, s, len, totalsilence);
547 return __opbx_dsp_silence(dsp, amp, len, totalsilence);
538548 }
539549
540550 #define FIX_INF(inf) \
------
544554 { \
545555 switch(inf->subclass) \
546556 { \
547 case OPBX_FORMAT_SLINEAR: \
548 break; \
549557 case OPBX_FORMAT_ULAW: \
550558 for (x = 0; x < len; x++) \
551 odata[x] = OPBX_LIN2MU((int16_t) amp[x]); \
559 odata[x] = OPBX_LIN2MU(amp[x]); \
552560 break; \
553561 case OPBX_FORMAT_ALAW: \
554562 for (x = 0; x < len; x++) \
555 odata[x] = OPBX_LIN2A((int16_t) amp[x]); \
563 odata[x] = OPBX_LIN2A(amp[x]); \
556564 break; \
557565 } \
558566 } \
------
582590 {
583591 case OPBX_FORMAT_SLINEAR:
584592 amp = af->data;
585 len = af->datalen / 2;
593 len = af->datalen/2;
586594 break;
587595 case OPBX_FORMAT_ULAW:
588596 amp = alloca(af->datalen*sizeof(int16_t));
------
595603 amp[x] = OPBX_ALAW(odata[x]);
596604 break;
597605 default:
598 opbx_log(LOG_WARNING, "Inband DTMF is not supported on codec %s. Use RFC2833\n", opbx_getformatname(af->subclass));
606 opbx_log(LOG_WARNING, "Tone detection is not supported on codec %s. Use RFC2833\n", opbx_getformatname(af->subclass));
599607 return af;
600608 }
601609 silence = __opbx_dsp_silence(dsp, amp, len, NULL);
602 if ((dsp->features & DSP_FEATURE_SILENCE_SUPPRESS) && silence)
610 if ((dsp->features & DSP_FEATURE_SILENCE_SUPPRESS) && silence)
603611 {
604612 opbx_fr_init(&dsp->f);
605613 dsp->f.frametype = OPBX_FRAME_NULL;
------
645653 if (dsp->dtmf_rx.last_hit)
646654 {
647655 /* Looks like we might have something.
648 * Request a conference mute for the moment */
656 Request a conference mute for the moment */
649657 dsp->thinkdigit = 'x';
650658 opbx_fr_init_ex(&dsp->f, OPBX_FRAME_DTMF, 'm', NULL);
651659 FIX_INF(af);
------
659667 {
660668 if (dsp->dtmf_rx.in_digit)
661669 {
662 /* Thought we saw one last time. Pretty sure we really have now */
670 /* Thought we saw one last time. It is now confirmed. */
663671 if (dsp->thinkdigit)
664672 {
665673 if ((dsp->thinkdigit != 'x') && (dsp->thinkdigit != dsp->dtmf_rx.in_digit))
------
716724 }
717725 }
718726 }
719 if ((dsp->features & DSP_FEATURE_FAX_DETECT))
727 if ((dsp->features & DSP_FEATURE_FAX_CNG_DETECT))
720728 {
721729 modem_connect_tones_rx(&dsp->fax_cng_rx, amp, len);
722730 if (modem_connect_tones_rx_get(&dsp->fax_cng_rx))
------
729737 return &dsp->f;
730738 }
731739 }
740 if ((dsp->features & DSP_FEATURE_FAX_CED_DETECT))
741 {
742 modem_connect_tones_rx(&dsp->fax_ced_rx, amp, len);
743 if (modem_connect_tones_rx_get(&dsp->fax_ced_rx))
744 {
745 opbx_fr_init_ex(&dsp->f, OPBX_FRAME_DTMF, 'F', NULL);
746 FIX_INF(af);
747 if (chan)
748 opbx_queue_frame(chan, af);
749 opbx_fr_free(af);
750 return &dsp->f;
751 }
752 }
732753 if ((dsp->features & DSP_FEATURE_CALL_PROGRESS))
733754 {
734 res = __opbx_dsp_call_progress(dsp, amp, len);
735 if (res)
755 if ((res = __opbx_dsp_call_progress(dsp, amp, len)))
736756 {
737757 switch (res)
738758 {
------
793813 MODEM_CONNECT_TONES_FAX_CNG,
794814 NULL,
795815 NULL);
816 modem_connect_tones_rx_init(&dsp->fax_ced_rx,
817 MODEM_CONNECT_TONES_FAX_CED,
818 NULL,
819 NULL);
796820
797821 /* Initialize initial DSP progress detect parameters */
798822 opbx_dsp_prog_reset(dsp);
------
843867 MODEM_CONNECT_TONES_FAX_CNG,
844868 NULL,
845869 NULL);
870 modem_connect_tones_rx_init(&dsp->fax_ced_rx,
871 MODEM_CONNECT_TONES_FAX_CED,
872 NULL,
873 NULL);
846874 }
847875
848876 void opbx_dsp_reset(struct opbx_dsp *dsp)
------
859887
860888 int opbx_dsp_digitmode(struct opbx_dsp *dsp, int digitmode)
861889 {
862 int new;
863 int old;
890 int new_mode;
891 int old_mode;
864892
865 old = dsp->digitmode & (DSP_DIGITMODE_DTMF | DSP_DIGITMODE_MF | DSP_DIGITMODE_MUTECONF | DSP_DIGITMODE_MUTEMAX);
866 new = digitmode & (DSP_DIGITMODE_DTMF | DSP_DIGITMODE_MF | DSP_DIGITMODE_MUTECONF | DSP_DIGITMODE_MUTEMAX);
867 if (old != new)
893 old_mode = dsp->digitmode & (DSP_DIGITMODE_DTMF | DSP_DIGITMODE_MF | DSP_DIGITMODE_MUTECONF | DSP_DIGITMODE_MUTEMAX);
894 new_mode = digitmode & (DSP_DIGITMODE_DTMF | DSP_DIGITMODE_MF | DSP_DIGITMODE_MUTECONF | DSP_DIGITMODE_MUTEMAX);
895 if (old_mode != new_mode)
868896 {
869897 /* Must initialize structures if switching from MF to DTMF or vice-versa */
870 if ((new & DSP_DIGITMODE_MF))
898 if ((new_mode & DSP_DIGITMODE_MF))
871899 bell_mf_rx_init(&dsp->bell_mf_rx, NULL, NULL);
872900 else
873901 dtmf_rx_init(&dsp->dtmf_rx, NULL, NULL);
------
876904 MODEM_CONNECT_TONES_FAX_CNG,
877905 NULL,
878906 NULL);
907 modem_connect_tones_rx_init(&dsp->fax_ced_rx,
908 MODEM_CONNECT_TONES_FAX_CED,
909 NULL,
910 NULL);
879911 }
880912 if ((digitmode & DSP_DIGITMODE_RELAXDTMF))
881913 dtmf_rx_parms(&dsp->dtmf_rx, FALSE, 8, 8);

callweaver/trunk/include/callweaver/dsp.h (unified diff)

r3025r3164
2323 #ifndef _CALLWEAVER_DSP_H
2424 #define _CALLWEAVER_DSP_H
2525
26 #define DSP_FEATURE_SILENCE_SUPPRESS (1 << 0)
27 #define DSP_FEATURE_BUSY_DETECT (1 << 1)
28 #define DSP_FEATURE_DTMF_DETECT (1 << 3)
29 #define DSP_FEATURE_FAX_DETECT (1 << 4)
26 #define DSP_FEATURE_SILENCE_SUPPRESS (1 << 0)
27 #define DSP_FEATURE_BUSY_DETECT (1 << 1)
28 #define DSP_FEATURE_DTMF_DETECT (1 << 3)
29 #define DSP_FEATURE_FAX_CNG_DETECT (1 << 4)
30 #define DSP_FEATURE_FAX_CED_DETECT (1 << 5)
3031
31 #define DSP_DIGITMODE_DTMF 0 /*! \brief Detect DTMF digits */
32 #define DSP_DIGITMODE_MF 1 /*! \brief Detect MF digits */
32 #define DSP_DIGITMODE_DTMF 0 /*! \brief Detect DTMF digits */
33 #define DSP_DIGITMODE_MF 1 /*! \brief Detect MF digits */
3334
34 #define DSP_DIGITMODE_NOQUELCH (1 << 8) /*! \brief Do not quelch DTMF from in-band */
35 #define DSP_DIGITMODE_MUTECONF (1 << 9) /*! \brief Mute conference */
36 #define DSP_DIGITMODE_MUTEMAX (1 << 10) /*! \brief Delay audio by a frame to try to extra quelch */
37 #define DSP_DIGITMODE_RELAXDTMF (1 << 11) /*! \brief "Radio" mode (relaxed DTMF) */
35 #define DSP_DIGITMODE_NOQUELCH (1 << 8) /*! \brief Do not quelch DTMF from in-band */
36 #define DSP_DIGITMODE_MUTECONF (1 << 9) /*! \brief Mute conference */
37 #define DSP_DIGITMODE_MUTEMAX (1 << 10) /*! \brief Delay audio by a frame to try to extra quelch */
38 #define DSP_DIGITMODE_RELAXDTMF (1 << 11) /*! \brief "Radio" mode (relaxed DTMF) */
3839
39 #define DSP_PROGRESS_TALK (1 << 16) /*! \brief Enable talk detection */
40 #define DSP_PROGRESS_RINGING (1 << 17) /*! \brief Enable calling tone detection */
41 #define DSP_PROGRESS_BUSY (1 << 18) /*! \brief Enable busy tone detection */
42 #define DSP_PROGRESS_CONGESTION (1 << 19) /*! \brief Enable congestion tone detection */
43 #define DSP_FEATURE_CALL_PROGRESS (DSP_PROGRESS_TALK | DSP_PROGRESS_RINGING | DSP_PROGRESS_BUSY | DSP_PROGRESS_CONGESTION)
40 #define DSP_PROGRESS_TALK (1 << 16) /*! \brief Enable talk detection */
41 #define DSP_PROGRESS_RINGING (1 << 17) /*! \brief Enable calling tone detection */
42 #define DSP_PROGRESS_BUSY (1 << 18) /*! \brief Enable busy tone detection */
43 #define DSP_PROGRESS_CONGESTION (1 << 19) /*! \brief Enable congestion tone detection */
44 #define DSP_FEATURE_CALL_PROGRESS (DSP_PROGRESS_TALK | DSP_PROGRESS_RINGING | DSP_PROGRESS_BUSY | DSP_PROGRESS_CONGESTION)
4445
45 #define DSP_TONE_STATE_SILENCE 0
46 #define DSP_TONE_STATE_RINGING 1
47 #define DSP_TONE_STATE_DIALTONE 2
48 #define DSP_TONE_STATE_TALKING 3
49 #define DSP_TONE_STATE_BUSY 4
50 #define DSP_TONE_STATE_SPECIAL1 5
51 #define DSP_TONE_STATE_SPECIAL2 6
52 #define DSP_TONE_STATE_SPECIAL3 7
53 #define DSP_TONE_STATE_HUNGUP 8
46 #define DSP_TONE_STATE_SILENCE 0
47 #define DSP_TONE_STATE_RINGING 1
48 #define DSP_TONE_STATE_DIALTONE 2
49 #define DSP_TONE_STATE_TALKING 3
50 #define DSP_TONE_STATE_BUSY 4
51 #define DSP_TONE_STATE_SPECIAL1 5
52 #define DSP_TONE_STATE_SPECIAL2 6
53 #define DSP_TONE_STATE_SPECIAL3 7
54 #define DSP_TONE_STATE_HUNGUP 8
5455
5556 struct opbx_dsp;
5657