Index: channels/chan_phone.c =================================================================== --- channels/chan_phone.c (révision 51140) +++ channels/chan_phone.c (copie de travail) @@ -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,9 +399,18 @@ 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; if (ioctl(p->fd, PHONE_REC_CODEC, G723_63)) { @@ -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)