[asterisk-commits] branch russell/hold_handling r37693 - in /team/russell/hold_handling: ./ apps...

asterisk-commits at lists.digium.com asterisk-commits at lists.digium.com
Sat Jul 15 16:48:26 MST 2006


Author: russell
Date: Sat Jul 15 18:48:26 2006
New Revision: 37693

URL: http://svn.digium.com/view/asterisk?rev=37693&view=rev
Log:
big set of changes to hold and music on hold stuff ... all untested and i
haven't looked back through my changes very much yet

- deprecate musicclass option in channel drivers
- add mohinterpret and mohsuggest options to various channel drivers
- mohinterpret is the moh class to use when put on hold
- mohsuggest is the moh class to suggest to the peer channel being put on hold
- make the handling of HOLD and UNHOLD frames more consistent, meaning that
  the channel receiving the frame is being put on hold or retrieved from hold
- change the way channel drivers put the channel they are bridged to on hold by
  queueing a HOLD/UNHOLD control frame with the mohsuggest class as the frame
  payload instead of directly turning on moh on the bridged channel.

When a channel driver receives a HOLD frame, if the mohinterpret option is set
to "passthrough", the HOLD/UNHOLD message is passed through (currently only
supported in IAX2). Otherwise, the first choice for the moh class to use is the
class set on the channel, which will only be done with 
Set(CHANNEL(musicclass)=blah). The second choice is the control frame payload,
otherwise known as the mohsuggest setting on the channel putting you on hold.
The third choice is the mohinterpret option on the channel. Then, of course, if
none of those are set, the "default" class is used.

Modified:
    team/russell/hold_handling/apps/app_dial.c
    team/russell/hold_handling/apps/app_followme.c
    team/russell/hold_handling/apps/app_meetme.c
    team/russell/hold_handling/apps/app_queue.c
    team/russell/hold_handling/channel.c
    team/russell/hold_handling/channels/chan_agent.c
    team/russell/hold_handling/channels/chan_alsa.c
    team/russell/hold_handling/channels/chan_iax2.c
    team/russell/hold_handling/channels/chan_mgcp.c
    team/russell/hold_handling/channels/chan_misdn.c
    team/russell/hold_handling/channels/chan_oss.c
    team/russell/hold_handling/channels/chan_sip.c
    team/russell/hold_handling/channels/chan_skinny.c
    team/russell/hold_handling/channels/chan_vpb.cc
    team/russell/hold_handling/channels/chan_zap.c
    team/russell/hold_handling/configs/alsa.conf.sample
    team/russell/hold_handling/configs/iax.conf.sample
    team/russell/hold_handling/configs/sip.conf.sample
    team/russell/hold_handling/configs/skinny.conf.sample
    team/russell/hold_handling/configs/zapata.conf.sample
    team/russell/hold_handling/include/asterisk/musiconhold.h
    team/russell/hold_handling/pbx.c
    team/russell/hold_handling/res/res_agi.c
    team/russell/hold_handling/res/res_features.c
    team/russell/hold_handling/res/res_musiconhold.c

