as reported in mantis #6066, fix a bunch of cli bugs and
[asterisk/asterisk.git] / dsp.c
diff --git a/dsp.c b/dsp.c
index 3806aaa..a11f272 100644 (file)
--- a/dsp.c
+++ b/dsp.c
@@ -58,34 +58,41 @@ ASTERISK_FILE_VERSION(__FILE__, "$Revision$")
 #include "asterisk/dsp.h"
 #include "asterisk/ulaw.h"
 #include "asterisk/alaw.h"
+#include "asterisk/utils.h"
 
-/* Number of goertzels for progress detect */
-#define GSAMP_SIZE_NA 183                      /* North America - 350, 440, 480, 620, 950, 1400, 1800 Hz */
-#define GSAMP_SIZE_CR 188                      /* Costa Rica, Brazil - Only care about 425 Hz */
-#define GSAMP_SIZE_UK 160                      /* UK disconnect goertzel feed - shoud trigger 400hz */
-
-#define PROG_MODE_NA           0
-#define PROG_MODE_CR           1       
-#define PROG_MODE_UK           2       
-
-/* For US modes */
-#define HZ_350  0
-#define HZ_440  1
-#define HZ_480  2
-#define HZ_620  3
-#define HZ_950  4
-#define HZ_1400 5
-#define HZ_1800 6
+/*! Number of goertzels for progress detect */
+enum gsamp_size {
+       GSAMP_SIZE_NA = 183,                    /*!< North America - 350, 440, 480, 620, 950, 1400, 1800 Hz */
+       GSAMP_SIZE_CR = 188,                    /*!< Costa Rica, Brazil - Only care about 425 Hz */
+       GSAMP_SIZE_UK = 160                     /*!< UK disconnect goertzel feed - should trigger 400hz */
+};
 
-/* For CR/BR modes */
-#define HZ_425 0
+enum prog_mode {
+       PROG_MODE_NA = 0,
+       PROG_MODE_CR,
+       PROG_MODE_UK
+};
 
