From dda40528ed446ee7e42019bd0d257e181960697c Mon Sep 17 00:00:00 2001 From: Richard Mudgett <rmudgett@digium.com> Date: Mon, 5 Mar 2012 21:48:32 +0000 Subject: [PATCH] Setup DSP when SS7 call is connected or early media is available. Outgoing SS7 calls fail to detect incoming DTMF so any bridged channel that requires out-of-band DTMF will not work. * Added sig_ss7_open_media() calls at appropriate places in sig_ss7.c. The new call converts conditionaled out unconverted code and shows that the code really did something useful. * Improved some chan_dahdi DTMF debug messages to help track DTMF handling. (closes issue ASTERISK-19312) Reported by: Igor Nikolaev ........ Merged revisions 358260 from http://svn.asterisk.org/svn/asterisk/branches/1.8 ........ Merged revisions 358261 from http://svn.asterisk.org/svn/asterisk/branches/10 git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@358262 65c4cc65-6c06-0410-ace0-fbb531ad65f3 --- channels/chan_dahdi.c | 20 ++++++++++++-------- channels/sig_ss7.c | 32 ++++++++++++++++++++------------ channels/sig_ss7.h | 1 + 3 files changed, 33 insertions(+), 20 deletions(-) diff --git a/channels/chan_dahdi.c b/channels/chan_dahdi.c index c4ce909427..21214bd88b 100644 --- a/channels/chan_dahdi.c +++ b/channels/chan_dahdi.c @@ -2637,17 +2637,17 @@ static struct ast_channel *my_new_pri_ast_channel(void *pvt, int state, enum sig static int set_actual_gain(int fd, float rxgain, float txgain, float rxdrc, float txdrc, int law); -#if defined(HAVE_PRI) +#if defined(HAVE_PRI) || defined(HAVE_SS7) /*! * \internal - * \brief Open the PRI channel media path. + * \brief Open the PRI/SS7 channel media path. * \since 1.8 * * \param p Channel private control structure. * * \return Nothing */ -static void my_pri_open_media(void *p) +static void my_pri_ss7_open_media(void *p) { struct dahdi_pvt *pvt = p; int res; @@ -2686,7 +2686,7 @@ static void my_pri_open_media(void *p) pvt->dsp_features = 0; } } -#endif /* defined(HAVE_PRI) */ +#endif /* defined(HAVE_PRI) || defined(HAVE_SS7) */ #if defined(HAVE_PRI) /*! @@ -3422,7 +3422,7 @@ static struct sig_pri_callback dahdi_pri_callbacks = .module_ref = my_module_ref, .module_unref = my_module_unref, .dial_digits = my_pri_dial_digits, - .open_media = my_pri_open_media, + .open_media = my_pri_ss7_open_media, .ami_channel_event = my_ami_channel_event, }; #endif /* defined(HAVE_PRI) */ @@ -3586,6 +3586,7 @@ static struct sig_ss7_callback dahdi_ss7_callbacks = .set_remotelyblocked = my_set_remotelyblocked, .set_callerid = my_set_callerid, .set_dnid = my_set_dnid, + .open_media = my_pri_ss7_open_media, }; #endif /* defined(HAVE_SS7) */ @@ -4500,11 +4501,13 @@ static int dahdi_digit_begin(struct ast_channel *chan, char digit) zo.dialstr[1] = digit; zo.dialstr[2] = '\0'; if ((res = ioctl(pvt->subs[SUB_REAL].dfd, DAHDI_DIAL, &zo))) - ast_log(LOG_WARNING, "Couldn't dial digit %c: %s\n", digit, strerror(errno)); + ast_log(LOG_WARNING, "Channel %s couldn't dial digit %c: %s\n", + ast_channel_name(chan), digit, strerror(errno)); else pvt->dialing = 1; } else { - ast_debug(1, "Started VLDTMF digit '%c'\n", digit); + ast_debug(1, "Channel %s started VLDTMF digit '%c'\n", + ast_channel_name(chan), digit); pvt->dialing = 1; pvt->begindigit = digit; } @@ -4540,7 +4543,8 @@ static int dahdi_digit_end(struct ast_channel *chan, char digit, unsigned int du if (pvt->begindigit) { x = -1; - ast_debug(1, "Ending VLDTMF digit '%c'\n", digit); + ast_debug(1, "Channel %s ending VLDTMF digit '%c'\n", + ast_channel_name(chan), digit); res = ioctl(pvt->subs[SUB_REAL].dfd, DAHDI_SENDTONE, &x); pvt->dialing = 0; pvt->begindigit = 0; diff --git a/channels/sig_ss7.c b/channels/sig_ss7.c index cebd6c8087..a23f9b25c1 100644 --- a/channels/sig_ss7.c +++ b/channels/sig_ss7.c @@ -151,6 +151,22 @@ static void sig_ss7_set_remotelyblocked(struct sig_ss7_chan *p, int is_blocked) } } +/*! + * \internal + * \brief Open the SS7 channel media path. + * \since 1.8.12 + * + * \param p Channel private control structure. + * + * \return Nothing + */ +static void sig_ss7_open_media(struct sig_ss7_chan *p) +{ + if (p->calls->open_media) { + p->calls->open_media(p->chan_pvt); + } +} + /*! * \internal * \brief Set the caller id information in the parent module. @@ -807,12 +823,7 @@ void *ss7_linkset(void *data) sig_ss7_queue_control(linkset, chanpos, AST_CONTROL_PROGRESS); p->progress = 1; sig_ss7_set_dialing(p, 0); -#if 0 /* This code no longer seems to be necessary so I did not convert it. */ - if (p->dsp && p->dsp_features) { - ast_dsp_set_features(p->dsp, p->dsp_features); - p->dsp_features = 0; - } -#endif + sig_ss7_open_media(p); } break; default: @@ -1184,12 +1195,8 @@ void *ss7_linkset(void *data) p->call_level = SIG_SS7_CALL_LEVEL_CONNECT; } sig_ss7_queue_control(linkset, chanpos, AST_CONTROL_ANSWER); -#if 0 /* This code no longer seems to be necessary so I did not convert it. */ - if (p->dsp && p->dsp_features) { - ast_dsp_set_features(p->dsp, p->dsp_features); - p->dsp_features = 0; - } -#endif + sig_ss7_set_dialing(p, 0); + sig_ss7_open_media(p); sig_ss7_set_echocanceller(p, 1); sig_ss7_unlock_private(p); } @@ -1622,6 +1629,7 @@ int sig_ss7_answer(struct sig_ss7_chan *p, struct ast_channel *ast) if (p->call_level < SIG_SS7_CALL_LEVEL_CONNECT) { p->call_level = SIG_SS7_CALL_LEVEL_CONNECT; } + sig_ss7_open_media(p); res = isup_anm(p->ss7->ss7, p->ss7call); ss7_rel(p->ss7); return res; diff --git a/channels/sig_ss7.h b/channels/sig_ss7.h index a69671c8d7..43e43a91ff 100644 --- a/channels/sig_ss7.h +++ b/channels/sig_ss7.h @@ -150,6 +150,7 @@ struct sig_ss7_callback { void (* const set_dnid)(void *pvt, const char *dnid); void (* const queue_control)(void *pvt, int subclass); + void (* const open_media)(void *pvt); }; struct sig_ss7_chan { -- GitLab