]> git.ipfire.org Git - thirdparty/asterisk.git/commitdiff
res_adsi: Fix major regression caused by media format rearchitecture.
authorNaveen Albert <asterisk@phreaknet.org>
Wed, 23 Nov 2022 22:59:16 +0000 (22:59 +0000)
committerGeorge Joseph <gjoseph@digium.com>
Thu, 8 Dec 2022 18:37:12 +0000 (12:37 -0600)
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

res/res_adsi.c

index f8a2f5696c2e05a6250951e1b00bc54b653131fd..c273c00dd2403e0b6c97d0f0d618630a152e9067 100644 (file)
@@ -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");
                }