summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRichard Mudgett <rmudgett@digium.com>2012-03-05 21:48:32 +0000
committerRichard Mudgett <rmudgett@digium.com>2012-03-05 21:48:32 +0000
commitdda40528ed446ee7e42019bd0d257e181960697c (patch)
tree94ee4d9b203b454c9fbf61e36123c230b1fa5e8d
parent11bbc097b7d6e115ea413dd80b8deee95ee3dc63 (diff)
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
-rw-r--r--channels/chan_dahdi.c20
-rw-r--r--channels/sig_ss7.c32
-rw-r--r--channels/sig_ss7.h1
3 files changed, 33 insertions, 20 deletions
diff --git a/channels/chan_dahdi.c b/channels/chan_dahdi.c
index c4ce90942..21214bd88 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 cebd6c808..a23f9b25c 100644
--- a/channels/sig_ss7.c
+++ b/channels/sig_ss7.c
@@ -153,6 +153,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.
* \since 1.8
*
@@ -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 a69671c8d..43e43a91f 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 {