|
|
|
@ -79,6 +79,9 @@
|
|
|
|
|
<option name="t">
|
|
|
|
|
<para>use alternate '*' terminator key (DTMF) instead of default '#'</para>
|
|
|
|
|
</option>
|
|
|
|
|
<option name="u">
|
|
|
|
|
<para>Don't truncate recorded silence.</para>
|
|
|
|
|
</option>
|
|
|
|
|
<option name="x">
|
|
|
|
|
<para>Ignore all terminator keys (DTMF) and keep recording until hangup.</para>
|
|
|
|
|
</option>
|
|
|
|
@ -131,6 +134,7 @@ enum {
|
|
|
|
|
FLAG_HAS_PERCENT = (1 << 7),
|
|
|
|
|
OPTION_ANY_TERMINATE = (1 << 8),
|
|
|
|
|
OPTION_OPERATOR_EXIT = (1 << 9),
|
|
|
|
|
OPTION_NO_TRUNCATE = (1 << 10),
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
AST_APP_OPTIONS(app_opts,{
|
|
|
|
@ -141,6 +145,7 @@ AST_APP_OPTIONS(app_opts,{
|
|
|
|
|
AST_APP_OPTION('q', OPTION_QUIET),
|
|
|
|
|
AST_APP_OPTION('s', OPTION_SKIP),
|
|
|
|
|
AST_APP_OPTION('t', OPTION_STAR_TERMINATE),
|
|
|
|
|
AST_APP_OPTION('u', OPTION_NO_TRUNCATE),
|
|
|
|
|
AST_APP_OPTION('y', OPTION_ANY_TERMINATE),
|
|
|
|
|
AST_APP_OPTION('x', OPTION_IGNORE_TERMINATE),
|
|
|
|
|
});
|
|
|
|
@ -192,6 +197,7 @@ static int record_exec(struct ast_channel *chan, const char *data)
|
|
|
|
|
int dspsilence = 0;
|
|
|
|
|
int silence = 0; /* amount of silence to allow */
|
|
|
|
|
int gotsilence = 0; /* did we timeout for silence? */
|
|
|
|
|
int truncate_silence = 1; /* truncate on complete silence recording */
|
|
|
|
|
int maxduration = 0; /* max duration of recording in milliseconds */
|
|
|
|
|
int gottimeout = 0; /* did we timeout for maxduration exceeded? */
|
|
|
|
|
int terminator = '#';
|
|
|
|
@ -243,7 +249,10 @@ static int record_exec(struct ast_channel *chan, const char *data)
|
|
|
|
|
ast_log(LOG_WARNING, "'%s' is not a valid silence duration\n", args.silence);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (ast_test_flag(&flags, OPTION_NO_TRUNCATE))
|
|
|
|
|
truncate_silence = 0;
|
|
|
|
|
|
|
|
|
|
if (args.maxduration) {
|
|
|
|
|
if ((sscanf(args.maxduration, "%30d", &i) == 1) && (i > -1))
|
|
|
|
|
/* Convert duration to milliseconds */
|
|
|
|
@ -443,7 +452,7 @@ static int record_exec(struct ast_channel *chan, const char *data)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (gotsilence) {
|
|
|
|
|
if (gotsilence && truncate_silence) {
|
|
|
|
|
ast_stream_rewind(s, silence - 1000);
|
|
|
|
|
ast_truncstream(s);
|
|
|
|
|
} else if (!gottimeout && f) {
|
|
|
|
|