summaryrefslogtreecommitdiff
path: root/main/pbx.c
diff options
context:
space:
mode:
Diffstat (limited to 'main/pbx.c')
-rw-r--r--main/pbx.c20
1 files changed, 16 insertions, 4 deletions
diff --git a/main/pbx.c b/main/pbx.c
index ef04d6644..3195da3bc 100644
--- a/main/pbx.c
+++ b/main/pbx.c
@@ -9559,6 +9559,7 @@ struct async_stat {
int timeout;
char app[AST_MAX_EXTENSION];
char appdata[1024];
+ int early_media; /* Connect the bridge if early media arrives, don't wait for answer */
};
static void *async_wait(void *data)
@@ -9569,6 +9570,7 @@ static void *async_wait(void *data)
int res;
struct ast_frame *f;
struct ast_app *app;
+ int have_early_media = 0;
if (chan) {
struct ast_callid *callid = ast_channel_callid(chan);
@@ -9593,10 +9595,18 @@ static void *async_wait(void *data)
ast_frfree(f);
break;
}
+ if (as->early_media && f->subclass.integer == AST_CONTROL_PROGRESS) {
+ have_early_media = 1;
+ ast_frfree(f);
+ break;
+ }
}
ast_frfree(f);
}
- if (ast_channel_state(chan) == AST_STATE_UP) {
+ if (ast_channel_state(chan) == AST_STATE_UP || have_early_media) {
+ if (have_early_media) {
+ ast_debug(2, "Activating pbx since we have early media \n");
+ }
if (!ast_strlen_zero(as->app)) {
app = pbx_findapp(as->app);
if (app) {
@@ -9657,7 +9667,7 @@ static int ast_pbx_outgoing_cdr_failed(void)
return 0; /* success */
}
-int ast_pbx_outgoing_exten(const char *type, struct ast_format_cap *cap, const char *addr, int timeout, const char *context, const char *exten, int priority, int *reason, int synchronous, const char *cid_num, const char *cid_name, struct ast_variable *vars, const char *account, struct ast_channel **channel)
+int ast_pbx_outgoing_exten(const char *type, struct ast_format_cap *cap, const char *addr, int timeout, const char *context, const char *exten, int priority, int *reason, int synchronous, const char *cid_num, const char *cid_name, struct ast_variable *vars, const char *account, struct ast_channel **channel, int early_media)
{
struct ast_channel *chan;
struct async_stat *as;
@@ -9666,6 +9676,8 @@ int ast_pbx_outgoing_exten(const char *type, struct ast_format_cap *cap, const c
int res = -1, cdr_res = -1;
struct outgoing_helper oh;
+ oh.connect_on_early_media = early_media;
+
callid_created = ast_callid_threadstorage_auto(&callid);
if (synchronous) {
@@ -9695,9 +9707,9 @@ int ast_pbx_outgoing_exten(const char *type, struct ast_format_cap *cap, const c
}
}
- if (ast_channel_state(chan) == AST_STATE_UP) {
+ if (ast_channel_state(chan) == AST_STATE_UP || (early_media && *reason == AST_CONTROL_PROGRESS)) {
res = 0;
- ast_verb(4, "Channel %s was answered.\n", ast_channel_name(chan));
+ ast_verb(4, "Channel %s %s\n", ast_channel_name(chan), ast_channel_state(chan) == AST_STATE_UP ? "was answered" : "got early media");
if (synchronous > 1) {
if (channel)