]> git.ipfire.org Git - thirdparty/asterisk.git/commitdiff
res_agi: Respect "transmit_silence" option for "RECORD FILE".
authorJoshua C. Colp <jcolp@sangoma.com>
Wed, 16 Nov 2022 11:40:26 +0000 (07:40 -0400)
committerJoshua C. Colp <jcolp@sangoma.com>
Wed, 16 Nov 2022 11:40:26 +0000 (07:40 -0400)
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

res/res_agi.c

index 56e8e76c252863274fcf8ca2e41b7b76eb200b0a..cafe13ba2def8c5a35bffd0fa6627a6a01c88dea 100644 (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;
 }