Sat Aug 6 00:39:38 2011

Asterisk developer's documentation


app_waitforsilence.c File Reference

Wait for Silence More...

#include "asterisk.h"
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include "asterisk/file.h"
#include "asterisk/logger.h"
#include "asterisk/channel.h"
#include "asterisk/pbx.h"
#include "asterisk/dsp.h"
#include "asterisk/module.h"
#include "asterisk/options.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 silencereqd, time_t waitstart, int timeout)
static int load_module (void)
static int unload_module (void)
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 | AST_MODFLAG_BUILDSUM, .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 = "361d7bb937402d51e4658efb5b4d76e4" , .load = load_module, .unload = unload_module, }
static char * app = "WaitForSilence"
static const struct ast_module_infoast_module_info = &__mod_info
static char * descrip
static char * synopsis = "Waits for a specified amount of silence"


Detailed Description

Wait for Silence

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

Definition in file app_waitforsilence.c.


Function Documentation

static void __reg_module ( void   )  [static]

Definition at line 214 of file app_waitforsilence.c.

static void __unreg_module ( void   )  [static]

Definition at line 214 of file app_waitforsilence.c.

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

Definition at line 78 of file app_waitforsilence.c.

References ast_dsp_free(), ast_dsp_new(), 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_verbose(), ast_waitfor(), f, LOG_DEBUG, LOG_WARNING, ast_channel::name, option_verbose, pbx_builtin_setvar_helper(), ast_channel::readformat, silencethreshold, and VERBOSE_PREFIX_3.

Referenced by waitforsilence_exec().

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

static int load_module ( void   )  [static]

Definition at line 209 of file app_waitforsilence.c.

References ast_register_application(), and waitforsilence_exec().

static int unload_module ( void   )  [static]

Definition at line 198 of file app_waitforsilence.c.

References ast_module_user_hangup_all, and ast_unregister_application().

00199 {
00200    int res;
00201 
00202    res = ast_unregister_application(app);
00203    
00204    ast_module_user_hangup_all();
00205 
00206    return res;
00207 }

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

Definition at line 160 of file app_waitforsilence.c.

References ast_answer(), ast_channel_start_silence_generator(), ast_channel_stop_silence_generator(), ast_log(), ast_opt_transmit_silence, ast_verbose(), do_waiting(), LOG_WARNING, option_verbose, and VERBOSE_PREFIX_3.

Referenced by load_module().

00161 {
00162    int res = 1;
00163    int silencereqd = 1000;
00164    int timeout = 0;
00165    int iterations = 1, i;
00166    time_t waitstart;
00167    struct ast_silence_generator *silgen = NULL;
00168 
00169    res = ast_answer(chan); /* Answer the channel */
00170 
00171    if (!data || ( (sscanf(data, "%30d|%30d|%30d", &silencereqd, &iterations, &timeout) != 3) &&
00172       (sscanf(data, "%30d|%30d", &silencereqd, &iterations) != 2) &&
00173       (sscanf(data, "%30d", &silencereqd) != 1) ) ) {
00174       ast_log(LOG_WARNING, "Using default value of 1000ms, 1 iteration, no timeout\n");
00175    }
00176 
00177    if (option_verbose > 2)
00178       ast_verbose(VERBOSE_PREFIX_3 "Waiting %d time(s) for %d ms silence with %d timeout\n", iterations, silencereqd, timeout);
00179 
00180    if (ast_opt_transmit_silence) {
00181       silgen = ast_channel_start_silence_generator(chan);
00182    }
00183    time(&waitstart);
00184    res = 1;
00185    for (i=0; (i<iterations) && (res == 1); i++) {
00186       res = do_waiting(chan, silencereqd, waitstart, timeout);
00187    }
00188    if (silgen) {
00189       ast_channel_stop_silence_generator(chan, silgen);
00190    }
00191 
00192    if (res > 0)
00193       res = 0;
00194    return res;
00195 }


Variable Documentation

struct ast_module_info __mod_info = { .name = AST_MODULE, .flags = AST_MODFLAG_DEFAULT | AST_MODFLAG_BUILDSUM, .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 = "361d7bb937402d51e4658efb5b4d76e4" , .load = load_module, .unload = unload_module, } [static]

Definition at line 214 of file app_waitforsilence.c.

char* app = "WaitForSilence" [static]

Definition at line 52 of file app_waitforsilence.c.

const struct ast_module_info* ast_module_info = &__mod_info [static]

Definition at line 214 of file app_waitforsilence.c.

char* descrip [static]

Definition at line 54 of file app_waitforsilence.c.

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

Definition at line 53 of file app_waitforsilence.c.


Generated on Sat Aug 6 00:39:38 2011 for Asterisk - the Open Source PBX by  doxygen 1.4.7