Modified: team/russell/hold_handling/apps/app_dial.c
URL: http://svn.digium.com/view/asterisk/team/russell/hold_handling/apps/app_dial.c?rev=37693&r1=37692&r2=37693&view=diff
==============================================================================
--- team/russell/hold_handling/apps/app_dial.c (original)
+++ team/russell/hold_handling/apps/app_dial.c Sat Jul 15 18:48:26 2006
@@ -1214,8 +1214,8 @@
 		/* Our status will at least be NOANSWER */
 		strcpy(status, "NOANSWER");
 		if (ast_test_flag(outgoing, OPT_MUSICBACK)) {
-			moh=1;
-			ast_moh_start(chan, opt_args[OPT_ARG_MUSICBACK]);
+			moh = 1;
+			ast_moh_start(chan, opt_args[OPT_ARG_MUSICBACK], NULL);
 		} else if (ast_test_flag(outgoing, OPT_RINGBACK)) {
 			ast_indicate(chan, AST_CONTROL_RINGING);
 			sentringing++;
@@ -1273,7 +1273,7 @@
 
 			if (ast_test_flag(&opts, OPT_MUSICBACK) && !ast_strlen_zero(opt_args[OPT_ARG_MUSICBACK])) {
 				ast_indicate(chan, -1);
-				ast_moh_start(chan, opt_args[OPT_ARG_MUSICBACK]);
+				ast_moh_start(chan, opt_args[OPT_ARG_MUSICBACK], NULL);
 			} else if (ast_test_flag(&opts, OPT_RINGBACK)) {
 				ast_indicate(chan, AST_CONTROL_RINGING);
 				sentringing++;
@@ -1701,7 +1701,7 @@
 					res = ast_waitstream(chan, AST_DIGIT_ANY);
 				if (!res && sleep) {
 					if (!ast_test_flag(chan, AST_FLAG_MOH))
-						ast_moh_start(chan, NULL);
+						ast_moh_start(chan, NULL, NULL);
 					res = ast_waitfordigit(chan, sleep);
 				}
 			} else {
@@ -1709,7 +1709,7 @@
 					res = ast_waitstream(chan, "");
 				if (sleep) {
 					if (!ast_test_flag(chan, AST_FLAG_MOH))
-						ast_moh_start(chan, NULL);
+						ast_moh_start(chan, NULL, NULL);
 					if (!res) 
 						res = ast_waitfordigit(chan, sleep);
 				}

Modified: team/russell/hold_handling/apps/app_followme.c
URL: http://svn.digium.com/view/asterisk/team/russell/hold_handling/apps/app_followme.c?rev=37693&r1=37692&r2=37693&view=diff
==============================================================================
--- team/russell/hold_handling/apps/app_followme.c (original)
+++ team/russell/hold_handling/apps/app_followme.c Sat Jul 15 18:48:26 2006
@@ -1010,10 +1010,7 @@
 					goto outrun;
 				if (ast_waitstream(chan, "") < 0)
 					goto outrun;
-				if (!strcmp(targs.mohclass, ""))
-					ast_moh_start(chan, NULL);
-				else
-					ast_moh_start(chan, targs.mohclass);
+				ast_moh_start(chan, !ast_strlen_zero(targs.mohclass) ? targs.mohclass : NULL, NULL);
 
 
 				targs.status = 0;

Modified: team/russell/hold_handling/apps/app_meetme.c
URL: http://svn.digium.com/view/asterisk/team/russell/hold_handling/apps/app_meetme.c?rev=37693&r1=37692&r2=37693&view=diff
==============================================================================
--- team/russell/hold_handling/apps/app_meetme.c (original)
+++ team/russell/hold_handling/apps/app_meetme.c Sat Jul 15 18:48:26 2006
@@ -1407,7 +1407,7 @@
 						}
 					}
 					if (musiconhold == 0 && (confflags & CONFFLAG_MOH)) {
-						ast_moh_start(chan, NULL);
+						ast_moh_start(chan, NULL, NULL);
 						musiconhold = 1;
 					} else {
 						ztc.confmode = ZT_CONF_CONF;
@@ -1445,7 +1445,7 @@
 			if ((confflags & CONFFLAG_MOH) && !(confflags & CONFFLAG_WAITMARKED)) {
 				if (conf->users == 1) {
 					if (musiconhold == 0) {
-						ast_moh_start(chan, NULL);
+						ast_moh_start(chan, NULL, NULL);
 						musiconhold = 1;
 					} 
 				} else {
@@ -1749,7 +1749,7 @@
 						}
 					}
 					if (musiconhold)
-			   			ast_moh_start(chan, NULL);
+			   			ast_moh_start(chan, NULL, NULL);
 
 					if (ioctl(fd, ZT_SETCONF, &ztc)) {
 						ast_log(LOG_WARNING, "Error setting conference\n");

Modified: team/russell/hold_handling/apps/app_queue.c
URL: http://svn.digium.com/view/asterisk/team/russell/hold_handling/apps/app_queue.c?rev=37693&r1=37692&r2=37693&view=diff
==============================================================================
--- team/russell/hold_handling/apps/app_queue.c (original)
+++ team/russell/hold_handling/apps/app_queue.c Sat Jul 15 18:48:26 2006
@@ -1336,7 +1336,7 @@
 
 	/* Don't restart music on hold if we're about to exit the caller from the queue */
 	if (!res)
-		ast_moh_start(qe->chan, qe->moh);
+		ast_moh_start(qe->chan, qe->moh, NULL);
 
 	return res;
 }
@@ -1775,7 +1775,7 @@
 
 	/* Resume Music on Hold if the caller is going to stay in the queue */
 	if (!res)
-		ast_moh_start(qe->chan, qe->moh);
+		ast_moh_start(qe->chan, qe->moh, NULL);
 
 	/* update last_periodic_announce_time */
 	qe->last_periodic_announce_time = now;
@@ -3265,7 +3265,7 @@
 		if (ringing) {
 			ast_indicate(chan, AST_CONTROL_RINGING);
 		} else {
-			ast_moh_start(chan, qe.moh);
+			ast_moh_start(chan, qe.moh, NULL);
 		}
 		for (;;) {
 			/* This is the wait loop for callers 2 through maxlen */

Modified: team/russell/hold_handling/channel.c
URL: http://svn.digium.com/view/asterisk/team/russell/hold_handling/channel.c?rev=37693&r1=37692&r2=37693&view=diff
==============================================================================
--- team/russell/hold_handling/channel.c (original)
+++ team/russell/hold_handling/channel.c Sat Jul 15 18:48:26 2006
@@ -3881,11 +3881,11 @@
 	return group;
 }
 
-static int (*ast_moh_start_ptr)(struct ast_channel *, const char *) = NULL;
+static int (*ast_moh_start_ptr)(struct ast_channel *, const char *, const char *) = NULL;
 static void (*ast_moh_stop_ptr)(struct ast_channel *) = NULL;
 static void (*ast_moh_cleanup_ptr)(struct ast_channel *) = NULL;
 
-void ast_install_music_functions(int (*start_ptr)(struct ast_channel *, const char *),
+void ast_install_music_functions(int (*start_ptr)(struct ast_channel *, const char *, const char *),
 				 void (*stop_ptr)(struct ast_channel *),
 				 void (*cleanup_ptr)(struct ast_channel *))
 {
@@ -3902,14 +3902,16 @@
 }
 
 /*! \brief Turn on music on hold on a given channel */
-int ast_moh_start(struct ast_channel *chan, const char *mclass)
+int ast_moh_start(struct ast_channel *chan, const char *mclass, const char *interpclass)
 {
 	if (ast_moh_start_ptr)
-		return ast_moh_start_ptr(chan, mclass);
-
-	if (option_verbose > 2)
-		ast_verbose(VERBOSE_PREFIX_3 "Music class %s requested but no musiconhold loaded.\n", mclass ? mclass : "default");
-	
+		return ast_moh_start_ptr(chan, mclass, interpclass);
+
+	if (option_verbose > 2) {
+		ast_verbose(VERBOSE_PREFIX_3 "Music class %s requested but no musiconhold loaded.\n", 
+			mclass ? mclass : (interpclass ? interpclass : "default"));
+	}
+
 	return 0;
 }
 

Modified: team/russell/hold_handling/channels/chan_agent.c
URL: http://svn.digium.com/view/asterisk/team/russell/hold_handling/channels/chan_agent.c?rev=37693&r1=37692&r2=37693&view=diff
==============================================================================
--- team/russell/hold_handling/channels/chan_agent.c (original)
+++ team/russell/hold_handling/channels/chan_agent.c Sat Jul 15 18:48:26 2006
@@ -595,7 +595,7 @@
 	int res = -1;
 	ast_mutex_lock(&p->lock);
 	if (p->chan)
-		res = ast_indicate(p->chan, condition);
+		res = ast_indicate_data(p->chan, condition, data, datalen);
 	else
 		res = 0;
 	ast_mutex_unlock(&p->lock);
@@ -773,7 +773,7 @@
 			ast_channel_unlock(p->chan);
 		} else if (p->loginstart) {
 			ast_channel_lock(p->chan);
-			ast_moh_start(p->chan, p->moh);
+			ast_indicate_data(p->chan, AST_CONTROL_HOLD, p->moh, strlen(p->moh));
 			ast_channel_unlock(p->chan);
 		}
 	}
@@ -965,7 +965,7 @@
 			ast_log( LOG_ERROR, "A blocker exists after agent channel ownership acquired\n" );
 			CRASH;
 		}
-		ast_moh_stop(p->chan);
+		ast_indicate(p->chan, AST_CONTROL_UNHOLD);
 	}
 	return tmp;
 }
