Sun Dec 18 20:55:43 2011

Asterisk developer's documentation


app_milliwatt.c File Reference

Digital Milliwatt Test. More...

#include "asterisk.h"
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <errno.h>
#include "asterisk/lock.h"
#include "asterisk/file.h"
#include "asterisk/logger.h"
#include "asterisk/channel.h"
#include "asterisk/pbx.h"
#include "asterisk/module.h"
#include "asterisk/utils.h"

Include dependency graph for app_milliwatt.c:

Go to the source code of this file.

Functions

 AST_MODULE_INFO_STANDARD (ASTERISK_GPL_KEY,"Digital Milliwatt (mu-law) Test Application")
static int load_module (void)
static void * milliwatt_alloc (struct ast_channel *chan, void *params)
static int milliwatt_exec (struct ast_channel *chan, void *data)
static int milliwatt_generate (struct ast_channel *chan, void *data, int len, int samples)
static void milliwatt_release (struct ast_channel *chan, void *data)
static int old_milliwatt_exec (struct ast_channel *chan)
static int unload_module (void)

Variables

static char * app = "Milliwatt"
static char * descrip
static char digital_milliwatt [] = {0x1e,0x0b,0x0b,0x1e,0x9e,0x8b,0x8b,0x9e}
static struct ast_generator milliwattgen
static char * synopsis = "Generate a Constant 1004Hz tone at 0dbm (mu-law)"


Detailed Description

Digital Milliwatt Test.

Author:
Mark Spencer <markster@digium.com>

Definition in file app_milliwatt.c.


Function Documentation

AST_MODULE_INFO_STANDARD ( ASTERISK_GPL_KEY  ,
"Digital Milliwatt (mu-law) Test Application"   
)

static int load_module ( void   )  [static]

Definition at line 189 of file app_milliwatt.c.

References ast_register_application(), and milliwatt_exec().

00190 {
00191    return ast_register_application(app, milliwatt_exec, synopsis, descrip);
00192 }

static void* milliwatt_alloc ( struct ast_channel chan,
void *  params 
) [static]

Definition at line 64 of file app_milliwatt.c.

References ast_calloc.

00065 {
00066    return ast_calloc(1, sizeof(int));
00067 }

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

Definition at line 145 of file app_milliwatt.c.

References ast_log(), ast_module_user_add, ast_module_user_remove, ast_safe_sleep(), ast_strlen_zero(), exit_app, LOG_ERROR, old_milliwatt_exec(), pbx_exec(), and pbx_findapp().

Referenced by load_module().

00146 {
00147    const char *options = data;
00148    struct ast_app *playtones_app;
00149    struct ast_module_user *u;
00150    int res = -1;
00151 
00152    u = ast_module_user_add(chan);
00153 
00154    if (!ast_strlen_zero(options) && strchr(options, 'o')) {
00155       res = old_milliwatt_exec(chan);
00156       goto exit_app;
00157    }
00158 
00159    if (!(playtones_app = pbx_findapp("Playtones"))) {
00160       ast_log(LOG_ERROR, "The Playtones application is required to run Milliwatt()\n");
00161       goto exit_app;
00162    }
00163 
00164    res = pbx_exec(chan, playtones_app, "1004/1000");
00165 
00166    while (!res) {
00167       res = ast_safe_sleep(chan, 10000);
00168    }
00169 
00170    res = 0;
00171 
00172 exit_app:
00173    ast_module_user_remove(u);
00174 
00175    return res;
00176 }

static int milliwatt_generate ( struct ast_channel chan,
void *  data,
int  len,
int  samples 
) [static]

Definition at line 75 of file app_milliwatt.c.

References AST_FORMAT_ULAW, AST_FRAME_VOICE, AST_FRIENDLY_OFFSET, ast_log(), ast_write(), ast_frame::datalen, errno, ast_frame::frametype, LOG_WARNING, and ast_frame::samples.

