Sat Mar 10 01:54:34 2012

Asterisk developer's documentation


app_playback.c File Reference

Trivial application to playback a sound file. More...

#include "asterisk.h"
#include "asterisk/file.h"
#include "asterisk/pbx.h"
#include "asterisk/module.h"
#include "asterisk/app.h"
#include "asterisk/say.h"
#include "asterisk/cli.h"

Go to the source code of this file.

Data Structures

struct  say_args_t

Functions

static void __reg_module (void)
static char * __say_cli_init (struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
static void __unreg_module (void)
static int do_say (say_args_t *a, const char *s, const char *options, int depth)
static int load_module (void)
static int playback_exec (struct ast_channel *chan, const char *data)
static int reload (void)
static void restore_say_mode (void *arg)
static int s_streamwait3 (const say_args_t *a, const char *fn)
static void save_say_mode (const void *arg)
static int say_date (struct ast_channel *chan, time_t t, const char *ints, const char *lang)
static int say_date_generic (struct ast_channel *chan, time_t t, const char *ints, const char *lang, const char *format, const char *timezonename, const char *prefix)
static int say_date_with_format (struct ast_channel *chan, time_t t, const char *ints, const char *lang, const char *format, const char *timezonename)
static int say_datetime (struct ast_channel *chan, time_t t, const char *ints, const char *lang)
static int say_enumeration_full (struct ast_channel *chan, int num, const char *ints, const char *lang, const char *options, int audiofd, int ctrlfd)
static int say_full (struct ast_channel *chan, const char *string, const char *ints, const char *lang, const char *options, int audiofd, int ctrlfd)
static int say_init_mode (const char *mode)
static int say_number_full (struct ast_channel *chan, int num, const char *ints, const char *lang, const char *options, int audiofd, int ctrlfd)
static int say_time (struct ast_channel *chan, time_t t, const char *ints, const char *lang)
static int unload_module (void)

Variables

static struct ast_module_info __mod_info = { .name = AST_MODULE, .flags = AST_MODFLAG_DEFAULT , .description = "Sound File Playback Application" , .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 = "88eaa8f5c1bd988bedd71113385e0886" , .load = load_module, .unload = unload_module, .reload = reload, }
static char * app = "Playback"
static struct ast_module_infoast_module_info = &__mod_info
static struct ast_cli_entry cli_playback []
static const void * say_api_buf [40]
static struct ast_configsay_cfg = NULL
static const char *const say_new = "new"
static const char *const say_old = "old"


Detailed Description

Trivial application to playback a sound file.

Author:
Mark Spencer <markster@digium.com>

Definition in file app_playback.c.


Function Documentation

static void __reg_module ( void   )  [static]

Definition at line 558 of file app_playback.c.

static char* __say_cli_init ( struct ast_cli_entry e,
int  cmd,
struct ast_cli_args a 
) [static]

Definition at line 384 of file app_playback.c.

References ast_cli_args::argc, ast_cli_entry::args, ast_cli_args::argv, ast_cli(), CLI_GENERATE, CLI_INIT, CLI_SHOWUSAGE, CLI_SUCCESS, ast_cli_entry::command, ast_cli_args::fd, say_init_mode(), and ast_cli_entry::usage.

00385 {
00386    const char *old_mode = say_api_buf[0] ? say_new : say_old;
00387    const char *mode;
00388    switch (cmd) {
00389    case CLI_INIT:
00390       e->command = "say load [new|old]";
00391       e->usage = 
00392          "Usage: say load [new|old]\n"
00393          "       say load\n"
00394          "           Report status of current say mode\n"
00395          "       say load new\n"
00396          "           Set say method, configured in say.conf\n"
00397          "       say load old\n"
00398          "           Set old say method, coded in asterisk core\n";
00399       return NULL;
00400    case CLI_GENERATE:
00401       return NULL;
00402    }
00403    if (a->argc == 2) {
00404       ast_cli(a->fd, "say mode is [%s]\n", old_mode);
00405       return CLI_SUCCESS;
00406    } else if (a->argc != e->args)
00407       return CLI_SHOWUSAGE;
00408    mode = a->argv[2];
00409    if (!strcmp(mode, old_mode))
00410       ast_cli(a->fd, "say mode is %s already\n", mode);
00411    else
00412       if (say_init_mode(mode) == 0)
00413          ast_cli(a->fd, "setting say mode from %s to %s\n", old_mode, mode);
00414 
00415    return CLI_SUCCESS;
00416 }

static void __unreg_module ( void   )  [static]

Definition at line 558 of file app_playback.c.

static int do_say ( say_args_t a,
const char *  s,
const char *  options,
int  depth 
) [static]

Definition at line 166 of file app_playback.c.

References ast_debug, ast_extension_match(), ast_log(), ast_strdupa, ast_variable_browse(), varshead::first, say_args_t::language, LOG_WARNING, ast_variable::name, ast_variable::next, say_cfg, and ast_variable::value.

Referenced by say_date_generic(), say_enumeration_full(), say_full(), and say_number_full().

00167 {
00168    struct ast_variable *v;
00169    char *lang, *x, *rule = NULL;
00170    int ret = 0;   
00171    struct varshead head = { .first = NULL, .last = NULL };
00172    struct ast_var_t *n;
00173 
00174    ast_debug(2, "string <%s> depth <%d>\n", s, depth);
00175    if (depth++ > 10) {
00176       ast_log(LOG_WARNING, "recursion too deep, exiting\n");
00177       return -1;
00178    } else if (!say_cfg) {
00179       ast_log(LOG_WARNING, "no say.conf, cannot spell '%s'\n", s);
00180       return -1;
00181    }
00182 
00183    /* scan languages same as in file.c */
00184    if (a->language == NULL)
00185       a->language = "en";     /* default */
00186    ast_debug(2, "try <%s> in <%s>\n", s, a->language);
00187    lang = ast_strdupa(a->language);
00188    for (;;) {
00189       for (v = ast_variable_browse(say_cfg, lang); v ; v = v->next) {
00190          if (ast_extension_match(v->name, s)) {
00191             rule = ast_strdupa(v->value);
00192             break;
00193          }
00194       }
00195       if (rule)
00196          break;
00197       if ( (x = strchr(lang, '_')) )
00198          *x = '\0';      /* try without suffix */
00199       else if (strcmp(lang, "en"))
00200          lang = "en";    /* last resort, try 'en' if not done yet */
00201       else
00202          break;
00203    }
00204    if (!rule)
00205       return 0;
00206 
00207    /* skip up to two prefixes to get the value */
00208    if ( (x = strchr(s, ':')) )
00209       s = x + 1;
00210    if ( (x = strchr(s, ':')) )
00211       s = x + 1;
00212    ast_debug(2, "value is <%s>\n", s);
00213    n = ast_var_assign("SAY", s);
00214    AST_LIST_INSERT_HEAD(&head, n, entries);
00215 
00216    /* scan the body, one piece at a time */
00217    while ( !ret && (x = strsep(&rule, ",")) ) { /* exit on key */
00218       char fn[128];
00219       const char *p, *fmt, *data; /* format and data pointers */
00220 
00221       /* prepare a decent file name */
00222       x = ast_skip_blanks(x);
00223       ast_trim_blanks(x);
00224 
00225       /* replace variables */
00226       pbx_substitute_variables_varshead(&head, x, fn, sizeof(fn));
00227       ast_debug(2, "doing [%s]\n", fn);
00228 
00229       /* locate prefix and data, if any */
00230       fmt = strchr(fn, ':');
00231       if (!fmt || fmt == fn)  {  /* regular filename */
00232          ret = s_streamwait3(a, fn);
00233          continue;
00234       }
00235       fmt++;
00236       data = strchr(fmt, ':');   /* colon before data */
00237       if (!data || data == fmt) {   /* simple prefix-fmt */
00238          ret = do_say(a, fn, options, depth);
00239          continue;
00240       }
00241       /* prefix:fmt:data */
00242       for (p = fmt; p < data && ret <= 0; p++) {
00243          char fn2[sizeof(fn)];
00244          if (*p == ' ' || *p == '\t')  /* skip blanks */
00245             continue;
00246          if (*p == '\'') {/* file name - we trim them */
00247             char *y;
00248             strcpy(fn2, ast_skip_blanks(p+1));  /* make a full copy */
00249             y = strchr(fn2, '\'');
00250             if (!y) {
00251                p = data;   /* invalid. prepare to end */
00252                break;
00253             }
00254             *y = '\0';
00255             ast_trim_blanks(fn2);
00256             p = strchr(p+1, '\'');
00257             ret = s_streamwait3(a, fn2);
00258          } else {
00259             int l = fmt-fn;
00260             strcpy(fn2, fn); /* copy everything */
00261             /* after prefix, append the format */
00262             fn2[l++] = *p;
00263             strcpy(fn2 + l, data);
00264             ret = do_say(a, fn2, options, depth);
00265          }
00266          
00267          if (ret) {
00268             break;
00269          }
00270       }
00271    }
00272    ast_var_delete(n);
00273    return ret;
00274 }

static int load_module ( void   )  [static]

Definition at line 535 of file app_playback.c.

References ast_config_load, ast_extension_match(), ast_variable_browse(), config_flags, CONFIG_STATUS_FILEINVALID, ast_variable::name, ast_variable::next, say_cfg, say_init_mode(), and ast_variable::value.

00536 {
00537    struct ast_variable *v;
00538    struct ast_flags config_flags = { 0 };
00539 
00540    say_cfg = ast_config_load("say.conf", config_flags);
00541    if (say_cfg && say_cfg != CONFIG_STATUS_FILEINVALID) {
00542       for (v = ast_variable_browse(say_cfg, "general"); v ; v = v->next) {
00543             if (ast_extension_match(v->name, "mode")) {
00544             say_init_mode(v->value);
00545             break;
00546          }
00547       }
00548    }
00549 
00550    ast_cli_register_multiple(cli_playback, ARRAY_LEN(cli_playback));
00551    return ast_register_application_xml(app, playback_exec);
00552 }

static int playback_exec ( struct ast_channel chan,
const char *  data 
) [static]

Definition at line 422 of file app_playback.c.

References ast_channel::_state, args, ast_answer(), AST_APP_ARG, AST_DECLARE_APP_ARGS, ast_log(), AST_STANDARD_APP_ARGS, AST_STATE_UP, ast_stopstream(), ast_strdupa, ast_streamfile(), ast_strlen_zero(), ast_waitstream(), ast_channel::language, LOG_WARNING, ast_channel::name, pbx_builtin_setvar_helper(), say_full(), strcasestr(), and strsep().

00423 {
00424    int res = 0;
00425    int mres = 0;
00426    char *tmp;
00427    int option_skip=0;
00428    int option_say=0;
00429    int option_noanswer = 0;
00430 
00431    AST_DECLARE_APP_ARGS(args,
00432       AST_APP_ARG(filenames);
00433       AST_APP_ARG(options);
00434    );
00435    
00436    if (ast_strlen_zero(data)) {
00437       ast_log(LOG_WARNING, "Playback requires an argument (filename)\n");
00438       return -1;
00439    }
00440 
00441    tmp = ast_strdupa(data);
00442    AST_STANDARD_APP_ARGS(args, tmp);
00443 
00444    if (args.options) {
00445       if (strcasestr(args.options, "skip"))
00446          option_skip = 1;
00447       if (strcasestr(args.options, "say"))
00448          option_say = 1;
00449       if (strcasestr(args.options, "noanswer"))
00450          option_noanswer = 1;
00451    } 
00452    if (chan->_state != AST_STATE_UP) {
00453       if (option_skip) {
00454          /* At the user's option, skip if the line is not up */
00455          goto done;
00456       } else if (!option_noanswer) {
00457          /* Otherwise answer unless we're supposed to send this while on-hook */
00458          res = ast_answer(chan);
00459       }
00460    }
00461    if (!res) {
00462       char *back = args.filenames;
00463       char *front;
00464 
00465       ast_stopstream(chan);
00466       while (!res && (front = strsep(&back, "&"))) {
00467          if (option_say)
00468             res = say_full(chan, front, "", chan->language, NULL, -1, -1);
00469          else
00470             res = ast_streamfile(chan, front, chan->language);
00471          if (!res) { 
00472             res = ast_waitstream(chan, "");  
00473             ast_stopstream(chan);
00474          } else {
00475             ast_log(LOG_WARNING, "ast_streamfile failed on %s for %s\n", chan->name, (char *)data);
00476             res = 0;
00477             mres = 1;
00478          }
00479       }
00480    }
00481 done:
00482    pbx_builtin_setvar_helper(chan, "PLAYBACKSTATUS", mres ? "FAILED" : "SUCCESS");
00483    return res;
00484 }

static int reload ( void   )  [static]

Definition at line 486 of file app_playback.c.

References ast_config_destroy(), ast_config_load, ast_extension_match(), ast_log(), ast_variable_browse(), CONFIG_FLAG_FILEUNCHANGED, config_flags, CONFIG_STATUS_FILEINVALID, CONFIG_STATUS_FILEUNCHANGED, LOG_ERROR, LOG_NOTICE, ast_variable::name, ast_variable::next, say_cfg, say_init_mode(), and ast_variable::value.

00487 {
00488    struct ast_variable *v;
00489    struct ast_flags config_flags = { CONFIG_FLAG_FILEUNCHANGED };
00490    struct ast_config *newcfg;
00491 
00492    if ((newcfg = ast_config_load("say.conf", config_flags)) == CONFIG_STATUS_FILEUNCHANGED) {
00493       return 0;
00494    } else if (newcfg == CONFIG_STATUS_FILEINVALID) {
00495       ast_log(LOG_ERROR, "Config file say.conf is in an invalid format.  Aborting.\n");
00496       return 0;
00497    }
00498 
00499    if (say_cfg) {
00500       ast_config_destroy(say_cfg);
00501       ast_log(LOG_NOTICE, "Reloading say.conf\n");
00502       say_cfg = newcfg;
00503    }
00504 
00505    if (say_cfg) {
00506       for (v = ast_variable_browse(say_cfg, "general"); v ; v = v->next) {
00507             if (ast_extension_match(v->name, "mode")) {
00508             say_init_mode(v->value);
00509             break;
00510          }
00511       }
00512    }
00513    
00514    /*
00515     * XXX here we should sort rules according to the same order
00516     * we have in pbx.c so we have the same matching behaviour.
00517     */
00518    return 0;
00519 }

static void restore_say_mode ( void *  arg  )  [static]

Definition at line 117 of file app_playback.c.

References ast_say_character_str_full, ast_say_date, ast_say_date_with_format, ast_say_datetime, ast_say_datetime_from_now, ast_say_digit_str_full, ast_say_enumeration_full, ast_say_number_full, ast_say_phonetic_str_full, and ast_say_time.

Referenced by say_init_mode().

00118 {
00119    int i = 0;
00120    say_api_buf[i++] = arg;
00121 
00122    ast_say_number_full = say_api_buf[i++];
00123    ast_say_enumeration_full = say_api_buf[i++];
00124    ast_say_digit_str_full = say_api_buf[i++];
00125    ast_say_character_str_full = say_api_buf[i++];
00126    ast_say_phonetic_str_full = say_api_buf[i++];
00127    ast_say_datetime = say_api_buf[i++];
00128    ast_say_time = say_api_buf[i++];
00129    ast_say_date = say_api_buf[i++];
00130    ast_say_datetime_from_now = say_api_buf[i++];
00131    ast_say_date_with_format = say_api_buf[i++];
00132 }

static int s_streamwait3 ( const say_args_t a,
const char *  fn 
) [static]

Definition at line 148 of file app_playback.c.

References ast_log(), ast_stopstream(), ast_streamfile(), ast_waitstream(), ast_waitstream_full(), say_args_t::audiofd, say_args_t::chan, say_args_t::ctrlfd, say_args_t::ints, say_args_t::language, and LOG_WARNING.

00149 {
00150    int res = ast_streamfile(a->chan, fn, a->language);
00151    if (res) {
00152       ast_log(LOG_WARNING, "Unable to play message %s\n", fn);
00153       return res;
00154    }
00155    res = (a->audiofd  > -1 && a->ctrlfd > -1) ?
00156    ast_waitstream_full(a->chan, a->ints, a->audiofd, a->ctrlfd) :
00157    ast_waitstream(a->chan, a->ints);
00158    ast_stopstream(a->chan);
00159    return res;  
00160 }

static void save_say_mode ( const void *  arg  )  [static]

Definition at line 100 of file app_playback.c.

References ast_say_character_str_full, ast_say_date, ast_say_date_with_format, ast_say_datetime, ast_say_datetime_from_now, ast_say_digit_str_full, ast_say_enumeration_full, ast_say_number_full, ast_say_phonetic_str_full, and ast_say_time.

Referenced by say_init_mode().

00101 {
00102    int i = 0;
00103    say_api_buf[i++] = arg;
00104 
00105    say_api_buf[i++] = ast_say_number_full;
00106    say_api_buf[i++] = ast_say_enumeration_full;
00107    say_api_buf[i++] = ast_say_digit_str_full;
00108    say_api_buf[i++] = ast_say_character_str_full;
00109    say_api_buf[i++] = ast_say_phonetic_str_full;
00110    say_api_buf[i++] = ast_say_datetime;
00111    say_api_buf[i++] = ast_say_time;
00112    say_api_buf[i++] = ast_say_date;
00113    say_api_buf[i++] = ast_say_datetime_from_now;
00114    say_api_buf[i++] = ast_say_date_with_format;
00115 }

static int say_date ( struct ast_channel chan,
time_t  t,
const char *  ints,
const char *  lang 
) [static]

Definition at line 335 of file app_playback.c.

References say_date_generic().

Referenced by __say_init(), and say_init_mode().

00336 {
00337    return say_date_generic(chan, t, ints, lang, "", NULL, "date");
00338 }

static int say_date_generic ( struct ast_channel chan,
time_t  t,
const char *  ints,
const char *  lang,
const char *  format,
const char *  timezonename,
const char *  prefix 
) [static]

Definition at line 304 of file app_playback.c.

References ast_localtime(), do_say(), ast_tm::tm_hour, ast_tm::tm_mday, ast_tm::tm_min, ast_tm::tm_mon, ast_tm::tm_sec, ast_tm::tm_wday, ast_tm::tm_yday, and ast_tm::tm_year.

Referenced by say_date(), say_date_with_format(), say_datetime(), and say_time().

00306 {
00307    char buf[128];
00308    struct ast_tm tm;
00309    struct timeval when = { t, 0 };
00310    say_args_t a = { chan, ints, lang, -1, -1 };
00311    if (format == NULL)
00312       format = "";
00313 
00314    ast_localtime(&when, &tm, NULL);
00315    snprintf(buf, sizeof(buf), "%s:%s:%04d%02d%02d%02d%02d.%02d-%d-%3d",
00316       prefix,
00317       format,
00318       tm.tm_year+1900,
00319       tm.tm_mon+1,
00320       tm.tm_mday,
00321       tm.tm_hour,
00322       tm.tm_min,
00323       tm.tm_sec,
00324       tm.tm_wday,
00325       tm.tm_yday);
00326    return do_say(&a, buf, NULL, 0);
00327 }

static int say_date_with_format ( struct ast_channel chan,
time_t  t,
const char *  ints,
const char *  lang,
const char *  format,
const char *  timezonename 
) [static]

Definition at line 329 of file app_playback.c.

References say_date_generic().

Referenced by __say_init(), and say_init_mode().

00331 {
00332    return say_date_generic(chan, t, ints, lang, format, timezonename, "datetime");
00333 }

static int say_datetime ( struct ast_channel chan,
time_t  t,
const char *  ints,
const char *  lang 
) [static]

Definition at line 345 of file app_playback.c.

References say_date_generic().

Referenced by __say_init(), and say_init_mode().

00346 {
00347    return say_date_generic(chan, t, ints, lang, "", NULL, "datetime");
00348 }

static int say_enumeration_full ( struct ast_channel chan,
int  num,
const char *  ints,
const char *  lang,
const char *  options,
int  audiofd,
int  ctrlfd 
) [static]

Definition at line 294 of file app_playback.c.

References do_say().

Referenced by __say_init(), and say_init_mode().

00297 {
00298    char buf[64];
00299    say_args_t a = { chan, ints, lang, audiofd, ctrlfd };
00300    snprintf(buf, sizeof(buf), "enum:%d", num);
00301    return do_say(&a, buf, options, 0);
00302 }

static int say_full ( struct ast_channel chan,
const char *  string,
const char *  ints,
const char *  lang,
const char *  options,
int  audiofd,
int  ctrlfd 
) [static]

Definition at line 276 of file app_playback.c.

References do_say().

Referenced by playback_exec().

00279 {
00280    say_args_t a = { chan, ints, lang, audiofd, ctrlfd };
00281    return do_say(&a, string, options, 0);
00282 }

static int say_init_mode ( const char *  mode  )  [static]

Definition at line 353 of file app_playback.c.

References ast_log(), ast_say_character_str_full, ast_say_date, ast_say_date_with_format, ast_say_datetime, ast_say_datetime_from_now, ast_say_digit_str_full, ast_say_digits_full(), ast_say_enumeration_full, ast_say_number_full, ast_say_phonetic_str_full, ast_say_time, LOG_ERROR, LOG_WARNING, restore_say_mode(), save_say_mode(), say_cfg, say_character_str_full(), say_date(), say_date_with_format(), say_datetime(), say_datetime_from_now(), say_digit_str_full(), say_enumeration_full(), say_number_full(), say_phonetic_str_full(), and say_time().

Referenced by __say_cli_init(), load_module(), and reload().

00353                                            {
00354    if (!strcmp(mode, say_new)) {
00355       if (say_cfg == NULL) {
00356          ast_log(LOG_ERROR, "There is no say.conf file to use new mode\n");
00357          return -1;
00358       }
00359       save_say_mode(say_new);
00360       ast_say_number_full = say_number_full;
00361 
00362       ast_say_enumeration_full = say_enumeration_full;
00363 #if 0
00364       ast_say_digits_full = say_digits_full;
00365       ast_say_digit_str_full = say_digit_str_full;
00366       ast_say_character_str_full = say_character_str_full;
00367       ast_say_phonetic_str_full = say_phonetic_str_full;
00368       ast_say_datetime_from_now = say_datetime_from_now;
00369 #endif
00370       ast_say_datetime = say_datetime;
00371       ast_say_time = say_time;
00372       ast_say_date = say_date;
00373       ast_say_date_with_format = say_date_with_format;
00374    } else if (!strcmp(mode, say_old) && say_api_buf[0] == say_new) {
00375       restore_say_mode(NULL);
00376    } else if (strcmp(mode, say_old)) {
00377       ast_log(LOG_WARNING, "unrecognized mode %s\n", mode);
00378       return -1;
00379    }
00380    
00381    return 0;
00382 }

static int say_number_full ( struct ast_channel chan,
int  num,
const char *  ints,
const char *  lang,
const char *  options,
int  audiofd,
int  ctrlfd 
) [static]

Definition at line 284 of file app_playback.c.

References do_say().

Referenced by __say_init(), and say_init_mode().

00287 {
00288    char buf[64];
00289    say_args_t a = { chan, ints, lang, audiofd, ctrlfd };
00290    snprintf(buf, sizeof(buf), "num:%d", num);
00291    return do_say(&a, buf, options, 0);
00292 }

static int say_time ( struct ast_channel chan,
time_t  t,
const char *  ints,
const char *  lang 
) [static]

Definition at line 340 of file app_playback.c.

References say_date_generic().

Referenced by __say_init(), and say_init_mode().

00341 {
00342    return say_date_generic(chan, t, ints, lang, "", NULL, "time");
00343 }

static int unload_module ( void   )  [static]

Definition at line 521 of file app_playback.c.

References ARRAY_LEN, ast_cli_unregister_multiple(), ast_config_destroy(), ast_unregister_application(), cli_playback, and say_cfg.

00522 {
00523    int res;
00524 
00525    res = ast_unregister_application(app);
00526 
00527    ast_cli_unregister_multiple(cli_playback, ARRAY_LEN(cli_playback));
00528 
00529    if (say_cfg)
00530       ast_config_destroy(say_cfg);
00531 
00532    return res; 
00533 }


Variable Documentation

struct ast_module_info __mod_info = { .name = AST_MODULE, .flags = AST_MODFLAG_DEFAULT , .description = "Sound File Playback Application" , .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 = "88eaa8f5c1bd988bedd71113385e0886" , .load = load_module, .unload = unload_module, .reload = reload, } [static]

Definition at line 558 of file app_playback.c.

char* app = "Playback" [static]

Definition at line 88 of file app_playback.c.

struct ast_module_info* ast_module_info = &__mod_info [static]

Definition at line 558 of file app_playback.c.

struct ast_cli_entry cli_playback[] [static]

Initial value:

 {
   { .handler =  __say_cli_init , .summary =  "Set or show the say mode" ,__VA_ARGS__ },
}

Definition at line 418 of file app_playback.c.

Referenced by unload_module().

const void* say_api_buf[40] [static]

Definition at line 96 of file app_playback.c.

struct ast_config* say_cfg = NULL [static]

Definition at line 90 of file app_playback.c.

Referenced by do_say(), load_module(), reload(), say_init_mode(), and unload_module().

const char* const say_new = "new" [static]

Definition at line 98 of file app_playback.c.

const char* const say_old = "old" [static]

Definition at line 97 of file app_playback.c.


Generated on Sat Mar 10 01:54:34 2012 for Asterisk - The Open Source Telephony Project by  doxygen 1.4.7