Add a few missing events to analog_handle_event.
authorJeff Peeler <jpeeler@digium.com>
Mon, 5 Oct 2009 19:20:36 +0000 (19:20 +0000)
committerJeff Peeler <jpeeler@digium.com>
Mon, 5 Oct 2009 19:20:36 +0000 (19:20 +0000)
The reported bug was actually only for pulsedigit, dtmfup, and dtmfdown
handling. Also added recognition for fax events (just some verbose output) and
fixed handling for the ec_disabled_event. In order to make comparing the analog
version of events to the DAHDI events easier, the ordering has been changed to
follow that of the DAHDI events.

(closes issue #15924)
Reported by: tzafrir

git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@222108 65c4cc65-6c06-0410-ace0-fbb531ad65f3

channels/chan_dahdi.c
channels/sig_analog.c
channels/sig_analog.h

index 33d17d6..2477100 100644 (file)
@@ -2118,6 +2118,18 @@ static void my_cancel_cidspill(void *pvt)
        }
 }
 
+static int my_confmute(void *pvt, int mute)
+{
+       struct dahdi_pvt *p = pvt;
+       return dahdi_confmute(p, mute);
+}
+
+static void my_set_pulsedial(void *pvt, int flag)
+{
+       struct dahdi_pvt *p = pvt;
+       p->pulsedial = flag;
+}
+
 static void my_increase_ss_count(void)
 {
        ast_mutex_lock(&ss_thread_lock);
@@ -2370,32 +2382,26 @@ static int my_play_tone(void *pvt, enum analog_sub sub, enum analog_tone tone)
 
 static enum analog_event dahdievent_to_analogevent(int event)
 {
-       enum analog_event res = ANALOG_EVENT_ERROR;
+       enum analog_event res;
 
        switch (event) {
-       case DAHDI_EVENT_DIALCOMPLETE:
-               res = ANALOG_EVENT_DIALCOMPLETE;
-               break;
-       case DAHDI_EVENT_WINKFLASH:
-               res = ANALOG_EVENT_WINKFLASH;
-               break;
        case DAHDI_EVENT_ONHOOK:
                res = ANALOG_EVENT_ONHOOK;
                break;
        case DAHDI_EVENT_RINGOFFHOOK:
                res = ANALOG_EVENT_RINGOFFHOOK;
                break;
+       case DAHDI_EVENT_WINKFLASH:
+               res = ANALOG_EVENT_WINKFLASH;
+               break;
        case DAHDI_EVENT_ALARM:
                res = ANALOG_EVENT_ALARM;
                break;
        case DAHDI_EVENT_NOALARM:
                res = ANALOG_EVENT_NOALARM;
                break;
-       case DAHDI_EVENT_HOOKCOMPLETE:
-               res = ANALOG_EVENT_HOOKCOMPLETE;
-               break;
-       case DAHDI_EVENT_POLARITY:
-               res = ANALOG_EVENT_POLARITY;
+       case DAHDI_EVENT_DIALCOMPLETE:
+               res = ANALOG_EVENT_DIALCOMPLETE;
                break;
        case DAHDI_EVENT_RINGERON:
                res = ANALOG_EVENT_RINGERON;
@@ -2403,21 +2409,56 @@ static enum analog_event dahdievent_to_analogevent(int event)
        case DAHDI_EVENT_RINGEROFF:
                res = ANALOG_EVENT_RINGEROFF;
                break;
-       case DAHDI_EVENT_RINGBEGIN:
-               res = ANALOG_EVENT_RINGBEGIN;
+       case DAHDI_EVENT_HOOKCOMPLETE:
+               res = ANALOG_EVENT_HOOKCOMPLETE;
                break;
        case DAHDI_EVENT_PULSE_START:
                res = ANALOG_EVENT_PULSE_START;
-       break;
+               break;
+       case DAHDI_EVENT_POLARITY:
+               res = ANALOG_EVENT_POLARITY;
+               break;
+       case DAHDI_EVENT_RINGBEGIN:
+               res = ANALOG_EVENT_RINGBEGIN;
+               break;
+       case DAHDI_EVENT_EC_DISABLED:
+               res = ANALOG_EVENT_EC_DISABLED;
+               break;
        case DAHDI_EVENT_REMOVED:
                res = ANALOG_EVENT_REMOVED;
-       break;
+               break;
        case DAHDI_EVENT_NEONMWI_ACTIVE:
                res = ANALOG_EVENT_NEONMWI_ACTIVE;
                break;
        case DAHDI_EVENT_NEONMWI_INACTIVE:
                res = ANALOG_EVENT_NEONMWI_INACTIVE;
                break;
+#ifdef HAVE_DAHDI_ECHOCANCEL_FAX_MODE
+       case DAHDI_EVENT_TX_CED_DETECTED:
+               res = ANALOG_EVENT_TX_CED_DETECTED;
+               break;
+       case DAHDI_EVENT_RX_CED_DETECTED:
+               res = ANALOG_EVENT_RX_CED_DETECTED;
+               break;
+       case DAHDI_EVENT_EC_NLP_DISABLED:
+               res = ANALOG_EVENT_EC_NLP_DISABLED;
+               break;
+       case DAHDI_EVENT_EC_NLP_ENABLED:
+               res = ANALOG_EVENT_EC_NLP_ENABLED;
+               break;
+#endif
+       case DAHDI_EVENT_PULSEDIGIT:
+               res = ANALOG_EVENT_PULSEDIGIT;
+               break;
+       case DAHDI_EVENT_DTMFDOWN:
+               res = ANALOG_EVENT_DTMFDOWN;
+               break;
+       case DAHDI_EVENT_DTMFUP:
+               res = ANALOG_EVENT_DTMFUP;
+               break;
+       default:
+               res = ANALOG_EVENT_ERROR;
+               break;
        }
 
        return res;
@@ -2846,6 +2887,8 @@ static struct analog_callback dahdi_analog_callbacks =
        .set_confirmanswer = my_set_confirmanswer,
        .check_confirmanswer = my_check_confirmanswer,
        .cancel_cidspill = my_cancel_cidspill,
+       .confmute = my_confmute,
+       .set_pulsedial = my_set_pulsedial,
 };
 
 static struct dahdi_pvt *round_robin[32];
index ce3da7b..29ea116 100644 (file)
@@ -220,42 +220,45 @@ static char *analog_event2str(enum analog_event event)
 {
        char *res;
        switch (event) {
-       case ANALOG_EVENT_DIALCOMPLETE:
-               res = "ANALOG_EVENT_DIALCOMPLETE";
-               break;
-       case ANALOG_EVENT_WINKFLASH:
-               res = "ANALOG_EVENT_WINKFLASH";
-               break;
        case ANALOG_EVENT_ONHOOK:
                res = "ANALOG_EVENT_ONHOOK";
                break;
        case ANALOG_EVENT_RINGOFFHOOK:
                res = "ANALOG_EVENT_RINGOFFHOOK";
                break;
+       case ANALOG_EVENT_WINKFLASH:
+               res = "ANALOG_EVENT_WINKFLASH";
+               break;
        case ANALOG_EVENT_ALARM:
                res = "ANALOG_EVENT_ALARM";
                break;
        case ANALOG_EVENT_NOALARM:
                res = "ANALOG_EVENT_NOALARM";
                break;
+       case ANALOG_EVENT_DIALCOMPLETE:
+               res = "ANALOG_EVENT_DIALCOMPLETE";
+               break;
        case ANALOG_EVENT_HOOKCOMPLETE:
                res = "ANALOG_EVENT_HOOKCOMPLETE";
                break;
+       case ANALOG_EVENT_PULSE_START:
+               res = "ANALOG_EVENT_PULSE_START";
+               break;
        case ANALOG_EVENT_POLARITY:
                res = "ANALOG_EVENT_POLARITY";
                break;
+       case ANALOG_EVENT_RINGBEGIN:
+               res = "ANALOG_EVENT_RINGBEGIN";
+               break;
+       case ANALOG_EVENT_EC_DISABLED:
+               res = "ANALOG_EVENT_EC_DISABLED";
+               break;
        case ANALOG_EVENT_RINGERON:
                res = "ANALOG_EVENT_RINGERON";
                break;
        case ANALOG_EVENT_RINGEROFF:
                res = "ANALOG_EVENT_RINGEROFF";
                break;
-       case ANALOG_EVENT_RINGBEGIN:
-               res = "ANALOG_EVENT_RINGBEGIN";
-               break;
-       case ANALOG_EVENT_PULSE_START:
-               res = "ANALOG_EVENT_PULSE_START";
-               break;
        case ANALOG_EVENT_REMOVED:
                res = "ANALOG_EVENT_REMOVED";
                break;
@@ -265,6 +268,29 @@ static char *analog_event2str(enum analog_event event)
        case ANALOG_EVENT_NEONMWI_INACTIVE:
                res = "ANALOG_EVENT_NEONMWI_INACTIVE";
                break;
+#ifdef HAVE_DAHDI_ECHOCANCEL_FAX_MODE
+       case ANALOG_EVENT_TX_CED_DETECTED:
+               res = "ANALOG_EVENT_TX_CED_DETECTED";
+               break;
+       case ANALOG_EVENT_RX_CED_DETECTED:
+               res = "ANALOG_EVENT_RX_CED_DETECTED";
+               break;
+       case ANALOG_EVENT_EC_NLP_DISABLED:
+               res = "ANALOG_EVENT_EC_NLP_DISABLED";
+               break;
+       case ANALOG_EVENT_EC_NLP_ENABLED:
+               res = "ANALOG_EVENT_EC_NLP_ENABLED";
+               break;
+#endif
+       case ANALOG_EVENT_PULSEDIGIT:
+               res = "ANALOG_EVENT_PULSEDIGIT";
+               break;
+       case ANALOG_EVENT_DTMFDOWN:
+               res = "ANALOG_EVENT_DTMFDOWN";
+               break;
+       case ANALOG_EVENT_DTMFUP:
+               res = "ANALOG_EVENT_DTMFUP";
+               break;
        default:
                res = "UNKNOWN/OTHER";
                break;
@@ -783,6 +809,22 @@ static void analog_cancel_cidspill(struct analog_pvt *p)
        p->calls->cancel_cidspill(p->chan_pvt);
 }
 
+static int analog_confmute(struct analog_pvt *p, int mute)
+{
+       if (p->calls->confmute) {
+               return p->calls->confmute(p->chan_pvt, mute);
+       }
+       return 0;
+}
+
+static void analog_set_pulsedial(struct analog_pvt *p, int flag)
+{
+       if (!p->calls->set_pulsedial) {
+               return;
+       }
+       p->calls->set_pulsedial(p->chan_pvt, flag);
+}
+
 static int analog_set_linear_mode(struct analog_pvt *p, int index, int linear_mode)
 {
        if (p->calls->set_linear_mode) {
@@ -1167,6 +1209,7 @@ int analog_hangup(struct analog_pvt *p, struct ast_channel *ast)
                p->owner = NULL;
                analog_set_ringtimeout(p, 0);
                analog_set_confirmanswer(p, 0);
+               analog_set_pulsedial(p, 0);
                p->outgoing = 0;
                p->onhooktime = time(NULL);
                p->cidrings = 1;
@@ -2332,11 +2375,42 @@ static struct ast_frame *__analog_handle_event(struct analog_pvt *p, struct ast_
 
        ast_debug(1, "Got event %s(%d) on channel %d (index %d)\n", analog_event2str(res), res, p->channel, index);
 
+       if (res & (ANALOG_EVENT_PULSEDIGIT | ANALOG_EVENT_DTMFUP)) {
+               analog_set_pulsedial(p, (res & ANALOG_EVENT_PULSEDIGIT));
+               ast_debug(1, "Detected %sdigit '%c'\n", (res & ANALOG_EVENT_PULSEDIGIT) ? "pulse ": "", res & 0xff);
+               analog_confmute(p, 0);
+               p->subs[index].f.frametype = AST_FRAME_DTMF_END;
+               p->subs[index].f.subclass = res & 0xff;
+               analog_handle_dtmfup(p, ast, index, &f);
+               return f;
+       }
+
+       if (res & ANALOG_EVENT_DTMFDOWN) {
+               ast_debug(1, "DTMF Down '%c'\n", res & 0xff);
+               /* Mute conference */
+               analog_confmute(p, 1);
+               p->subs[index].f.frametype = AST_FRAME_DTMF_BEGIN;
+               p->subs[index].f.subclass = res & 0xff;
+               return f;
+       }
+
        switch (res) {
-#ifdef ANALOG_EVENT_EC_DISABLED
        case ANALOG_EVENT_EC_DISABLED:
                ast_verb(3, "Channel %d echo canceler disabled due to CED detection\n", p->channel);
-               p->echocanon = 0;
+               analog_set_echocanceller(p, 0);
+               break;
+#ifdef HAVE_DAHDI_ECHOCANCEL_FAX_MODE
+       case ANALOG_EVENT_TX_CED_DETECTED:
+               ast_verb(3, "Channel %d detected a CED tone towards the network.\n", p->channel);
+               break;
+       case ANALOG_EVENT_RX_CED_DETECTED:
+               ast_verb(3, "Channel %d detected a CED tone from the network.\n", p->channel);
+               break;
+       case ANALOG_EVENT_EC_NLP_DISABLED:
+               ast_verb(3, "Channel %d echo canceler disabled its NLP.\n", p->channel);
+               break;
+       case ANALOG_EVENT_EC_NLP_ENABLED:
+               ast_verb(3, "Channel %d echo canceler enabled its NLP.\n", p->channel);
                break;
 #endif
        case ANALOG_EVENT_PULSE_START:
index de86662..5993e9f 100644 (file)
@@ -65,23 +65,31 @@ enum analog_tone {
 
 enum analog_event {
        ANALOG_EVENT_NONE = 0,
-       ANALOG_EVENT_DIALCOMPLETE,
-       ANALOG_EVENT_WINKFLASH,
        ANALOG_EVENT_ONHOOK,
        ANALOG_EVENT_RINGOFFHOOK,
+       ANALOG_EVENT_WINKFLASH,
        ANALOG_EVENT_ALARM,
        ANALOG_EVENT_NOALARM,
-       ANALOG_EVENT_HOOKCOMPLETE,
-       ANALOG_EVENT_POLARITY,
+       ANALOG_EVENT_DIALCOMPLETE,
        ANALOG_EVENT_RINGERON,
        ANALOG_EVENT_RINGEROFF,
-       ANALOG_EVENT_RINGBEGIN,
+       ANALOG_EVENT_HOOKCOMPLETE,
        ANALOG_EVENT_PULSE_START,
-       ANALOG_EVENT_ERROR,
+       ANALOG_EVENT_POLARITY,
+       ANALOG_EVENT_RINGBEGIN,
+       ANALOG_EVENT_EC_DISABLED,
        ANALOG_EVENT_REMOVED,
        ANALOG_EVENT_NEONMWI_ACTIVE,
        ANALOG_EVENT_NEONMWI_INACTIVE,
-       ANALOG_EVENT_DTMFCID,
+       ANALOG_EVENT_TX_CED_DETECTED,
+       ANALOG_EVENT_RX_CED_DETECTED,
+       ANALOG_EVENT_EC_NLP_DISABLED,
+       ANALOG_EVENT_EC_NLP_ENABLED,
+       ANALOG_EVENT_ERROR, /* not a DAHDI event */
+       ANALOG_EVENT_DTMFCID, /* not a DAHDI event */
+       ANALOG_EVENT_PULSEDIGIT = (1 << 16), 
+       ANALOG_EVENT_DTMFDOWN = (1 << 17),
+       ANALOG_EVENT_DTMFUP = (1 << 18),
 };
 
 enum analog_sub {
@@ -203,6 +211,8 @@ struct analog_callback {
        void (* const set_confirmanswer)(void *pvt, int flag);
        int (* const check_confirmanswer)(void *pvt);
        void (* const cancel_cidspill)(void *pvt);
+       int (* const confmute)(void *pvt, int mute);    
+       void (* const set_pulsedial)(void *pvt, int flag);
 };
 
 
@@ -279,7 +289,6 @@ struct analog_pvt {
        unsigned int echobreak:1;
        unsigned int hidecallerid:1;
        unsigned int outgoing:1;
-       unsigned int pulsedial:1;               /*!< TRUE if a pulsed digit was detected. (Pulse dial phone detected) */
 
        char callwait_num[AST_MAX_EXTENSION];
        char callwait_name[AST_MAX_EXTENSION];