diff options
author | markster <markster@f38db490-d61c-443f-a65b-d21fe96a405b> | 2003-05-03 16:09:56 +0000 |
---|---|---|
committer | markster <markster@f38db490-d61c-443f-a65b-d21fe96a405b> | 2003-05-03 16:09:56 +0000 |
commit | 828afe663834abfb2706f97b72b0fdf101659595 (patch) | |
tree | b28d062edc8b7ace13e223d3a02272e9bcd9a990 /apps/app_voicemail.c | |
parent | cd78510af982343f6d0ef475921731c147beca84 (diff) |
Add silence detection to voicemail
git-svn-id: http://svn.digium.com/svn/asterisk/trunk@955 f38db490-d61c-443f-a65b-d21fe96a405b
Diffstat (limited to 'apps/app_voicemail.c')
-rwxr-xr-x | apps/app_voicemail.c | 63 |
1 files changed, 63 insertions, 0 deletions
diff --git a/apps/app_voicemail.c b/apps/app_voicemail.c index 124cc9cf9..727763264 100755 --- a/apps/app_voicemail.c +++ b/apps/app_voicemail.c @@ -23,6 +23,7 @@ #include <asterisk/adsi.h> #include <asterisk/app.h> #include <asterisk/manager.h> +#include <asterisk/dsp.h> #include <stdlib.h> #include <errno.h> #include <unistd.h> @@ -496,12 +497,29 @@ static int leave_voicemail(struct ast_channel *chan, char *ext, int silent, int char *s; time_t start; time_t end; + struct ast_dsp *sildet; /* silence detector dsp */ + int totalsilence = 0; + int dspsilence = 0; + int silence = 0; /* amount of silence to allow */ + int gotsilence = 0; /* did we timeout for silence? */ + char *silencestr; + char *thresholdstr; + int rfmt; + int threshold = 128; cfg = ast_load(VOICEMAIL_CONFIG); if (!cfg) { ast_log(LOG_WARNING, "No such configuration file %s\n", VOICEMAIL_CONFIG); return -1; } + if ((silencestr = ast_variable_retrieve(cfg, "general", "maxsilence"))) { + silence = atoi(silencestr); + if (silence > 0) + silence *= 1000; + } + if ((thresholdstr = ast_variable_retrieve(cfg, "general", "silencethreshold"))) + threshold = atoi(thresholdstr); + if (!(astemail = ast_variable_retrieve(cfg, "general", "serveremail"))) astemail = ASTERISK_USERNAME; if ((s = ast_variable_retrieve(cfg, "general", "maxmessage"))) { @@ -657,6 +675,22 @@ static int leave_voicemail(struct ast_channel *chan, char *ext, int silent, int wavother++; free(sfmt[x]); } + + if (silence > 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; + } + sildet = ast_dsp_new(); + if (!sildet) { + ast_log(LOG_WARNING, "Unable to create silence detector :(\n"); + return -1; + } + ast_dsp_set_threshold(sildet, 50); + } + if (x == fmtcnt) { /* Loop forever, writing the packets we read to the writer(s), until we read a # or get a hangup */ @@ -700,6 +734,25 @@ static int leave_voicemail(struct ast_channel *chan, char *ext, int silent, int ast_frfree(f); break; } + /* Silence Detection */ + if (silence > 0) { + dspsilence = 0; + ast_dsp_silence(sildet, f, &dspsilence); + if (dspsilence) { + totalsilence = dspsilence; + } else { + totalsilence = 0; + } + if (totalsilence > silence) { + /* Ended happily with silence */ + outmsg=2; + ast_frfree(f); + gotsilence = 1; + res = 0; + break; + } + } + } else if (f->frametype == AST_FRAME_DTMF) { if (f->subclass == '#') { if (option_verbose > 2) @@ -726,6 +779,16 @@ static int leave_voicemail(struct ast_channel *chan, char *ext, int silent, int res = -1; outmsg=1; } + if (gotsilence) { + ast_stream_rewind(writer, silence-1000); + ast_truncstream(writer); + + /* And each of the others */ + for (x=0;x<fmtcnt;x++) { + ast_stream_rewind(others[x], silence-1000); + ast_truncstream(others[x]); + } + } } else { ast_log(LOG_WARNING, "Error creating writestream '%s', format '%s'\n", fn, sfmt[x]); free(sfmt[x]); |