From: Joshua C. Colp Date: Wed, 16 Nov 2022 11:40:26 +0000 (-0400) Subject: res_agi: Respect "transmit_silence" option for "RECORD FILE". X-Git-Tag: 20.1.0-rc1~32 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=61922d293435dc8b5724d1fddb02f47e75d1608a;p=thirdparty%2Fasterisk.git res_agi: Respect "transmit_silence" option for "RECORD FILE". The "RECORD FILE" command in res_agi has its own implementation for actually doing the recording. This has resulted in it not actually obeying the option "transmit_silence" when recording. This change causes it to now send silence if the option is enabled. ASTERISK-30314 Change-Id: Ib3a85601ff35d1b904f836691bad8a4b7e957174 --- diff --git a/res/res_agi.c b/res/res_agi.c index 56e8e76c25..cafe13ba2d 100644 --- a/res/res_agi.c +++ b/res/res_agi.c @@ -2907,6 +2907,7 @@ static int handle_recordfile(struct ast_channel *chan, AGI *agi, int argc, const int gotsilence = 0; /* did we timeout for silence? */ char *silencestr = NULL; RAII_VAR(struct ast_format *, rfmt, NULL, ao2_cleanup); + struct ast_silence_generator *silgen = NULL; /* XXX EAGI FIXME XXX */ @@ -2984,6 +2985,10 @@ static int handle_recordfile(struct ast_channel *chan, AGI *agi, int argc, const ast_seekstream(fs, sample_offset, SEEK_SET); ast_truncstream(fs); + if (ast_opt_transmit_silence) { + silgen = ast_channel_start_silence_generator(chan); + } + start = ast_tvnow(); while ((ms < 0) || ast_tvdiff_ms(ast_tvnow(), start) < ms) { res = ast_waitfor(chan, ms - ast_tvdiff_ms(ast_tvnow(), start)); @@ -2992,6 +2997,8 @@ static int handle_recordfile(struct ast_channel *chan, AGI *agi, int argc, const ast_agi_send(agi->fd, chan, "200 result=%d (waitfor) endpos=%ld\n", res,sample_offset); if (sildet) ast_dsp_free(sildet); + if (silgen) + ast_channel_stop_silence_generator(chan, silgen); return RESULT_FAILURE; } f = ast_read(chan); @@ -3000,6 +3007,8 @@ static int handle_recordfile(struct ast_channel *chan, AGI *agi, int argc, const ast_agi_send(agi->fd, chan, "200 result=%d (hangup) endpos=%ld\n", -1, sample_offset); if (sildet) ast_dsp_free(sildet); + if (silgen) + ast_channel_stop_silence_generator(chan, silgen); return RESULT_FAILURE; } switch(f->frametype) { @@ -3016,6 +3025,8 @@ static int handle_recordfile(struct ast_channel *chan, AGI *agi, int argc, const ast_frfree(f); if (sildet) ast_dsp_free(sildet); + if (silgen) + ast_channel_stop_silence_generator(chan, silgen); return RESULT_SUCCESS; } break; @@ -3067,6 +3078,10 @@ static int handle_recordfile(struct ast_channel *chan, AGI *agi, int argc, const ast_dsp_free(sildet); } + if (silgen) { + ast_channel_stop_silence_generator(chan, silgen); + } + return RESULT_SUCCESS; }