mirror of
				https://github.com/asterisk/asterisk.git
				synced 2025-10-31 18:55:19 +00:00 
			
		
		
		
	Add support for G729 passthrough with Sigma Designs boards. (issue #8829 reported by ywalther)
git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@51144 65c4cc65-6c06-0410-ace0-fbb531ad65f3
This commit is contained in:
		
							
								
								
									
										1
									
								
								CHANGES
									
									
									
									
									
								
							
							
						
						
									
										1
									
								
								CHANGES
									
									
									
									
									
								
							| @@ -61,6 +61,7 @@ Changes since Asterisk 1.4-beta was branched: | ||||
|   * Added the jittertargetextra configuration option. | ||||
|   * Added the URI redirect option for the built-in HTTP server | ||||
|   * Added the trunkmaxsize configuration option to chan_iax2. | ||||
|   * Added G729 passthrough support to chan_phone for Sigma Designs boards. | ||||
|  | ||||
| SIP changes | ||||
| ----------- | ||||
|   | ||||
| @@ -98,7 +98,7 @@ static int echocancel = AEC_OFF; | ||||
|  | ||||
| static int silencesupression = 0; | ||||
|  | ||||
| static int prefformat = AST_FORMAT_G723_1 | AST_FORMAT_SLINEAR | AST_FORMAT_ULAW; | ||||
| static int prefformat = AST_FORMAT_G729A | AST_FORMAT_G723_1 | AST_FORMAT_SLINEAR | AST_FORMAT_ULAW; | ||||
|  | ||||
| /* Protect the interface list (of phone_pvt's) */ | ||||
| AST_MUTEX_DEFINE_STATIC(iflock); | ||||
| @@ -170,7 +170,7 @@ static int phone_indicate(struct ast_channel *chan, int condition, const void *d | ||||
| static const struct ast_channel_tech phone_tech = { | ||||
| 	.type = "Phone", | ||||
| 	.description = tdesc, | ||||
| 	.capabilities = AST_FORMAT_G723_1 | AST_FORMAT_SLINEAR | AST_FORMAT_ULAW, | ||||
| 	.capabilities = AST_FORMAT_G723_1 | AST_FORMAT_SLINEAR | AST_FORMAT_ULAW | AST_FORMAT_G729A, | ||||
| 	.requester = phone_request, | ||||
| 	.send_digit_begin = phone_digit_begin, | ||||
| 	.send_digit_end = phone_digit_end, | ||||
| @@ -399,8 +399,17 @@ static int phone_setup(struct ast_channel *ast) | ||||
| 	p = ast->tech_pvt; | ||||
| 	ioctl(p->fd, PHONE_CPT_STOP); | ||||
| 	/* Nothing to answering really, just start recording */ | ||||
| 	if (ast->rawreadformat == AST_FORMAT_G723_1) { | ||||
| 		/* Prefer g723 */ | ||||
| 	if (ast->rawreadformat == AST_FORMAT_G729A) { | ||||
| 		/* Prefer g729 */ | ||||
| 		ioctl(p->fd, PHONE_REC_STOP); | ||||
| 		if (p->lastinput != AST_FORMAT_G729A) { | ||||
| 			p->lastinput = AST_FORMAT_G729A; | ||||
| 			if (ioctl(p->fd, PHONE_REC_CODEC, G729)) { | ||||
| 				ast_log(LOG_WARNING, "Failed to set codec to g729\n"); | ||||
| 				return -1; | ||||
| 			} | ||||
| 		} | ||||
|         } else if (ast->rawreadformat == AST_FORMAT_G723_1) { | ||||
| 		ioctl(p->fd, PHONE_REC_STOP); | ||||
| 		if (p->lastinput != AST_FORMAT_G723_1) { | ||||
| 			p->lastinput = AST_FORMAT_G723_1; | ||||
| @@ -667,7 +676,7 @@ static int phone_write(struct ast_channel *ast, struct ast_frame *frame) | ||||
| 		return 0; | ||||
| 	} | ||||
| 	if (!(frame->subclass & | ||||
| 		(AST_FORMAT_G723_1 | AST_FORMAT_SLINEAR | AST_FORMAT_ULAW)) &&  | ||||
| 		(AST_FORMAT_G723_1 | AST_FORMAT_SLINEAR | AST_FORMAT_ULAW | AST_FORMAT_G729A)) &&  | ||||
| 	    p->mode != MODE_FXS) { | ||||
| 		ast_log(LOG_WARNING, "Cannot handle frames in %d format\n", frame->subclass); | ||||
| 		return -1; | ||||
| @@ -684,7 +693,30 @@ static int phone_write(struct ast_channel *ast, struct ast_frame *frame) | ||||
| 		return 0; | ||||
| 	} | ||||
| #endif	 | ||||
| 	if (frame->subclass == AST_FORMAT_G723_1) { | ||||
| 	if (frame->subclass == AST_FORMAT_G729A) { | ||||
| 		if (p->lastformat != AST_FORMAT_G729A) { | ||||
| 			ioctl(p->fd, PHONE_PLAY_STOP); | ||||
| 			ioctl(p->fd, PHONE_REC_STOP); | ||||
| 			if (ioctl(p->fd, PHONE_PLAY_CODEC, G729)) { | ||||
| 				ast_log(LOG_WARNING, "Unable to set G729 mode\n"); | ||||
| 				return -1; | ||||
| 			} | ||||
| 			if (ioctl(p->fd, PHONE_REC_CODEC, G729)) { | ||||
| 				ast_log(LOG_WARNING, "Unable to set G729 mode\n"); | ||||
| 				return -1; | ||||
| 			} | ||||
| 			p->lastformat = AST_FORMAT_G729A; | ||||
| 			p->lastinput = AST_FORMAT_G729A; | ||||
| 			/* Reset output buffer */ | ||||
| 			p->obuflen = 0; | ||||
| 			codecset = 1; | ||||
| 		} | ||||
| 		if (frame->datalen > 80) { | ||||
| 			ast_log(LOG_WARNING, "Frame size too large for G.729 (%d bytes)\n", frame->datalen); | ||||
| 			return -1; | ||||
| 		} | ||||
| 		maxfr = 80; | ||||
|         } else if (frame->subclass == AST_FORMAT_G723_1) { | ||||
| 		if (p->lastformat != AST_FORMAT_G723_1) { | ||||
| 			ioctl(p->fd, PHONE_PLAY_STOP); | ||||
| 			ioctl(p->fd, PHONE_REC_STOP); | ||||
| @@ -1214,7 +1246,7 @@ static struct ast_channel *phone_request(const char *type, int format, void *dat | ||||
| 	p = iflist; | ||||
| 	while(p) { | ||||
| 		if (p->mode == MODE_FXS || | ||||
| 		    format & (AST_FORMAT_G723_1 | AST_FORMAT_SLINEAR | AST_FORMAT_ULAW)) { | ||||
| 		    format & (AST_FORMAT_G729A | AST_FORMAT_G723_1 | AST_FORMAT_SLINEAR | AST_FORMAT_ULAW)) { | ||||
| 		    size_t length = strlen(p->dev + 5); | ||||
|     		if (strncmp(name, p->dev + 5, length) == 0 && | ||||
|     		    !isalnum(name[length])) { | ||||
| @@ -1231,7 +1263,7 @@ static struct ast_channel *phone_request(const char *type, int format, void *dat | ||||
| 	restart_monitor(); | ||||
| 	if (tmp == NULL) { | ||||
| 		oldformat = format; | ||||
| 		format &= (AST_FORMAT_G723_1 | AST_FORMAT_SLINEAR | AST_FORMAT_ULAW); | ||||
| 		format &= (AST_FORMAT_G729A | AST_FORMAT_G723_1 | AST_FORMAT_SLINEAR | AST_FORMAT_ULAW); | ||||
| 		if (!format) { | ||||
| 			ast_log(LOG_NOTICE, "Asked to get a channel of unsupported format '%d'\n", oldformat); | ||||
| 			return NULL; | ||||
| @@ -1382,7 +1414,9 @@ static int load_module(void) | ||||
| 		} else if (!strcasecmp(v->name, "context")) { | ||||
| 			ast_copy_string(context, v->value, sizeof(context)); | ||||
| 		} else if (!strcasecmp(v->name, "format")) { | ||||
| 			if (!strcasecmp(v->value, "g723.1")) { | ||||
| 			if (!strcasecmp(v->value, "g729")) { | ||||
| 				prefformat = AST_FORMAT_G729A; | ||||
|                         } else if (!strcasecmp(v->value, "g723.1")) { | ||||
| 				prefformat = AST_FORMAT_G723_1; | ||||
| 			} else if (!strcasecmp(v->value, "slinear")) { | ||||
| 				if (mode == MODE_FXS) | ||||
|   | ||||
| @@ -18,12 +18,14 @@ mode=immediate | ||||
| ;mode=fxo | ||||
| ;mode=sig | ||||
| ; | ||||
| ; You can decide which format to use by default, "g723.1" or "slinear". | ||||
| ; You can decide which format to use by default, "g723.1", "g729", or "slinear". | ||||
| ; Note that g729 is only supported for Sigma Designs boards. | ||||
| ; XXX Be careful, sometimes the card causes kernel panics when running | ||||
| ; in signed linear mode for some reason... XXX | ||||
| ; | ||||
| format=slinear | ||||
| ;format=g723.1 | ||||
| ;format=g729 | ||||
| ; | ||||
| ; And set the echo cancellation to "off", "low", "medium", and "high". | ||||
| ; This is not supported on all phones. | ||||
|   | ||||
		Reference in New Issue
	
	Block a user