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 fb8d86e5d..0e4ddb189 100644
--- a/apps/app_disa.c
+++ b/apps/app_disa.c
@@ -160,8 +160,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 cb30b7a9d..0fad48b32 100644
--- a/apps/app_playback.c
+++ b/apps/app_playback.c
@@ -426,9 +426,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 92fb7026e..3af8a3525 100644
--- a/channels/chan_sip.c
+++ b/channels/chan_sip.c
@@ -689,6 +689,8 @@ static int pedanticsipchecking; /*!< Extra checking ? Default off */
static int autocreatepeer; /*!< Auto creation of peers at registration? Default off. */
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 */
@@ -5297,9 +5299,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);
@@ -13959,6 +13963,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");
@@ -21868,6 +21873,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(global_realm, S_OR(ast_config_AST_SYSTEM_NAME, DEFAULT_REALM), sizeof(global_realm));
ast_copy_string(default_callerid, DEFAULT_CALLERID, sizeof(default_callerid));
@@ -22027,6 +22033,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 1bf3c1bec..a4ad6f391 100644
--- a/configs/sip.conf.sample
+++ b/configs/sip.conf.sample
@@ -202,6 +202,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 d51dce0a2..a81782298 100644
--- a/main/pbx.c
+++ b/main/pbx.c
@@ -7917,6 +7917,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) {