diff options
-rw-r--r-- | channels/chan_dahdi.c | 75 | ||||
-rw-r--r-- | channels/sig_analog.c | 102 | ||||
-rw-r--r-- | channels/sig_analog.h | 25 |
3 files changed, 164 insertions, 38 deletions
diff --git a/channels/chan_dahdi.c b/channels/chan_dahdi.c index 33d17d64a..2477100d5 100644 --- a/channels/chan_dahdi.c +++ b/channels/chan_dahdi.c @@ -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]; diff --git a/channels/sig_analog.c b/channels/sig_analog.c index ce3da7b60..29ea11680 100644 --- a/channels/sig_analog.c +++ b/channels/sig_analog.c @@ -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: diff --git a/channels/sig_analog.h b/channels/sig_analog.h index de86662df..5993e9f54 100644 --- a/channels/sig_analog.h +++ b/channels/sig_analog.h @@ -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]; |