From fa8a1eff2f86fdd727f6e3d5443b404bd8d44e61 Mon Sep 17 00:00:00 2001 From: Sean Bright Date: Tue, 14 Feb 2017 09:12:31 -0500 Subject: [PATCH] app_record: Add option to prevent silence from being truncated When using Record() with the silence detection feature, the stream is written out to the given file. However, if only 'silence' is detected, this file is then truncated to the first second of the recording. This patch adds the 'u' option to Record() to override that behavior. ASTERISK-18286 #close Reported by: var Patches: app_record-1.8.7.1.diff (license #6184) patch uploaded by var Change-Id: Ia1cd163483235efe2db05e52f39054288553b957 --- CHANGES | 9 +++++++++ apps/app_record.c | 13 +++++++++++-- 2 files changed, 20 insertions(+), 2 deletions(-) diff --git a/CHANGES b/CHANGES index be5848809c..0fe21f77bc 100644 --- a/CHANGES +++ b/CHANGES @@ -8,6 +8,15 @@ === ============================================================================== +------------------------------------------------------------------------------ +--- Functionality changes from Asterisk 14.3.0 to Asterisk 14.4.0 ------------ +------------------------------------------------------------------------------ + +app_record +------------------ + * Added new 'u' option to Record() application which prevents Asterisk from + truncating silence from the end of recorded files. + ------------------------------------------------------------------------------ --- Functionality changes from Asterisk 14.2.0 to Asterisk 14.3.0 ------------ ------------------------------------------------------------------------------ diff --git a/apps/app_record.c b/apps/app_record.c index fcd8938760..cc5c1875cf 100644 --- a/apps/app_record.c +++ b/apps/app_record.c @@ -81,6 +81,9 @@ ASTERISK_REGISTER_FILE() + @@ -133,6 +136,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,{ @@ -143,6 +147,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), }); @@ -194,6 +199,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 = '#'; @@ -245,7 +251,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 */ @@ -445,7 +454,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) { -- 2.47.2