Mon Oct 8 12:39:22 2012

Asterisk developer's documentation


format_wav.c File Reference

Work with WAV in the proprietary Microsoft format. Microsoft WAV format (8000hz Signed Linear). More...

#include "asterisk.h"
#include "asterisk/mod_format.h"
#include "asterisk/module.h"
#include "asterisk/endian.h"

Go to the source code of this file.

Data Structures

struct  wav_desc

Defines

#define BLOCKSIZE   160
#define WAV_BUF_SIZE   320
#define WAV_HEADER_SIZE   44

Functions

static void __reg_module (void)
static void __unreg_module (void)
static int check_header (FILE *f, int hz)
static int check_header_fmt (FILE *f, int hsize, int hz)
static int load_module (void)
static int unload_module (void)
static int update_header (FILE *f)
static void wav_close (struct ast_filestream *s)
static int wav_open (struct ast_filestream *s)
static struct ast_framewav_read (struct ast_filestream *s, int *whennext)
static int wav_rewrite (struct ast_filestream *s, const char *comment)
static int wav_seek (struct ast_filestream *fs, off_t sample_offset, int whence)
static off_t wav_tell (struct ast_filestream *fs)
static int wav_trunc (struct ast_filestream *fs)
static int wav_write (struct ast_filestream *fs, struct ast_frame *f)
static int write_header (FILE *f, int writehz)

Variables

static struct ast_module_info __mod_info = { .name = AST_MODULE, .flags = AST_MODFLAG_LOAD_ORDER , .description = "Microsoft WAV/WAV16 format (8kHz/16kHz Signed Linear)" , .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 = "ac1f6a56484a8820659555499174e588" , .load = load_module, .unload = unload_module, .load_pri = AST_MODPRI_APP_DEPEND }
static struct ast_module_infoast_module_info = &__mod_info
static struct ast_format wav16_f
static struct ast_format wav_f


Detailed Description

Work with WAV in the proprietary Microsoft format. Microsoft WAV format (8000hz Signed Linear).

Definition in file format_wav.c.


Define Documentation

#define BLOCKSIZE   160

Definition at line 55 of file format_wav.c.

#define WAV_BUF_SIZE   320

Definition at line 43 of file format_wav.c.

Referenced by wav_read().

#define WAV_HEADER_SIZE   44

Definition at line 45 of file format_wav.c.

Referenced by wav_seek().


Function Documentation

static void __reg_module ( void   )  [static]

Definition at line 568 of file format_wav.c.

static void __unreg_module ( void   )  [static]

Definition at line 568 of file format_wav.c.

static int check_header ( FILE *  f,
int  hz 
) [static]

Definition at line 141 of file format_wav.c.

References ast_log(), check_header_fmt(), LOG_DEBUG, LOG_WARNING, and type.

00142 {
00143    int type, size, formtype;
00144    int data;
00145    if (fread(&type, 1, 4, f) != 4) {
00146       ast_log(LOG_WARNING, "Read failed (type)\n");
00147       return -1;
00148    }
00149    if (fread(&size, 1, 4, f) != 4) {
00150       ast_log(LOG_WARNING, "Read failed (size)\n");
00151       return -1;
00152    }
00153    size = ltohl(size);
00154    if (fread(&formtype, 1, 4, f) != 4) {
00155       ast_log(LOG_WARNING, "Read failed (formtype)\n");
00156       return -1;
00157    }
00158    if (memcmp(&type, "RIFF", 4)) {
00159       ast_log(LOG_WARNING, "Does not begin with RIFF\n");
00160       return -1;
00161    }
00162    if (memcmp(&formtype, "WAVE", 4)) {
00163       ast_log(LOG_WARNING, "Does not contain WAVE\n");
00164       return -1;
00165    }
00166    /* Skip any facts and get the first data block */
00167    for(;;)
00168    { 
00169       char buf[4];
00170        
00171        /* Begin data chunk */
00172        if (fread(&buf, 1, 4, f) != 4) {
00173          ast_log(LOG_WARNING, "Read failed (block header format)\n");
00174          return -1;
00175        }
00176        /* Data has the actual length of data in it */
00177        if (fread(&data, 1, 4, f) != 4) {
00178          ast_log(LOG_WARNING, "Read failed (block '%.4s' header length)\n", buf);
00179          return -1;
00180        }
00181        data = ltohl(data);
00182       if (memcmp(&buf, "fmt ", 4) == 0) {
00183          if (check_header_fmt(f, data, hz))
00184             return -1;
00185          continue;
00186       }
00187        if(memcmp(buf, "data", 4) == 0 ) 
00188          break;
00189       ast_log(LOG_DEBUG, "Skipping unknown block '%.4s'\n", buf);
00190        if (fseek(f,data,SEEK_CUR) == -1 ) {
00191          ast_log(LOG_WARNING, "Failed to skip '%.4s' block: %d\n", buf, data);
00192          return -1;
00193        }
00194    }
00195 #if 0
00196    curpos = lseek(fd, 0, SEEK_CUR);
00197    truelength = lseek(fd, 0, SEEK_END);
00198    lseek(fd, curpos, SEEK_SET);
00199    truelength -= curpos;
00200 #endif   
00201    return data;
00202 }