@@ -1964,12 +1964,7 @@
 							res = ast_safe_sleep(chan, 500);
 						ast_mutex_unlock(&p->lock);
 					} else if (!res) {
-#ifdef HONOR_MUSIC_CLASS
-						/* check if the moh class was changed with setmusiconhold */
-						if (*(chan->musicclass))
-							ast_copy_string(p->moh, chan->musicclass, sizeof(p->moh));
-#endif								
-						ast_moh_start(chan, p->moh);
+						ast_indicate_data(chan, AST_CONTROL_HOLD, p->moh, strlen(p->moh));
 						if (p->loginstart == 0)
 							time(&p->loginstart);
 						manager_event(EVENT_FLAG_AGENT, "Agentlogin",

Modified: team/russell/hold_handling/channels/chan_alsa.c
URL: http://svn.digium.com/view/asterisk/team/russell/hold_handling/channels/chan_alsa.c?rev=37693&r1=37692&r2=37693&view=diff
==============================================================================
--- team/russell/hold_handling/channels/chan_alsa.c (original)
+++ team/russell/hold_handling/channels/chan_alsa.c Sat Jul 15 18:48:26 2006
@@ -61,6 +61,7 @@
 #include "asterisk/endian.h"
 #include "asterisk/stringfields.h"
 #include "asterisk/abstract_jb.h"
+#include "asterisk/musiconhold.h"
 
 #include "busy.h"
 #include "ringtone.h"
@@ -127,6 +128,7 @@
 static char context[AST_MAX_CONTEXT] = "default";
 static char language[MAX_LANGUAGE] = "";
 static char exten[AST_MAX_EXTENSION] = "s";
+static char mohinterpret[MAX_MUSICCLASS];
 
 static int hookstate=0;
 
@@ -764,7 +766,9 @@
 static int alsa_indicate(struct ast_channel *chan, int cond, const void *data, size_t datalen)
 {
 	int res = 0;
-	ast_mutex_lock(&alsalock);
+
+	ast_mutex_lock(&alsalock);
+	
 	switch(cond) {
 	case AST_CONTROL_BUSY:
 		res = 1;
@@ -773,7 +777,6 @@
 		res = 2;
 		break;
 	case AST_CONTROL_RINGING:
-		res = 0;
 		break;
 	case -1:
 		res = -1;
@@ -781,14 +784,24 @@
 	case AST_CONTROL_VIDUPDATE:
 		res = -1;
 		break;
+	case AST_CONTROL_HOLD:
+		ast_verbose( " << Console Has Been Placed on Hold >> \n");
+		ast_moh_start(chan, data, mohinterpret);
+		break;
+	case AST_CONTROL_UNHOLD:
+		ast_verbose( " << Console Has Been Retrieved from Hold >> \n");
+		ast_moh_stop(chan);
+		break;
 	default:
 		ast_log(LOG_WARNING, "Don't know how to display condition %d on %s\n", cond, chan->name);
 		res = -1;
 	}
-	if (res > -1) {
+	
+	if (res > -1)
 		write(sndcmd[1], &res, sizeof(res));
-	}
-	ast_mutex_unlock(&alsalock);
+
+	ast_mutex_unlock(&alsalock);
+
 	return res;	
 }
 
@@ -1068,14 +1081,15 @@
 	/* Copy the default jb config over global_jbconf */
 	memcpy(&global_jbconf, &default_jbconf, sizeof(struct ast_jb_conf));
 
+	strcpy(mohinterpret, "default");
+
 	if ((cfg = ast_config_load(config))) {
 		v = ast_variable_browse(cfg, "general");
-		while(v) {
+		for (; v; v = v->next) {
 			/* handle jb conf */
-			if (!ast_jb_read_conf(&global_jbconf, v->name, v->value)) {
-				v = v->next;
+			if (!ast_jb_read_conf(&global_jbconf, v->name, v->value))
 				continue;
-			}
+			
 			if (!strcasecmp(v->name, "autoanswer"))
 				autoanswer = ast_true(v->value);
 			else if (!strcasecmp(v->name, "silencesuppression"))
@@ -1083,16 +1097,17 @@
 			else if (!strcasecmp(v->name, "silencethreshold"))
 				silencethreshold = atoi(v->value);
 			else if (!strcasecmp(v->name, "context"))
-				strncpy(context, v->value, sizeof(context)-1);
+				ast_copy_string(context, v->value, sizeof(context));
 			else if (!strcasecmp(v->name, "language"))
-				strncpy(language, v->value, sizeof(language)-1);
+				ast_copy_string(language, v->value, sizeof(language));
 			else if (!strcasecmp(v->name, "extension"))
-				strncpy(exten, v->value, sizeof(exten)-1);
+				ast_copy_string(exten, v->value, sizeof(exten));
 			else if (!strcasecmp(v->name, "input_device"))
-				strncpy(indevname, v->value, sizeof(indevname)-1);
+				ast_copy_string(indevname, v->value, sizeof(indevname));
 			else if (!strcasecmp(v->name, "output_device"))
-				strncpy(outdevname, v->value, sizeof(outdevname)-1);
-			v=v->next;
+				ast_copy_string(outdevname, v->value, sizeof(outdevname));
+			else if (!strcasecmp(v->name, "mohinterpret"))
+				ast_copy_string(mohinterpret, v->value, sizeof(mohinterpret));
 		}
 		ast_config_destroy(cfg);
 	}

Modified: team/russell/hold_handling/channels/chan_iax2.c
URL: http://svn.digium.com/view/asterisk/team/russell/hold_handling/channels/chan_iax2.c?rev=37693&r1=37692&r2=37693&view=diff
==============================================================================
--- team/russell/hold_handling/channels/chan_iax2.c (original)
+++ team/russell/hold_handling/channels/chan_iax2.c Sat Jul 15 18:48:26 2006
@@ -217,6 +217,8 @@
 #endif /* IAXTESTS */
 
 static char accountcode[AST_MAX_ACCOUNT_CODE];
+static char mohinterpret[MAX_MUSICCLASS];
+static char mohsuggest[MAX_MUSICCLASS];
 static int amaflags = 0;
 static int adsi = 0;
 static int delayreject = 0;
@@ -283,6 +285,8 @@
 	int authmethods;
 	int encmethods;
 	char accountcode[AST_MAX_ACCOUNT_CODE];
+	char mohinterpret[MAX_MUSICCLASS];
+	char mohsuggest[MAX_MUSICCLASS];
 	char inkeys[80];				/*!< Key(s) this user can use to authenticate to us */
 	char language[MAX_LANGUAGE];
 	int amaflags;
@@ -310,6 +314,8 @@
 	char regexten[AST_MAX_EXTENSION];		/*!< Extension to register (if regcontext is used) */
 	char peercontext[AST_MAX_EXTENSION];		/*!< Context to pass to peer */
 	char mailbox[AST_MAX_EXTENSION];		/*!< Mailbox */
+	char mohinterpret[MAX_MUSICCLASS];
+	char mohsuggest[MAX_MUSICCLASS];
 	struct ast_codec_pref prefs;
 	struct ast_dnsmgr_entry *dnsmgr;		/*!< DNS refresh manager */
 	struct sockaddr_in addr;
@@ -590,6 +596,8 @@
 	int calling_pres;
 	char dproot[AST_MAX_EXTENSION];
 	char accountcode[AST_MAX_ACCOUNT_CODE];
+	char mohinterpret[MAX_MUSICCLASS];
+	char mohsuggest[MAX_MUSICCLASS];
 	int amaflags;
 	struct iax2_dpcache *dpentries;
 	struct ast_variable *vars;
@@ -1226,6 +1234,8 @@
 			iaxs[x]->amaflags = amaflags;
 			ast_copy_flags(iaxs[x], (&globalflags), IAX_NOTRANSFER | IAX_TRANSFERMEDIA | IAX_USEJITTERBUF | IAX_FORCEJITTERBUF);	
 			ast_copy_string(iaxs[x]->accountcode, accountcode, sizeof(iaxs[x]->accountcode));
+			ast_copy_string(iaxs[x]->mohinterpret, mohinterpret, sizeof(iaxs[x]->mohinterpret));
+			ast_copy_string(iaxs[x]->mohsuggest, mohsuggest, sizeof(iaxs[x]->mohsuggest));
 		} else {
 			ast_log(LOG_WARNING, "Out of resources\n");
 			ast_mutex_unlock(&iaxsl[x]);
@@ -2577,6 +2587,8 @@
 	char prefs[32];
 	char context[AST_MAX_CONTEXT];
 	char peercontext[AST_MAX_CONTEXT];
+	char mohinterpret[MAX_MUSICCLASS];
+	char mohsuggest[MAX_MUSICCLASS];
 };
 
 static int create_addr(const char *peername, struct sockaddr_in *sin, struct create_addr_info *cai)
@@ -2634,6 +2646,8 @@
 	ast_copy_string(cai->username, peer->username, sizeof(cai->username));
 	ast_copy_string(cai->timezone, peer->zonetag, sizeof(cai->timezone));
 	ast_copy_string(cai->outkey, peer->outkey, sizeof(cai->outkey));
+	ast_copy_string(cai->mohinterpret, peer->mohinterpret, sizeof(cai->mohinterpret));
+	ast_copy_string(cai->mohsuggest, peer->mohsuggest, sizeof(cai->mohsuggest));
 	if (ast_strlen_zero(peer->dbsecret)) {
 		ast_copy_string(cai->secret, peer->secret, sizeof(cai->secret));
 	} else {
@@ -2881,6 +2895,9 @@
 	iaxs[callno]->encmethods = cai.encmethods;
 
 	iaxs[callno]->adsi = cai.adsi;
+	
+	ast_copy_string(iaxs[callno]->mohinterpret, cai.mohinterpret, sizeof(iaxs[callno]->mohinterpret));
+	ast_copy_string(iaxs[callno]->mohsuggest, cai.mohsuggest, sizeof(iaxs[callno]->mohsuggest));
 
 	if (pds.key)
 		ast_copy_string(iaxs[callno]->outkey, pds.key, sizeof(iaxs[callno]->outkey));
@@ -3168,9 +3185,23 @@
 static int iax2_indicate(struct ast_channel *c, int condition, const void *data, size_t datalen)
 {
 	unsigned short callno = PTR_TO_CALLNO(c->tech_pvt);
+
 	if (option_debug && iaxdebug)
 		ast_log(LOG_DEBUG, "Indicating condition %d\n", condition);
-	return send_command_locked(callno, AST_FRAME_CONTROL, condition, 0, data, datalen, -1);
+
+	if (!strcasecmp(iaxs[callno]->mohinterpret, "passthrough"))
+		return send_command_locked(callno, AST_FRAME_CONTROL, condition, 0, data, datalen, -1);
+
+	switch (condition) {
+	case AST_CONTROL_HOLD:
+		ast_moh_start(c, data, iaxs[callno]->mohinterpret);
+		return 0;
+	case AST_CONTROL_UNHOLD:
+		ast_moh_stop(c);
+		return 0;
+	default:
+		return send_command_locked(callno, AST_FRAME_CONTROL, condition, 0, data, datalen, -1);
+	}
 }
 	
 static int iax2_transfer(struct ast_channel *c, const char *dest)
@@ -4703,6 +4734,10 @@
 		}
 		if (!ast_strlen_zero(user->accountcode))
 			ast_copy_string(iaxs[callno]->accountcode, user->accountcode, sizeof(iaxs[callno]->accountcode));
+		if (!ast_strlen_zero(user->mohinterpret))
+			ast_copy_string(iaxs[callno]->mohinterpret, user->mohinterpret, sizeof(iaxs[callno]->mohinterpret));
+		if (!ast_strlen_zero(user->mohsuggest))
+			ast_copy_string(iaxs[callno]->mohsuggest, user->mohsuggest, sizeof(iaxs[callno]->mohsuggest));
 		if (user->amaflags)
 			iaxs[callno]->amaflags = user->amaflags;
 		if (!ast_strlen_zero(user->language))
@@ -6668,9 +6703,11 @@
 
 					ast_set_flag(iaxs[fr->callno], IAX_QUELCH);
 					if (ies.musiconhold) {
-						if (iaxs[fr->callno]->owner &&
-							ast_bridged_channel(iaxs[fr->callno]->owner))
-								ast_moh_start(ast_bridged_channel(iaxs[fr->callno]->owner), NULL);
+						if (iaxs[fr->callno]->owner && ast_bridged_channel(iaxs[fr->callno]->owner)) {
+							const char *mohsuggest = iaxs[fr->callno]->mohsuggest;
+							ast_queue_control_data(iaxs[fr->callno]->owner, AST_CONTROL_HOLD, 
+								!ast_strlen_zero(mohsuggest) ? mohsuggest : NULL, strlen(mohsuggest));
+						}
 					}
 				}
 				break;
@@ -6686,9 +6723,8 @@
 					}
 
 					ast_clear_flag(iaxs[fr->callno], IAX_QUELCH);
