diff options
author | qwell <qwell@f38db490-d61c-443f-a65b-d21fe96a405b> | 2006-09-02 01:39:15 +0000 |
---|---|---|
committer | qwell <qwell@f38db490-d61c-443f-a65b-d21fe96a405b> | 2006-09-02 01:39:15 +0000 |
commit | 4b4369a6c285e62d51b0027734e6ed087c865c1c (patch) | |
tree | f6a9a22422b889a5dc82c592c946a2f966f3fa18 /channels/chan_skinny.c | |
parent | 84f25b324935934da66e663fa0322d4d05eb10fc (diff) |
Fix VLDTMF issues.
It still isn't variable length, but it does let you dial again.
git-svn-id: http://svn.digium.com/svn/asterisk/trunk@41788 f38db490-d61c-443f-a65b-d21fe96a405b
Diffstat (limited to 'channels/chan_skinny.c')
-rw-r--r-- | channels/chan_skinny.c | 28 |
1 files changed, 21 insertions, 7 deletions
diff --git a/channels/chan_skinny.c b/channels/chan_skinny.c index 1f0ec6b33..fa1e1daea 100644 --- a/channels/chan_skinny.c +++ b/channels/chan_skinny.c @@ -2172,6 +2172,7 @@ static void *skinny_ss(void *data) if (option_verbose > 2) ast_verbose( VERBOSE_PREFIX_3 "Starting simple switch on '%s@%s'\n", l->name, d->name); + while (len < AST_MAX_EXTENSION-1) { res = ast_waitfordigit(c, timeout); timeout = 0; @@ -2759,22 +2760,25 @@ 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, }; + struct ast_frame fb = { 0, }; + struct ast_frame fe = { 0, }; char dgt; int digit; int lineInstance; int callReference; + fb.frametype = AST_FRAME_DTMF_BEGIN; + fe.frametype = AST_FRAME_DTMF_END; + digit = letohl(req->data.keypad.button); lineInstance = letohl(req->data.keypad.lineInstance); callReference = letohl(req->data.keypad.callReference); - f.frametype = AST_FRAME_DTMF; if (digit == 14) { dgt = '*'; } else if (digit == 15) { dgt = '#'; - } else if (digit >=0 && digit <= 9) { + } else if (digit >= 0 && digit <= 9) { dgt = '0' + digit; } else { /* digit=10-13 (A,B,C,D ?), or @@ -2787,8 +2791,12 @@ static int handle_keypad_button_message(skinny_req *req, struct skinnysession *s dgt = '0' + digit; ast_log(LOG_WARNING, "Unsupported digit %d\n", digit); } - f.subclass = dgt; - f.src = "skinny"; + + fb.subclass = dgt; + fe.subclass = dgt; + + fb.src = "skinny"; + fe.src = "skinny"; if (lineInstance && callReference) sub = find_subchannel_by_instance_reference(d, lineInstance, callReference); @@ -2800,11 +2808,17 @@ static int handle_keypad_button_message(skinny_req *req, struct skinnysession *s l = sub->parent; if (sub->owner) { + if (sub->owner->_state == 0) { + ast_queue_frame(sub->owner, &fb); + } /* XXX MUST queue this frame to all lines in threeway call if threeway call is active */ - ast_queue_frame(sub->owner, &f); + ast_queue_frame(sub->owner, &fe); /* XXX This seriously needs to be fixed */ if (sub->next && sub->next->owner) { - ast_queue_frame(sub->next->owner, &f); + if (sub->owner->_state == 0) { + ast_queue_frame(sub->next->owner, &fb); + } + ast_queue_frame(sub->next->owner, &fe); } } else { if (skinnydebug) |