aboutsummaryrefslogtreecommitdiffstats
path: root/channels/chan_skinny.c
diff options
context:
space:
mode:
authorqwell <qwell@f38db490-d61c-443f-a65b-d21fe96a405b>2006-09-02 01:39:15 +0000
committerqwell <qwell@f38db490-d61c-443f-a65b-d21fe96a405b>2006-09-02 01:39:15 +0000
commit4b4369a6c285e62d51b0027734e6ed087c865c1c (patch)
treef6a9a22422b889a5dc82c592c946a2f966f3fa18 /channels/chan_skinny.c
parent84f25b324935934da66e663fa0322d4d05eb10fc (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.c28
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)