static int check_header_fmt ( FILE *  f,
int  hsize,
int  hz 
) [static]

Definition at line 80 of file format_wav.c.

References ast_log(), format, and LOG_WARNING.

Referenced by check_header().

00081 {
00082    short format, chans, bysam, bisam;
00083    int bysec;
00084    int freq;
00085    if (hsize < 16) {
00086       ast_log(LOG_WARNING, "Unexpected header size %d\n", hsize);
00087       return -1;
00088    }
00089    if (fread(&format, 1, 2, f) != 2) {
00090       ast_log(LOG_WARNING, "Read failed (format)\n");
00091       return -1;
00092    }
00093    if (ltohs(format) != 1) {
00094       ast_log(LOG_WARNING, "Not a wav file %d\n", ltohs(format));
00095       return -1;
00096    }
00097    if (fread(&chans, 1, 2, f) != 2) {
00098       ast_log(LOG_WARNING, "Read failed (format)\n");
00099       return -1;
00100    }
00101    if (ltohs(chans) != 1) {
00102       ast_log(LOG_WARNING, "Not in mono %d\n", ltohs(chans));
00103       return -1;
00104    }
00105    if (fread(&freq, 1, 4, f) != 4) {
00106       ast_log(LOG_WARNING, "Read failed (freq)\n");
00107       return -1;
00108    }
00109    if (((ltohl(freq) != 8000) && (ltohl(freq) != 16000)) ||
00110        ((ltohl(freq) == 8000) && (hz != 8000)) ||
00111        ((ltohl(freq) == 16000) && (hz != 16000))) {
00112       ast_log(LOG_WARNING, "Unexpected frequency mismatch %d (expecting %d)\n", ltohl(freq),hz);
00113       return -1;
00114    }
00115    /* Ignore the byte frequency */
00116    if (fread(&bysec, 1, 4, f) != 4) {
00117       ast_log(LOG_WARNING, "Read failed (BYTES_PER_SECOND)\n");
00118       return -1;
00119    }
00120    /* Check bytes per sample */
00121    if (fread(&bysam, 1, 2, f) != 2) {
00122       ast_log(LOG_WARNING, "Read failed (BYTES_PER_SAMPLE)\n");
00123       return -1;
00124    }
00125    if (ltohs(bysam) != 2) {
00126       ast_log(LOG_WARNING, "Can only handle 16bits per sample: %d\n", ltohs(bysam));
00127       return -1;
00128    }
00129    if (fread(&bisam, 1, 2, f) != 2) {
00130       ast_log(LOG_WARNING, "Read failed (Bits Per Sample): %d\n", ltohs(bisam));
00131       return -1;
00132    }
00133    /* Skip any additional header */
00134    if (fseek(f,hsize-16,SEEK_CUR) == -1 ) {
00135       ast_log(LOG_WARNING, "Failed to skip remaining header bytes: %d\n", hsize-16 );
00136       return -1;
00137    }
00138    return 0;
00139 }

static int load_module ( void   )  [static]

Definition at line 550 of file format_wav.c.

References ast_format_register, AST_MODULE_LOAD_FAILURE, AST_MODULE_LOAD_SUCCESS, wav16_f, and wav_f.

