fix an issue with dtmf not being sent sometimes
authorNorth Antara <north@ntbox.com>
Tue, 20 Jun 2006 08:09:30 +0000 (08:09 +0000)
committerNorth Antara <north@ntbox.com>
Tue, 20 Jun 2006 08:09:30 +0000 (08:09 +0000)
slightly modify handling of digits

git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@35032 65c4cc65-6c06-0410-ace0-fbb531ad65f3

channels/chan_skinny.c

index 715d4fb..899bd13 100644 (file)
@@ -2254,7 +2254,12 @@ static int skinny_answer(struct ast_channel *ast)
        if (ast->_state != AST_STATE_UP) {
                ast_setstate(ast, AST_STATE_UP);
        }
+
        transmit_tone(s, SKINNY_SILENCE);
+       /* order matters here...
+          for some reason, transmit_callinfo must be before transmit_callstate,
+          or you won't get keypad messages in some situations. */
+       transmit_callinfo(s, ast->cid.cid_name, ast->cid.cid_num, ast->exten, ast->exten, l->instance, sub->callid, 2);
        transmit_callstate(s, l->instance, SKINNY_CONNECTED, sub->callid);
        transmit_displaypromptstatus(s, "Connected", 0, l->instance, sub->callid);
        return res;
@@ -2602,8 +2607,9 @@ static int handle_keypad_button_message(skinny_req *req, struct skinnysession *s
 {
        struct skinny_subchannel *sub = NULL;
        struct skinny_line *l;
+       struct skinny_device *d = s->device;
        struct ast_frame f = { 0, };
-       char d;
+       char dgt;
        int digit;
        int lineInstance;
        int callReference;
@@ -2613,11 +2619,11 @@ static int handle_keypad_button_message(skinny_req *req, struct skinnysession *s
        callReference = letohl(req->data.keypad.callReference);
        f.frametype = AST_FRAME_DTMF;
        if (digit == 14) {
-               d = '*';
+               dgt = '*';
        } else if (digit == 15) {
-               d = '#';
+               dgt = '#';
        } else if (digit >=0 && digit <= 9) {
-               d = '0' + digit;
+               dgt = '0' + digit;
        } else {
                /* digit=10-13 (A,B,C,D ?), or
                 * digit is bad value
@@ -2626,14 +2632,16 @@ static int handle_keypad_button_message(skinny_req *req, struct skinnysession *s
                 * value for backward compatibility, and log
                 * a warning.
                 */
-               d = '0' + digit;
+               dgt = '0' + digit;
                ast_log(LOG_WARNING, "Unsupported digit %d\n", digit);
        }
-       f.subclass = d;
+       f.subclass = dgt;
        f.src = "skinny";
 
        if (lineInstance && callReference)
-               sub = find_subchannel_by_instance_reference(s->device, lineInstance, callReference);
+               sub = find_subchannel_by_instance_reference(d, lineInstance, callReference);
+       else
+               sub = find_subchannel_by_instance_reference(d, d->lastlineinstance, d->lastcallreference);
 
        if (!sub)
                return 0;