[asterisk-commits] rmudgett: branch rmudgett/parking r330636 - /team/rmudgett/parking/main/
SVN commits to the Asterisk project
asterisk-commits at lists.digium.com
Tue Aug 2 11:31:34 CDT 2011
Author: rmudgett
Date: Tue Aug 2 11:31:29 2011
New Revision: 330636
URL: http://svnview.digium.com/svn/asterisk?view=rev&rev=330636
Log:
Address autoservice concerns when playing courtesy tone for parking.
Modified:
team/rmudgett/parking/main/features.c
Modified: team/rmudgett/parking/main/features.c
URL: http://svnview.digium.com/svn/asterisk/team/rmudgett/parking/main/features.c?view=diff&rev=330636&r1=330635&r2=330636
==============================================================================
--- team/rmudgett/parking/main/features.c (original)
+++ team/rmudgett/parking/main/features.c Tue Aug 2 11:31:29 2011
@@ -1734,34 +1734,75 @@
}
/*!
+ * \internal
+ * \brief Play file to specified channel.
+ *
+ * \param play_to Channel to play audiofile to.
+ * \param other Channel to put in autoservice while playing file.
+ * \param msg Descriptive name of message type being played.
+ * \param audiofile Audio file to play.
+ *
+ * \retval 0 on success.
+ * \retval -1 on error. (Couldn't play file, a channel hung up,...)
+ */
+static int play_message_on_chan(struct ast_channel *play_to, struct ast_channel *other, const char *msg, const char *audiofile)
+{
+ /* Put other channel in autoservice. */
+ if (ast_autoservice_start(other)) {
+ return -1;
+ }
+ ast_autoservice_ignore(other, AST_FRAME_DTMF_BEGIN);
+ ast_autoservice_ignore(other, AST_FRAME_DTMF_END);
+ if (ast_stream_and_wait(play_to, audiofile, "")) {
+ ast_log(LOG_WARNING, "Failed to play %s '%s'!\n", msg, audiofile);
+ ast_autoservice_stop(other);
+ return -1;
+ }
+ if (ast_autoservice_stop(other)) {
+ return -1;
+ }
+ return 0;
+}
+
+/*!
+ * \internal
+ * \brief Play file to specified channels.
+ *
+ * \param left Channel on left to play file.
+ * \param right Channel on right to play file.
+ * \param which Play file on indicated channels: which < 0 play left, which == 0 play both, which > 0 play right
+ * \param msg Descriptive name of message type being played.
+ * \param audiofile Audio file to play to channels.
+ *
+ * \note Plays file to the indicated channels in turn so please
+ * don't use this for very long messages.
+ *
+ * \retval 0 on success.
+ * \retval -1 on error. (Couldn't play file, channel hung up,...)
+ */
+static int play_message_to_chans(struct ast_channel *left, struct ast_channel *right, int which, const char *msg, const char *audiofile)
+{
+ /* First play the file to the left channel if requested. */
+ if (which <= 0 && play_message_on_chan(left, right, msg, audiofile)) {
+ return -1;
+ }
+
+ /* Then play the file to the right channel if requested. */
+ if (which >= 0 && play_message_on_chan(right, left, msg, audiofile)) {
+ return -1;
+ }
+
+ return 0;
+}
+
+/*!
* \brief Play message to both caller and callee in bridged call, plays synchronously, autoservicing the
* other channel during the message, so please don't use this for very long messages
*/
static int play_message_in_bridged_call(struct ast_channel *caller_chan, struct ast_channel *callee_chan, const char *audiofile)
{
- /* First play for caller, put other channel on auto service */
- if (ast_autoservice_start(callee_chan))
- return -1;
- ast_autoservice_ignore(callee_chan, AST_FRAME_DTMF_END);
- if (ast_stream_and_wait(caller_chan, audiofile, "")) {
- ast_log(LOG_WARNING, "Failed to play automon message!\n");
- ast_autoservice_stop(callee_chan);
- return -1;
- }
- if (ast_autoservice_stop(callee_chan))
- return -1;
- /* Then play for callee, put other channel on auto service */
- if (ast_autoservice_start(caller_chan))
- return -1;
- ast_autoservice_ignore(caller_chan, AST_FRAME_DTMF_END);
- if (ast_stream_and_wait(callee_chan, audiofile, "")) {
- ast_log(LOG_WARNING, "Failed to play automon message !\n");
- ast_autoservice_stop(caller_chan);
- return -1;
- }
- if (ast_autoservice_stop(caller_chan))
- return -1;
- return(0);
+ return play_message_to_chans(caller_chan, callee_chan, 0, "automon message",
+ audiofile);
}
/*!
@@ -4751,30 +4792,23 @@
/* Play a courtesy to the source(s) configured to prefix the bridge connecting */
if (!ast_strlen_zero(courtesytone)) {
- int error = 0;
-
-/* BUGBUG we should autoservice the channel not getting the courtesy tone. */
- if (parkedplay == 0) {
- error = ast_stream_and_wait(chan, courtesytone, "");
- } else if (parkedplay == 1) {
- error = ast_stream_and_wait(peer, courtesytone, "");
- } else if (parkedplay == 2) {
- if (!ast_streamfile(chan, courtesytone, chan->language)
- && !ast_streamfile(peer, courtesytone, peer->language)) {
- /*! \todo XXX we would like to wait on both! */
- res = ast_waitstream(chan, "");
- if (res >= 0) {
- res = ast_waitstream(peer, "");
- }
- if (res < 0) {
- error = 1;
- }
- } else {
- error = 1;
- }
- }
- if (error) {
- ast_log(LOG_WARNING, "Failed to play courtesy tone!\n");
+ static const char msg[] = "courtesy tone";
+
+ switch (parkedplay) {
+ case 0:/* Courtesy tone to pickup chan */
+ res = play_message_to_chans(chan, peer, -1, msg, courtesytone);
+ break;
+ case 1:/* Courtesy tone to parked chan */
+ res = play_message_to_chans(chan, peer, 1, msg, courtesytone);
+ break;
+ case 2:/* Courtesy tone to both chans */
+ res = play_message_to_chans(chan, peer, 0, msg, courtesytone);
+ break;
+ default:
+ res = 0;
+ break;
+ }
+ if (res) {
ast_hangup(peer);
parkinglot_unref(parkinglot);
return -1;
More information about the asterisk-commits
mailing list