00076 {
00077    unsigned char buf[AST_FRIENDLY_OFFSET + 640];
00078    const int maxsamples = sizeof (buf) / sizeof (buf[0]);
00079    int i, *indexp = (int *) data;
00080    struct ast_frame wf = {
00081       .frametype = AST_FRAME_VOICE,
00082       .subclass = AST_FORMAT_ULAW,
00083       .offset = AST_FRIENDLY_OFFSET,
00084       .data = buf + AST_FRIENDLY_OFFSET,
00085       .src = __FUNCTION__,
00086    };
00087 
00088    /* Instead of len, use samples, because channel.c generator_force
00089    * generate(chan, tmp, 0, 160) ignores len. In any case, len is
00090    * a multiple of samples, given by number of samples times bytes per
00091    * sample. In the case of ulaw, len = samples. for signed linear
00092    * len = 2 * samples */
00093 
00094    if (samples > maxsamples) {
00095       ast_log(LOG_WARNING, "Only doing %d samples (%d requested)\n", maxsamples, samples);
00096       samples = maxsamples;
00097    }
00098 
00099    len = samples * sizeof (buf[0]);
00100    wf.datalen = len;
00101    wf.samples = samples;
00102 
00103    /* create a buffer containing the digital milliwatt pattern */
00104    for (i = 0; i < len; i++) {
00105       buf[AST_FRIENDLY_OFFSET + i] = digital_milliwatt[(*indexp)++];
00106       *indexp &= 7;
00107    }
00108 
00109    if (ast_write(chan,&wf) < 0) {
00110       ast_log(LOG_WARNING,"Failed to write frame to '%s': %s\n",chan->name,strerror(errno));
00111       return -1;
00112    }
00113 
00114    return 0;
00115 }

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

Definition at line 69 of file app_milliwatt.c.

References free.

00070 {
00071    free(data);
00072    return;
00073 }

static int old_milliwatt_exec ( struct ast_channel chan  )  [static]

Definition at line 123 of file app_milliwatt.c.

References ast_channel::_state, ast_activate_generator(), ast_answer(), ast_deactivate_generator(), AST_FORMAT_ULAW, ast_log(), ast_safe_sleep(), ast_set_read_format(), ast_set_write_format(), AST_STATE_UP, and LOG_WARNING.

Referenced by milliwatt_exec().

00124 {
00125    ast_set_write_format(chan, AST_FORMAT_ULAW);
00126    ast_set_read_format(chan, AST_FORMAT_ULAW);
00127 
00128    if (chan->_state != AST_STATE_UP) {
00129       ast_answer(chan);
00130    }
00131 
00132    if (ast_activate_generator(chan,&milliwattgen,"milliwatt") < 0) {
00133       ast_log(LOG_WARNING,"Failed to activate generator on '%s'\n",chan->name);
00134       return -1;
00135    }
00136 
00137    while (!ast_safe_sleep(chan, 10000))
00138       ;
00139 
00140    ast_deactivate_generator(chan);
00141 
00142    return -1;
00143 }

static int unload_module ( void   )  [static]

Definition at line 178 of file app_milliwatt.c.

References ast_module_user_hangup_all, and ast_unregister_application().

00179 {
00180    int res;
00181 
00182    res = ast_unregister_application(app);
00183 
00184    ast_module_user_hangup_all();
00185 
00186    return res;
00187 }


Variable Documentation

char* app = "Milliwatt" [static]

Definition at line 50 of file app_milliwatt.c.

char* descrip [static]

Definition at line 54 of file app_milliwatt.c.

char digital_milliwatt[] = {0x1e,0x0b,0x0b,0x1e,0x9e,0x8b,0x8b,0x9e} [static]

Definition at line 62 of file app_milliwatt.c.

struct ast_generator milliwattgen [static]

Initial value:

 {
   alloc: milliwatt_alloc,
   release: milliwatt_release,
   generate: milliwatt_generate,
}

Definition at line 117 of file app_milliwatt.c.

char* synopsis = "Generate a Constant 1004Hz tone at 0dbm (mu-law)" [static]

Definition at line 52 of file app_milliwatt.c.


Generated on Sun Dec 18 20:55:43 2011 for Asterisk - the Open Source PBX by  doxygen 1.5.6