-					if (iaxs[fr->callno]->owner &&
-						ast_bridged_channel(iaxs[fr->callno]->owner))
-							ast_moh_stop(ast_bridged_channel(iaxs[fr->callno]->owner));
+					if (iaxs[fr->callno]->owner && ast_bridged_channel(iaxs[fr->callno]->owner))
+						ast_queue_control(iaxs[fr->callno]->owner, AST_CONTROL_UNHOLD);
 				}
 				break;
 			case IAX_COMMAND_TXACC:
@@ -8244,6 +8280,10 @@
 				ast_copy_string(peer->secret, v->value, sizeof(peer->secret));
 			} else if (!strcasecmp(v->name, "mailbox")) {
 				ast_copy_string(peer->mailbox, v->value, sizeof(peer->mailbox));
+			} else if (!strcasecmp(v->name, "mohinterpret")) {
+				ast_copy_string(peer->mohinterpret, v->value, sizeof(peer->mohinterpret));
+			} else if (!strcasecmp(v->name, "mohsuggest")) {
+				ast_copy_string(peer->mohsuggest, v->value, sizeof(peer->mohsuggest));
 			} else if (!strcasecmp(v->name, "dbsecret")) {
 				ast_copy_string(peer->dbsecret, v->value, sizeof(peer->dbsecret));
 			} else if (!strcasecmp(v->name, "trunk")) {
@@ -8502,6 +8542,10 @@
 				ast_set_flag(user, IAX_HASCALLERID);	
 			} else if (!strcasecmp(v->name, "accountcode")) {
 				ast_copy_string(user->accountcode, v->value, sizeof(user->accountcode));
+			} else if (!strcasecmp(v->name, "mohinterpret")) {
+				ast_copy_string(user->mohinterpret, v->value, sizeof(user->mohinterpret));
+			} else if (!strcasecmp(v->name, "mohsuggest")) {
+				ast_copy_string(user->mohsuggest, v->value, sizeof(user->mohsuggest));
 			} else if (!strcasecmp(v->name, "language")) {
 				ast_copy_string(user->language, v->value, sizeof(user->language));
 			} else if (!strcasecmp(v->name, "amaflags")) {
@@ -8876,6 +8920,10 @@
 				ast_log(LOG_WARNING, "Invalid tos value at line %d, see doc/ip-tos.txt for more information.'\n", v->lineno);
 		} else if (!strcasecmp(v->name, "accountcode")) {
 			ast_copy_string(accountcode, v->value, sizeof(accountcode));
+		} else if (!strcasecmp(v->name, "mohinterpret")) {
+			ast_copy_string(mohinterpret, v->value, sizeof(user->mohinterpret));
+		} else if (!strcasecmp(v->name, "mohsuggest")) {
+			ast_copy_string(mohsuggest, v->value, sizeof(user->mohsuggest));
 		} else if (!strcasecmp(v->name, "amaflags")) {
 			format = ast_cdr_amaflags2int(v->value);
 			if (format < 0) {
@@ -8954,8 +9002,10 @@
 	struct iax2_registry *reg;
 	struct iax2_peer *peer = NULL;
 
-	ast_copy_string(accountcode, "", sizeof(accountcode));
-	ast_copy_string(language, "", sizeof(language));
+	strcpy(accountcode, "");
+	strcpy(language, "");
+	strcpy(mohinterpret, "default");
+	strcpy(mohsuggest, "");
 	amaflags = 0;
 	delayreject = 0;
 	ast_clear_flag((&globalflags), IAX_NOTRANSFER);	

Modified: team/russell/hold_handling/channels/chan_mgcp.c
URL: http://svn.digium.com/view/asterisk/team/russell/hold_handling/channels/chan_mgcp.c?rev=37693&r1=37692&r2=37693&view=diff
==============================================================================
--- team/russell/hold_handling/channels/chan_mgcp.c (original)
+++ team/russell/hold_handling/channels/chan_mgcp.c Sat Jul 15 18:48:26 2006
@@ -27,48 +27,6 @@
  *
  * \ingroup channel_drivers
  */
-
-/* FO: Changes
- * -- add distinctive ring signalling (part of RFC 3660)
- */
-
-/* JS: Changes
-   -- add support for the wildcard endpoint
-   -- seteable wildcard with wcardep on mgcp.conf
-   -- added package indicator on RQNT, i.e "dl" --> "L/dl"
-   -- removed MDCX just before DLCX, do we need this ?
-*/
-
-/* JS: TODO
-   -- reload for wildcard endpoint probably buggy
-   -- when hf is notified we're sending CRCX after MDCX, without waiting for
-      OK on the MDCX which fails on Cisco IAD 24XX
-   -- honour codec order, by now the lowest codec number in "allow" is the prefered
-*/
-
-/* SC: Changes
-   -- packet retransmit mechanism (simplistic)
-   -- per endpoint/subchannel mgcp command sequencing. 
-   -- better transaction handling
-   -- fixed some mem leaks
-   -- run-time configuration reload 
-   -- distinguish CA and GW default MGCP ports
-   -- prevent clipping of DTMF tones in an established call
-   -- fixed a few crash scenarios in 3-way
-   -- fix for a few cases where asterisk and MGW end-up in conflicting ep states 
-   -- enclose numeric IP in [] for outgoing requests
-*/
-
-/* SC: TODO
-   -- piggyback support
-   -- responseAck support
-   -- enhance retransmit mechanism (RTO calc. etc.)
-   -- embedded command support
-*/
-
-/* FS: Changes
-   -- fixed reload_config() / do_monitor to stay responsive during reloads
-*/
 
 #include "asterisk.h"
 
@@ -155,13 +113,13 @@
 #define MGCP_DTMF_INBAND	(1 << 1)
 #define MGCP_DTMF_HYBRID	(1 << 2)
 
-#define DEFAULT_MGCP_GW_PORT	2427 /* From RFC 2705 */
-#define DEFAULT_MGCP_CA_PORT	2727 /* From RFC 2705 */
-#define MGCP_MAX_PACKET		1500 /* Also from RFC 2543, should sub headers tho */
-#define DEFAULT_RETRANS		1000 /* How frequently to retransmit */
-#define MAX_RETRANS		5    /* Try only 5 times for retransmissions */
-
-/* MGCP rtp stream modes */
+#define DEFAULT_MGCP_GW_PORT	2427 /*!< From RFC 2705 */
+#define DEFAULT_MGCP_CA_PORT	2727 /*!< From RFC 2705 */
+#define MGCP_MAX_PACKET		1500 /*!< Also from RFC 2543, should sub headers tho */
+#define DEFAULT_RETRANS		1000 /*!< How frequently to retransmit */
+#define MAX_RETRANS		5    /*!< Try only 5 times for retransmissions */
+
+/*! MGCP rtp stream modes { */
 #define MGCP_CX_SENDONLY	0
 #define MGCP_CX_RECVONLY	1
 #define MGCP_CX_SENDRECV	2
@@ -169,6 +127,7 @@
 #define MGCP_CX_CONFERENCE	3
 #define MGCP_CX_MUTE		4
 #define MGCP_CX_INACTIVE	4
+/*! } */
 
 static char *mgcp_cxmodes[] = {
 	"sendonly",
@@ -178,16 +137,17 @@
 	"inactive"
 };
 
-/* SC: MGCP commands */
-#define MGCP_CMD_EPCF 0
-#define MGCP_CMD_CRCX 1
-#define MGCP_CMD_MDCX 2
-#define MGCP_CMD_DLCX 3
-#define MGCP_CMD_RQNT 4
-#define MGCP_CMD_NTFY 5
-#define MGCP_CMD_AUEP 6
-#define MGCP_CMD_AUCX 7
-#define MGCP_CMD_RSIP 8
+enum {
+	MGCP_CMD_EPCF,
+	MGCP_CMD_CRCX,
+	MGCP_CMD_MDCX,
+	MGCP_CMD_DLCX,
+	MGCP_CMD_RQNT,
+	MGCP_CMD_NTFY,
+	MGCP_CMD_AUEP,
+	MGCP_CMD_AUCX,
+	MGCP_CMD_RSIP
+};
 
 static char context[AST_MAX_EXTENSION] = "default";
 
@@ -199,39 +159,22 @@
 static int dtmfmode = 0;
 static int nat = 0;
 
-/* Not used. Dosn't hurt for us to always send cid  */
-/* to the mgcp box. */
-/*static int use_callerid = 1;*/
-/*static int cur_signalling = -1;*/
-
-/*static unsigned int cur_group = 0;*/
 static ast_group_t cur_callergroup = 0;
 static ast_group_t cur_pickupgroup = 0;
 
-/* XXX Is this needed? */
-/*     Doesn't look like the dsp stuff for */
-/*     dtmfmode is actually hooked up.   */
-/*static int relaxdtmf = 0;*/
-
 static int tos = 0;
 
 static int immediate = 0;
 
 static int callwaiting = 0;
 
-/* Not used. Dosn't hurt for us to always send cid  */
-/* to the mgcp box. */
-/*static int callwaitingcallerid = 0;*/
-
-/*static int hidecallerid = 0;*/
-
 static int callreturn = 0;
 
 static int slowsequence = 0;
 
 static int threewaycalling = 0;
 
-/* This is for flashhook transfers */
+/*! This is for flashhook transfers */
 static int transfer = 0;
 
 static int cancallforward = 0;
@@ -240,10 +183,6 @@
 
 static int canreinvite = CANREINVITE;
 
-/*static int busycount = 3;*/
-
-/*static int callprogress = 0;*/
-
 static char accountcode[AST_MAX_ACCOUNT_CODE] = "";
 
 static char mailbox[AST_MAX_EXTENSION];
@@ -252,26 +191,25 @@
 
 static int adsi = 0;
 
-/* SC: transaction id should always be positive */
 static unsigned int oseq;
 
-/* Wait up to 16 seconds for first digit (FXO logic) */
+/*! Wait up to 16 seconds for first digit (FXO logic) */
 static int firstdigittimeout = 16000;
 
-/* How long to wait for following digits (FXO logic) */
+/*! How long to wait for following digits (FXO logic) */
 static int gendigittimeout = 8000;
 
-/* How long to wait for an extra digit, if there is an ambiguous match */
+/*! How long to wait for an extra digit, if there is an ambiguous match */
 static int matchdigittimeout = 3000;
 
-/* Protect the monitoring thread, so only one process can kill or start it, and not
-   when it's doing something critical. */
+/*! Protect the monitoring thread, so only one process can kill or start it, and not
+    when it's doing something critical. */
 AST_MUTEX_DEFINE_STATIC(netlock);
 
 AST_MUTEX_DEFINE_STATIC(monlock);
 
-/* This is the thread for the monitor which checks for input on the channels
-   which are not currently in use. */
+/*! This is the thread for the monitor which checks for input on the channels
+    which are not currently in use. */
 static pthread_t monitor_thread = AST_PTHREADT_NULL;
 
 static int restart_monitor(void);
@@ -287,8 +225,8 @@
 
 static struct sched_context *sched;
 static struct io_context *io;
-/* The private structures of the  mgcp channels are linked for
-   selecting outgoing channels */
+/*! The private structures of the  mgcp channels are linked for
+  ! selecting outgoing channels */
    
 #define MGCP_MAX_HEADERS	64
 #define MGCP_MAX_LINES		64
@@ -304,20 +242,10 @@
 	int lines;			/*!< SDP Content */
 	char *line[MGCP_MAX_LINES];
 	char data[MGCP_MAX_PACKET];
-	int cmd;                        /*!< SC: int version of verb = command */
-	unsigned int trid;              /*!< SC: int version of identifier = transaction id */
-	struct mgcp_request *next;      /*!< SC: next in the queue */
+	int cmd;                        /*!< int version of verb = command */
+	unsigned int trid;              /*!< int version of identifier = transaction id */
+	struct mgcp_request *next;      /*!< next in the queue */
 };
-
-/* SC: obsolete
-static struct mgcp_pkt {
-	int retrans;
-	struct mgcp_endpoint *owner;
-	int packetlen;
-	char data[MGCP_MAX_PACKET];
-	struct mgcp_pkt *next;
-} *packets = NULL;	
-*/
 
 /*! \brief mgcp_message: MGCP message for queuing up */
 struct mgcp_message {
@@ -331,7 +259,7 @@
 	char buf[0];
 };
 
-#define RESPONSE_TIMEOUT 30	/* in seconds */
+#define RESPONSE_TIMEOUT 30	/*!< in seconds */
 
 struct mgcp_response {
 	time_t whensent;
@@ -347,7 +275,7 @@
 #define SUB_ALT  1
 
 struct mgcp_subchannel {
-	/* SC: subchannel magic string. 
+	/*! subchannel magic string. 
 	   Needed to prove that any subchannel pointer passed by asterisk 
 	   really points to a valid subchannel memory area.
 	   Ugly.. But serves the purpose for the time being.
@@ -360,18 +288,18 @@
 	struct mgcp_endpoint *parent;
 	struct ast_rtp *rtp;
 	struct sockaddr_in tmpdest;
-	char txident[80]; /* FIXME SC: txident is replaced by rqnt_ident in endpoint. 
+	char txident[80]; /*! \todo FIXME txident is replaced by rqnt_ident in endpoint. 
 			This should be obsoleted */
 	char cxident[80];
 	char callid[80];
 	int cxmode;
-	struct mgcp_request *cx_queue; /*!< SC: pending CX commands */
-	ast_mutex_t cx_queue_lock;     /*!< SC: CX queue lock */
+	struct mgcp_request *cx_queue; /*!< pending CX commands */
+	ast_mutex_t cx_queue_lock;     /*!< CX queue lock */
 	int nat;
-	int iseq; /* Not used? RTP? */
+	int iseq;                      /*!< Not used? RTP? */
 	int outgoing;
 	int alreadygone;
-	struct mgcp_subchannel *next; /* for out circular linked list */
+	struct mgcp_subchannel *next;  /*!< for out circular linked list */
 };
 
 #define MGCP_ONHOOK  1
@@ -423,13 +351,13 @@
 	int immediate;
 	int hookstate;
 	int adsi;
-	char rqnt_ident[80];             /*!< SC: request identifier */
-	struct mgcp_request *rqnt_queue; /*!< SC: pending RQNT commands */
+	char rqnt_ident[80];             /*!< request identifier */
+	struct mgcp_request *rqnt_queue; /*!< pending RQNT commands */
 	ast_mutex_t rqnt_queue_lock;
-	struct mgcp_request *cmd_queue;  /*!< SC: pending commands other than RQNT */
+	struct mgcp_request *cmd_queue;  /*!< pending commands other than RQNT */
 	ast_mutex_t cmd_queue_lock;
-	int delme;                       /*!< SC: needed for reload */
-	int needaudit;                   /*!< SC: needed for reload */
+	int delme;                       /*!< needed for reload */
+	int needaudit;                   /*!< needed for reload */
 	struct ast_dsp *dsp; /*!< XXX Should there be a dsp/subchannel? XXX */
 	/* owner is tracked on the subchannels, and the *sub indicates whos in charge */
 	/* struct ast_channel *owner; */
@@ -443,7 +371,7 @@
 static struct mgcp_gateway {
 	/* A gateway containing one or more endpoints */
 	char name[80];
-	int isnamedottedip; /*!< SC: is the name FQDN or dotted ip */
+	int isnamedottedip; /*!< is the name FQDN or dotted ip */
 	struct sockaddr_in addr;
 	struct sockaddr_in defaddr;
 	struct in_addr ourip;
@@ -451,17 +379,17 @@
 	int expire;		/*!< XXX Should we ever expire dynamic registrations? XXX */
 	struct mgcp_endpoint *endpoints;
 	struct ast_ha *ha;
-/* SC: obsolete
+/* obsolete
 	time_t lastouttime;
 	int lastout;
 	int messagepending;
 */
-/* JS: Wildcard endpoint name */
+/* Wildcard endpoint name */
 	char wcardep[30];
-	struct mgcp_message *msgs; /*!< SC: gw msg queue */
-	ast_mutex_t msgs_lock;     /*!< SC: queue lock */  
-	int retransid;             /*!< SC: retrans timer id */
-	int delme;                 /*!< SC: needed for reload */
+	struct mgcp_message *msgs; /*!< gw msg queue */
+	ast_mutex_t msgs_lock;     /*!< queue lock */  
+	int retransid;             /*!< retrans timer id */
+	int delme;                 /*!< needed for reload */
 	struct mgcp_response *responses;
 	struct mgcp_gateway *next;
 } *gateways;
@@ -552,7 +480,7 @@
 	return 0;
 }
 
-/* SC: modified for new transport mechanism */
+/* modified for new transport mechanism */
 static int __mgcp_xmit(struct mgcp_gateway *gw, char *data, int len)
 {
 	int res;
@@ -594,7 +522,7 @@
 	return res;
 }
 
-/* SC: modified for new transport framework */
+/* modified for new transport framework */
 static void dump_queue(struct mgcp_gateway *gw, struct mgcp_endpoint *p)
 {
 	struct mgcp_message *cur, *q = NULL, *w, *prev;
@@ -736,7 +664,7 @@
 	return res;
 }
 
-/* SC: modified for the new transaction mechanism */
+/* modified for the new transaction mechanism */
 static int mgcp_postrequest(struct mgcp_endpoint *p, struct mgcp_subchannel *sub, 
                             char *data, int len, unsigned int seqno)
 {
@@ -802,7 +730,7 @@
 	return 0;
 }
 
-/* SC: modified for new transport */
+/* modified for new transport */
 static int send_request(struct mgcp_endpoint *p, struct mgcp_subchannel *sub, 
                         struct mgcp_request *req, unsigned int seqno)
 {
@@ -875,7 +803,7 @@
 		}
 	}
 