00551 {
00552    if (ast_format_register(&wav_f)
00553       || ast_format_register(&wav16_f))
00554       return AST_MODULE_LOAD_FAILURE;
00555    return AST_MODULE_LOAD_SUCCESS;
00556 }

static int unload_module ( void   )  [static]

Definition at line 558 of file format_wav.c.

References ast_format_unregister(), ast_format::name, wav16_f, and wav_f.

00559 {
00560    return ast_format_unregister(wav_f.name)
00561       || ast_format_unregister(wav16_f.name);
00562 }

static int update_header ( FILE *  f  )  [static]

Definition at line 204 of file format_wav.c.

References ast_log(), and LOG_WARNING.

00205 {
00206    off_t cur,end;
00207    int datalen,filelen,bytes;
00208    
00209    cur = ftello(f);
00210    fseek(f, 0, SEEK_END);
00211    end = ftello(f);
00212    /* data starts 44 bytes in */
00213    bytes = end - 44;
00214    datalen = htoll(bytes);
00215    /* chunk size is bytes of data plus 36 bytes of header */
00216    filelen = htoll(36 + bytes);
00217    
00218    if (cur < 0) {
00219       ast_log(LOG_WARNING, "Unable to find our position\n");
00220       return -1;
00221    }
00222    if (fseek(f, 4, SEEK_SET)) {
00223       ast_log(LOG_WARNING, "Unable to set our position\n");
00224       return -1;
00225    }
00226    if (fwrite(&filelen, 1, 4, f) != 4) {
00227       ast_log(LOG_WARNING, "Unable to set write file size\n");
00228       return -1;
00229    }
00230    if (fseek(f, 40, SEEK_SET)) {
00231       ast_log(LOG_WARNING, "Unable to set our position\n");
00232       return -1;
00233    }
00234    if (fwrite(&datalen, 1, 4, f) != 4) {
00235       ast_log(LOG_WARNING, "Unable to set write datalen\n");
00236       return -1;
00237    }
00238    if (fseeko(f, cur, SEEK_SET)) {
00239       ast_log(LOG_WARNING, "Unable to return to position\n");
00240       return -1;
00241    }
00242    return 0;
00243 }

static void wav_close ( struct ast_filestream s  )  [static]

Definition at line 340 of file format_wav.c.

References ast_filestream::_private, ast_log(), wav_desc::bytes, errno, ast_filestream::f, ast_filestream::filename, LOG_WARNING, ast_filestream::mode, and update_header().

00341 {
00342    char zero = 0;
00343    struct wav_desc *fs = (struct wav_desc *)s->_private;
00344 
00345    if (s->mode == O_RDONLY) {
00346       return;
00347    }
00348 
00349    if (s->filename) {
00350       update_header(s->f);
00351    }
00352 
00353    /* Pad to even length */
00354    if (fs->bytes & 0x1) {
00355       if (!fwrite(&zero, 1, 1, s->f)) {
00356          ast_log(LOG_WARNING, "fwrite() failed: %s\n", strerror(errno));
00357       }
00358    }
00359 }

static int wav_open ( struct ast_filestream s  )  [static]

Definition at line 316 of file format_wav.c.

References ast_filestream::_private, AST_FORMAT_SLINEAR16, check_header(), ast_filestream::f, ast_filestream::fmt, ast_format::format, and wav_desc::maxlen.

00317 {
00318    /* We don't have any header to read or anything really, but
00319       if we did, it would go here.  We also might want to check
00320       and be sure it's a valid file.  */
00321    struct wav_desc *tmp = (struct wav_desc *)s->_private;
00322    if ((tmp->maxlen = check_header(s->f, (s->fmt->format == AST_FORMAT_SLINEAR16 ? 16000 : 8000))) < 0)
00323       return -1;
00324    return 0;
00325 }

static struct ast_frame* wav_read ( struct ast_filestream s,
int *  whennext 
) [static]

Definition at line 361 of file format_wav.c.

References ast_filestream::_private, AST_FORMAT_SLINEAR, AST_FORMAT_SLINEAR16, AST_FRAME_SET_BUFFER, AST_FRAME_VOICE, AST_FRIENDLY_OFFSET, ast_log(), ast_filestream::buf, ast_frame_subclass::codec, ast_frame::data, ast_frame::datalen, errno, ast_filestream::f, ast_filestream::fr, ast_frame::frametype, wav_desc::hz, LOG_WARNING, ast_frame::mallocd, wav_desc::maxlen, ast_frame::ptr, ast_frame::samples, ast_frame::subclass, and WAV_BUF_SIZE.

