[svn-commits] branch russell_fixup/format_mp3 r225 - /team/russell_fixup/format_mp3/

svn-commits at lists.digium.com svn-commits at lists.digium.com
Fri Jun 30 19:03:13 MST 2006


Author: russell
Date: Fri Jun 30 21:03:13 2006
New Revision: 225

URL: http://svn.digium.com/view/asterisk-addons?rev=225&view=rev
Log:
fix the build of format_mp3 with the patch from issue #6978, by roman, with a
couple of tiny updates

Modified:
    team/russell_fixup/format_mp3/format_mp3.c

Modified: team/russell_fixup/format_mp3/format_mp3.c
URL: http://svn.digium.com/view/asterisk-addons/team/russell_fixup/format_mp3/format_mp3.c?rev=225&r1=224&r2=225&view=diff
==============================================================================
--- team/russell_fixup/format_mp3/format_mp3.c (original)
+++ team/russell_fixup/format_mp3/format_mp3.c Fri Jun 30 21:03:13 2006
@@ -14,6 +14,8 @@
  * This program is free software, distributed under the terms of
  * the GNU General Public License
  */
+
+#include <asterisk.h>
 
 #include "mpg123.h" 
 #include "mpglib.h" 
@@ -43,18 +45,13 @@
 
 /* Based on format_wav.c */
 
