From: Naveen Albert Date: Wed, 23 Nov 2022 22:59:16 +0000 (+0000) Subject: res_adsi: Fix major regression caused by media format rearchitecture. X-Git-Tag: 20.1.0-rc1~14 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=80e6205bb05f920022b959685155c3b3ce1668ec;p=thirdparty%2Fasterisk.git res_adsi: Fix major regression caused by media format rearchitecture. The commit that rearchitected media formats, a2c912e9972c91973ea66902d217746133f96026 (ASTERISK_23114) introduced a regression by improperly translating code in res_adsi.c. In particular, the pointer to the frame buffer was initialized at the top of adsi_careful_send, rather than dynamically updating it for each frame, as is required. This resulted in the first frame being repeatedly sent, rather than advancing through the frames. This corrupted the transmission of the CAS to the CPE, which meant that CPE would never respond with the DTMF acknowledgment, effectively completely breaking ADSI functionality. This issue is now fixed, and ADSI now works properly again. ASTERISK-29793 #close Change-Id: Icdeddf733eda2981c98712d1ac9cddc0db507dbe --- diff --git a/res/res_adsi.c b/res/res_adsi.c index f8a2f5696c..c273c00dd2 100644 --- a/res/res_adsi.c +++ b/res/res_adsi.c @@ -157,7 +157,6 @@ static int adsi_careful_send(struct ast_channel *chan, unsigned char *buf, int l struct ast_frame outf = { .frametype = AST_FRAME_VOICE, .subclass.format = ast_format_ulaw, - .data.ptr = buf, }; int amt; @@ -171,6 +170,7 @@ static int adsi_careful_send(struct ast_channel *chan, unsigned char *buf, int l *remain = *remain - amt; } + outf.data.ptr = buf; outf.datalen = amt; outf.samples = amt; if (ast_write(chan, &outf)) { @@ -211,6 +211,7 @@ static int adsi_careful_send(struct ast_channel *chan, unsigned char *buf, int l } else if (remain) { *remain = inf->datalen - amt; } + outf.data.ptr = buf; outf.datalen = amt; outf.samples = amt; if (ast_write(chan, &outf)) { @@ -236,6 +237,7 @@ static int __adsi_transmit_messages(struct ast_channel *chan, unsigned char **ms if (ast_channel_adsicpe(chan) == AST_ADSI_UNAVAILABLE) { /* Don't bother if we know they don't support ADSI */ + ast_log(LOG_WARNING, "ADSI is not supported for %s\n", ast_channel_name(chan)); errno = ENOSYS; return -1; } @@ -255,7 +257,7 @@ static int __adsi_transmit_messages(struct ast_channel *chan, unsigned char **ms for (;;) { if (((res = ast_waitfor(chan, waittime)) < 1)) { /* Didn't get back DTMF A in time */ - ast_debug(1, "No ADSI CPE detected (%d)\n", res); + ast_verb(4, "No ADSI CPE detected (%d)\n", res); if (!ast_channel_adsicpe(chan)) { ast_channel_adsicpe_set(chan, AST_ADSI_UNAVAILABLE); } @@ -291,7 +293,7 @@ static int __adsi_transmit_messages(struct ast_channel *chan, unsigned char **ms ast_frfree(f); } - ast_debug(1, "ADSI Compatible CPE Detected\n"); + ast_verb(4, "ADSI Compatible CPE Detected\n"); } else { ast_debug(1, "Already in data mode\n"); }