[svn-commits] jdixon: branch jdixon/chan_usbradio-1.4 r138512 - /team/jdixon/chan_usbradio-...

SVN commits to the Digium repositories svn-commits at lists.digium.com
Sun Aug 17 10:17:46 CDT 2008


Author: jdixon
Date: Sun Aug 17 10:17:46 2008
New Revision: 138512

URL: http://svn.digium.com/view/asterisk?view=rev&rev=138512
Log:
Fixed parrot mode

Modified:
    team/jdixon/chan_usbradio-1.4/dev-1.0/apps/app_rpt.c

Modified: team/jdixon/chan_usbradio-1.4/dev-1.0/apps/app_rpt.c
URL: http://svn.digium.com/view/asterisk/team/jdixon/chan_usbradio-1.4/dev-1.0/apps/app_rpt.c?view=diff&rev=138512&r1=138511&r2=138512
==============================================================================
--- team/jdixon/chan_usbradio-1.4/dev-1.0/apps/app_rpt.c (original)
+++ team/jdixon/chan_usbradio-1.4/dev-1.0/apps/app_rpt.c Sun Aug 17 10:17:46 2008
@@ -22,7 +22,7 @@
 /*! \file
  *
  * \brief Radio Repeater / Remote Base program 
- *  version 0.905 (1.0-dev4) 8/16/08 
+ *  version 0.906 (1.0-dev4) 8/17/08 
  * 
  * \author Jim Dixon, WB6NIL <jim at lambdatel.com>
  *
@@ -243,9 +243,10 @@
 #define	ENDCHAR '#'
 #define	EXTNODEFILE "/var/lib/asterisk/rpt_extnodes"
 #define	NODENAMES "rpt/nodenames"
-#define	PARROTFILE "/tmp/parrot_%s_%u"
-
-#define	PARROTTIME 1000
+
+#define	PARROTMAX 6000 /* Max time for parrot recording in 20 ms intervals */
+
+#define	PARROTTIME 1000 /* after-use delay in ms for parrot mode */
 
 #define	DEFAULT_IOBASE 0x378
 
@@ -293,7 +294,7 @@
 	TAILMSG, MACRO_NOTFOUND, MACRO_BUSY, LASTNODEKEY, FULLSTATUS,
 	MEMNOTFOUND, INVFREQ, REMMODE, REMLOGIN, REMXXX, REMSHORTSTATUS,
 	REMLONGSTATUS, LOGINREQ, SCAN, SCANSTAT, TUNE, SETREMOTE, TOPKEY,
-	TIMEOUT_WARNING, ACT_TIMEOUT_WARNING, LINKUNKEY, UNAUTHTX, PARROT,
+	TIMEOUT_WARNING, ACT_TIMEOUT_WARNING, LINKUNKEY, UNAUTHTX, 
 	STATS_TIME_LOCAL};
 
 
@@ -375,7 +376,7 @@
 /*! Stop the tones from playing */
 void ast_playtones_stop(struct ast_channel *chan);
 
-static  char *tdesc = "Radio Repeater / Remote Base  version 0.905  8/16/2008";
+static  char *tdesc = "Radio Repeater / Remote Base  version 0.906  8/17/2008";
 
 static char *app = "Rpt";
 
@@ -803,6 +804,8 @@
 	char parrotstate;
 	int  parrottimer;
 	unsigned int parrotcnt;
+	struct ast_trans_pvt *parrotin_path;
+	struct ast_trans_pvt *parrotout_path;
 	struct ast_channel *rxchannel,*txchannel,*pchannel,*timingchannel;
 	struct ast_channel *remchannel;
 	struct ast_frame *lastf1,*lastf2;
@@ -885,6 +888,7 @@
 	char myfirsttx;
 	short pcq[RPT_MIXER_BLOCKSIZE];
 	char pcqflag;