-struct ast_filestream {
-	void *reserved[AST_RESERVED_POINTERS];
-	/* This is what a filestream means to us */
-	FILE *f; /* Descriptor */
-	struct ast_frame fr;				/* Frame information */
+struct mp3_private {
 	char waste[AST_FRIENDLY_OFFSET];	/* Buffer for sending frames, etc */
-	char empty;							/* Empty character */
+	char empty;				/* Empty character */
 	int lasttimeout;
 	int maxlen;
 	struct timeval last;
 	struct mpstr mp;
-	char buf[MP3_BUFLEN];
 	char sbuf[MP3_SCACHE];
 	char dbuf[MP3_DCACHE];
 	int buflen;
@@ -67,13 +64,8 @@
 	long seek;
 };
 
-
-AST_MUTEX_DEFINE_STATIC(mp3_lock);
-static int glistcnt = 0;
-
 static char *name = "mp3";
 static char *desc = "MP3 format [Any rate but 8000hz mono optimal]";
-static char *exts = "mp3";
 
 #define BLOCKSIZE 160
 #define OUTSCALE 4096
@@ -103,92 +95,80 @@
 #endif
 
 
-static struct ast_filestream *mp3_open(FILE *f)
-{
-	struct ast_filestream *tmp;
-	if ((tmp = malloc(sizeof(struct ast_filestream)))) {
-		memset(tmp, 0, sizeof(struct ast_filestream));
-		if (ast_mutex_lock(&mp3_lock)) {
-			ast_log(LOG_WARNING, "Unable to lock mp3 list\n");
-			free(tmp);
-			return NULL;
-		}
-		InitMP3(&tmp->mp, OUTSCALE);
-		tmp->dbuflen = 0;
-		tmp->f = f;
-		tmp->fr.data = tmp->buf;
-		tmp->fr.frametype = AST_FRAME_VOICE;
-		tmp->fr.subclass = AST_FORMAT_SLINEAR;
-		/* datalen will vary for each frame */
-		tmp->fr.src = name;
-		tmp->fr.mallocd = 0;
-		tmp->offset = 0;
-		glistcnt++;
-		ast_mutex_unlock(&mp3_lock);
-		ast_update_use_count();
-	}
-	return tmp;
+static int mp3_open(struct ast_filestream *s)
+{
+	struct mp3_private *p = s->private;
+	
+	InitMP3(&p->mp, OUTSCALE);
+	p->dbuflen = 0;
+	s->fr.data = s->buf;
+	s->fr.frametype = AST_FRAME_VOICE;
+	s->fr.subclass = AST_FORMAT_SLINEAR;
+	/* datalen will vary for each frame */
+	s->fr.src = name;
+	s->fr.mallocd = 0;
+	p->offset = 0;
+	return 0;
 }
 
 
 static void mp3_close(struct ast_filestream *s)
 {
-	if (ast_mutex_lock(&mp3_lock)) {
-		ast_log(LOG_WARNING, "Unable to lock mp3 list\n");
-		return;
-	}
-
-	ExitMP3(&s->mp);
-	
-	glistcnt--;
-	ast_mutex_unlock(&mp3_lock);
-	ast_update_use_count();
-	fclose(s->f);
-	free(s);
-	s = NULL;
-
+	struct mp3_private *p = s->private;
+	
+	ExitMP3(&p->mp);
+	return;
 }
 
 static int mp3_squeue(struct ast_filestream *s) 
 {
+	struct mp3_private *p = s->private;
 	int res=0;
-	s->lastseek = ftell(s->f);
-	s->sbuflen = fread(s->sbuf, 1, MP3_SCACHE, s->f);
-	if(s->sbuflen < 0) {
-		ast_log(LOG_WARNING, "Short read (%d) (%s)!\n", s->sbuflen, strerror(errno));
+	
+	p->lastseek = ftell(s->f);
+	p->sbuflen = fread(p->sbuf, 1, MP3_SCACHE, s->f);
+	if(p->sbuflen < 0) {
+		ast_log(LOG_WARNING, "Short read (%d) (%s)!\n", p->sbuflen, strerror(errno));
 		return -1;
 	}
-	res = decodeMP3(&s->mp,s->sbuf,s->sbuflen,s->dbuf,MP3_DCACHE,&s->dbuflen);
+	res = decodeMP3(&p->mp,p->sbuf,p->sbuflen,p->dbuf,MP3_DCACHE,&p->dbuflen);
 	if(res != MP3_OK)
 		return -1;
-	s->sbuflen -= s->dbuflen;
-	s->dbufoffset = 0;
+	p->sbuflen -= p->dbuflen;
+	p->dbufoffset = 0;
 	return 0;
 }
+
 static int mp3_dqueue(struct ast_filestream *s) 
 {
+	struct mp3_private *p = s->private;
 	int res=0;
-	if((res = decodeMP3(&s->mp,NULL,0,s->dbuf,MP3_DCACHE,&s->dbuflen)) == MP3_OK) {
-		s->sbuflen -= s->dbuflen;
-		s->dbufoffset = 0;
+	
+	if((res = decodeMP3(&p->mp,NULL,0,p->dbuf,MP3_DCACHE,&p->dbuflen)) == MP3_OK) {
+		p->sbuflen -= p->dbuflen;
+		p->dbufoffset = 0;
 	}
 	return res;
 }
-static int mp3_queue(struct ast_filestream *s) {
+
+static int mp3_queue(struct ast_filestream *s)
+{
+	struct mp3_private *p = s->private;
 	int res = 0, bytes = 0;
-	if(s->seek) {
-		ExitMP3(&s->mp);
-		InitMP3(&s->mp, OUTSCALE);
+	
+	if(p->seek) {
+		ExitMP3(&p->mp);
+		InitMP3(&p->mp, OUTSCALE);
 		fseek(s->f, 0, SEEK_SET);
-		s->sbuflen = s->dbuflen = s->offset = 0;
-		while(s->offset < s->seek) {
+		p->sbuflen = p->dbuflen = p->offset = 0;
+		while(p->offset < p->seek) {
 			if(mp3_squeue(s))
 				return -1;
-			while(s->offset < s->seek && ((res = mp3_dqueue(s))) == MP3_OK) {
-				for(bytes = 0 ; bytes < s->dbuflen ; bytes++) {
-					s->dbufoffset++;
-					s->offset++;
-					if(s->offset >= s->seek)
+			while(p->offset < p->seek && ((res = mp3_dqueue(s))) == MP3_OK) {
+				for(bytes = 0 ; bytes < p->dbuflen ; bytes++) {
+					p->dbufoffset++;
+					p->offset++;
+					if(p->offset >= p->seek)
 						break;
 				}
 			}
@@ -196,16 +176,16 @@
 				return -1;
 		}
 		
-		s->seek = 0;
+		p->seek = 0;
 		return 0;
 	}
-	if(s->dbuflen == 0) {
-		if(s->sbuflen) {
+	if(p->dbuflen == 0) {
+		if(p->sbuflen) {
 			res = mp3_dqueue(s);
 			if(res == MP3_ERR)
 				return -1;
 		}
-		if(! s->sbuflen || res != MP3_OK) {
+		if(! p->sbuflen || res != MP3_OK) {
 			if(mp3_squeue(s))
 				return -1;
 		}
@@ -218,6 +198,7 @@
 static struct ast_frame *mp3_read(struct ast_filestream *s, int *whennext)
 {
 
+	struct mp3_private *p = s->private;
 	int delay =0;
 	int save=0;
 
@@ -226,35 +207,35 @@
 	if(mp3_queue(s))
 		return NULL;
 
-	if(s->dbuflen) {
-		for(s->buflen=0; s->buflen < MP3_BUFLEN && s->buflen < s->dbuflen; s->buflen++) {
-			s->buf[s->buflen] = s->dbuf[s->buflen+s->dbufoffset];
-			s->sbufoffset++;
+	if(p->dbuflen) {
+		for(p->buflen=0; p->buflen < MP3_BUFLEN && p->buflen < p->dbuflen; p->buflen++) {
+			s->buf[p->buflen] = p->dbuf[p->buflen+p->dbufoffset];
+			p->sbufoffset++;
 		}
-		s->dbufoffset += s->buflen;
-		s->dbuflen -= s->buflen;
-
-		if(s->buflen < MP3_BUFLEN) {
+		p->dbufoffset += p->buflen;
+		p->dbuflen -= p->buflen;
+
+		if(p->buflen < MP3_BUFLEN) {
 			if(mp3_queue(s))
 				return NULL;
 
-			for(save = s->buflen; s->buflen < MP3_BUFLEN; s->buflen++) {
-				s->buf[s->buflen] = s->dbuf[(s->buflen-save)+s->dbufoffset];
-				s->sbufoffset++;
+			for(save = p->buflen; p->buflen < MP3_BUFLEN; p->buflen++) {
+				s->buf[p->buflen] = p->dbuf[(p->buflen-save)+p->dbufoffset];
+				p->sbufoffset++;
 			}
-			s->dbufoffset += (MP3_BUFLEN - save);
-			s->dbuflen -= (MP3_BUFLEN - save);
+			p->dbufoffset += (MP3_BUFLEN - save);
+			p->dbuflen -= (MP3_BUFLEN - save);
 
 		} 
 
 	}
 	
-	s->offset += s->buflen;
-	delay = s->buflen/2;
+	p->offset += p->buflen;
+	delay = p->buflen/2;
 	s->fr.frametype = AST_FRAME_VOICE;
 	s->fr.subclass = AST_FORMAT_SLINEAR;
 	s->fr.offset = AST_FRIENDLY_OFFSET;
-	s->fr.datalen = s->buflen;
+	s->fr.datalen = p->buflen;
 	s->fr.data = s->buf;
 	s->fr.mallocd = 0;
 	s->fr.samples = delay;
@@ -271,17 +252,17 @@
 }
 
 
-static int mp3_seek(struct ast_filestream *fs, long sample_offset, int whence)
-{
-
+static int mp3_seek(struct ast_filestream *s, off_t sample_offset, int whence)
+{
+	struct mp3_private *p = s->private;
 	off_t min,max,cur;
 	long offset=0,samples;
 	samples = sample_offset * 2;
 
 	min = 0;
-	fseek(fs->f, 0, SEEK_END);
-	max = ftell(fs->f) * 100;
-	cur = fs->offset;
+	fseek(s->f, 0, SEEK_END);
+	max = ftell(s->f) * 100;
+	cur = p->offset;
 
 	if (whence == SEEK_SET)
 		offset = samples + min;
@@ -293,27 +274,29 @@
 		offset = (offset > max)?max:offset;
 	}
 
-	fs->seek = offset;
-	return fs->seek;
-	
-}
-
-static struct ast_filestream *mp3_rewrite(FILE *f, const char *comment) 
-{
-	ast_log(LOG_ERROR,"I Can't write MP3 only read them.\n");
-	return NULL;
-}
-
-static int mp3_trunc(struct ast_filestream *fs) 
-{
-
+	p->seek = offset;
+	return p->seek;
+	
+}
+
+static int mp3_rewrite(struct ast_filestream *s, const char *comment) 
+{
 	ast_log(LOG_ERROR,"I Can't write MP3 only read them.\n");
 	return -1;
 }
 
-static long mp3_tell(struct ast_filestream *fs)
-{
-	return fs->offset/2;
+static int mp3_trunc(struct ast_filestream *s) 
+{
+
+	ast_log(LOG_ERROR,"I Can't write MP3 only read them.\n");
+	return -1;
+}
+
+static off_t mp3_tell(struct ast_filestream *s)
+{
+	struct mp3_private *p = s->private;
+	
+	return p->offset/2;
 }
 
 static char *mp3_getcomment(struct ast_filestream *s)
@@ -321,47 +304,45 @@
 	return NULL;
 }
 
-int load_module()
+static const struct ast_format mp3_f = {
+	.name = "mp3",
+	.exts = "mp3",
+	.format = AST_FORMAT_SLINEAR,
+	.open = mp3_open,
+	.write = mp3_write,
+	.rewrite = mp3_rewrite,
+	.seek =	mp3_seek,
+	.trunc = mp3_trunc,
+	.tell =	mp3_tell,
+	.read =	mp3_read,
+	.close = mp3_close,
+	.getcomment = mp3_getcomment,
+	.buf_size = MP3_BUFLEN + AST_FRIENDLY_OFFSET,
+	.desc_size = sizeof(struct mp3_private),
+	.module = &mod_data,
+};
+
+
+static int load_module(void *mod)
 {
 	InitMP3Constants();
-	return ast_format_register(name, exts, AST_FORMAT_SLINEAR,
-							   mp3_open,
-							   mp3_rewrite,
-							   mp3_write,
-							   mp3_seek,
-							   mp3_trunc,
-							   mp3_tell,
-							   mp3_read,
-							   mp3_close,
-							   mp3_getcomment);
-								
-								
-}
-
-int unload_module()
+	return ast_format_register(&mp3_f);
+}
+
+static int unload_module(void *mod)
 {
 	return ast_format_unregister(name);
 }	
 
-int usecount()
-{
-	int res;
-	if (ast_mutex_lock(&mp3_lock)) {
-		ast_log(LOG_WARNING, "Unable to lock mp3 list\n");
-		return -1;
-	}
-	res = glistcnt;
-	ast_mutex_unlock(&mp3_lock);
-	return res;
-}
-
-char *description()
+static const char *description(void)
 {
 	return desc;
 }
 
 
-char *key()
+static const char *key(void)
 {
 	return ASTERISK_GPL_KEY;
 }
+
+STD_MOD1;



More information about the svn-commits mailing list