There can be one and only one thread handling a channel's media at a time.
Otherwise, we don't know which thread is going to handle the media frames.
ASTERISK-27625
Change-Id: Ia341f1a6f4d54f2022261abec9021fe5b2eb4905
return 0;
}
- ast_senddigit(chan, *digit, duration_ms);
+ ast_senddigit_external(chan, *digit, duration_ms);
chan = ast_channel_unref(chan);
/*!
* \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
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)