-/* For UK mode */
-#define HZ_400 0
+enum freq_index { 
+       /*! For US modes { */
+       HZ_350 = 0,
+       HZ_440,
+       HZ_480,
+       HZ_620,
+       HZ_950,
+       HZ_1400,
+       HZ_1800, /*!< } */
+
+       /*! For CR/BR modes */
+       HZ_425 = 0,
+
+       /*! For UK mode */
+       HZ_400 = 0
+};
 
 static struct progalias {
        char *name;
-       int mode;
+       enum prog_mode mode;
 } aliases[] = {
        { "us", PROG_MODE_NA },
        { "ca", PROG_MODE_NA },
@@ -95,39 +102,42 @@ static struct progalias {
 };
 
 static struct progress {
-       int size;
+       enum gsamp_size size;
        int freqs[7];
 } modes[] = {
-       { GSAMP_SIZE_NA, { 350, 440, 480, 620, 950, 1400, 1800 } },     /* North America */
-       { GSAMP_SIZE_CR, { 425 } },
-       { GSAMP_SIZE_UK, { 400 } },
+       { GSAMP_SIZE_NA, { 350, 440, 480, 620, 950, 1400, 1800 } },     /*!< North America */
+       { GSAMP_SIZE_CR, { 425 } },                                     /*!< Costa Rica, Brazil */
+       { GSAMP_SIZE_UK, { 400 } },                                     /*!< UK */
 };
 
 #define DEFAULT_THRESHOLD      512
 
-#define BUSY_PERCENT           10      /* The percentage difference between the two last silence periods */
-#define BUSY_PAT_PERCENT       7       /* The percentage difference between measured and actual pattern */
-#define BUSY_THRESHOLD         100     /* Max number of ms difference between max and min times in busy */
-#define BUSY_MIN               75      /* Busy must be at least 80 ms in half-cadence */
-#define BUSY_MAX               3100    /* Busy can't be longer than 3100 ms in half-cadence */
+enum busy_detect {
+       BUSY_PERCENT = 10,      /*!< The percentage difference between the two last silence periods */
+       BUSY_PAT_PERCENT = 7,   /*!< The percentage difference between measured and actual pattern */
+       BUSY_THRESHOLD = 100,   /*!< Max number of ms difference between max and min times in busy */
+       BUSY_MIN = 75,          /*!< Busy must be at least 80 ms in half-cadence */
+       BUSY_MAX =3100          /*!< Busy can't be longer than 3100 ms in half-cadence */
+};
 
-/* Remember last 15 units */
+/*! Remember last 15 units */
 #define DSP_HISTORY            15
 
-/* Define if you want the fax detector -- NOT RECOMMENDED IN -STABLE */
+/*! Define if you want the fax detector -- NOT RECOMMENDED IN -STABLE */
 #define FAX_DETECT
 
-#define TONE_THRESH            10.0    /* How much louder the tone should be than channel energy */
-#define TONE_MIN_THRESH        1e8     /* How much tone there should be at least to attempt */
-
-                                       /* All THRESH_XXX values are in GSAMP_SIZE chunks (us = 22ms) */
-#define THRESH_RING            8       /* Need at least 150ms ring to accept */
-#define THRESH_TALK            2       /* Talk detection does not work continously */
-#define THRESH_BUSY            4       /* Need at least 80ms to accept */
-#define THRESH_CONGESTION      4       /* Need at least 80ms to accept */
-#define THRESH_HANGUP          60      /* Need at least 1300ms to accept hangup */
-#define THRESH_RING2ANSWER     300     /* Timeout from start of ring to answer (about 6600 ms) */
-
+#define TONE_THRESH            10.0    /*!< How much louder the tone should be than channel energy */
+#define TONE_MIN_THRESH        1e8     /*!< How much tone there should be at least to attempt */
+
+/*! All THRESH_XXX values are in GSAMP_SIZE chunks (us = 22ms) */
+enum gsamp_thresh {
+       THRESH_RING = 8,                /*!< Need at least 150ms ring to accept */
+       THRESH_TALK = 2,                /*!< Talk detection does not work continuously */
+       THRESH_BUSY = 4,                /*!< Need at least 80ms to accept */
+       THRESH_CONGESTION = 4,          /*!< Need at least 80ms to accept */
+       THRESH_HANGUP = 60,             /*!< Need at least 1300ms to accept hangup */
+       THRESH_RING2ANSWER = 300        /*!< Timeout from start of ring to answer (about 6600 ms) */
+};
 
 #define        MAX_DTMF_DIGITS         128
 
@@ -331,8 +341,8 @@ struct ast_dsp {
        goertzel_state_t freqs[7];
        int freqcount;
        int gsamps;
-       int gsamp_size;
-       int progmode;
+       enum gsamp_size gsamp_size;
+       enum prog_mode progmode;
        int tstate;
        int tcount;
        int digitmode;
@@ -1434,8 +1444,7 @@ struct ast_frame *ast_dsp_process(struct ast_channel *chan, struct ast_dsp *dsp,
                len = af->datalen / 2;
                break;
        case AST_FORMAT_ULAW:
-               shortdata = alloca(af->datalen * 2);
-               if (!shortdata) {
+               if (!(shortdata = alloca(af->datalen * 2))) {
                        ast_log(LOG_WARNING, "Unable to allocate stack space for data: %s\n", strerror(errno));
                        return af;
                }
@@ -1443,8 +1452,7 @@ struct ast_frame *ast_dsp_process(struct ast_channel *chan, struct ast_dsp *dsp,
                        shortdata[x] = AST_MULAW(odata[x]);
                break;
        case AST_FORMAT_ALAW:
-               shortdata = alloca(af->datalen * 2);
-               if (!shortdata) {
+               if (!(shortdata = alloca(af->datalen * 2))) {
                        ast_log(LOG_WARNING, "Unable to allocate stack space for data: %s\n", strerror(errno));
                        return af;
                }
@@ -1607,10 +1615,8 @@ static void ast_dsp_prog_reset(struct ast_dsp *dsp)
 struct ast_dsp *ast_dsp_new(void)
 {
        struct ast_dsp *dsp;
-
-       dsp = malloc(sizeof(struct ast_dsp));
-       if (dsp) {
-               memset(dsp, 0, sizeof(struct ast_dsp));
+       
+       if ((dsp = ast_calloc(1, sizeof(*dsp)))) {              
                dsp->threshold = DEFAULT_THRESHOLD;
                dsp->features = DSP_FEATURE_SILENCE_SUPPRESS;
                dsp->busycount = DSP_HISTORY;