00362 {
00363    int res;
00364    int samples;   /* actual samples read */
00365 #if __BYTE_ORDER == __BIG_ENDIAN
00366    int x;
00367    short *tmp;
00368 #endif
00369    int bytes;
00370    off_t here;
00371    /* Send a frame from the file to the appropriate channel */
00372    struct wav_desc *fs = (struct wav_desc *)s->_private;
00373 
00374    bytes = (fs->hz == 16000 ? (WAV_BUF_SIZE * 2) : WAV_BUF_SIZE);
00375 
00376    here = ftello(s->f);
00377    if (fs->maxlen - here < bytes)      /* truncate if necessary */
00378       bytes = fs->maxlen - here;
00379    if (bytes < 0)
00380       bytes = 0;
00381 /*    ast_debug(1, "here: %d, maxlen: %d, bytes: %d\n", here, s->maxlen, bytes); */
00382    s->fr.frametype = AST_FRAME_VOICE;
00383    s->fr.subclass.codec = (fs->hz == 16000 ? AST_FORMAT_SLINEAR16 : AST_FORMAT_SLINEAR);
00384    s->fr.mallocd = 0;
00385    AST_FRAME_SET_BUFFER(&s->fr, s->buf, AST_FRIENDLY_OFFSET, bytes);
00386    
00387    if ( (res = fread(s->fr.data.ptr, 1, s->fr.datalen, s->f)) <= 0 ) {
00388       if (res)
00389          ast_log(LOG_WARNING, "Short read (%d) (%s)!\n", res, strerror(errno));
00390       return NULL;
00391    }
00392    s->fr.datalen = res;
00393    s->fr.samples = samples = res / 2;
00394 
00395 #if __BYTE_ORDER == __BIG_ENDIAN
00396    tmp = (short *)(s->fr.data.ptr);
00397    /* file format is little endian so we need to swap */
00398    for( x = 0; x < samples; x++)
00399       tmp[x] = (tmp[x] << 8) | ((tmp[x] & 0xff00) >> 8);
00400 #endif
00401 
00402    *whennext = samples;
00403    return &s->fr;
00404 }

static int wav_rewrite ( struct ast_filestream s,
const char *  comment 
) [static]

Definition at line 327 of file format_wav.c.

References ast_filestream::_private, AST_FORMAT_SLINEAR16, ast_filestream::f, ast_filestream::fmt, ast_format::format, wav_desc::hz, and write_header().

00328 {
00329    /* We don't have any header to read or anything really, but
00330       if we did, it would go here.  We also might want to check
00331       and be sure it's a valid file.  */
00332 
00333    struct wav_desc *tmp = (struct wav_desc *)s->_private;
00334    tmp->hz = (s->fmt->format == AST_FORMAT_SLINEAR16 ? 16000 : 8000);
00335    if (write_header(s->f,tmp->hz))
00336       return -1;
00337    return 0;
00338 }

static int wav_seek ( struct ast_filestream fs,
off_t  sample_offset,
int  whence 
) [static]

Definition at line 455 of file format_wav.c.

References ast_log(), AST_LOG_WARNING, errno, ast_filestream::f, SEEK_FORCECUR, and WAV_HEADER_SIZE.

00456 {
00457    off_t min = WAV_HEADER_SIZE, max, cur, offset = 0, samples;
00458 
00459    samples = sample_offset * 2; /* SLINEAR is 16 bits mono, so sample_offset * 2 = bytes */
00460 
00461    if ((cur = ftello(fs->f)) < 0) {
00462       ast_log(AST_LOG_WARNING, "Unable to determine current position in wav filestream %p: %s\n", fs, strerror(errno));
00463       return -1;
00464    }
00465 
00466    if (fseeko(fs->f, 0, SEEK_END) < 0) {
00467       ast_log(AST_LOG_WARNING, "Unable to seek to end of wav filestream %p: %s\n", fs, strerror(errno));
00468       return -1;
00469    }
00470 
00471    if ((max = ftello(fs->f)) < 0) {
00472       ast_log(AST_LOG_WARNING, "Unable to determine max position in wav filestream %p: %s\n", fs, strerror(errno));
00473       return -1;
00474    }
00475 
00476    if (whence == SEEK_SET)
00477       offset = samples + min;
00478    else if (whence == SEEK_CUR || whence == SEEK_FORCECUR)
00479       offset = samples + cur;
00480    else if (whence == SEEK_END)
00481       offset = max - samples;
00482         if (whence != SEEK_FORCECUR) {
00483       offset = (offset > max)?max:offset;
00484    }
00485    /* always protect the header space. */
00486    offset = (offset < min)?min:offset;
00487    return fseeko(fs->f, offset, SEEK_SET);
00488 }

