Mon Nov 24 15:34:37 2008

Asterisk developer's documentation


format_sln.c File Reference

RAW SLINEAR Format. More...

#include "asterisk.h"
#include <unistd.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <stdlib.h>
#include <sys/time.h>
#include <stdio.h>
#include <errno.h>
#include <string.h>
#include "asterisk/lock.h"
#include "asterisk/channel.h"
#include "asterisk/file.h"
#include "asterisk/logger.h"
#include "asterisk/sched.h"
#include "asterisk/module.h"
#include "asterisk/endian.h"

Go to the source code of this file.

Defines

#define BUF_SIZE   320
#define SLIN_SAMPLES   160

Functions

 AST_MODULE_INFO_STANDARD (ASTERISK_GPL_KEY,"Raw Signed Linear Audio support (SLN)")
static int load_module (void)
static struct ast_frameslinear_read (struct ast_filestream *s, int *whennext)
static int slinear_seek (struct ast_filestream *fs, off_t sample_offset, int whence)
static off_t slinear_tell (struct ast_filestream *fs)
static int slinear_trunc (struct ast_filestream *fs)
static int slinear_write (struct ast_filestream *fs, struct ast_frame *f)
static int unload_module (void)

Variables

static struct ast_format slin_f


Detailed Description

RAW SLINEAR Format.

Definition in file format_sln.c.


Define Documentation

#define BUF_SIZE   320

Definition at line 46 of file format_sln.c.

#define SLIN_SAMPLES   160

Definition at line 47 of file format_sln.c.


Function Documentation

AST_MODULE_INFO_STANDARD ( ASTERISK_GPL_KEY  ,
"Raw Signed Linear Audio support (SLN)"   
)

static int load_module ( void   )  [static]

Definition at line 131 of file format_sln.c.

References ast_format_register, and slin_f.

00132 {
00133    return ast_format_register(&slin_f);
00134 }

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

Definition at line 49 of file format_sln.c.

References AST_FORMAT_SLINEAR, AST_FRAME_SET_BUFFER, AST_FRAME_VOICE, AST_FRIENDLY_OFFSET, ast_log(), BUF_SIZE, errno, LOG_WARNING, and s.

00050 {
00051    int res;
00052    /* Send a frame from the file to the appropriate channel */
00053 
00054    s->fr.frametype = AST_FRAME_VOICE;
00055    s->fr.subclass = AST_FORMAT_SLINEAR;
00056    s->fr.mallocd = 0;
00057    AST_FRAME_SET_BUFFER(&s->fr, s->buf, AST_FRIENDLY_OFFSET, BUF_SIZE);
00058    if ((res = fread(s->fr.data, 1, s->fr.datalen, s->f)) < 1) {
00059       if (res)
00060          ast_log(LOG_WARNING, "Short read (%d) (%s)!\n", res, strerror(errno));
00061       return NULL;
00062    }
00063    *whennext = s->fr.samples = res/2;
00064    s->fr.datalen = res;
00065    return &s->fr;
00066 }

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

Definition at line 86 of file format_sln.c.

References ast_filestream::f, offset, and SEEK_FORCECUR.

00087 {
00088    off_t offset=0,min,cur,max;
00089 
00090    min = 0;
00091    sample_offset <<= 1;
00092    cur = ftello(fs->f);
00093    fseeko(fs->f, 0, SEEK_END);
00094    max = ftello(fs->f);
00095    if (whence == SEEK_SET)
00096       offset = sample_offset;
00097    else if (whence == SEEK_CUR || whence == SEEK_FORCECUR)
00098       offset = sample_offset + cur;
00099    else if (whence == SEEK_END)
00100       offset = max - sample_offset;
00101    if (whence != SEEK_FORCECUR) {
00102       offset = (offset > max)?max:offset;
00103    }
00104    /* always protect against seeking past begining. */
00105    offset = (offset < min)?min:offset;
00106    return fseeko(fs->f, offset, SEEK_SET);
00107 }

static off_t slinear_tell ( struct ast_filestream fs  )  [static]

Definition at line 114 of file format_sln.c.

References ast_filestream::f.

00115 {
00116    return ftello(fs->f) / 2;
00117 }

static int slinear_trunc ( struct ast_filestream fs  )  [static]

Definition at line 109 of file format_sln.c.

References ast_filestream::f.

00110 {
00111    return ftruncate(fileno(fs->f), ftello(fs->f));
00112 }

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

Definition at line 68 of file format_sln.c.

References AST_FORMAT_SLINEAR, AST_FRAME_VOICE, ast_log(), errno, ast_filestream::f, f, and LOG_WARNING.

00069 {
00070    int res;
00071    if (f->frametype != AST_FRAME_VOICE) {
00072       ast_log(LOG_WARNING, "Asked to write non-voice frame!\n");
00073       return -1;
00074    }
00075    if (f->subclass != AST_FORMAT_SLINEAR) {
00076       ast_log(LOG_WARNING, "Asked to write non-slinear frame (%d)!\n", f->subclass);
00077       return -1;
00078    }
00079    if ((res = fwrite(f->data, 1, f->datalen, fs->f)) != f->datalen) {
00080          ast_log(LOG_WARNING, "Bad write (%d/%d): %s\n", res, f->datalen, strerror(errno));
00081          return -1;
00082    }
00083    return 0;
00084 }

static int unload_module ( void   )  [static]

Definition at line 136 of file format_sln.c.

References ast_format_unregister(), ast_format::name, and slin_f.

00137 {
00138    return ast_format_unregister(slin_f.name);
00139 }  


Variable Documentation

struct ast_format slin_f [static]

Definition at line 119 of file format_sln.c.

Referenced by load_module(), and unload_module().


Generated on Mon Nov 24 15:34:37 2008 for Asterisk - the Open Source PBX by  doxygen 1.4.7