[asterisk-commits] branch north/bug_1082 - r8222 in /team/north/bug_1082: apps/ channels/

asterisk-commits at lists.digium.com asterisk-commits at lists.digium.com
Wed Jan 18 16:45:47 MST 2006


Author: north
Date: Wed Jan 18 17:45:46 2006
New Revision: 8222

URL: http://svn.digium.com/view/asterisk?rev=8222&view=rev
Log:
Took patch from bug 1082, changed it to set channel var from queues, and read same var from agent_call

Modified:
    team/north/bug_1082/apps/app_queue.c
    team/north/bug_1082/channels/chan_agent.c

Modified: team/north/bug_1082/apps/app_queue.c
URL: http://svn.digium.com/view/asterisk/team/north/bug_1082/apps/app_queue.c?rev=8222&r1=8221&r2=8222&view=diff
==============================================================================
--- team/north/bug_1082/apps/app_queue.c (original)
+++ team/north/bug_1082/apps/app_queue.c Wed Jan 18 17:45:46 2006
@@ -350,6 +350,7 @@
 	char sound_thanks[80];          /*!< Sound file: "Thank you for your patience." (def. queue-thankyou) */
 	char sound_reporthold[80];	/*!< Sound file: "Hold time" (def. queue-reporthold) */
 	char sound_periodicannounce[MAX_PERIODIC_ANNOUNCEMENTS][80];/* Sound files: Custom announce, no default */
+	char sound_ack[80];		/*!< Sound file: Per queue agent ack sound, no default */
 
 	int count;			/*!< How many entries */
 	int maxlen;			/*!< Max number of entries */
@@ -689,6 +690,8 @@
 		}
 	} else if (!strcasecmp(param, "periodic-announce-frequency")) {
 		q->periodicannouncefrequency = atoi(val);
+	} else if (!strcasecmp(param, "acksound")) {
+		ast_copy_string(q->sound_ack, val, sizeof(q->sound_ack));
 	} else if (!strcasecmp(param, "retry")) {
 		q->retry = atoi(val);
 		if (q->retry < 0)
@@ -1433,6 +1436,9 @@
 
 	/* Presense of ADSI CPE on outgoing channel follows ours */
 	tmp->chan->adsicpe = qe->chan->adsicpe;
+
+	/* Allows agent to play a per queue ack sound */
+	pbx_builtin_setvar_helper(tmp->chan, "QUEUEACKSOUND", qe->parent->sound_ack);
 
 	/* Place the call, but don't wait on the answer */
 	res = ast_call(tmp->chan, location, 0);

Modified: team/north/bug_1082/channels/chan_agent.c
URL: http://svn.digium.com/view/asterisk/team/north/bug_1082/channels/chan_agent.c?rev=8222&r1=8221&r2=8222&view=diff
==============================================================================
--- team/north/bug_1082/channels/chan_agent.c (original)
+++ team/north/bug_1082/channels/chan_agent.c Wed Jan 18 17:45:46 2006
@@ -54,6 +54,7 @@
 #include "asterisk/module.h"
 #include "asterisk/pbx.h"
 #include "asterisk/options.h"
+#include "asterisk/translate.h"
 #include "asterisk/lock.h"
 #include "asterisk/sched.h"
 #include "asterisk/io.h"
@@ -157,6 +158,8 @@
 static int autologoff;
 static int wrapuptime;
 static int ackcall;
+static char acksound[AST_MAX_BUF] = "";
+static int ackwait = 0;
 static int multiplelogin = 1;
 static int autologoffunavail = 0;
 
@@ -206,6 +209,8 @@
 	char loginchan[80];            /**< channel they logged in from */
 	char logincallerid[80];        /**< Caller ID they had when they logged in */
 	struct ast_channel *chan;      /**< Channel we use */
+	struct ast_trans_pvt *trans;
+	int framecount;
 	struct agent_pvt *next;        /**< Next Agent in the linked list. */
 };
 
