]> git.ipfire.org Git - thirdparty/asterisk.git/commitdiff
AMI PlayDTMF Action: Make not compete with channel's media thread.
authorRichard Mudgett <rmudgett@digium.com>
Wed, 13 Jun 2018 18:05:03 +0000 (13:05 -0500)
committerRichard Mudgett <rmudgett@digium.com>
Tue, 19 Jun 2018 19:14:03 +0000 (14:14 -0500)
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

apps/app_senddtmf.c
include/asterisk/channel.h
main/channel.c

index 178b13ff0325db830a9fce26adfe4047c276ed16..e0362e7d300e7c64c0748cb88b92bda7e99857b3 100644 (file)
@@ -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);
 
index 295fcbe82db9023c7dc6cf3718d4a2ccccccd790..16b8a7be5c93224bc53bab73fffee3171b2c8e52 100644 (file)
@@ -2225,13 +2225,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
index 92ec444d41f6306b13eb39f69a6616ae0e0ec63c..a29c9683e6dfcd403e21c9a9d0aba7bb648f5fb4 100644 (file)
@@ -4832,12 +4832,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)