diff options
author | file <file@f38db490-d61c-443f-a65b-d21fe96a405b> | 2006-08-31 01:59:02 +0000 |
---|---|---|
committer | file <file@f38db490-d61c-443f-a65b-d21fe96a405b> | 2006-08-31 01:59:02 +0000 |
commit | 3f22aa53af0a7bb3efb280a1adda11f00a7f68fc (patch) | |
tree | 95a924d57b906428b26d398758facf98b92bdcb2 /channels/chan_features.c | |
parent | 0fcb352fba60344329a582f891ddd4433f48c6fa (diff) |
Merge in VLDTMF support with Zaptel/Core done by the ever great Darumkilla Russell Bryant and the RTP portion done by myself, Muffinlicious Joshua Colp. This has gone through so many discussions/revisions it's not funny but we finally have it!
git-svn-id: http://svn.digium.com/svn/asterisk/trunk@41507 f38db490-d61c-443f-a65b-d21fe96a405b
Diffstat (limited to 'channels/chan_features.c')
-rw-r--r-- | channels/chan_features.c | 26 |
1 files changed, 22 insertions, 4 deletions
diff --git a/channels/chan_features.c b/channels/chan_features.c index d1feadbea..66b6da3e3 100644 --- a/channels/chan_features.c +++ b/channels/chan_features.c @@ -95,7 +95,8 @@ static AST_LIST_HEAD_STATIC(features, feature_pvt); #define SUB_THREEWAY 2 /* Three-way call */ static struct ast_channel *features_request(const char *type, int format, void *data, int *cause); -static int features_digit(struct ast_channel *ast, char digit); +static int features_digit_begin(struct ast_channel *ast, char digit); +static int features_digit_end(struct ast_channel *ast, char digit); static int features_call(struct ast_channel *ast, char *dest, int timeout); static int features_hangup(struct ast_channel *ast); static int features_answer(struct ast_channel *ast); @@ -109,7 +110,8 @@ static const struct ast_channel_tech features_tech = { .description = tdesc, .capabilities = -1, .requester = features_request, - .send_digit = features_digit, + .send_digit_begin = features_digit_begin, + .send_digit_end = features_digit_end, .call = features_call, .hangup = features_hangup, .answer = features_answer, @@ -300,7 +302,7 @@ static int features_indicate(struct ast_channel *ast, int condition, const void return res; } -static int features_digit(struct ast_channel *ast, char digit) +static int features_digit_begin(struct ast_channel *ast, char digit) { struct feature_pvt *p = ast->tech_pvt; int res = -1; @@ -310,7 +312,23 @@ static int features_digit(struct ast_channel *ast, char digit) ast_mutex_lock(&p->lock); x = indexof(p, ast, 0); if (!x && p->subchan) - res = ast_senddigit(p->subchan, digit); + res = ast_senddigit_begin(p->subchan, digit); + ast_mutex_unlock(&p->lock); + + return res; +} + +static int features_digit_end(struct ast_channel *ast, char digit) +{ + struct feature_pvt *p = ast->tech_pvt; + int res = -1; + int x; + + /* Queue up a frame representing the indication as a control frame */ + ast_mutex_lock(&p->lock); + x = indexof(p, ast, 0); + if (!x && p->subchan) + res = ast_senddigit_end(p->subchan, digit); ast_mutex_unlock(&p->lock); return res; } |