static off_t wav_tell ( struct ast_filestream fs  )  [static]

Definition at line 510 of file format_wav.c.

References ast_filestream::f.

00511 {
00512    off_t offset;
00513    offset = ftello(fs->f);
00514    /* subtract header size to get samples, then divide by 2 for 16 bit samples */
00515    return (offset - 44)/2;
00516 }

static int wav_trunc ( struct ast_filestream fs  )  [static]

Definition at line 490 of file format_wav.c.

References ast_log(), AST_LOG_WARNING, errno, ast_filestream::f, and update_header().

00491 {
00492    int fd;
00493    off_t cur;
00494 
00495    if ((fd = fileno(fs->f)) < 0) {
00496       ast_log(AST_LOG_WARNING, "Unable to determine file descriptor for wav filestream %p: %s\n", fs, strerror(errno));
00497       return -1;
00498    }
00499    if ((cur = ftello(fs->f)) < 0) {
00500       ast_log(AST_LOG_WARNING, "Unable to determine current position in wav filestream %p: %s\n", fs, strerror(errno));
00501       return -1;
00502    }
00503    /* Truncate file to current length */
00504    if (ftruncate(fd, cur)) {
00505       return -1;
00506    }
00507    return update_header(fs->f);
00508 }

static int wav_write ( struct ast_filestream fs,
struct ast_frame f 
) [static]

Definition at line 406 of file format_wav.c.

References ast_filestream::_private, AST_FORMAT_SLINEAR, AST_FORMAT_SLINEAR16, AST_FRAME_VOICE, ast_getformatname(), ast_log(), errno, ast_filestream::f, f, ast_filestream::fmt, ast_format::format, wav_desc::hz, and LOG_WARNING.

