[asterisk-commits] file: trunk r51144 - in /trunk: ./ channels/
configs/
asterisk-commits at lists.digium.com
asterisk-commits at lists.digium.com
Tue Jan 16 10:23:32 MST 2007
Author: file
Date: Tue Jan 16 11:23:31 2007
New Revision: 51144
URL: http://svn.digium.com/view/asterisk?view=rev&rev=51144
Log:
Add support for G729 passthrough with Sigma Designs boards. (issue #8829 reported by ywalther)
Modified:
trunk/CHANGES
trunk/channels/chan_phone.c
trunk/configs/phone.conf.sample
Modified: trunk/CHANGES
URL: http://svn.digium.com/view/asterisk/trunk/CHANGES?view=diff&rev=51144&r1=51143&r2=51144
==============================================================================
--- trunk/CHANGES (original)
+++ trunk/CHANGES Tue Jan 16 11:23:31 2007
@@ -61,6 +61,7 @@
* 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
-----------
Modified: trunk/channels/chan_phone.c
URL: http://svn.digium.com/view/asterisk/trunk/channels/chan_phone.c?view=diff&rev=51144&r1=51143&r2=51144
==============================================================================
--- trunk/channels/chan_phone.c (original)
+++ trunk/channels/chan_phone.c Tue Jan 16 11:23:31 2007
@@ -98,7 +98,7 @@
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 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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
} 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)
Modified: trunk/configs/phone.conf.sample
URL: http://svn.digium.com/view/asterisk/trunk/configs/phone.conf.sample?view=diff&rev=51144&r1=51143&r2=51144
==============================================================================
--- trunk/configs/phone.conf.sample (original)
+++ trunk/configs/phone.conf.sample Tue Jan 16 11:23:31 2007
@@ -18,12 +18,14 @@
;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.
More information about the asterisk-commits
mailing list