@@ -501,6 +506,14 @@
 			/* Note that we don't hangup if it's not a callback because Asterisk will do it
 			   for us when the PBX instance that called login finishes */
 			if (!ast_strlen_zero(p->loginchan)) {
+				if(p && p->chan && p->chan->stream) {
+					ast_closestream(p->chan->stream);
+					p->chan->stream = NULL;
+				}
+				if(p && p->trans) {
+					ast_translator_free_path(p->trans);
+					p->trans = NULL;
+				}
 				if (p->chan)
 					ast_log(LOG_DEBUG, "Bridge on '%s' being cleared (2)\n", p->chan->name);
 
@@ -529,6 +542,7 @@
  				if (p->ackcall) {
  					if (option_verbose > 2)
  						ast_verbose(VERBOSE_PREFIX_3 "%s answered, waiting for '#' to acknowledge\n", p->chan->name);
+					p->framecount = 1;
  					/* Don't pass answer along */
  					ast_frfree(f);
  					f = &null_frame;
@@ -543,6 +557,14 @@
  			break;
  		case AST_FRAME_DTMF:
  			if (!p->acknowledged && (f->subclass == '#')) {
+				if(p && p->chan && p->chan->stream) {
+					ast_closestream(p->chan->stream);
+					p->chan->stream = NULL;
+				}
+				if(p && p->trans) {
+					ast_translator_free_path(p->trans);
+					p->trans = NULL;
+				}
  				if (option_verbose > 2)
  					ast_verbose(VERBOSE_PREFIX_3 "%s acknowledged\n", p->chan->name);
  				p->acknowledged = 1;
@@ -664,6 +686,7 @@
 static int agent_call(struct ast_channel *ast, char *dest, int timeout)
 {
 	struct agent_pvt *p = ast->tech_pvt;
+	struct ast_frame *f2 = NULL;
 	int res = -1;
 	int newstate=0;
 	ast_mutex_lock(&p->lock);
@@ -735,6 +758,57 @@
 		}
 		res = 0;
 	}
+
+	/* Turn this code into poor man's generator since we are reading frames at the perfect speed 
+	   just open a stream and pass along the frames from the file while we are waiting for 
+	   the agent to press # or the timeout to occur.
+	*/
+	if(p && ! p->acknowledged) {
+		/* We don't want to rely on queues being loaded,
+		   so we'll just use a channel variable that gets set from queues.
+		*/
+		char *oldacksound = NULL;
+		if (!ast_strlen_zero(acksound))
+			oldacksound = ast_strdupa(acksound);
+		if (!ast_strlen_zero(pbx_builtin_getvar_helper(ast, "QUEUEACKSOUND")))
+			strncpy(acksound, pbx_builtin_getvar_helper(ast, "QUEUEACKSOUND"), AST_MAX_BUF);
+
+		if(p->chan && !ast_strlen_zero(acksound) && p->framecount++ > ackwait &&
+		   ! p->trans && (ast_openstream(p->chan,acksound, p->chan->language))) {
+			if((f2 = ast_readframe(p->chan->stream))) {
+				if(p->chan->readformat && p->chan->readformat != f2->subclass) 
+					p->trans = ast_translator_build_path(p->chan->readformat, f2->subclass);
+			}
+		}
+		ast_copy_string(acksound, oldacksound, sizeof(acksound));
+
+		if(p->framecount > ackwait && p->chan && p->chan->stream) {
+			if(!f2) {
+				if(!(f2 = ast_readframe(p->chan->stream))) {
+					/* Reset the stream and the ackwait and play the file again if the time comes. */
+					if(p->chan && p->chan->stream) {
+						ast_closestream(p->chan->stream);
+						p->chan->stream = NULL;
+					}
+					if(p->trans) {
+						ast_translator_free_path(p->trans);
+						p->trans = NULL;
+					}
+					p->framecount = 0;
+				}
+			}
+			if(f2) {
+				if(p->trans && f2->subclass != p->chan->readformat)
+					f2 = ast_translate(p->trans, f2, 1);
+				if(f2) {
+					ast_write(p->chan, f2);
+					ast_frfree(f2);
+					f2 = NULL;
+				}
+			}
+		}
+	}
+
 	CLEANUP(ast,p);
 	ast_mutex_unlock(&p->lock);
 	if (newstate)
@@ -765,6 +839,15 @@
 	ast->tech_pvt = NULL;
 	p->app_sleep_cond = 1;
 	p->acknowledged = 0;
+
+	if(p && p->chan && p->chan->stream) {
+		ast_stopstream(p->chan);
+		p->chan->stream = NULL;
+	}
+	if(p && p->trans) {
+		ast_translator_free_path(p->trans);
+		p->trans = NULL;
+	}
 
 	/* if they really are hung up then set start to 0 so the test
 	 * later if we're called on an already downed channel
@@ -991,6 +1074,8 @@
 		 * can safely use signals for this purpose. The pselect() needs to be
 		 * implemented in the kernel for this.
 		 */
+		p->trans = NULL;
+		p->framecount = 0;
 		p->app_sleep_cond = 0;
 		if( ast_mutex_trylock(&p->app_lock) )
 		{
@@ -1076,6 +1161,10 @@
 		/* Create the interface list */
 		if (!strcasecmp(v->name, "agent")) {
 			add_agent(v->value, 0);
+		} else if (!strcasecmp(v->name, "acksound")) {
+			strncpy(acksound,v->value,AST_MAX_BUF);
+		} else if (!strcasecmp(v->name, "ackwait")) {
+			ackwait = atoi(v->value);
 		} else if (!strcasecmp(v->name, "group")) {
 			group = ast_get_group(v->value);
 		} else if (!strcasecmp(v->name, "autologoff")) {



More information about the asterisk-commits mailing list