[asterisk-commits] branch 1.2 - r7800 in /branches/1.2/formats:
format_pcm.c format_pcm_alaw.c
asterisk-commits at lists.digium.com
asterisk-commits at lists.digium.com
Wed Jan 4 17:27:58 CST 2006
Author: kpfleming
Date: Wed Jan 4 17:27:57 2006
New Revision: 7800
URL: http://svn.digium.com/view/asterisk?rev=7800&view=rev
Log:
ensure that ulaw/alaw sound files are filled with silence when extended (not zeroes)
Modified:
branches/1.2/formats/format_pcm.c
branches/1.2/formats/format_pcm_alaw.c
Modified: branches/1.2/formats/format_pcm.c
URL: http://svn.digium.com/view/asterisk/branches/1.2/formats/format_pcm.c?rev=7800&r1=7799&r2=7800&view=diff
==============================================================================
--- branches/1.2/formats/format_pcm.c (original)
+++ branches/1.2/formats/format_pcm.c Wed Jan 4 17:27:57 2006
@@ -1,7 +1,7 @@
/*
* Asterisk -- An open source telephony toolkit.
*
- * Copyright (C) 1999 - 2005, Digium, Inc.
+ * Copyright (C) 1999 - 2006, Digium, Inc.
*
* Mark Spencer <markster at digium.com>
*
@@ -44,6 +44,7 @@
#include "asterisk/sched.h"
#include "asterisk/module.h"
#include "asterisk/endian.h"
+#include "asterisk/ulaw.h"
#define BUF_SIZE 160 /* 160 samples */
@@ -66,6 +67,8 @@
static char *name = "pcm";
static char *desc = "Raw uLaw 8khz Audio support (PCM)";
static char *exts = "pcm|ulaw|ul|mu";
+
+static char ulaw_silence[BUF_SIZE];
static struct ast_filestream *pcm_open(FILE *f)
{
@@ -173,24 +176,44 @@
static int pcm_seek(struct ast_filestream *fs, long sample_offset, int whence)
{
- off_t offset=0,min,cur,max;
-
- min = 0;
+ long cur, max, offset;
+
cur = ftell(fs->f);
- fseek(fs->f, 0, SEEK_END);
- max = ftell(fs->f);
- if (whence == SEEK_SET)
+ max = fseek(fs->f, 0, SEEK_END);
+
+ switch (whence) {
+ case SEEK_SET:
offset = sample_offset;
- else if (whence == SEEK_CUR || whence == SEEK_FORCECUR)
- offset = sample_offset + cur;
- else if (whence == SEEK_END)
+ break;
+ case SEEK_END:
offset = max - sample_offset;
- if (whence != SEEK_FORCECUR) {
- offset = (offset > max)?max:offset;
- }
- /* always protect against seeking past begining. */
- offset = (offset < min)?min:offset;
- return fseek(fs->f, offset, SEEK_SET);
+ break;
+ case SEEK_CUR:
+ case SEEK_FORCECUR:
+ offset = cur + sample_offset;
+ break;
+ }
+
+ switch (whence) {
+ case SEEK_FORCECUR:
+ if (offset > max) {
+ size_t left = offset - max;
+ size_t res;
+
+ while (left) {
+ res = fwrite(ulaw_silence, (left > BUF_SIZE) ? BUF_SIZE : left,
+ sizeof(ulaw_silence[0]), fs->f);
+ if (res == -1)
+ return res;
+ left -= res;
+ }
+ }
+ /* fall through */
+ default:
+ offset = (offset > max) ? max : offset;
+ offset = (offset < 0) ? 0 : offset;
+ return fseek(fs->f, offset, SEEK_SET);
+ }
}
static int pcm_trunc(struct ast_filestream *fs)
@@ -212,18 +235,21 @@
int load_module()
{
+ int index;
+
+ for (index = 0; index < (sizeof(ulaw_silence) / sizeof(ulaw_silence[0])); index++)
+ ulaw_silence[index] = AST_LIN2MU(0);
+
return ast_format_register(name, exts, AST_FORMAT_ULAW,
- pcm_open,
- pcm_rewrite,
- pcm_write,
- pcm_seek,
- pcm_trunc,
- pcm_tell,
- pcm_read,
- pcm_close,
- pcm_getcomment);
-
-
+ pcm_open,
+ pcm_rewrite,
+ pcm_write,
+ pcm_seek,
+ pcm_trunc,
+ pcm_tell,
+ pcm_read,
+ pcm_close,
+ pcm_getcomment);
}
int unload_module()
Modified: branches/1.2/formats/format_pcm_alaw.c
URL: http://svn.digium.com/view/asterisk/branches/1.2/formats/format_pcm_alaw.c?rev=7800&r1=7799&r2=7800&view=diff
==============================================================================
--- branches/1.2/formats/format_pcm_alaw.c (original)
+++ branches/1.2/formats/format_pcm_alaw.c Wed Jan 4 17:27:57 2006
@@ -1,7 +1,7 @@
/*
* Asterisk -- An open source telephony toolkit.
*
- * Copyright (C) 1999 - 2005, Digium, Inc.
+ * Copyright (C) 1999 - 2006, Digium, Inc.
*
* Mark Spencer <markster at digium.com>
*
@@ -45,6 +45,7 @@
#include "asterisk/sched.h"
#include "asterisk/module.h"
#include "asterisk/endian.h"
+#include "asterisk/alaw.h"
#define BUF_SIZE 160 /* 160 samples */
@@ -73,6 +74,8 @@
static char *desc = "Raw aLaw 8khz PCM Audio support";
static char *exts = "alaw|al";
+static char alaw_silence[BUF_SIZE];
+
#if 0
/* Returns time in msec since system boot. */
@@ -248,24 +251,44 @@
static int pcm_seek(struct ast_filestream *fs, long sample_offset, int whence)
{
- off_t offset=0,min,cur,max;
-
- min = 0;
+ long cur, max, offset;
+
cur = ftell(fs->f);
- fseek(fs->f, 0, SEEK_END);
- max = ftell(fs->f);
- if (whence == SEEK_SET)
+ max = fseek(fs->f, 0, SEEK_END);
+
+ switch (whence) {
+ case SEEK_SET:
offset = sample_offset;
- else if (whence == SEEK_CUR || whence == SEEK_FORCECUR)
- offset = sample_offset + cur;
- else if (whence == SEEK_END)
+ break;
+ case SEEK_END:
offset = max - sample_offset;
- if (whence != SEEK_FORCECUR) {
- offset = (offset > max)?max:offset;
- }
- /* Always protect against seeking past begining */
- offset = (offset < min)?min:offset;
- return fseek(fs->f, offset, SEEK_SET);
+ break;
+ case SEEK_CUR:
+ case SEEK_FORCECUR:
+ offset = cur + sample_offset;
+ break;
+ }
+
+ switch (whence) {
+ case SEEK_FORCECUR:
+ if (offset > max) {
+ size_t left = offset - max;
+ size_t res;
+
+ while (left) {
+ res = fwrite(alaw_silence, (left > BUF_SIZE) ? BUF_SIZE : left,
+ sizeof(alaw_silence[0]), fs->f);
+ if (res == -1)
+ return res;
+ left -= res;
+ }
+ }
+ /* fall through */
+ default:
+ offset = (offset > max) ? max : offset;
+ offset = (offset < 0) ? 0 : offset;
+ return fseek(fs->f, offset, SEEK_SET);
+ }
}
static int pcm_trunc(struct ast_filestream *fs)
@@ -288,16 +311,21 @@
int load_module()
{
+ int index;
+
+ for (index = 0; index < (sizeof(alaw_silence) / sizeof(alaw_silence[0])); index++)
+ alaw_silence[index] = AST_LIN2A(0);
+
return ast_format_register(name, exts, AST_FORMAT_ALAW,
- pcm_open,
- pcm_rewrite,
- pcm_write,
- pcm_seek,
- pcm_trunc,
- pcm_tell,
- pcm_read,
- pcm_close,
- pcm_getcomment);
+ pcm_open,
+ pcm_rewrite,
+ pcm_write,
+ pcm_seek,
+ pcm_trunc,
+ pcm_tell,
+ pcm_read,
+ pcm_close,
+ pcm_getcomment);
}
int unload_module()
More information about the asterisk-commits
mailing list