diff --git a/apps/app_voicemail2.c b/apps/app_voicemail2.c index f2bb8549e5..ed6f0f1ca1 100755 --- a/apps/app_voicemail2.c +++ b/apps/app_voicemail2.c @@ -569,6 +569,10 @@ static int play_and_record(struct ast_channel *chan, char *playfile, char *recor char *sfmt[MAX_OTHER_FORMATS]; char *stringp=NULL; time_t start, end; + struct ast_dsp *sildet; /* silence detector dsp */ + int totalsilence = 0; + int dspsilence = 0; + int gotsilence = 0; /* did we timeout for silence? */ ast_log(LOG_DEBUG,"play_and_record: %s, %s, '%s'\n", playfile ? playfile : "", recordfile, fmt); @@ -609,6 +613,23 @@ static int play_and_record(struct ast_channel *chan, char *playfile, char *recor break; } } + + sildet = ast_dsp_new(); //Create the silence detector + if (!sildet) { + ast_log(LOG_WARNING, "Unable to create silence detector :(\n"); + return -1; + } + ast_dsp_set_threshold(sildet, 50); + + if (maxsilence > 0) { + //rfmt = chan->readformat; + res = ast_set_read_format(chan, AST_FORMAT_SLINEAR); + if (res < 0) { + ast_log(LOG_WARNING, "Unable to set to linear mode, giving up\n"); + return -1; + } + } + if (x == fmtcnt) { /* Loop forever, writing the packets we read to the writer(s), until we read a # or get a hangup */ @@ -637,6 +658,24 @@ static int play_and_record(struct ast_channel *chan, char *playfile, char *recor for (x=0;x 0) { + dspsilence = 0; + ast_dsp_silence(sildet, f, &dspsilence); + if (dspsilence) + totalsilence = dspsilence; + else + totalsilence = 0; + + if (totalsilence > maxsilence) { + /* Ended happily with silence */ + ast_frfree(f); + gotsilence = 1; + outmsg=2; + break; + } + } /* Exit on any error */ if (res) { ast_log(LOG_WARNING, "Error writing frame\n"); @@ -678,7 +717,10 @@ static int play_and_record(struct ast_channel *chan, char *playfile, char *recor for (x=0;x 0) { - rfmt = chan->readformat; - res = ast_set_read_format(chan, AST_FORMAT_SLINEAR); - if (res < 0) { - ast_log(LOG_WARNING, "Unable to set to linear mode, giving up\n"); - return -1; - } - if (!sildet) { - ast_log(LOG_WARNING, "Unable to create silence detector :(\n"); - return -1; - } - ast_dsp_set_threshold(sildet, 50); - } -#endif + ast_log(LOG_WARNING, "No format for saving voicemail?\n"); free_user(vmu); } else ast_log(LOG_WARNING, "No entry in voicemail config file for '%s'\n", ext);