aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--apps/app_disa.c6
-rw-r--r--apps/app_playback.c6
-rw-r--r--channels/chan_sip.c14
-rw-r--r--configs/sip.conf.sample7
-rw-r--r--main/pbx.c2
5 files changed, 30 insertions, 5 deletions
diff --git a/apps/app_disa.c b/apps/app_disa.c
index bc2970f43..db09c9edb 100644
--- a/apps/app_disa.c
+++ b/apps/app_disa.c
@@ -187,8 +187,12 @@ static int disa_exec(struct ast_channel *chan, void *data)
/* answer */
ast_answer(chan);
}
- } else
+ } else {
special_noanswer = 1;
+ if (chan->_state != AST_STATE_UP) {
+ ast_indicate(chan, AST_CONTROL_PROGRESS);
+ }
+ }
ast_debug(1, "Context: %s\n",args.context);
diff --git a/apps/app_playback.c b/apps/app_playback.c
index c32fccc1e..5e65f3a32 100644
--- a/apps/app_playback.c
+++ b/apps/app_playback.c
@@ -449,9 +449,13 @@ static int playback_exec(struct ast_channel *chan, void *data)
if (option_skip) {
/* At the user's option, skip if the line is not up */
goto done;
- } else if (!option_noanswer)
+ } else if (!option_noanswer) {
/* Otherwise answer unless we're supposed to send this while on-hook */
res = ast_answer(chan);
+ } else {
+ ast_indicate(chan, AST_CONTROL_PROGRESS);
+ }
+
}
if (!res) {
char *back = args.filenames;
diff --git a/channels/chan_sip.c b/channels/chan_sip.c
index f65d8b76f..b598e2c5f 100644
--- a/channels/chan_sip.c
+++ b/channels/chan_sip.c
@@ -1080,6 +1080,8 @@ static struct sip_settings sip_cfg;
static int global_match_auth_username; /*!< Match auth username if available instead of From: Default off. */
static int global_relaxdtmf; /*!< Relax DTMF */
+static int global_prematuremediafilter; /*!< Enable/disable premature frames in a call (causing 183 early media) */
+static int global_relaxdtmf; /*!< Relax DTMF */
static int global_rtptimeout; /*!< Time out call if no RTP */
static int global_rtpholdtimeout; /*!< Time out call if no RTP during hold */
static int global_rtpkeepalive; /*!< Send RTP keepalives */
@@ -5999,9 +6001,11 @@ static int sip_write(struct ast_channel *ast, struct ast_frame *frame)
!ast_test_flag(&p->flags[0], SIP_PROGRESS_SENT) &&
!ast_test_flag(&p->flags[0], SIP_OUTGOING)) {
ast_rtp_new_source(p->rtp);
- p->invitestate = INV_EARLY_MEDIA;
- transmit_provisional_response(p, "183 Session Progress", &p->initreq, TRUE);
- ast_set_flag(&p->flags[0], SIP_PROGRESS_SENT);
+ if (!global_prematuremediafilter) {
+ p->invitestate = INV_EARLY_MEDIA;
+ transmit_provisional_response(p, "183 Session Progress", &p->initreq, TRUE);
+ ast_set_flag(&p->flags[0], SIP_PROGRESS_SENT);
+ }
} else if (p->t38.state == T38_ENABLED) {
change_t38_state(p, T38_DISABLED);
transmit_reinvite_with_sdp(p, FALSE, FALSE);
@@ -15579,6 +15583,7 @@ static char *sip_show_settings(struct ast_cli_entry *e, int cmd, struct ast_cli_
ast_cli(a->fd, " Timer T1: %d\n", global_t1);
ast_cli(a->fd, " Timer T1 minimum: %d\n", global_t1min);
ast_cli(a->fd, " Timer B: %d\n", global_timer_b);
+ ast_cli(a->fd, " No premature media: %s\n", global_prematuremediafilter ? "Yes" : "No");
ast_cli(a->fd, "\nDefault Settings:\n");
ast_cli(a->fd, "-----------------\n");
@@ -23723,6 +23728,7 @@ static int reload_config(enum channelreloadreason reason)
snprintf(global_useragent, sizeof(global_useragent), "%s %s", DEFAULT_USERAGENT, ast_get_version());
snprintf(global_sdpsession, sizeof(global_sdpsession), "%s %s", DEFAULT_SDPSESSION, ast_get_version());
snprintf(global_sdpowner, sizeof(global_sdpowner), "%s", DEFAULT_SDPOWNER);
+ global_prematuremediafilter = TRUE;
ast_copy_string(default_notifymime, DEFAULT_NOTIFYMIME, sizeof(default_notifymime));
ast_copy_string(sip_cfg.realm, S_OR(ast_config_AST_SYSTEM_NAME, DEFAULT_REALM), sizeof(sip_cfg.realm));
ast_copy_string(default_callerid, DEFAULT_CALLERID, sizeof(default_callerid));
@@ -23908,6 +23914,8 @@ static int reload_config(enum channelreloadreason reason)
ast_set2_flag(&global_flags[1], i || ast_true(v->value), SIP_PAGE2_RTAUTOCLEAR);
} else if (!strcasecmp(v->name, "usereqphone")) {
ast_set2_flag(&global_flags[0], ast_true(v->value), SIP_USEREQPHONE);
+ } else if (!strcasecmp(v->name, "prematuremedia")) {
+ global_prematuremediafilter = ast_true(v->value);
} else if (!strcasecmp(v->name, "relaxdtmf")) {
global_relaxdtmf = ast_true(v->value);
} else if (!strcasecmp(v->name, "vmexten")) {
diff --git a/configs/sip.conf.sample b/configs/sip.conf.sample
index 0dbc53612..a77745f0c 100644
--- a/configs/sip.conf.sample
+++ b/configs/sip.conf.sample
@@ -209,6 +209,13 @@ srvlookup=yes ; Enable DNS SRV lookups on outbound calls
;relaxdtmf=yes ; Relax dtmf handling
;trustrpid = no ; If Remote-Party-ID should be trusted
;sendrpid = yes ; If Remote-Party-ID should be sent
+;prematuremedia=no ; Some ISDN links send empty media frames before
+ ; the call is in ringing or progress state. The SIP
+ ; channel will then send 183 indicating early media
+ ; which will be empty - thus users get no ring signal.
+ ; Setting this to "no" will stop any media before we have
+ ; call progress. Default is "yes".
+
;progressinband=never ; If we should generate in-band ringing always
; use 'never' to never use in-band signalling, even in cases
; where some buggy devices might not render it
diff --git a/main/pbx.c b/main/pbx.c
index 824788f88..55dc233e3 100644
--- a/main/pbx.c
+++ b/main/pbx.c
@@ -8810,6 +8810,8 @@ static int pbx_builtin_background(struct ast_channel *chan, void *data)
} else if (!ast_test_flag(&flags, BACKGROUND_NOANSWER)) {
res = ast_answer(chan);
}
+ /* Send progress control frame to start early media */
+ ast_indicate(chan, AST_CONTROL_PROGRESS);
}
if (!res) {