Fri Jul 24 00:41:16 2009

Asterisk developer's documentation


app_waitforsilence.c File Reference

Wait for Silence More...

#include "asterisk.h"
#include "asterisk/file.h"
#include "asterisk/channel.h"
#include "asterisk/pbx.h"
#include "asterisk/dsp.h"
#include "asterisk/module.h"

Go to the source code of this file.

Functions

static void __reg_module (void)
static void __unreg_module (void)
static int do_waiting (struct ast_channel *chan, int timereqd, time_t waitstart, int timeout, int wait_for_silence)
static int load_module (void)
static int unload_module (void)
static int waitfor_exec (struct ast_channel *chan, void *data, int wait_for_silence)
static int waitfornoise_exec (struct ast_channel *chan, void *data)
static int waitforsilence_exec (struct ast_channel *chan, void *data)

Variables

static struct ast_module_info __mod_info = { .name = AST_MODULE, .flags = AST_MODFLAG_DEFAULT , .description = "Wait For Silence" , .key = "This paragraph is copyright (c) 2006 by Digium, Inc. \In order for your module to load, it must return this \key via a function called \"key\". Any code which \includes this paragraph must be licensed under the GNU \General Public License version 2 or later (at your \option). In addition to Digium's general reservations \of rights, Digium expressly reserves the right to \allow other parties to license this paragraph under \different terms. Any use of Digium, Inc. trademarks or \logos (including \"Asterisk\" or \"Digium\") without \express written permission of Digium, Inc. is prohibited.\n" , .buildopt_sum = "a9c98e5d177805051735cb5b0b16b0a0" , .load = load_module, .unload = unload_module, }
static char * app_noise = "WaitForNoise"
static char * app_silence = "WaitForSilence"
static struct ast_module_infoast_module_info = &__mod_info
static char * descrip_noise
static char * descrip_silence
static char * synopsis_noise = "Waits for a specified amount of noise"
static char * synopsis_silence = "Waits for a specified amount of silence"


Detailed Description

Wait for Silence

Author:
David C. Troy <dave@popvox.com>

Philipp Skadorov <skadorov@yahoo.com>

Definition in file app_waitforsilence.c.


Function Documentation

static void __reg_module ( void   )  [static]

Definition at line 221 of file app_waitforsilence.c.

static void __unreg_module ( void   )  [static]

Definition at line 221 of file app_waitforsilence.c.

static int do_waiting ( struct ast_channel chan,
int  timereqd,
time_t  waitstart,
int  timeout,
int  wait_for_silence 
) [static]

Definition at line 83 of file app_waitforsilence.c.

References ast_debug, ast_dsp_free(), ast_dsp_get_threshold_from_settings(), ast_dsp_new(), ast_dsp_noise(), ast_dsp_set_threshold(), ast_dsp_silence(), AST_FORMAT_SLINEAR, AST_FRAME_VOICE, ast_frfree, ast_getformatname(), ast_log(), ast_read(), ast_set_read_format(), ast_verb, ast_waitfor(), chan, f, LOG_WARNING, ast_channel::name, pbx_builtin_setvar_helper(), ast_channel::readformat, and THRESHOLD_SILENCE.

Referenced by waitfor_exec().

00083                                                                                                                    {
00084    struct ast_frame *f = NULL;
00085    int dsptime = 0;
00086    int rfmt = 0;
00087    int res = 0;
00088    struct ast_dsp *sildet;  /* silence detector dsp */
00089    time_t now;
00090 
00091    /*Either silence or noise calc depending on wait_for_silence flag*/
00092    int (*ast_dsp_func)(struct ast_dsp*, struct ast_frame*, int*) =
00093             wait_for_silence ? ast_dsp_silence : ast_dsp_noise;
00094 
00095    rfmt = chan->readformat; /* Set to linear mode */
00096    if ((res = ast_set_read_format(chan, AST_FORMAT_SLINEAR)) < 0) {
00097       ast_log(LOG_WARNING, "Unable to set channel to linear mode, giving up\n");
00098       return -1;
00099    }
00100 
00101    /* Create the silence detector */
00102    if (!(sildet = ast_dsp_new())) {
00103       ast_log(LOG_WARNING, "Unable to create silence detector :(\n");
00104       return -1;
00105    }
00106    ast_dsp_set_threshold(sildet, ast_dsp_get_threshold_from_settings(THRESHOLD_SILENCE));
00107 
00108    /* Await silence... */
00109    for (;;) {
00110       /* Start with no silence received */
00111       dsptime = 0;
00112 
00113       res = ast_waitfor(chan, timereqd);
00114 
00115       /* Must have gotten a hangup; let's exit */
00116       if (res < 0) {
00117          pbx_builtin_setvar_helper(chan, "WAITSTATUS", "HANGUP");
00118          break;
00119       }
00120       
00121       /* We waited and got no frame; sounds like digital silence or a muted digital channel */
00122       if (res == 0) {
00123          dsptime = timereqd;
00124       } else {
00125          /* Looks like we did get a frame, so let's check it out */
00126          if (!(f = ast_read(chan))) {
00127             pbx_builtin_setvar_helper(chan, "WAITSTATUS", "HANGUP");
00128             break;
00129          }
00130          if (f->frametype == AST_FRAME_VOICE) {
00131             ast_dsp_func(sildet, f, &dsptime);
00132          }
00133          ast_frfree(f);
00134       }
00135 
00136       ast_verb(6, "Got %dms %s < %dms required\n", dsptime, wait_for_silence ? "silence" : "noise", timereqd);
00137 
00138       if (dsptime >= timereqd) {
00139          ast_verb(3, "Exiting with %dms %s >= %dms required\n", dsptime, wait_for_silence ? "silence" : "noise", timereqd);
00140          /* Ended happily with silence */
00141          res = 1;
00142          pbx_builtin_setvar_helper(chan, "WAITSTATUS", wait_for_silence ? "SILENCE" : "NOISE");
00143          ast_debug(1, "WAITSTATUS was set to %s\n", wait_for_silence ? "SILENCE" : "NOISE");
00144          break;
00145       }
00146 
00147       if (timeout && (difftime(time(&now), waitstart) >= timeout)) {
00148          pbx_builtin_setvar_helper(chan, "WAITSTATUS", "TIMEOUT");
00149          ast_debug(1, "WAITSTATUS was set to TIMEOUT\n");
00150          res = 0;
00151          break;
00152       }
00153    }
00154 
00155 
00156    if (rfmt && ast_set_read_format(chan, rfmt)) {
00157       ast_log(LOG_WARNING, "Unable to restore format %s to channel '%s'\n", ast_getformatname(rfmt), chan->name);
00158    }
00159    ast_dsp_free(sildet);
00160    return res;
00161 }

