diff --git a/apps/app_voicemail.c b/apps/app_voicemail.c
index 0b9904cf4a..67562da5f1 100644
--- a/apps/app_voicemail.c
+++ b/apps/app_voicemail.c
@@ -135,6 +135,10 @@
Accept digits for a new extension in context c ,
if played during the greeting. Context defaults to the current context.
+
+ Play greetings as early media -- only answer the channel just
+ before accepting the voice message.
+
Use the specified amount of gain when recording the voicemail
@@ -627,7 +631,8 @@ enum vm_option_flags {
OPT_AUTOPLAY = (1 << 6),
OPT_DTMFEXIT = (1 << 7),
OPT_MESSAGE_Urgent = (1 << 8),
- OPT_MESSAGE_PRIORITY = (1 << 9)
+ OPT_MESSAGE_PRIORITY = (1 << 9),
+ OPT_EARLYM_GREETING = (1 << 10)
};
enum vm_option_args {
@@ -653,7 +658,8 @@ AST_APP_OPTIONS(vm_app_options, {
AST_APP_OPTION('p', OPT_PREPEND_MAILBOX),
AST_APP_OPTION_ARG('a', OPT_AUTOPLAY, OPT_ARG_PLAYFOLDER),
AST_APP_OPTION('U', OPT_MESSAGE_Urgent),
- AST_APP_OPTION('P', OPT_MESSAGE_PRIORITY)
+ AST_APP_OPTION('P', OPT_MESSAGE_PRIORITY),
+ AST_APP_OPTION('e', OPT_EARLYM_GREETING)
});
static const char * const mailbox_folders[] = {
@@ -6905,6 +6911,8 @@ static int leave_voicemail(struct ast_channel *chan, char *ext, struct leave_vm_
return -1;
}
/* The meat of recording the message... All the announcements and beeps have been played*/
+ if (ast_channel_state(chan) != AST_STATE_UP)
+ ast_answer(chan);
ast_copy_string(fmt, vmfmts, sizeof(fmt));
if (!ast_strlen_zero(fmt)) {
char msg_id[MSG_ID_LEN] = "";
@@ -12310,9 +12318,6 @@ static int vm_exec(struct ast_channel *chan, const char *data)
memset(&leave_options, 0, sizeof(leave_options));
- if (ast_channel_state(chan) != AST_STATE_UP)
- ast_answer(chan);
-
if (!ast_strlen_zero(data)) {
tmp = ast_strdupa(data);
AST_STANDARD_APP_ARGS(args, tmp);
@@ -12345,6 +12350,15 @@ static int vm_exec(struct ast_channel *chan, const char *data)
args.argv0 = ast_strdupa(temp);
}
+ if (ast_channel_state(chan) != AST_STATE_UP) {
+ if (ast_test_flag(&flags, OPT_EARLYM_GREETING)) {
+ ast_indicate(chan, AST_CONTROL_PROGRESS);
+ ast_log(AST_LOG_WARNING, "Playing greetings as Early Media, deferring answer (EXPERIMENTAL FEATURE)\n");
+ } else {
+ ast_answer(chan);
+ }
+ }
+
res = leave_voicemail(chan, args.argv0, &leave_options);
if (res == 't') {
ast_play_and_wait(chan, "vm-goodbye");