00407 {
00408 #if __BYTE_ORDER == __BIG_ENDIAN
00409    int x;
00410    short tmp[16000], *tmpi;
00411 #endif
00412    struct wav_desc *s = (struct wav_desc *)fs->_private;
00413    int res;
00414 
00415    if (f->frametype != AST_FRAME_VOICE) {
00416       ast_log(LOG_WARNING, "Asked to write non-voice frame!\n");
00417       return -1;
00418    }
00419    if ((f->subclass.codec != AST_FORMAT_SLINEAR) && (f->subclass.codec != AST_FORMAT_SLINEAR16)) {
00420       ast_log(LOG_WARNING, "Asked to write non-SLINEAR%s frame (%s)!\n", s->hz == 16000 ? "16" : "", ast_getformatname(f->subclass.codec));
00421       return -1;
00422    }
00423    if (f->subclass.codec != fs->fmt->format) {
00424       ast_log(LOG_WARNING, "Can't change SLINEAR frequency during write\n");
00425       return -1;
00426    }
00427    if (!f->datalen)
00428       return -1;
00429 
00430 #if __BYTE_ORDER == __BIG_ENDIAN
00431    /* swap and write */
00432    if (f->datalen > sizeof(tmp)) {
00433       ast_log(LOG_WARNING, "Data length is too long\n");
00434       return -1;
00435    }
00436    tmpi = f->data.ptr;
00437    for (x=0; x < f->datalen/2; x++) 
00438       tmp[x] = (tmpi[x] << 8) | ((tmpi[x] & 0xff00) >> 8);
00439 
00440    if ((res = fwrite(tmp, 1, f->datalen, fs->f)) != f->datalen ) {
00441 #else
00442    /* just write */
00443    if ((res = fwrite(f->data.ptr, 1, f->datalen, fs->f)) != f->datalen ) {
00444 #endif
00445       ast_log(LOG_WARNING, "Bad write (%d): %s\n", res, strerror(errno));
00446       return -1;
00447    }
00448 
00449    s->bytes += f->datalen;
00450       
00451    return 0;
00452 
00453 }

static int write_header ( FILE *  f,
int  writehz 
) [static]

Definition at line 245 of file format_wav.c.

References ast_log(), and LOG_WARNING.

00246 {
00247    unsigned int hz;
00248    unsigned int bhz;
00249    unsigned int hs = htoll(16);
00250    unsigned short fmt = htols(1);
00251    unsigned short chans = htols(1);
00252    unsigned short bysam = htols(2);
00253    unsigned short bisam = htols(16);
00254    unsigned int size = htoll(0);
00255 
00256    if (writehz == 16000) {
00257       hz = htoll(16000);
00258       bhz = htoll(32000);
00259    } else {
00260       hz = htoll(8000);
00261       bhz = htoll(16000);
00262    }
00263    /* Write a wav header, ignoring sizes which will be filled in later */
00264    fseek(f,0,SEEK_SET);
00265    if (fwrite("RIFF", 1, 4, f) != 4) {
00266       ast_log(LOG_WARNING, "Unable to write header\n");
00267       return -1;
00268    }
00269    if (fwrite(&size, 1, 4, f) != 4) {
00270       ast_log(LOG_WARNING, "Unable to write header\n");
00271       return -1;
00272    }
00273    if (fwrite("WAVEfmt ", 1, 8, f) != 8) {
00274       ast_log(LOG_WARNING, "Unable to write header\n");
00275       return -1;
00276    }
00277    if (fwrite(&hs, 1, 4, f) != 4) {
00278       ast_log(LOG_WARNING, "Unable to write header\n");
00279       return -1;
00280    }
00281    if (fwrite(&fmt, 1, 2, f) != 2) {
00282       ast_log(LOG_WARNING, "Unable to write header\n");
00283       return -1;
00284    }
00285    if (fwrite(&chans, 1, 2, f) != 2) {
00286       ast_log(LOG_WARNING, "Unable to write header\n");
00287       return -1;
00288    }
00289    if (fwrite(&hz, 1, 4, f) != 4) {
00290       ast_log(LOG_WARNING, "Unable to write header\n");
00291       return -1;
00292    }
00293    if (fwrite(&bhz, 1, 4, f) != 4) {
00294       ast_log(LOG_WARNING, "Unable to write header\n");
00295       return -1;
00296    }
00297    if (fwrite(&bysam, 1, 2, f) != 2) {
00298       ast_log(LOG_WARNING, "Unable to write header\n");
00299       return -1;
00300    }
00301    if (fwrite(&bisam, 1, 2, f) != 2) {
00302       ast_log(LOG_WARNING, "Unable to write header\n");
00303       return -1;
00304    }
00305    if (fwrite("data", 1, 4, f) != 4) {
00306       ast_log(LOG_WARNING, "Unable to write header\n");
00307       return -1;
00308    }
00309    if (fwrite(&size, 1, 4, f) != 4) {
00310       ast_log(LOG_WARNING, "Unable to write header\n");
00311       return -1;
00312    }
00313    return 0;
00314 }


Variable Documentation

struct ast_module_info __mod_info = { .name = AST_MODULE, .flags = AST_MODFLAG_LOAD_ORDER , .description = "Microsoft WAV/WAV16 format (8kHz/16kHz Signed Linear)" , .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 = "ac1f6a56484a8820659555499174e588" , .load = load_module, .unload = unload_module, .load_pri = AST_MODPRI_APP_DEPEND } [static]

Definition at line 568 of file format_wav.c.

struct ast_module_info* ast_module_info = &__mod_info [static]

Definition at line 568 of file format_wav.c.

struct ast_format wav16_f [static]

Definition at line 518 of file format_wav.c.

Referenced by load_module(), and unload_module().

struct ast_format wav_f [static]

Definition at line 534 of file format_wav.c.

Referenced by load_module(), and unload_module().


Generated on Mon Oct 8 12:39:22 2012 for Asterisk - The Open Source Telephony Project by  doxygen 1.4.7