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
This commit is contained in:
Joshua C. Colp 2022-11-16 07:40:26 -04:00
parent d085d7d5f9
commit 5223b941b8
1 changed files with 15 additions and 0 deletions

View File

@ -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;
}