| 
									
										
										
										
											2004-02-27 05:16:26 +00:00
										 |  |  | /*
 | 
					
						
							| 
									
										
										
										
											2005-09-15 15:44:26 +00:00
										 |  |  |  * Asterisk -- An open source telephony toolkit. | 
					
						
							|  |  |  |  * | 
					
						
							| 
									
										
										
										
											2005-01-21 07:06:25 +00:00
										 |  |  |  * Copyright (c) 2004 - 2005, inAccess Networks | 
					
						
							| 
									
										
										
										
											2004-02-27 05:16:26 +00:00
										 |  |  |  * | 
					
						
							|  |  |  |  * Michael Manousos <manousos@inaccessnetworks.com> | 
					
						
							| 
									
										
										
										
											2005-09-15 15:44:26 +00:00
										 |  |  |  * | 
					
						
							|  |  |  |  * See http://www.asterisk.org for more information about
 | 
					
						
							|  |  |  |  * the Asterisk project. Please do not directly contact | 
					
						
							|  |  |  |  * any of the maintainers of this project for assistance; | 
					
						
							|  |  |  |  * the project provides a web site, mailing lists and IRC | 
					
						
							|  |  |  |  * channels for your use. | 
					
						
							|  |  |  |  * | 
					
						
							| 
									
										
										
										
											2004-02-27 05:16:26 +00:00
										 |  |  |  * This program is free software, distributed under the terms of | 
					
						
							| 
									
										
										
										
											2005-09-15 15:44:26 +00:00
										 |  |  |  * the GNU General Public License Version 2. See the LICENSE file | 
					
						
							|  |  |  |  * at the top of the source tree. | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2005-10-26 13:03:17 +00:00
										 |  |  | /*!\file
 | 
					
						
							| 
									
										
										
										
											2005-09-15 15:44:26 +00:00
										 |  |  |  * | 
					
						
							| 
									
										
										
										
											2005-10-26 13:03:17 +00:00
										 |  |  |  * \brief Headerless G.726 (16/24/32/40kbps) data format for Asterisk. | 
					
						
							| 
									
										
										
										
											2005-09-15 15:44:26 +00:00
										 |  |  |  *  | 
					
						
							| 
									
										
										
										
											2005-11-06 15:09:47 +00:00
										 |  |  |  * File name extensions: | 
					
						
							|  |  |  |  * \arg 40 kbps: g726-40 | 
					
						
							|  |  |  |  * \arg 32 kbps: g726-32 | 
					
						
							|  |  |  |  * \arg 24 kbps: g726-24 | 
					
						
							|  |  |  |  * \arg 16 kbps: g726-16 | 
					
						
							|  |  |  |  * \ingroup formats | 
					
						
							| 
									
										
										
										
											2004-02-27 05:16:26 +00:00
										 |  |  |  */ | 
					
						
							| 
									
										
										
										
											2011-07-14 20:28:54 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | /*** MODULEINFO
 | 
					
						
							|  |  |  | 	<support_level>core</support_level> | 
					
						
							|  |  |  |  ***/ | 
					
						
							| 
									
										
										
										
											2004-02-27 05:16:26 +00:00
										 |  |  |   | 
					
						
							| 
									
										
										
										
											2006-06-07 18:54:56 +00:00
										 |  |  | #include "asterisk.h"
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | ASTERISK_FILE_VERSION(__FILE__, "$Revision$") | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-11-22 00:53:49 +00:00
										 |  |  | #include "asterisk/mod_format.h"
 | 
					
						
							| 
									
										
										
										
											2005-06-06 22:12:19 +00:00
										 |  |  | #include "asterisk/module.h"
 | 
					
						
							|  |  |  | #include "asterisk/endian.h"
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2004-02-27 05:16:26 +00:00
										 |  |  | #define	RATE_40		0
 | 
					
						
							|  |  |  | #define	RATE_32		1
 | 
					
						
							|  |  |  | #define	RATE_24		2
 | 
					
						
							|  |  |  | #define	RATE_16		3
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* We can only read/write chunks of FRAME_TIME ms G.726 data */ | 
					
						
							|  |  |  | #define	FRAME_TIME	10	/* 10 ms size */
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-04-04 12:59:25 +00:00
										 |  |  | #define	BUF_SIZE	(5*FRAME_TIME)	/* max frame size in bytes ? */
 | 
					
						
							| 
									
										
										
										
											2004-02-27 05:16:26 +00:00
										 |  |  | /* Frame sizes in bytes */ | 
					
						
							|  |  |  | static int frame_size[4] = {  | 
					
						
							|  |  |  | 		FRAME_TIME * 5, | 
					
						
							|  |  |  | 		FRAME_TIME * 4, | 
					
						
							|  |  |  | 		FRAME_TIME * 3, | 
					
						
							|  |  |  | 		FRAME_TIME * 2 | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-04-04 12:59:25 +00:00
										 |  |  | struct g726_desc  { | 
					
						
							|  |  |  | 	int rate;	/* RATE_* defines */ | 
					
						
							| 
									
										
										
										
											2004-02-27 05:16:26 +00:00
										 |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /*
 | 
					
						
							|  |  |  |  * Rate dependant format functions (open, rewrite) | 
					
						
							|  |  |  |  */ | 
					
						
							| 
									
										
										
										
											2006-04-04 12:59:25 +00:00
										 |  |  | static int g726_open(struct ast_filestream *tmp, int rate) | 
					
						
							| 
									
										
										
										
											2004-02-27 05:16:26 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2007-11-29 17:50:44 +00:00
										 |  |  | 	struct g726_desc *s = (struct g726_desc *)tmp->_private; | 
					
						
							| 
									
										
										
										
											2006-04-04 12:59:25 +00:00
										 |  |  | 	s->rate = rate; | 
					
						
							| 
									
										
										
										
											2007-06-14 19:39:12 +00:00
										 |  |  | 	ast_debug(1, "Created filestream G.726-%dk.\n", 40 - s->rate * 8); | 
					
						
							| 
									
										
										
										
											2006-04-04 12:59:25 +00:00
										 |  |  | 	return 0; | 
					
						
							| 
									
										
										
										
											2004-02-27 05:16:26 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-04-04 12:59:25 +00:00
										 |  |  | static int g726_40_open(struct ast_filestream *s) | 
					
						
							| 
									
										
										
										
											2004-02-27 05:16:26 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2006-04-04 12:59:25 +00:00
										 |  |  | 	return g726_open(s, RATE_40); | 
					
						
							| 
									
										
										
										
											2004-02-27 05:16:26 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-04-04 12:59:25 +00:00
										 |  |  | static int g726_32_open(struct ast_filestream *s) | 
					
						
							| 
									
										
										
										
											2004-02-27 05:16:26 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2006-04-04 12:59:25 +00:00
										 |  |  | 	return g726_open(s, RATE_32); | 
					
						
							| 
									
										
										
										
											2004-02-27 05:16:26 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-04-04 12:59:25 +00:00
										 |  |  | static int g726_24_open(struct ast_filestream *s) | 
					
						
							| 
									
										
										
										
											2004-02-27 05:16:26 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2006-04-04 12:59:25 +00:00
										 |  |  | 	return g726_open(s, RATE_24); | 
					
						
							| 
									
										
										
										
											2004-02-27 05:16:26 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-04-04 12:59:25 +00:00
										 |  |  | static int g726_16_open(struct ast_filestream *s) | 
					
						
							| 
									
										
										
										
											2004-02-27 05:16:26 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2006-04-04 12:59:25 +00:00
										 |  |  | 	return g726_open(s, RATE_16); | 
					
						
							| 
									
										
										
										
											2004-02-27 05:16:26 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-04-04 12:59:25 +00:00
										 |  |  | static int g726_40_rewrite(struct ast_filestream *s, const char *comment) | 
					
						
							| 
									
										
										
										
											2004-02-27 05:16:26 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2006-04-04 12:59:25 +00:00
										 |  |  | 	return g726_open(s, RATE_40); | 
					
						
							| 
									
										
										
										
											2004-02-27 05:16:26 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-04-04 12:59:25 +00:00
										 |  |  | static int g726_32_rewrite(struct ast_filestream *s, const char *comment) | 
					
						
							| 
									
										
										
										
											2004-02-27 05:16:26 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2006-04-04 12:59:25 +00:00
										 |  |  | 	return g726_open(s, RATE_32); | 
					
						
							| 
									
										
										
										
											2004-02-27 05:16:26 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-04-04 12:59:25 +00:00
										 |  |  | static int g726_24_rewrite(struct ast_filestream *s, const char *comment) | 
					
						
							| 
									
										
										
										
											2004-02-27 05:16:26 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2006-04-04 12:59:25 +00:00
										 |  |  | 	return g726_open(s, RATE_24); | 
					
						
							| 
									
										
										
										
											2004-02-27 05:16:26 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-04-04 12:59:25 +00:00
										 |  |  | static int g726_16_rewrite(struct ast_filestream *s, const char *comment) | 
					
						
							| 
									
										
										
										
											2004-02-27 05:16:26 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2006-04-04 12:59:25 +00:00
										 |  |  | 	return g726_open(s, RATE_16); | 
					
						
							| 
									
										
										
										
											2004-02-27 05:16:26 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-04-04 12:59:25 +00:00
										 |  |  | /*
 | 
					
						
							|  |  |  |  * Rate independent format functions (read, write) | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2004-02-27 05:16:26 +00:00
										 |  |  | static struct ast_frame *g726_read(struct ast_filestream *s, int *whennext) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	int res; | 
					
						
							| 
									
										
										
										
											2007-11-29 17:50:44 +00:00
										 |  |  | 	struct g726_desc *fs = (struct g726_desc *)s->_private; | 
					
						
							| 
									
										
										
										
											2006-04-04 12:59:25 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2004-02-27 05:16:26 +00:00
										 |  |  | 	/* Send a frame from the file to the appropriate channel */ | 
					
						
							|  |  |  | 	s->fr.frametype = AST_FRAME_VOICE; | 
					
						
							| 
									
										
										
										
											2011-02-03 16:22:10 +00:00
										 |  |  | 	ast_format_set(&s->fr.subclass.format, AST_FORMAT_G726, 0); | 
					
						
							| 
									
										
										
										
											2004-02-27 05:16:26 +00:00
										 |  |  | 	s->fr.mallocd = 0; | 
					
						
							| 
									
										
										
										
											2006-04-09 22:31:38 +00:00
										 |  |  | 	AST_FRAME_SET_BUFFER(&s->fr, s->buf, AST_FRIENDLY_OFFSET, frame_size[fs->rate]); | 
					
						
							| 
									
										
										
										
											2006-04-04 12:59:25 +00:00
										 |  |  | 	s->fr.samples = 8 * FRAME_TIME; | 
					
						
							| 
									
										
										
										
											2008-05-22 16:29:54 +00:00
										 |  |  | 	if ((res = fread(s->fr.data.ptr, 1, s->fr.datalen, s->f)) != s->fr.datalen) { | 
					
						
							| 
									
										
										
										
											2004-02-27 05:16:26 +00:00
										 |  |  | 		if (res) | 
					
						
							|  |  |  | 			ast_log(LOG_WARNING, "Short read (%d) (%s)!\n", res, strerror(errno)); | 
					
						
							|  |  |  | 		return NULL; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	*whennext = s->fr.samples; | 
					
						
							|  |  |  | 	return &s->fr; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-04-04 12:59:25 +00:00
										 |  |  | static int g726_write(struct ast_filestream *s, struct ast_frame *f) | 
					
						
							| 
									
										
										
										
											2004-02-27 05:16:26 +00:00
										 |  |  | { | 
					
						
							|  |  |  | 	int res; | 
					
						
							| 
									
										
										
										
											2007-11-29 17:50:44 +00:00
										 |  |  | 	struct g726_desc *fs = (struct g726_desc *)s->_private; | 
					
						
							| 
									
										
										
										
											2006-04-04 12:59:25 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2004-02-27 05:16:26 +00:00
										 |  |  | 	if (f->frametype != AST_FRAME_VOICE) { | 
					
						
							|  |  |  | 		ast_log(LOG_WARNING, "Asked to write non-voice frame!\n"); | 
					
						
							|  |  |  | 		return -1; | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2011-02-03 16:22:10 +00:00
										 |  |  | 	if (f->subclass.format.id != AST_FORMAT_G726) { | 
					
						
							| 
									
										
										
										
											2009-11-04 14:05:12 +00:00
										 |  |  | 		ast_log(LOG_WARNING, "Asked to write non-G726 frame (%s)!\n",  | 
					
						
							| 
									
										
										
										
											2011-02-03 16:22:10 +00:00
										 |  |  | 						ast_getformatname(&f->subclass.format)); | 
					
						
							| 
									
										
										
										
											2004-02-27 05:16:26 +00:00
										 |  |  | 		return -1; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	if (f->datalen % frame_size[fs->rate]) { | 
					
						
							|  |  |  | 		ast_log(LOG_WARNING, "Invalid data length %d, should be multiple of %d\n",  | 
					
						
							|  |  |  | 						f->datalen, frame_size[fs->rate]); | 
					
						
							|  |  |  | 		return -1; | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2008-05-22 16:29:54 +00:00
										 |  |  | 	if ((res = fwrite(f->data.ptr, 1, f->datalen, s->f)) != f->datalen) { | 
					
						
							| 
									
										
										
										
											2006-04-04 12:59:25 +00:00
										 |  |  | 		ast_log(LOG_WARNING, "Bad write (%d/%d): %s\n",  | 
					
						
							|  |  |  | 				res, frame_size[fs->rate], strerror(errno)); | 
					
						
							| 
									
										
										
										
											2004-02-27 05:16:26 +00:00
										 |  |  | 			return -1; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	return 0; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-02-20 23:35:12 +00:00
										 |  |  | static int g726_seek(struct ast_filestream *fs, off_t sample_offset, int whence) | 
					
						
							| 
									
										
										
										
											2004-02-27 05:16:26 +00:00
										 |  |  | { | 
					
						
							|  |  |  | 	return -1; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static int g726_trunc(struct ast_filestream *fs) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	return -1; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-02-20 23:35:12 +00:00
										 |  |  | static off_t g726_tell(struct ast_filestream *fs) | 
					
						
							| 
									
										
										
										
											2004-02-27 05:16:26 +00:00
										 |  |  | { | 
					
						
							|  |  |  | 	return -1; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-02-03 16:22:10 +00:00
										 |  |  | static struct ast_format_def f[] = { | 
					
						
							| 
									
										
										
										
											2006-04-04 12:59:25 +00:00
										 |  |  | 	{ | 
					
						
							|  |  |  | 		.name = "g726-40", | 
					
						
							|  |  |  | 		.exts = "g726-40", | 
					
						
							|  |  |  | 		.open = g726_40_open, | 
					
						
							|  |  |  | 		.rewrite = g726_40_rewrite, | 
					
						
							|  |  |  | 		.write = g726_write, | 
					
						
							|  |  |  | 		.seek = g726_seek, | 
					
						
							|  |  |  | 		.trunc = g726_trunc, | 
					
						
							|  |  |  | 		.tell = g726_tell, | 
					
						
							|  |  |  | 		.read = g726_read, | 
					
						
							|  |  |  | 		.buf_size = BUF_SIZE + AST_FRIENDLY_OFFSET, | 
					
						
							|  |  |  | 		.desc_size = sizeof(struct g726_desc), | 
					
						
							|  |  |  | 	}, | 
					
						
							|  |  |  | 	{ | 
					
						
							|  |  |  | 		.name = "g726-32", | 
					
						
							|  |  |  | 		.exts = "g726-32", | 
					
						
							|  |  |  | 		.open = g726_32_open, | 
					
						
							|  |  |  | 		.rewrite = g726_32_rewrite, | 
					
						
							|  |  |  | 		.write = g726_write, | 
					
						
							|  |  |  | 		.seek = g726_seek, | 
					
						
							|  |  |  | 		.trunc = g726_trunc, | 
					
						
							|  |  |  | 		.tell = g726_tell, | 
					
						
							|  |  |  | 		.read = g726_read, | 
					
						
							|  |  |  | 		.buf_size = BUF_SIZE + AST_FRIENDLY_OFFSET, | 
					
						
							|  |  |  | 		.desc_size = sizeof(struct g726_desc), | 
					
						
							|  |  |  | 	}, | 
					
						
							|  |  |  | 	{ | 
					
						
							|  |  |  | 		.name = "g726-24", | 
					
						
							|  |  |  | 		.exts = "g726-24", | 
					
						
							|  |  |  | 		.open = g726_24_open, | 
					
						
							|  |  |  | 		.rewrite = g726_24_rewrite, | 
					
						
							|  |  |  | 		.write = g726_write, | 
					
						
							|  |  |  | 		.seek = g726_seek, | 
					
						
							|  |  |  | 		.trunc = g726_trunc, | 
					
						
							|  |  |  | 		.tell = g726_tell, | 
					
						
							|  |  |  | 		.read = g726_read, | 
					
						
							|  |  |  | 		.buf_size = BUF_SIZE + AST_FRIENDLY_OFFSET, | 
					
						
							|  |  |  | 		.desc_size = sizeof(struct g726_desc), | 
					
						
							|  |  |  | 	}, | 
					
						
							|  |  |  | 	{ | 
					
						
							|  |  |  | 		.name = "g726-16", | 
					
						
							|  |  |  | 		.exts = "g726-16", | 
					
						
							|  |  |  | 		.open = g726_16_open, | 
					
						
							|  |  |  | 		.rewrite = g726_16_rewrite, | 
					
						
							|  |  |  | 		.write = g726_write, | 
					
						
							|  |  |  | 		.seek = g726_seek, | 
					
						
							|  |  |  | 		.trunc = g726_trunc, | 
					
						
							|  |  |  | 		.tell = g726_tell, | 
					
						
							|  |  |  | 		.read = g726_read, | 
					
						
							|  |  |  | 		.buf_size = BUF_SIZE + AST_FRIENDLY_OFFSET, | 
					
						
							|  |  |  | 		.desc_size = sizeof(struct g726_desc), | 
					
						
							|  |  |  | 	}, | 
					
						
							| 
									
										
										
										
											2011-02-03 16:22:10 +00:00
										 |  |  | 	{	.desc_size = 0 }	/* terminator */ | 
					
						
							| 
									
										
										
										
											2006-04-04 12:59:25 +00:00
										 |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-08-21 02:11:39 +00:00
										 |  |  | static int load_module(void) | 
					
						
							| 
									
										
										
										
											2004-02-27 05:16:26 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2006-04-04 12:59:25 +00:00
										 |  |  | 	int i; | 
					
						
							| 
									
										
										
										
											2004-02-27 05:16:26 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-02-03 16:22:10 +00:00
										 |  |  | 	for (i = 0; f[i].desc_size ; i++) { | 
					
						
							|  |  |  | 		ast_format_set(&f[i].format, AST_FORMAT_G726, 0); | 
					
						
							|  |  |  | 		if (ast_format_def_register(&f[i])) {	/* errors are fatal */ | 
					
						
							| 
									
										
										
										
											2006-04-04 12:59:25 +00:00
										 |  |  | 			ast_log(LOG_WARNING, "Failed to register format %s.\n", f[i].name); | 
					
						
							| 
									
										
										
										
											2007-10-31 19:24:29 +00:00
										 |  |  | 			return AST_MODULE_LOAD_FAILURE; | 
					
						
							| 
									
										
										
										
											2006-04-04 12:59:25 +00:00
										 |  |  | 		} | 
					
						
							| 
									
										
										
										
											2004-02-27 05:16:26 +00:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2007-10-31 19:24:29 +00:00
										 |  |  | 	return AST_MODULE_LOAD_SUCCESS; | 
					
						
							| 
									
										
										
										
											2004-02-27 05:16:26 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-08-21 02:11:39 +00:00
										 |  |  | static int unload_module(void) | 
					
						
							| 
									
										
										
										
											2004-02-27 05:16:26 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2006-04-04 12:59:25 +00:00
										 |  |  | 	int i; | 
					
						
							| 
									
										
										
										
											2004-02-27 05:16:26 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-02-03 16:22:10 +00:00
										 |  |  | 	for (i = 0; f[i].desc_size ; i++) { | 
					
						
							|  |  |  | 		if (ast_format_def_unregister(f[i].name)) | 
					
						
							| 
									
										
										
										
											2006-04-04 12:59:25 +00:00
										 |  |  | 			ast_log(LOG_WARNING, "Failed to unregister format %s.\n", f[i].name); | 
					
						
							| 
									
										
										
										
											2004-02-27 05:16:26 +00:00
										 |  |  | 	} | 
					
						
							|  |  |  | 	return(0); | 
					
						
							| 
									
										
										
										
											2010-07-20 19:35:02 +00:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											2004-02-27 05:16:26 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-07-26 03:28:02 +00:00
										 |  |  | AST_MODULE_INFO(ASTERISK_GPL_KEY, AST_MODFLAG_LOAD_ORDER, "Raw G.726 (16/24/32/40kbps) data", | 
					
						
							|  |  |  | 	.load = load_module, | 
					
						
							|  |  |  | 	.unload = unload_module, | 
					
						
							|  |  |  | 	.load_pri = AST_MODPRI_APP_DEPEND | 
					
						
							|  |  |  | ); |