diff --git a/channels/chan_unistim.c b/channels/chan_unistim.c index c8dfaff83a73a6e53b5fa6c924f5c033b075c34e..539d935c0a4732836475ec1b44fa252c71c7ca35 100644 --- a/channels/chan_unistim.c +++ b/channels/chan_unistim.c @@ -3313,22 +3313,12 @@ static void handle_call_incoming(struct unistimsession *s) return; } -static int unistim_do_senddigit(struct unistimsession *pte, char digit) +static int send_dtmf_tone(struct unistimsession *pte, char digit) { - struct ast_frame f = { .frametype = AST_FRAME_DTMF, .subclass.integer = digit, .src = "unistim" }; - struct unistim_subchannel *sub; - int row, col; + int row, col; - sub = get_sub(pte->device, SUB_REAL); - if (!sub || !sub->owner || sub->alreadygone) { - ast_log(LOG_WARNING, "Unable to find subchannel in dtmf senddigit\n"); - return -1; - } - - /* Send DTMF indication _before_ playing sounds */ - ast_queue_frame(sub->owner, &f); if (unistimdebug) { - ast_verb(0, "Send Digit %c (%i ms)\n", digit, pte->device->dtmfduration); + ast_verb(0, "Phone Play Digit %c\n", digit); } if (pte->device->dtmfduration > 0) { row = (digit - '1') % 3; @@ -3346,6 +3336,28 @@ static int unistim_do_senddigit(struct unistimsession *pte, char digit) } else { send_tone(pte, 500, 2000); } + } + return 0; +} + +static int unistim_do_senddigit(struct unistimsession *pte, char digit) +{ + struct ast_frame f = { .frametype = AST_FRAME_DTMF, .subclass.integer = digit, .src = "unistim" }; + struct unistim_subchannel *sub; + + sub = get_sub(pte->device, SUB_REAL); + if (!sub || !sub->owner || sub->alreadygone) { + ast_log(LOG_WARNING, "Unable to find subchannel in dtmf senddigit\n"); + return -1; + } + + /* Send DTMF indication _before_ playing sounds */ + ast_queue_frame(sub->owner, &f); + if (pte->device->dtmfduration > 0) { + if (unistimdebug) { + ast_verb(0, "Send Digit %c (%i ms)\n", digit, pte->device->dtmfduration); + } + send_dtmf_tone(pte, digit); usleep(pte->device->dtmfduration * 1000); /* XXX Less than perfect, blocking an important thread is not a good idea */ send_tone(pte, 0, 0); } @@ -5488,34 +5500,21 @@ static int unistim_senddigit_begin(struct ast_channel *ast, char digit) if (!pte) { return -1; } - return unistim_do_senddigit(pte, digit); + return send_dtmf_tone(pte, digit); } static int unistim_senddigit_end(struct ast_channel *ast, char digit, unsigned int duration) { struct unistimsession *pte = channel_to_session(ast); - struct ast_frame f = { 0, }; - struct unistim_subchannel *sub; - - sub = get_sub(pte->device, SUB_REAL); - if (!sub || !sub->owner || sub->alreadygone) { - ast_log(LOG_WARNING, "Unable to find subchannel in dtmf senddigit_end\n"); + if (!pte) { return -1; } if (unistimdebug) { - ast_verb(0, "Send Digit off %c\n", digit); - } - if (!pte) { - return -1; + ast_verb(0, "Send Digit off %c (duration %d)\n", digit, duration); } send_tone(pte, 0, 0); - f.frametype = AST_FRAME_DTMF; - f.subclass.integer = digit; - f.src = "unistim"; - ast_queue_frame(sub->owner, &f); - return 0; }