summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTorrey Searle <torrey@voxbone.com>2017-07-11 16:55:36 +0200
committerGeorge Joseph <gjoseph@digium.com>2017-07-14 07:50:39 -0500
commita4c85309f0059fa840bf351566dd897c02dbe353 (patch)
tree512ba79584b48b60cfe0ea75755867eb2e85531a
parente29284b13170c3bcd559a146e43558f8db2a1976 (diff)
res/res_stasis_snoop: generate silence when audiohook returns null
Currently when rtp is paused, no packets are written to the recorded audio file, causing the silence to be skipped and recording not properly time aligned. The read handler as been adapted to return a silence frame of the correct size. ASTERISK-27128 #close Change-Id: I2d7f60650457860b9c70907b14426756b058a844
-rw-r--r--res/res_stasis_snoop.c22
1 files changed, 21 insertions, 1 deletions
diff --git a/res/res_stasis_snoop.c b/res/res_stasis_snoop.c
index abdef6e46..da66894f6 100644
--- a/res/res_stasis_snoop.c
+++ b/res/res_stasis_snoop.c
@@ -74,6 +74,8 @@ struct stasis_app_snoop {
unsigned int whisper_active:1;
/*! \brief Uniqueid of the channel this snoop is snooping on */
char uniqueid[AST_MAX_UNIQUEID];
+ /*! \brief A frame of silence to use when the audiohook returns null */
+ struct ast_frame silence;
};
/*! \brief Destructor for snoop structure */
@@ -93,6 +95,11 @@ static void snoop_destroy(void *obj)
ast_audiohook_destroy(&snoop->whisper);
}
+ if (snoop->silence.data.ptr) {
+ ast_free(snoop->silence.data.ptr);
+ snoop->silence.data.ptr = NULL;
+ }
+
ast_free(snoop->app);
ast_channel_cleanup(snoop->chan);
@@ -199,7 +206,7 @@ static struct ast_frame *snoop_read(struct ast_channel *chan)
frame = ast_audiohook_read_frame(&snoop->spy, snoop->spy_samples, snoop->spy_direction, snoop->spy_format);
ast_audiohook_unlock(&snoop->spy);
- return frame ? frame : &ast_null_frame;
+ return frame ? frame : &snoop->silence;
}
/*! \brief Callback function for hanging up a Snoop channel */
@@ -385,6 +392,19 @@ struct ast_channel *stasis_app_control_snoop(struct ast_channel *chan,
snoop->spy_samples = ast_format_get_sample_rate(snoop->spy_format) / (1000 / SNOOP_INTERVAL);
snoop->spy_active = 1;
+
+ snoop->silence.frametype = AST_FRAME_VOICE,
+ snoop->silence.datalen = snoop->spy_samples * sizeof(uint16_t),
+ snoop->silence.samples = snoop->spy_samples,
+ snoop->silence.mallocd = 0,
+ snoop->silence.offset = 0,
+ snoop->silence.src = __PRETTY_FUNCTION__,
+ snoop->silence.subclass.format = snoop->spy_format,
+ snoop->silence.data.ptr = ast_calloc(snoop->spy_samples, sizeof(uint16_t));
+ if (!snoop->silence.data.ptr) {
+ ast_hangup(snoop->chan);
+ return NULL;
+ }
}
/* If whispering is enabled set up the audiohook */