static int load_module ( void   )  [static]

Definition at line 212 of file app_waitforsilence.c.

References ast_register_application, waitfornoise_exec(), and waitforsilence_exec().

static int unload_module ( void   )  [static]

Definition at line 203 of file app_waitforsilence.c.

References ast_unregister_application().

00204 {
00205    int res;
00206    res = ast_unregister_application(app_silence);
00207    res |= ast_unregister_application(app_noise);
00208 
00209    return res;
00210 }

static int waitfor_exec ( struct ast_channel chan,
void *  data,
int  wait_for_silence 
) [static]

Definition at line 163 of file app_waitforsilence.c.

References ast_channel::_state, ast_answer(), ast_log(), AST_STATE_UP, ast_verb, chan, do_waiting(), and LOG_WARNING.

Referenced by waitfornoise_exec(), and waitforsilence_exec().

00164 {
00165    int res = 1;
00166    int timereqd = 1000;
00167    int timeout = 0;
00168    int iterations = 1, i;
00169    time_t waitstart;
00170 
00171    if (chan->_state != AST_STATE_UP) {
00172       res = ast_answer(chan); /* Answer the channel */
00173    }
00174 
00175    if (!data || ( (sscanf(data, "%d,%d,%d", &timereqd, &iterations, &timeout) != 3) &&
00176       (sscanf(data, "%d,%d", &timereqd, &iterations) != 2) &&
00177       (sscanf(data, "%d", &timereqd) != 1) ) ) {
00178       ast_log(LOG_WARNING, "Using default value of 1000ms, 1 iteration, no timeout\n");
00179    }
00180 
00181    ast_verb(3, "Waiting %d time(s) for %d ms silence with %d timeout\n", iterations, timereqd, timeout);
00182 
00183    time(&waitstart);
00184    res = 1;
00185    for (i=0; (i<iterations) && (res == 1); i++) {
00186       res = do_waiting(chan, timereqd, waitstart, timeout, wait_for_silence);
00187    }
00188    if (res > 0)
00189       res = 0;
00190    return res;
00191 }

static int waitfornoise_exec ( struct ast_channel chan,
void *  data 
) [static]

Definition at line 198 of file app_waitforsilence.c.

References chan, and waitfor_exec().

Referenced by load_module().

00199 {
00200    return waitfor_exec(chan, data, 0);
00201 }

static int waitforsilence_exec ( struct ast_channel chan,
void *  data 
) [static]

Definition at line 193 of file app_waitforsilence.c.

References chan, and waitfor_exec().

Referenced by load_module().

00194 {
00195    return waitfor_exec(chan, data, 1);
00196 }


Variable Documentation

struct ast_module_info __mod_info = { .name = AST_MODULE, .flags = AST_MODFLAG_DEFAULT , .description = "Wait For Silence" , .key = "This paragraph is copyright (c) 2006 by Digium, Inc. \In order for your module to load, it must return this \key via a function called \"key\". Any code which \includes this paragraph must be licensed under the GNU \General Public License version 2 or later (at your \option). In addition to Digium's general reservations \of rights, Digium expressly reserves the right to \allow other parties to license this paragraph under \different terms. Any use of Digium, Inc. trademarks or \logos (including \"Asterisk\" or \"Digium\") without \express written permission of Digium, Inc. is prohibited.\n" , .buildopt_sum = "a9c98e5d177805051735cb5b0b16b0a0" , .load = load_module, .unload = unload_module, } [static]

Definition at line 221 of file app_waitforsilence.c.

char* app_noise = "WaitForNoise" [static]

Definition at line 77 of file app_waitforsilence.c.

char* app_silence = "WaitForSilence" [static]

Definition at line 51 of file app_waitforsilence.c.

struct ast_module_info* ast_module_info = &__mod_info [static]

Definition at line 221 of file app_waitforsilence.c.

char* descrip_noise [static]

Initial value:

"WaitForNoise(noiserequired[,iterations][,timeout]) \n"
"Wait for Noise: The same as Wait for Silance but waits for noise that is above the threshold specified\n"

Definition at line 79 of file app_waitforsilence.c.

char* descrip_silence [static]

Definition at line 53 of file app_waitforsilence.c.

char* synopsis_noise = "Waits for a specified amount of noise" [static]

Definition at line 78 of file app_waitforsilence.c.

char* synopsis_silence = "Waits for a specified amount of silence" [static]

Definition at line 52 of file app_waitforsilence.c.


Generated on Fri Jul 24 00:41:16 2009 for Asterisk - the Open Source PBX by  doxygen 1.4.7