diff --git a/apps/app_voicemail.c b/apps/app_voicemail.c index c830ec3c60e068a60bccd42971f6359f6aa7100e..1bb736bf84390b099e9a761a991c1450066d5dfc 100644 --- a/apps/app_voicemail.c +++ b/apps/app_voicemail.c @@ -135,6 +135,10 @@ <para>Accept digits for a new extension in context <replaceable>c</replaceable>, if played during the greeting. Context defaults to the current context.</para> </option> + <option name="e"> + <para>Play greetings as early media -- only answer the channel just + before accepting the voice message.</para> + </option> <option name="g"> <argument name="#" required="true" /> <para>Use the specified amount of gain when recording the voicemail @@ -577,7 +581,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 { @@ -603,7 +608,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[] = { @@ -6854,6 +6860,9 @@ 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] = ""; @@ -12259,9 +12268,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); @@ -12294,6 +12300,14 @@ 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); + } else { + ast_answer(chan); + } + } + res = leave_voicemail(chan, args.argv0, &leave_options); if (res == 't') { ast_play_and_wait(chan, "vm-goodbye"); diff --git a/doc/CHANGES-staging/voicemail_early_media.txt b/doc/CHANGES-staging/voicemail_early_media.txt new file mode 100644 index 0000000000000000000000000000000000000000..6dd79befae66a68fb2cadc6cc2af83897c9763b5 --- /dev/null +++ b/doc/CHANGES-staging/voicemail_early_media.txt @@ -0,0 +1,6 @@ +Subject: app_voicemail + +The VoiceMail application can now be configured to send greetings and +instructions via early media and only answering the channel when it is +time for the caller to record their message. This behavior can be +activated by passing the new 'e' option to VoiceMail.