aboutsummaryrefslogtreecommitdiffstats
path: root/apps/app_rpt.c
diff options
context:
space:
mode:
authorjim <jim@f38db490-d61c-443f-a65b-d21fe96a405b>2004-08-16 01:35:02 +0000
committerjim <jim@f38db490-d61c-443f-a65b-d21fe96a405b>2004-08-16 01:35:02 +0000
commit235838a1b788fffe8ff2a0f525d8f1070811a410 (patch)
tree0fef19993dfceb9caf35db88fb4f6121323b1d46 /apps/app_rpt.c
parentd25e7b73cdc35c79930a28e961867594470beb7c (diff)
Fixed remote base audio problem (where 2 different interfaces are in use) and
allow for non-rbi remotes and rbi remotes to co-exist on same system git-svn-id: http://svn.digium.com/svn/asterisk/trunk@3610 f38db490-d61c-443f-a65b-d21fe96a405b
Diffstat (limited to 'apps/app_rpt.c')
-rwxr-xr-xapps/app_rpt.c51
1 files changed, 38 insertions, 13 deletions
diff --git a/apps/app_rpt.c b/apps/app_rpt.c
index b5d0e5331..73e98a685 100755
--- a/apps/app_rpt.c
+++ b/apps/app_rpt.c
@@ -3,7 +3,7 @@
* Asterisk -- A telephony toolkit for Linux.
*
* Radio Repeater / Remote Base program
- * version 0.13 7/12/04
+ * version 0.14 8/15/04
*
* See http://www.zapatatelephony.org/app_rpt.html
*
@@ -136,7 +136,7 @@ enum {SOURCE_RPT, SOURCE_LNK, SOURCE_RMT};
#include <tonezone.h>
#include <linux/zaptel.h>
-static char *tdesc = "Radio Repeater / Remote Base version 0.13 07/12/2004";
+static char *tdesc = "Radio Repeater / Remote Base version 0.14 08/15/2004";
static char *app = "Rpt";
static char *synopsis = "Radio Repeater/Remote Base Control System";
@@ -237,7 +237,7 @@ static struct rpt
char remotetx;
char remoteon;
char simple;
- char remote;
+ char *remote;
char tounkeyed;
char tonotify;
char enable;
@@ -2469,7 +2469,10 @@ static int setrbi(struct rpt *myrpt)
char tmp[MAXREMSTR] = "",rbicmd[5],*s;
int band,txoffset = 0,txpower = 0,rxpl;
-
+ /* must be a remote system */
+ if (!myrpt->remote) return(0);
+ /* must have rbi hardware */
+ if (strncmp(myrpt->remote,"rbi",3)) return(0);
strncpy(tmp, myrpt->freq, sizeof(tmp) - 1);
s = strchr(tmp,'.');
/* if no decimal, is invalid */
@@ -3467,9 +3470,7 @@ int i,j,n,longestnode;
rpt_vars[n].idtime = retrieve_astcfgint( this, "idtime", 60000, 2400000, IDTIME); /* Enforce a min max */
rpt_vars[n].politeid = retrieve_astcfgint( this, "politeid", 30000, 300000, POLITEID); /* Enforce a min max */
- val = ast_variable_retrieve(cfg,this,"remote");
- if (val) rpt_vars[n].remote = ast_true(val);
- else rpt_vars[n].remote = 0;
+ rpt_vars[n].remote = ast_variable_retrieve(cfg,this,"remote");
rpt_vars[n].tonezone = ast_variable_retrieve(cfg,this,"tonezone");
val = ast_variable_retrieve(cfg,this,"iobase");
if (val) rpt_vars[n].iobase = atoi(val);
@@ -3549,7 +3550,7 @@ int i,j,n,longestnode;
static int rpt_exec(struct ast_channel *chan, void *data)
{
- int res=-1,i,keyed = 0,rem_totx;
+ int res=-1,i,keyed = 0,rem_totx,n;
struct localuser *u;
char tmp[256];
char *options,*stringp,*tele;
@@ -3705,7 +3706,7 @@ static int rpt_exec(struct ast_channel *chan, void *data)
ast_set_write_format(myrpt->rxchannel,AST_FORMAT_SLINEAR);
myrpt->rxchannel->whentohangup = 0;
myrpt->rxchannel->appl = "Apprpt";
- myrpt->rxchannel->data = "(Repeater Rx)";
+ myrpt->rxchannel->data = "(Link Rx)";
if (option_verbose > 2)
ast_verbose(VERBOSE_PREFIX_3 "rpt (Rx) initiating call to %s/%s on %s\n",
myrpt->rxchanname,tele,myrpt->rxchannel->name);
@@ -3737,7 +3738,7 @@ static int rpt_exec(struct ast_channel *chan, void *data)
ast_set_write_format(myrpt->txchannel,AST_FORMAT_SLINEAR);
myrpt->txchannel->whentohangup = 0;
myrpt->txchannel->appl = "Apprpt";
- myrpt->txchannel->data = "(Repeater Rx)";
+ myrpt->txchannel->data = "(Link Tx)";
if (option_verbose > 2)
ast_verbose(VERBOSE_PREFIX_3 "rpt (Tx) initiating call to %s/%s on %s\n",
myrpt->txchanname,tele,myrpt->txchannel->name);
@@ -3776,14 +3777,17 @@ static int rpt_exec(struct ast_channel *chan, void *data)
if (chan->_state != AST_STATE_UP) {
ast_answer(chan);
}
- cs[0] = chan;
- cs[1] = myrpt->rxchannel;
+ n = 0;
+ cs[n++] = chan;
+ cs[n++] = myrpt->rxchannel;
+ if (myrpt->rxchannel != myrpt->txchannel)
+ cs[n++] = myrpt->txchannel;
for(;;)
{
if (ast_check_hangup(chan)) break;
if (ast_check_hangup(myrpt->rxchannel)) break;
ms = MSWAIT;
- who = ast_waitfor_n(cs,2,&ms);
+ who = ast_waitfor_n(cs,n,&ms);
if (who == NULL) ms = 0;
elap = MSWAIT - ms;
if (!ms) continue;
@@ -3895,6 +3899,27 @@ static int rpt_exec(struct ast_channel *chan, void *data)
ast_frfree(f);
continue;
}
+ if ((myrpt->rxchannel != myrpt->txchannel) &&
+ (who == myrpt->txchannel)) /* do this cuz you have to */
+ {
+ f = ast_read(myrpt->txchannel);
+ if (!f)
+ {
+ if (debug) printf("@@@@ link:Hung Up\n");
+ break;
+ }
+ if (f->frametype == AST_FRAME_CONTROL)
+ {
+ if (f->subclass == AST_CONTROL_HANGUP)
+ {
+ if (debug) printf("@@@@ rpt:Hung Up\n");
+ ast_frfree(f);
+ break;
+ }
+ }
+ ast_frfree(f);
+ continue;
+ }
}
ast_mutex_lock(&myrpt->lock);