Merge "AMI PlayDTMF Action: Make not compete with channel's media thread."

16.0
George Joseph 7 years ago committed by Gerrit Code Review
commit 46c1f81fad

@ -167,7 +167,7 @@ static int manager_play_dtmf(struct mansession *s, const struct message *m)
return 0;
}
ast_senddigit(chan, *digit, duration_ms);
ast_senddigit_external(chan, *digit, duration_ms);
chan = ast_channel_unref(chan);

@ -2177,13 +2177,31 @@ int ast_recvchar(struct ast_channel *chan, int timeout);
/*!
* \brief Send a DTMF digit to a channel.
*
* \param chan channel to act upon
* \param digit the DTMF digit to send, encoded in ASCII
* \param duration the duration of the digit ending in ms
*
* \pre This must only be called by the channel's media handler thread.
*
* \return 0 on success, -1 on failure
*/
int ast_senddigit(struct ast_channel *chan, char digit, unsigned int duration);
/*!
* \brief Send a DTMF digit to a channel from an external thread.
*
* \param chan channel to act upon
* \param digit the DTMF digit to send, encoded in ASCII
* \param duration the duration of the digit ending in ms
*
* \pre This must only be called by threads that are not the channel's
* media handler thread.
*
* \return 0 on success, -1 on failure
*/
int ast_senddigit_external(struct ast_channel *chan, char digit, unsigned int duration);
/*!
* \brief Send a DTMF digit to a channel.
* \param chan channel to act upon

@ -4810,12 +4810,28 @@ int ast_senddigit_end(struct ast_channel *chan, char digit, unsigned int duratio
int ast_senddigit(struct ast_channel *chan, char digit, unsigned int duration)
{
if (duration < AST_DEFAULT_EMULATE_DTMF_DURATION) {
duration = AST_DEFAULT_EMULATE_DTMF_DURATION;
}
if (ast_channel_tech(chan)->send_digit_begin) {
ast_senddigit_begin(chan, digit);
ast_safe_sleep(chan, duration);
}
return ast_senddigit_end(chan, digit, duration);
}
int ast_senddigit_external(struct ast_channel *chan, char digit, unsigned int duration)
{
if (duration < AST_DEFAULT_EMULATE_DTMF_DURATION) {
duration = AST_DEFAULT_EMULATE_DTMF_DURATION;
}
if (ast_channel_tech(chan)->send_digit_begin) {
ast_senddigit_begin(chan, digit);
ast_safe_sleep(chan, (duration >= AST_DEFAULT_EMULATE_DTMF_DURATION ? duration : AST_DEFAULT_EMULATE_DTMF_DURATION));
usleep(duration * 1000);
}
return ast_senddigit_end(chan, digit, (duration >= AST_DEFAULT_EMULATE_DTMF_DURATION ? duration : AST_DEFAULT_EMULATE_DTMF_DURATION));
return ast_senddigit_end(chan, digit, duration);
}
int ast_prod(struct ast_channel *chan)

Loading…
Cancel
Save