+	char txrealkeyed;
 #ifdef OLD_ASTERISK
         AST_LIST_HEAD(, ast_frame) inq;
 #else
@@ -895,7 +899,11 @@
 #else
 	AST_LIST_HEAD_NOLOCK(, ast_frame) txq;
 #endif
-	char txrealkeyed;
+#ifdef OLD_ASTERISK
+	AST_LIST_HEAD(, ast_frame) parrotq;
+#else
+	AST_LIST_HEAD_NOLOCK(, ast_frame) parrotq;
+#endif
 #ifdef	__RPT_NOTCH
 	struct rptfilter
 	{
@@ -1322,6 +1330,27 @@
 			}
 			rxtelem = rxtelem->qe_forw;
 		}
+		if (rpt_vars[n].p.parrotmode && 
+			(((rpt_vars[n].parrotstate == 1) && 
+			    ((rpt_vars[n].parrotcnt > PARROTMAX) || 
+				(rpt_vars[n].parrottimer <= 0)))
+			|| (rpt_vars[n].parrotstate == 2)))
+		{
+			struct ast_frame *f2;
+			rpt_vars[n].parrotstate = 2;
+			rpt_vars[n].parrotcnt = 0;
+			f1 = AST_LIST_REMOVE_HEAD(&rpt_vars[n].parrotq,frame_list);
+			if (f1) 
+			{
+				f2 = ast_translate(rpt_vars[n].parrotout_path,f1,1);
+				rpt_mixer_put(&rpt_vars[n].txconf,f2->data,NULL);
+				ast_frfree(f2);
+			} 
+			else
+			{
+				rpt_vars[n].parrotstate = 0;
+			}
+		}			
 	        rpt_mixer_voyeur(&rpt_vars[n].conf,&rpt_vars[n].txconf);
 	        rpt_mixer_next(&rpt_vars[n].conf);				
 	        rpt_mixer_next(&rpt_vars[n].txconf);				
@@ -1389,7 +1418,17 @@
 				f1 = AST_LIST_REMOVE_HEAD(&rpt_vars[n].txq,
 					frame_list);
 				ast_write(rpt_vars[n].txchannel,f1);
-				ast_frfree(f1);
+				if (rpt_vars[n].p.parrotmode && (
+					rpt_vars[n].parrotstate == 1))
+				{
+					struct ast_frame *f2;
+					f2 = ast_translate(rpt_vars[n].parrotin_path,f1,1);
+					f1 = ast_frdup(f2);
+					ast_frfree(f2);
+					AST_LIST_INSERT_TAIL(&rpt_vars[n].parrotq,
+						f1,frame_list);
+					rpt_vars[n].parrotcnt++;
+				} else 	ast_frfree(f1);
 			}
 		}
 		else
@@ -1401,6 +1440,18 @@
 			else
 			{
 				ast_write(rpt_vars[n].remchannel,&fr);
+			}
+			if (rpt_vars[n].p.parrotmode && 
+				(rpt_vars[n].parrotstate == 1))
+			{
+				struct ast_frame *f2;
+				f1 = ast_frdup(&fr);
+				f2 = ast_translate(rpt_vars[n].parrotin_path,f1,1);
+				f1 = ast_frdup(f2);
+				ast_frfree(f2);
+				AST_LIST_INSERT_TAIL(&rpt_vars[n].parrotq,
+					f1,frame_list);
+				rpt_vars[n].parrotcnt++;
 			}
 			while((f1 = AST_LIST_REMOVE_HEAD(&rpt_vars[n].txq,
 				frame_list))) ast_frfree(f1);
