[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