-	/* XXX SC: find tail. We could also keep tail in the data struct for faster access */
+	/* XXX find tail. We could also keep tail in the data struct for faster access */
 	for (t = *queue; t && t->next; t = t->next);
 
 	r->next = NULL;
@@ -1004,7 +932,7 @@
 	}
 
 	if ((p->dtmfmode & MGCP_DTMF_INBAND) && p->dsp) {
-		/* SC: check whether other channel is active. */
+		/* check whether other channel is active. */
 		if (!sub->next->owner) {
 			if (p->dtmfmode & MGCP_DTMF_HYBRID)
 				p->dtmfmode &= ~MGCP_DTMF_INBAND;
@@ -1056,10 +984,10 @@
 		sub->rtp = NULL;
 	}
 
-	/* SC: Decrement use count */
+	/* Decrement use count */
 	ast_atomic_fetchadd_int(&__mod_desc->usecnt, -1);
 	ast_update_use_count();
-	/* SC: Decrement use count */
+	/* Decrement use count */
 
 	if ((p->hookstate == MGCP_ONHOOK) && (!sub->next->rtp)) {
 		p->hidecallerid = 0;
@@ -1101,7 +1029,7 @@
 		e = g->endpoints;
 		ast_cli(fd, "Gateway '%s' at %s (%s)\n", g->name, g->addr.sin_addr.s_addr ? ast_inet_ntoa(iabuf, sizeof(iabuf), g->addr.sin_addr) : ast_inet_ntoa(iabuf, sizeof(iabuf), g->defaddr.sin_addr), g->dynamic ? "Dynamic" : "Static");
 		while(e) {
-			/* JS: Don't show wilcard endpoint */
+			/* Don't show wilcard endpoint */
 			if (strcmp(e->name, g->wcardep) !=0)
 				ast_cli(fd, "   -- '%s@%s in '%s' is %s\n", e->name, g->name, e->context, e->sub->owner ? "active" : "idle");
 			hasendpoints = 1;
@@ -1197,7 +1125,7 @@
 	} else {
 		transmit_modify_request(sub);
 	}
-	/* SC: verbose level check */
+	/* verbose level check */
 	if (option_verbose > 2) {
 		ast_verbose(VERBOSE_PREFIX_3 "MGCP mgcp_answer(%s) on %s@%s-%d\n", 
 			ast->name, p->name, p->parent->name, sub->id);
@@ -1428,9 +1356,15 @@
 	case AST_CONTROL_CONGESTION:
 		transmit_notify_request(sub, "G/cg");
 		break;
+	case AST_CONTROL_HOLD:
+		ast_moh_start(ast, data, NULL);
+		break;
+	case AST_CONTROL_UNHOLD:
+		ast_moh_stop(ast);
+		break;
 	case -1:
 		transmit_notify_request(sub, "");
-		break;		
+		break;
 	default:
 		ast_log(LOG_WARNING, "Don't know how to indicate condition %d\n", ind);
 		res = -1;
@@ -1458,7 +1392,7 @@
 		if (i->dtmfmode & (MGCP_DTMF_INBAND | MGCP_DTMF_HYBRID)) {
 			i->dsp = ast_dsp_new();
 			ast_dsp_set_features(i->dsp,DSP_FEATURE_DTMF_DETECT);
-			/* SC: this is to prevent clipping of dtmf tones during dsp processing */
+			/* this is to prevent clipping of dtmf tones during dsp processing */
 			ast_dsp_digitmode(i->dsp, DSP_DIGITMODE_NOQUELCH);
 		} else {
 			i->dsp = NULL;
@@ -1496,7 +1430,7 @@
 				tmp = NULL;
 			}
 		}
-		/* SC: verbose level check */
+		/* verbose level check */
 		if (option_verbose > 2) {
 			ast_verbose(VERBOSE_PREFIX_3 "MGCP mgcp_new(%s) created in state: %s\n",
 				tmp->name, ast_state2str(state));
@@ -1637,14 +1571,14 @@
 						ast_verbose(VERBOSE_PREFIX_3 "Registered MGCP gateway '%s' at %s port %d\n", g->name, ast_inet_ntoa(iabuf, sizeof(iabuf), g->addr.sin_addr), ntohs(g->addr.sin_port));
 				}
 			}
-			/* SC: not dynamic, check if the name matches */
+			/* not dynamic, check if the name matches */
 			else if (name) {
 				if (strcasecmp(g->name, at)) {
 					g = g->next;
 					continue;
 				}
 			}
-			/* SC: not dynamic, no name, check if the addr matches */
+			/* not dynamic, no name, check if the addr matches */
 			else if (!name && sin) {
  				if ((g->addr.sin_addr.s_addr != sin->sin_addr.s_addr) ||
 				    (g->addr.sin_port != sin->sin_port)) {
@@ -1662,7 +1596,7 @@
 					ast_log(LOG_DEBUG, "Searching on %s@%s for subchannel\n",
 						p->name, g->name);
 				if (msgid) {
-#if 0 /* SC: new transport mech */
+#if 0 /* new transport mech */
 					sub = p->sub;
 					do {
 						if (option_debug)
@@ -1971,7 +1905,7 @@
 		return -1;
 	}
 	req->header[req->headers] = req->data + req->len;
-	/* SC: check if we need brackets around the gw name */
+	/* check if we need brackets around the gw name */
 	if (p->parent->isnamedottedip)
 		snprintf(req->header[req->headers], sizeof(req->data) - req->len, "%s %d %s@[%s] MGCP 1.0\r\n", verb, oseq, p->name, p->parent->name);
 	else
@@ -2148,12 +2082,12 @@
 	add_header(&resp, "C", sub->callid);
 	add_header(&resp, "L", local);
 	add_header(&resp, "M", mgcp_cxmodes[sub->cxmode]);
-	/* SC: X header should not be sent. kept for compatibility */
+	/* X header should not be sent. kept for compatibility */
 	add_header(&resp, "X", sub->txident);
 	add_header(&resp, "I", sub->cxident);
 	/*add_header(&resp, "S", "");*/
 	add_sdp(&resp, sub, rtp);
-	/* SC: fill in new fields */
+	/* fill in new fields */
 	resp.cmd = MGCP_CMD_MDCX;
 	resp.trid = oseq;
 	return send_request(p, sub, &resp, oseq); /* SC */
@@ -2182,11 +2116,11 @@
 	add_header(&resp, "C", sub->callid);
 	add_header(&resp, "L", local);
 	add_header(&resp, "M", mgcp_cxmodes[sub->cxmode]);
-	/* SC: X header should not be sent. kept for compatibility */
+	/* X header should not be sent. kept for compatibility */
 	add_header(&resp, "X", sub->txident);
 	/*add_header(&resp, "S", "");*/
 	add_sdp(&resp, sub, rtp);
-	/* SC: fill in new fields */
+	/* fill in new fields */
 	resp.cmd = MGCP_CMD_CRCX;
 	resp.trid = oseq;
 	return send_request(p, sub, &resp, oseq);  /* SC */
@@ -2215,7 +2149,7 @@
 	if (!ast_strlen_zero(tone)) {
 		add_header(&resp, "S", tone);
 	}
-	/* SC: fill in new fields */
+	/* fill in new fields */
 	resp.cmd = MGCP_CMD_RQNT;
 	resp.trid = oseq;
 	return send_request(p, NULL, &resp, oseq); /* SC */
@@ -2262,7 +2196,7 @@
 		ast_verbose(VERBOSE_PREFIX_3 "MGCP Asked to indicate tone: %s on  %s@%s-%d in cxmode: %s\n", 

[... 1502 lines stripped ...]


More information about the asterisk-commits mailing list