@@ -1932,16 +1983,19 @@
 */
 static void birdbath(struct rpt *myrpt)
 {
-	struct rpt_tele *telem;
+struct ast_frame *f1;
+
 	if(debug > 2)
 		ast_log(LOG_NOTICE, "birdbath!!");
 	rpt_mutex_lock(&myrpt->lock);
-	telem = myrpt->tele.next;
-	while(telem != &myrpt->tele)
-	{
-		if (telem->mode == PARROT) ast_softhangup(telem->chan,AST_SOFTHANGUP_DEV);
-		telem = telem->next;
-	}
+	while(!AST_LIST_EMPTY(&myrpt->parrotq))
+	{
+		f1 = AST_LIST_REMOVE_HEAD(&myrpt->parrotq,frame_list);
+		ast_frfree(f1);
+	}
+	myrpt->parrottimer = 0;
+	myrpt->parrotstate = 0;
+	myrpt->parrotcnt = 0;
 	rpt_mutex_unlock(&myrpt->lock);
 }
 
@@ -2655,6 +2709,22 @@
 		rpt_vars[n].links.prev = &rpt_vars[n].links;
 		rpt_vars[n].rpt_thread = AST_PTHREADT_NULL;
 		rpt_vars[n].tailmessagen = 0;
+		rpt_vars[n].parrotin_path = 
+			ast_translator_build_path(AST_FORMAT_G726,AST_FORMAT_SLINEAR);
+		if (!rpt_vars[n].parrotin_path)
+		{
+			ast_mutex_unlock(&rpt_vars[n].lock);
+			ast_log(LOG_NOTICE,"Unable to build path for parrot mode\n");
+			pthread_exit(NULL);
+		}
+		rpt_vars[n].parrotout_path = 
+			ast_translator_build_path(AST_FORMAT_SLINEAR,AST_FORMAT_G726);
+		if (!rpt_vars[n].parrotout_path)
+		{
+			ast_mutex_unlock(&rpt_vars[n].lock);
+			ast_log(LOG_NOTICE,"Unable to build path for parrot mode\n");
+			pthread_exit(NULL);
+		}
 	}
 #ifdef	__RPT_NOTCH
 	/* zot out filters stuff */
@@ -2773,7 +2843,7 @@
 	if (val) rpt_vars[n].p.authlevel = atoi(val); 
 	else rpt_vars[n].p.authlevel = 0;
 	val = (char *) ast_variable_retrieve(cfg,this,"parrot");
-	if (val) rpt_vars[n].p.parrotmode = ast_true(val) * 2;
+	if (val) rpt_vars[n].p.parrotmode = (ast_true(val) & 1) * 2;
 	else rpt_vars[n].p.parrotmode = 0;
 	val = (char *) ast_variable_retrieve(cfg,this,"parrottime");
 	if (val) rpt_vars[n].p.parrottime = atoi(val); 
@@ -4396,7 +4466,7 @@
 
 	confc = (((mytele->mode == ID) || (mytele->mode == IDTALKOVER) || (mytele->mode == UNKEY) || 
 		(mytele->mode == TAILMSG) || (mytele->mode == LINKUNKEY) || (mytele->mode == TIMEOUT) || 
-		(mytele->mode == PARROT) || (mytele->mode == STATS_TIME_LOCAL)) ? 
+		(mytele->mode == STATS_TIME_LOCAL)) ? 
 		 	'T' : 'C');
 
 	mytele->uid = ++myrpt->uid;
@@ -5351,30 +5421,6 @@
 		imdone = 1;
 		break;
 
-	    case PARROT: /* Repeat stuff */
-
-		sprintf(mystr,PARROTFILE,myrpt->name,mytele->parrot);
-		if (ast_fileexists(mystr,NULL,mychannel->language) <= 0)
-		{
-			imdone = 1;
-			myrpt->parrotstate = 0;
-			break;
-		}
-		wait_interval(myrpt, DLY_PARROT, mychannel);
-		sprintf(mystr,PARROTFILE,myrpt->name,mytele->parrot);
-		res = ast_streamfile(mychannel, mystr, mychannel->language);
-		if (!res) 
-			res = ast_waitstream(mychannel, "");
-		else
-			 ast_log(LOG_WARNING, "ast_streamfile failed on %s\n", mychannel->name);
-		ast_stopstream(mychannel);
-		sprintf(mystr,PARROTFILE,myrpt->name,mytele->parrot);
-		strcat(mystr,".wav");
-		unlink(mystr);			
-		imdone = 1;
-		myrpt->parrotstate = 0;
-		break;
-
 	    case TIMEOUT:
 		res = saynode(myrpt,mychannel,myrpt->name);
 		if (!res)
@@ -5637,8 +5683,7 @@
 	memset((char *)tele,0,sizeof(struct rpt_tele));
 	tele->rpt = myrpt;
 	tele->mode = mode;
-	if (mode == PARROT) tele->parrot = (unsigned int) data;
-	else mylink = (struct rpt_link *) data;
+	mylink = (struct rpt_link *) data;
 	rpt_mutex_lock(&myrpt->lock);
 	if((mode == CONNFAIL) || (mode == REMDISC) || (mode == CONNECTED) ||
 	    (mode == LINKUNKEY)){
@@ -11330,6 +11375,7 @@
 	myrpt->ready = 1;
 	AST_LIST_HEAD_INIT_NOLOCK(&myrpt->inq);
 	AST_LIST_HEAD_INIT_NOLOCK(&myrpt->txq);
+	AST_LIST_HEAD_INIT_NOLOCK(&myrpt->parrotq);
 	while (ms >= 0)
 	{
 		struct ast_frame *f,*f1,*f2;
@@ -11698,15 +11744,15 @@
 		if (myrpt->exttx && 
 			myrpt->p.parrotmode && (!myrpt->parrotstate))
 		{
-			char myfname[300],myf1[300];
-
-			sprintf(myfname,PARROTFILE,myrpt->name,myrpt->parrotcnt);
-			strcat(myfname,".wav");
-			unlink(myfname);			
+			while(!AST_LIST_EMPTY(&myrpt->parrotq))
+			{
+				f1 = AST_LIST_REMOVE_HEAD(&myrpt->parrotq,
+					frame_list);
+				ast_frfree(f1);
+			}
 			myrpt->parrotstate = 1;
 			myrpt->parrottimer = myrpt->p.parrottime;
-			sprintf(myf1,"mixmonitor start %s %s a",myrpt->txchannel->name,myfname);
-			ast_cli_command(nullfd,myf1);
+			myrpt->parrotcnt = 0;
 		}
 		/* Reconnect */
 	
@@ -12106,15 +12152,6 @@
 			rpt_mutex_unlock(&myrpt->lock);
 			continue;
 		}
-		if (myrpt->p.parrotmode && (myrpt->parrotstate == 1) &&
-			(myrpt->parrottimer <= 0))
-		{
-
-			sprintf(tmpstr,"mixmonitor stop %s",myrpt->txchannel->name);
-			ast_cli_command(nullfd,tmpstr);
-			myrpt->parrotstate = 2;
-			rpt_telemetry(myrpt,PARROT,(struct rpt_link *) myrpt->parrotcnt++); 
-		}			
 		if (myrpt->cmdAction.state == CMD_STATE_READY)
 		{ /* there is a command waiting to be processed */
 			int status;
@@ -12862,6 +12899,9 @@
 	if (myrpt->xlink  == 1) myrpt->xlink = 2;
 	rpt_mutex_unlock(&myrpt->lock);
 	if (myrpt->timingchannel) ast_hangup(myrpt->timingchannel);
+	if (myrpt->parrotin_path) ast_translator_free_path(myrpt->parrotin_path);
+	if (myrpt->parrotout_path) ast_translator_free_path(myrpt->parrotout_path);
+	birdbath(myrpt);
 	if (debug) printf("@@@@ rpt:Hung up channel\n");
 	myrpt->rpt_thread = AST_PTHREADT_STOP;
 	pthread_exit(NULL); 




More information about the svn-commits mailing list