mirror of
https://github.com/asterisk/asterisk.git
synced 2026-07-28 00:10:25 -07:00
Goodbye Zaptel, hello DAHDI. Removes Zaptel driver support with DAHDI. Configuration file and dialplan backwards compatability has been put in place where appropiate. Release announcement to follow.
git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@122234 65c4cc65-6c06-0410-ace0-fbb531ad65f3
This commit is contained in:
@@ -75,7 +75,7 @@ static int chanavail_exec(struct ast_channel *chan, void *data)
|
||||
);
|
||||
|
||||
if (ast_strlen_zero(data)) {
|
||||
ast_log(LOG_WARNING, "ChanIsAvail requires an argument (Zap/1&Zap/2)\n");
|
||||
ast_log(LOG_WARNING, "ChanIsAvail requires an argument (DAHDI/1&DAHDI/2)\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
|
||||
+4
-1
@@ -47,6 +47,7 @@ ASTERISK_FILE_VERSION(__FILE__, "$Revision$")
|
||||
#include "asterisk/translate.h"
|
||||
#include "asterisk/module.h"
|
||||
#include "asterisk/lock.h"
|
||||
#include "asterisk/options.h"
|
||||
|
||||
#define AST_NAME_STRLEN 256
|
||||
#define NUM_SPYGROUPS 128
|
||||
@@ -587,6 +588,7 @@ static struct chanspy_ds *next_channel(struct ast_channel *chan,
|
||||
const char *exten, const char *context, struct chanspy_ds *chanspy_ds)
|
||||
{
|
||||
struct ast_channel *next;
|
||||
char channel_name[AST_CHANNEL_NAME];
|
||||
|
||||
redo:
|
||||
if (!ast_strlen_zero(spec))
|
||||
@@ -599,7 +601,8 @@ redo:
|
||||
if (!next)
|
||||
return NULL;
|
||||
|
||||
if (!strncmp(next->name, "Zap/pseudo", 10)) {
|
||||
snprintf(channel_name, AST_CHANNEL_NAME, "%s/pseudo", dahdi_chan_name);
|
||||
if (!strncmp(next->name, channel_name, 10)) {
|
||||
ast_channel_unlock(next);
|
||||
goto redo;
|
||||
} else if (next == chan) {
|
||||
|
||||
@@ -21,7 +21,7 @@
|
||||
|
||||
/*! \file
|
||||
*
|
||||
* \brief Zap Barge support
|
||||
* \brief DAHDI Barge support
|
||||
*
|
||||
* \author Mark Spencer <markster@digium.com>
|
||||
*
|
||||
@@ -32,14 +32,14 @@
|
||||
*/
|
||||
|
||||
/*** MODULEINFO
|
||||
<depend>zaptel</depend>
|
||||
<depend>dahdi</depend>
|
||||
***/
|
||||
|
||||
#include "asterisk.h"
|
||||
|
||||
ASTERISK_FILE_VERSION(__FILE__, "$Revision$")
|
||||
|
||||
#include "asterisk/zapata.h"
|
||||
#include "asterisk/dahdi.h"
|
||||
|
||||
#include "asterisk/lock.h"
|
||||
#include "asterisk/file.h"
|
||||
@@ -52,12 +52,13 @@ ASTERISK_FILE_VERSION(__FILE__, "$Revision$")
|
||||
#include "asterisk/say.h"
|
||||
#include "asterisk/utils.h"
|
||||
|
||||
static char *app = "ZapBarge";
|
||||
static char *app = "DAHDIBarge";
|
||||
static char *deprecated_app = "ZapBarge";
|
||||
|
||||
static char *synopsis = "Barge in (monitor) Zap channel";
|
||||
static char *synopsis = "Barge in (monitor) DAHDI channel";
|
||||
|
||||
static char *descrip =
|
||||
" ZapBarge([channel]): Barges in on a specified zap\n"
|
||||
" DAHDIBarge([channel]): Barges in on a specified DAHDI\n"
|
||||
"channel or prompts if one is not specified. Returns\n"
|
||||
"-1 when caller user hangs up and is independent of the\n"
|
||||
"state of the channel being monitored.";
|
||||
@@ -86,7 +87,7 @@ static int careful_write(int fd, unsigned char *data, int len)
|
||||
static int conf_run(struct ast_channel *chan, int confno, int confflags)
|
||||
{
|
||||
int fd;
|
||||
struct zt_confinfo ztc;
|
||||
struct dahdi_confinfo dahdic;
|
||||
struct ast_frame *f;
|
||||
struct ast_channel *c;
|
||||
struct ast_frame fr;
|
||||
@@ -95,11 +96,11 @@ static int conf_run(struct ast_channel *chan, int confno, int confflags)
|
||||
int nfds;
|
||||
int res;
|
||||
int flags;
|
||||
int retryzap;
|
||||
int retrydahdi;
|
||||
int origfd;
|
||||
int ret = -1;
|
||||
|
||||
ZT_BUFFERINFO bi;
|
||||
DAHDI_BUFFERINFO bi;
|
||||
char __buf[CONF_SIZE + AST_FRIENDLY_OFFSET];
|
||||
char *buf = __buf + AST_FRIENDLY_OFFSET;
|
||||
|
||||
@@ -115,11 +116,11 @@ static int conf_run(struct ast_channel *chan, int confno, int confflags)
|
||||
goto outrun;
|
||||
}
|
||||
ast_indicate(chan, -1);
|
||||
retryzap = strcasecmp(chan->tech->type, "Zap");
|
||||
zapretry:
|
||||
retrydahdi = strcasecmp(chan->tech->type, "DAHDI");
|
||||
dahdiretry:
|
||||
origfd = chan->fds[0];
|
||||
if (retryzap) {
|
||||
fd = open("/dev/zap/pseudo", O_RDWR);
|
||||
if (retrydahdi) {
|
||||
fd = open("/dev/dahdi/pseudo", O_RDWR);
|
||||
if (fd < 0) {
|
||||
ast_log(LOG_WARNING, "Unable to open pseudo channel: %s\n", strerror(errno));
|
||||
goto outrun;
|
||||
@@ -139,10 +140,10 @@ zapretry:
|
||||
/* Setup buffering information */
|
||||
memset(&bi, 0, sizeof(bi));
|
||||
bi.bufsize = CONF_SIZE;
|
||||
bi.txbufpolicy = ZT_POLICY_IMMEDIATE;
|
||||
bi.rxbufpolicy = ZT_POLICY_IMMEDIATE;
|
||||
bi.txbufpolicy = DAHDI_POLICY_IMMEDIATE;
|
||||
bi.rxbufpolicy = DAHDI_POLICY_IMMEDIATE;
|
||||
bi.numbufs = 4;
|
||||
if (ioctl(fd, ZT_SET_BUFINFO, &bi)) {
|
||||
if (ioctl(fd, DAHDI_SET_BUFINFO, &bi)) {
|
||||
ast_log(LOG_WARNING, "Unable to set buffering information: %s\n", strerror(errno));
|
||||
close(fd);
|
||||
goto outrun;
|
||||
@@ -153,34 +154,34 @@ zapretry:
|
||||
fd = chan->fds[0];
|
||||
nfds = 0;
|
||||
}
|
||||
memset(&ztc, 0, sizeof(ztc));
|
||||
memset(&dahdic, 0, sizeof(dahdic));
|
||||
/* Check to see if we're in a conference... */
|
||||
ztc.chan = 0;
|
||||
if (ioctl(fd, ZT_GETCONF, &ztc)) {
|
||||
dahdic.chan = 0;
|
||||
if (ioctl(fd, DAHDI_GETCONF, &dahdic)) {
|
||||
ast_log(LOG_WARNING, "Error getting conference\n");
|
||||
close(fd);
|
||||
goto outrun;
|
||||
}
|
||||
if (ztc.confmode) {
|
||||
if (dahdic.confmode) {
|
||||
/* Whoa, already in a conference... Retry... */
|
||||
if (!retryzap) {
|
||||
ast_debug(1, "Zap channel is in a conference already, retrying with pseudo\n");
|
||||
retryzap = 1;
|
||||
goto zapretry;
|
||||
if (!retrydahdi) {
|
||||
ast_debug(1, "DAHDI channel is in a conference already, retrying with pseudo\n");
|
||||
retrydahdi = 1;
|
||||
goto dahdiretry;
|
||||
}
|
||||
}
|
||||
memset(&ztc, 0, sizeof(ztc));
|
||||
memset(&dahdic, 0, sizeof(dahdic));
|
||||
/* Add us to the conference */
|
||||
ztc.chan = 0;
|
||||
ztc.confno = confno;
|
||||
ztc.confmode = ZT_CONF_MONITORBOTH;
|
||||
dahdic.chan = 0;
|
||||
dahdic.confno = confno;
|
||||
dahdic.confmode = DAHDI_CONF_MONITORBOTH;
|
||||
|
||||
if (ioctl(fd, ZT_SETCONF, &ztc)) {
|
||||
if (ioctl(fd, DAHDI_SETCONF, &dahdic)) {
|
||||
ast_log(LOG_WARNING, "Error setting conference\n");
|
||||
close(fd);
|
||||
goto outrun;
|
||||
}
|
||||
ast_debug(1, "Placed channel %s in ZAP channel %d monitor\n", chan->name, confno);
|
||||
ast_debug(1, "Placed channel %s in DAHDI channel %d monitor\n", chan->name, confno);
|
||||
|
||||
for(;;) {
|
||||
outfd = -1;
|
||||
@@ -188,13 +189,13 @@ zapretry:
|
||||
c = ast_waitfor_nandfds(&chan, 1, &fd, nfds, NULL, &outfd, &ms);
|
||||
if (c) {
|
||||
if (c->fds[0] != origfd) {
|
||||
if (retryzap) {
|
||||
if (retrydahdi) {
|
||||
/* Kill old pseudo */
|
||||
close(fd);
|
||||
}
|
||||
ast_debug(1, "Ooh, something swapped out under us, starting over\n");
|
||||
retryzap = 0;
|
||||
goto zapretry;
|
||||
retrydahdi = 0;
|
||||
goto dahdiretry;
|
||||
}
|
||||
f = ast_read(c);
|
||||
if (!f)
|
||||
@@ -236,10 +237,10 @@ zapretry:
|
||||
else {
|
||||
/* Take out of conference */
|
||||
/* Add us to the conference */
|
||||
ztc.chan = 0;
|
||||
ztc.confno = 0;
|
||||
ztc.confmode = 0;
|
||||
if (ioctl(fd, ZT_SETCONF, &ztc)) {
|
||||
dahdic.chan = 0;
|
||||
dahdic.confno = 0;
|
||||
dahdic.confmode = 0;
|
||||
if (ioctl(fd, DAHDI_SETCONF, &dahdic)) {
|
||||
ast_log(LOG_WARNING, "Error setting conference\n");
|
||||
}
|
||||
}
|
||||
@@ -258,9 +259,9 @@ static int conf_exec(struct ast_channel *chan, void *data)
|
||||
char confstr[80] = "";
|
||||
|
||||
if (!ast_strlen_zero(data)) {
|
||||
if ((sscanf(data, "Zap/%d", &confno) != 1) &&
|
||||
if ((sscanf(data, "DAHDI/%d", &confno) != 1) &&
|
||||
(sscanf(data, "%d", &confno) != 1)) {
|
||||
ast_log(LOG_WARNING, "ZapBarge Argument (if specified) must be a channel number, not '%s'\n", (char *)data);
|
||||
ast_log(LOG_WARNING, "DAHDIBarge Argument (if specified) must be a channel number, not '%s'\n", (char *)data);
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
@@ -286,6 +287,12 @@ out:
|
||||
return res;
|
||||
}
|
||||
|
||||
static int conf_exec_warn(struct ast_channel *chan, void *data)
|
||||
{
|
||||
ast_log(LOG_WARNING, "Use of the command %s is deprecated, please use %s instead.\n", deprecated_app, app);
|
||||
return conf_exec(chan, data);
|
||||
}
|
||||
|
||||
static int unload_module(void)
|
||||
{
|
||||
return ast_unregister_application(app);
|
||||
@@ -293,7 +300,8 @@ static int unload_module(void)
|
||||
|
||||
static int load_module(void)
|
||||
{
|
||||
ast_register_application(deprecated_app, conf_exec_warn, synopsis, descrip);
|
||||
return ((ast_register_application(app, conf_exec, synopsis, descrip)) ? AST_MODULE_LOAD_FAILURE : AST_MODULE_LOAD_SUCCESS);
|
||||
}
|
||||
|
||||
AST_MODULE_INFO_STANDARD(ASTERISK_GPL_KEY, "Barge in on Zap channel application");
|
||||
AST_MODULE_INFO_STANDARD(ASTERISK_GPL_KEY, "Barge in on DAHDI channel application");
|
||||
@@ -26,7 +26,7 @@
|
||||
*/
|
||||
|
||||
/*** MODULEINFO
|
||||
<depend>zaptel</depend>
|
||||
<depend>dahdi</depend>
|
||||
***/
|
||||
|
||||
#include "asterisk.h"
|
||||
@@ -43,7 +43,7 @@ ASTERISK_FILE_VERSION(__FILE__, "$Revision$")
|
||||
|
||||
#include <fcntl.h>
|
||||
|
||||
#include "asterisk/zapata.h"
|
||||
#include "asterisk/dahdi.h"
|
||||
|
||||
#include "asterisk/lock.h"
|
||||
#include "asterisk/file.h"
|
||||
@@ -52,15 +52,16 @@ ASTERISK_FILE_VERSION(__FILE__, "$Revision$")
|
||||
#include "asterisk/module.h"
|
||||
#include "asterisk/app.h"
|
||||
|
||||
static char *app = "ZapRAS";
|
||||
static char *app = "DAHDIRAS";
|
||||
static char *deprecated_app = "ZapRAS";
|
||||
|
||||
static char *synopsis = "Executes Zaptel ISDN RAS application";
|
||||
static char *synopsis = "Executes DAHDI ISDN RAS application";
|
||||
|
||||
static char *descrip =
|
||||
" ZapRAS(args): Executes a RAS server using pppd on the given channel.\n"
|
||||
"The channel must be a clear channel (i.e. PRI source) and a Zaptel\n"
|
||||
" DAHDIRAS(args): Executes a RAS server using pppd on the given channel.\n"
|
||||
"The channel must be a clear channel (i.e. PRI source) and a DAHDI\n"
|
||||
"channel to be able to use this function (No modem emulation is included).\n"
|
||||
"Your pppd must be patched to be zaptel aware. Arguments should be\n"
|
||||
"Your pppd must be patched to be DAHDI aware. Arguments should be\n"
|
||||
"separated by , characters.\n";
|
||||
|
||||
|
||||
@@ -96,7 +97,7 @@ static pid_t spawn_ras(struct ast_channel *chan, char *args)
|
||||
memset(argv, 0, sizeof(argv));
|
||||
|
||||
/* First argument is executable, followed by standard
|
||||
arguments for zaptel PPP */
|
||||
arguments for DAHDI PPP */
|
||||
argv[argc++] = PPP_EXEC;
|
||||
argv[argc++] = "nodetach";
|
||||
|
||||
@@ -109,7 +110,7 @@ static pid_t spawn_ras(struct ast_channel *chan, char *args)
|
||||
}
|
||||
|
||||
argv[argc++] = "plugin";
|
||||
argv[argc++] = "zaptel.so";
|
||||
argv[argc++] = "dahdi.so";
|
||||
argv[argc++] = "stdin";
|
||||
|
||||
/* Finally launch PPP */
|
||||
@@ -124,10 +125,10 @@ static void run_ras(struct ast_channel *chan, char *args)
|
||||
int status;
|
||||
int res;
|
||||
int signalled = 0;
|
||||
struct zt_bufferinfo savebi;
|
||||
struct dahdi_bufferinfo savebi;
|
||||
int x;
|
||||
|
||||
res = ioctl(chan->fds[0], ZT_GET_BUFINFO, &savebi);
|
||||
res = ioctl(chan->fds[0], DAHDI_GET_BUFINFO, &savebi);
|
||||
if(res) {
|
||||
ast_log(LOG_WARNING, "Unable to check buffer policy on channel %s\n", chan->name);
|
||||
return;
|
||||
@@ -163,10 +164,10 @@ static void run_ras(struct ast_channel *chan, char *args)
|
||||
}
|
||||
/* Throw back into audio mode */
|
||||
x = 1;
|
||||
ioctl(chan->fds[0], ZT_AUDIOMODE, &x);
|
||||
ioctl(chan->fds[0], DAHDI_AUDIOMODE, &x);
|
||||
|
||||
/* Restore saved values */
|
||||
res = ioctl(chan->fds[0], ZT_SET_BUFINFO, &savebi);
|
||||
res = ioctl(chan->fds[0], DAHDI_SET_BUFINFO, &savebi);
|
||||
if (res < 0) {
|
||||
ast_log(LOG_WARNING, "Unable to set buffer policy on channel %s\n", chan->name);
|
||||
}
|
||||
@@ -176,11 +177,11 @@ static void run_ras(struct ast_channel *chan, char *args)
|
||||
ast_safe_fork_cleanup();
|
||||
}
|
||||
|
||||
static int zapras_exec(struct ast_channel *chan, void *data)
|
||||
static int dahdiras_exec(struct ast_channel *chan, void *data)
|
||||
{
|
||||
int res=-1;
|
||||
char *args;
|
||||
ZT_PARAMS ztp;
|
||||
DAHDI_PARAMS dahdip;
|
||||
|
||||
if (!data)
|
||||
data = "";
|
||||
@@ -190,16 +191,16 @@ static int zapras_exec(struct ast_channel *chan, void *data)
|
||||
/* Answer the channel if it's not up */
|
||||
if (chan->_state != AST_STATE_UP)
|
||||
ast_answer(chan);
|
||||
if (strcasecmp(chan->tech->type, "Zap")) {
|
||||
/* If it's not a zap channel, we're done. Wait a couple of
|
||||
if (strcasecmp(chan->tech->type, "DAHDI")) {
|
||||
/* If it's not a DAHDI channel, we're done. Wait a couple of
|
||||
seconds and then hangup... */
|
||||
ast_verb(2, "Channel %s is not a Zap channel\n", chan->name);
|
||||
ast_verb(2, "Channel %s is not a DAHDI channel\n", chan->name);
|
||||
sleep(2);
|
||||
} else {
|
||||
memset(&ztp, 0, sizeof(ztp));
|
||||
if (ioctl(chan->fds[0], ZT_GET_PARAMS, &ztp)) {
|
||||
ast_log(LOG_WARNING, "Unable to get zaptel parameters\n");
|
||||
} else if (ztp.sigtype != ZT_SIG_CLEAR) {
|
||||
memset(&dahdip, 0, sizeof(dahdip));
|
||||
if (ioctl(chan->fds[0], DAHDI_GET_PARAMS, &dahdip)) {
|
||||
ast_log(LOG_WARNING, "Unable to get DAHDI parameters\n");
|
||||
} else if (dahdip.sigtype != DAHDI_SIG_CLEAR) {
|
||||
ast_verb(2, "Channel %s is not a clear channel\n", chan->name);
|
||||
} else {
|
||||
/* Everything should be okay. Run PPP. */
|
||||
@@ -211,6 +212,12 @@ static int zapras_exec(struct ast_channel *chan, void *data)
|
||||
return res;
|
||||
}
|
||||
|
||||
static int dahdiras_exec_warn(struct ast_channel *chan, void *data)
|
||||
{
|
||||
ast_log(LOG_WARNING, "Use of the command %s is deprecated, please use %s instead.\n", deprecated_app, app);
|
||||
return dahdiras_exec(chan, data);
|
||||
}
|
||||
|
||||
static int unload_module(void)
|
||||
{
|
||||
return ast_unregister_application(app);
|
||||
@@ -218,8 +225,9 @@ static int unload_module(void)
|
||||
|
||||
static int load_module(void)
|
||||
{
|
||||
return ((ast_register_application(app, zapras_exec, synopsis, descrip)) ? AST_MODULE_LOAD_FAILURE : AST_MODULE_LOAD_SUCCESS);
|
||||
ast_register_application(deprecated_app, dahdiras_exec_warn, synopsis, descrip);
|
||||
return ((ast_register_application(app, dahdiras_exec, synopsis, descrip)) ? AST_MODULE_LOAD_FAILURE : AST_MODULE_LOAD_SUCCESS);
|
||||
}
|
||||
|
||||
AST_MODULE_INFO_STANDARD(ASTERISK_GPL_KEY, "Zaptel ISDN Remote Access Server");
|
||||
AST_MODULE_INFO_STANDARD(ASTERISK_GPL_KEY, "DAHDI ISDN Remote Access Server");
|
||||
|
||||
@@ -23,7 +23,7 @@
|
||||
|
||||
/*! \file
|
||||
*
|
||||
* \brief Zap Scanner
|
||||
* \brief DAHDI Scanner
|
||||
*
|
||||
* \author Mark Spencer <markster@digium.com>
|
||||
*
|
||||
@@ -31,14 +31,14 @@
|
||||
*/
|
||||
|
||||
/*** MODULEINFO
|
||||
<depend>zaptel</depend>
|
||||
<depend>dahdi</depend>
|
||||
***/
|
||||
|
||||
#include "asterisk.h"
|
||||
|
||||
ASTERISK_FILE_VERSION(__FILE__, "$Revision$")
|
||||
|
||||
#include "asterisk/zapata.h"
|
||||
#include "asterisk/dahdi.h"
|
||||
|
||||
#include "asterisk/lock.h"
|
||||
#include "asterisk/file.h"
|
||||
@@ -50,23 +50,25 @@ ASTERISK_FILE_VERSION(__FILE__, "$Revision$")
|
||||
#include "asterisk/utils.h"
|
||||
#include "asterisk/cli.h"
|
||||
#include "asterisk/say.h"
|
||||
#include "asterisk/options.h"
|
||||
|
||||
static char *app = "ZapScan";
|
||||
static char *app = "DAHDIScan";
|
||||
static char *deprecated_app = "ZapScan";
|
||||
|
||||
static char *synopsis = "Scan Zap channels to monitor calls";
|
||||
static char *synopsis = "Scan DAHDI channels to monitor calls";
|
||||
|
||||
static char *descrip =
|
||||
" ZapScan([group]) allows a call center manager to monitor Zap channels in\n"
|
||||
" DAHDIScan([group]) allows a call center manager to monitor DAHDI channels in\n"
|
||||
"a convenient way. Use '#' to select the next channel and use '*' to exit\n"
|
||||
"Limit scanning to a channel GROUP by setting the option group argument.\n";
|
||||
|
||||
|
||||
#define CONF_SIZE 160
|
||||
|
||||
static struct ast_channel *get_zap_channel_locked(int num) {
|
||||
static struct ast_channel *get_dahdi_channel_locked(int num) {
|
||||
char name[80];
|
||||
|
||||
snprintf(name, sizeof(name), "Zap/%d-1", num);
|
||||
snprintf(name, sizeof(name), "%s/%d-1", dahdi_chan_name, num);
|
||||
return ast_get_channel_by_name_locked(name);
|
||||
}
|
||||
|
||||
@@ -92,7 +94,7 @@ static int careful_write(int fd, unsigned char *data, int len)
|
||||
static int conf_run(struct ast_channel *chan, int confno, int confflags)
|
||||
{
|
||||
int fd;
|
||||
struct zt_confinfo ztc;
|
||||
struct dahdi_confinfo dahdic;
|
||||
struct ast_frame *f;
|
||||
struct ast_channel *c;
|
||||
struct ast_frame fr;
|
||||
@@ -101,13 +103,13 @@ static int conf_run(struct ast_channel *chan, int confno, int confflags)
|
||||
int nfds;
|
||||
int res;
|
||||
int flags;
|
||||
int retryzap;
|
||||
int retrydahdi;
|
||||
int origfd;
|
||||
int ret = -1;
|
||||
char input[4];
|
||||
int ic = 0;
|
||||
|
||||
ZT_BUFFERINFO bi;
|
||||
DAHDI_BUFFERINFO bi;
|
||||
char __buf[CONF_SIZE + AST_FRIENDLY_OFFSET];
|
||||
char *buf = __buf + AST_FRIENDLY_OFFSET;
|
||||
|
||||
@@ -123,11 +125,11 @@ static int conf_run(struct ast_channel *chan, int confno, int confflags)
|
||||
goto outrun;
|
||||
}
|
||||
ast_indicate(chan, -1);
|
||||
retryzap = strcasecmp(chan->tech->type, "Zap");
|
||||
zapretry:
|
||||
retrydahdi = strcasecmp(chan->tech->type, "DAHDI");
|
||||
dahdiretry:
|
||||
origfd = chan->fds[0];
|
||||
if (retryzap) {
|
||||
fd = open("/dev/zap/pseudo", O_RDWR);
|
||||
if (retrydahdi) {
|
||||
fd = open("/dev/dahdi/pseudo", O_RDWR);
|
||||
if (fd < 0) {
|
||||
ast_log(LOG_WARNING, "Unable to open pseudo channel: %s\n", strerror(errno));
|
||||
goto outrun;
|
||||
@@ -147,10 +149,10 @@ static int conf_run(struct ast_channel *chan, int confno, int confflags)
|
||||
/* Setup buffering information */
|
||||
memset(&bi, 0, sizeof(bi));
|
||||
bi.bufsize = CONF_SIZE;
|
||||
bi.txbufpolicy = ZT_POLICY_IMMEDIATE;
|
||||
bi.rxbufpolicy = ZT_POLICY_IMMEDIATE;
|
||||
bi.txbufpolicy = DAHDI_POLICY_IMMEDIATE;
|
||||
bi.rxbufpolicy = DAHDI_POLICY_IMMEDIATE;
|
||||
bi.numbufs = 4;
|
||||
if (ioctl(fd, ZT_SET_BUFINFO, &bi)) {
|
||||
if (ioctl(fd, DAHDI_SET_BUFINFO, &bi)) {
|
||||
ast_log(LOG_WARNING, "Unable to set buffering information: %s\n", strerror(errno));
|
||||
close(fd);
|
||||
goto outrun;
|
||||
@@ -161,34 +163,34 @@ static int conf_run(struct ast_channel *chan, int confno, int confflags)
|
||||
fd = chan->fds[0];
|
||||
nfds = 0;
|
||||
}
|
||||
memset(&ztc, 0, sizeof(ztc));
|
||||
memset(&dahdic, 0, sizeof(dahdic));
|
||||
/* Check to see if we're in a conference... */
|
||||
ztc.chan = 0;
|
||||
if (ioctl(fd, ZT_GETCONF, &ztc)) {
|
||||
dahdic.chan = 0;
|
||||
if (ioctl(fd, DAHDI_GETCONF, &dahdic)) {
|
||||
ast_log(LOG_WARNING, "Error getting conference\n");
|
||||
close(fd);
|
||||
goto outrun;
|
||||
}
|
||||
if (ztc.confmode) {
|
||||
if (dahdic.confmode) {
|
||||
/* Whoa, already in a conference... Retry... */
|
||||
if (!retryzap) {
|
||||
ast_debug(1, "Zap channel is in a conference already, retrying with pseudo\n");
|
||||
retryzap = 1;
|
||||
goto zapretry;
|
||||
if (!retrydahdi) {
|
||||
ast_debug(1, "DAHDI channel is in a conference already, retrying with pseudo\n");
|
||||
retrydahdi = 1;
|
||||
goto dahdiretry;
|
||||
}
|
||||
}
|
||||
memset(&ztc, 0, sizeof(ztc));
|
||||
memset(&dahdic, 0, sizeof(dahdic));
|
||||
/* Add us to the conference */
|
||||
ztc.chan = 0;
|
||||
ztc.confno = confno;
|
||||
ztc.confmode = ZT_CONF_MONITORBOTH;
|
||||
dahdic.chan = 0;
|
||||
dahdic.confno = confno;
|
||||
dahdic.confmode = DAHDI_CONF_MONITORBOTH;
|
||||
|
||||
if (ioctl(fd, ZT_SETCONF, &ztc)) {
|
||||
if (ioctl(fd, DAHDI_SETCONF, &dahdic)) {
|
||||
ast_log(LOG_WARNING, "Error setting conference\n");
|
||||
close(fd);
|
||||
goto outrun;
|
||||
}
|
||||
ast_debug(1, "Placed channel %s in ZAP channel %d monitor\n", chan->name, confno);
|
||||
ast_debug(1, "Placed channel %s in DAHDI channel %d monitor\n", chan->name, confno);
|
||||
|
||||
for (;;) {
|
||||
outfd = -1;
|
||||
@@ -196,13 +198,13 @@ static int conf_run(struct ast_channel *chan, int confno, int confflags)
|
||||
c = ast_waitfor_nandfds(&chan, 1, &fd, nfds, NULL, &outfd, &ms);
|
||||
if (c) {
|
||||
if (c->fds[0] != origfd) {
|
||||
if (retryzap) {
|
||||
if (retrydahdi) {
|
||||
/* Kill old pseudo */
|
||||
close(fd);
|
||||
}
|
||||
ast_debug(1, "Ooh, something swapped out under us, starting over\n");
|
||||
retryzap = 0;
|
||||
goto zapretry;
|
||||
retrydahdi = 0;
|
||||
goto dahdiretry;
|
||||
}
|
||||
f = ast_read(c);
|
||||
if (!f) {
|
||||
@@ -222,7 +224,7 @@ static int conf_run(struct ast_channel *chan, int confno, int confflags)
|
||||
input[ic++] = '\0';
|
||||
ic = 0;
|
||||
ret = atoi(input);
|
||||
ast_verb(3, "Zapscan: change channel to %d\n", ret);
|
||||
ast_verb(3, "DAHDIScan: change channel to %d\n", ret);
|
||||
break;
|
||||
}
|
||||
}
|
||||
@@ -265,10 +267,10 @@ static int conf_run(struct ast_channel *chan, int confno, int confflags)
|
||||
} else {
|
||||
/* Take out of conference */
|
||||
/* Add us to the conference */
|
||||
ztc.chan = 0;
|
||||
ztc.confno = 0;
|
||||
ztc.confmode = 0;
|
||||
if (ioctl(fd, ZT_SETCONF, &ztc)) {
|
||||
dahdic.chan = 0;
|
||||
dahdic.confno = 0;
|
||||
dahdic.confmode = 0;
|
||||
if (ioctl(fd, DAHDI_SETCONF, &dahdic)) {
|
||||
ast_log(LOG_WARNING, "Error setting conference\n");
|
||||
}
|
||||
}
|
||||
@@ -312,7 +314,7 @@ static int conf_exec(struct ast_channel *chan, void *data)
|
||||
ast_frfree(f);
|
||||
ichan = NULL;
|
||||
if(input) {
|
||||
ichan = get_zap_channel_locked(input);
|
||||
ichan = get_dahdi_channel_locked(input);
|
||||
input = 0;
|
||||
}
|
||||
|
||||
@@ -332,8 +334,8 @@ static int conf_exec(struct ast_channel *chan, void *data)
|
||||
continue;
|
||||
}
|
||||
}
|
||||
if (tempchan && (!strcmp(tempchan->tech->type, "Zap")) && (tempchan != chan)) {
|
||||
ast_verb(3, "Zap channel %s is in-use, monitoring...\n", tempchan->name);
|
||||
if (tempchan && (!strcmp(tempchan->tech->type, "DAHDI")) && (tempchan != chan)) {
|
||||
ast_verb(3, "DAHDI channel %s is in-use, monitoring...\n", tempchan->name);
|
||||
ast_copy_string(confstr, tempchan->name, sizeof(confstr));
|
||||
ast_channel_unlock(tempchan);
|
||||
if ((tmp = strchr(confstr, '-'))) {
|
||||
@@ -355,6 +357,12 @@ static int conf_exec(struct ast_channel *chan, void *data)
|
||||
return res;
|
||||
}
|
||||
|
||||
static int conf_exec_warn(struct ast_channel *chan, void *data)
|
||||
{
|
||||
ast_log(LOG_WARNING, "Use of the command %s is deprecated, please use %s instead.\n", deprecated_app, app);
|
||||
return conf_exec(chan, data);
|
||||
}
|
||||
|
||||
static int unload_module(void)
|
||||
{
|
||||
return ast_unregister_application(app);
|
||||
@@ -362,8 +370,9 @@ static int unload_module(void)
|
||||
|
||||
static int load_module(void)
|
||||
{
|
||||
ast_register_application(deprecated_app, conf_exec_warn, synopsis, descrip);
|
||||
return ((ast_register_application(app, conf_exec, synopsis, descrip)) ? AST_MODULE_LOAD_FAILURE : AST_MODULE_LOAD_SUCCESS);
|
||||
}
|
||||
|
||||
AST_MODULE_INFO_STANDARD(ASTERISK_GPL_KEY, "Scan Zap channels application");
|
||||
AST_MODULE_INFO_STANDARD(ASTERISK_GPL_KEY, "Scan DAHDI channels application");
|
||||
|
||||
+5
-5
@@ -171,8 +171,8 @@ static char *descrip =
|
||||
" o - Specify that the CallerID that was present on the *calling* channel\n"
|
||||
" be set as the CallerID on the *called* channel. This was the\n"
|
||||
" behavior of Asterisk 1.0 and earlier.\n"
|
||||
" O([x]) - \"Operator Services\" mode (Zaptel channel to Zaptel channel\n"
|
||||
" only, if specified on non-Zaptel interface, it will be ignored).\n"
|
||||
" O([x]) - \"Operator Services\" mode (DAHDI channel to DAHDI channel\n"
|
||||
" only, if specified on non-DAHDI interface, it will be ignored).\n"
|
||||
" When the destination answers (presumably an operator services\n"
|
||||
" station), the originator no longer has control of their line.\n"
|
||||
" They may hang up, but the switch will not release their line\n"
|
||||
@@ -1895,9 +1895,9 @@ static int dial_exec_full(struct ast_channel *chan, void *data, struct ast_flags
|
||||
res = -1;
|
||||
goto done;
|
||||
}
|
||||
if (opermode && !strncmp(chan->name, "Zap", 3) && !strncmp(peer->name, "Zap", 3)) {
|
||||
/* what's this special handling for Zap <-> Zap ?
|
||||
* A: Zap to Zap calls are natively bridged at the kernel driver
|
||||
if (opermode && !strncmp(chan->tech->type, "DAHDI", 3) && !strncmp(peer->name, "DAHDI", 3)) {
|
||||
/* what's this special handling for dahdi <-> dahdi ?
|
||||
* A: dahdi to dahdi calls are natively bridged at the kernel driver
|
||||
* level, so we need to ensure that this mode gets propagated
|
||||
* all the way down. */
|
||||
struct oprmode oprmode;
|
||||
|
||||
-741
@@ -1,741 +0,0 @@
|
||||
/*
|
||||
* Asterisk -- A telephony toolkit for Linux.
|
||||
*
|
||||
* Simple fax applications
|
||||
*
|
||||
* 2007-2008, Dmitry Andrianov <asterisk@dima.spb.ru>
|
||||
*
|
||||
* Code based on original implementation by Steve Underwood <steveu@coppice.org>
|
||||
*
|
||||
* This program is free software, distributed under the terms of
|
||||
* the GNU General Public License
|
||||
*
|
||||
*/
|
||||
|
||||
/*** MODULEINFO
|
||||
<depend>spandsp</depend>
|
||||
***/
|
||||
|
||||
#include "asterisk.h"
|
||||
|
||||
ASTERISK_FILE_VERSION(__FILE__, "$Revision$")
|
||||
|
||||
#include <string.h>
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
#include <inttypes.h>
|
||||
#include <pthread.h>
|
||||
#include <errno.h>
|
||||
#include <tiffio.h>
|
||||
|
||||
#include <spandsp.h>
|
||||
|
||||
#include "asterisk/lock.h"
|
||||
#include "asterisk/file.h"
|
||||
#include "asterisk/logger.h"
|
||||
#include "asterisk/channel.h"
|
||||
#include "asterisk/pbx.h"
|
||||
#include "asterisk/app.h"
|
||||
#include "asterisk/dsp.h"
|
||||
#include "asterisk/module.h"
|
||||
#include "asterisk/manager.h"
|
||||
|
||||
static char *app_sndfax_name = "SendFAX";
|
||||
static char *app_sndfax_synopsis = "Send a FAX";
|
||||
static char *app_sndfax_desc =
|
||||
" SendFAX(filename[|options]):\n"
|
||||
"Send a given TIFF file to the channel as a FAX.\n"
|
||||
"The option string may contain zero or more of the following characters:\n"
|
||||
" 'a' -- makes the application behave as an answering machine\n"
|
||||
" The default behaviour is to behave as a calling machine.\n"
|
||||
"\n"
|
||||
"This application uses following variables:\n"
|
||||
" LOCALSTATIONID to identify itself to the remote end.\n"
|
||||
" LOCALHEADERINFO to generate a header line on each page.\n"
|
||||
"\n"
|
||||
"This application sets the following channel variables upon completion:\n"
|
||||
" FAXSTATUS - status of operation:\n"
|
||||
" SUCCESS | FAILED\n"
|
||||
" FAXERROR - Error when FAILED\n"
|
||||
" REMOTESTATIONID - CSID of the remote side.\n"
|
||||
" FAXPAGES - number of pages sent.\n"
|
||||
" FAXBITRATE - transmition rate.\n"
|
||||
" FAXRESOLUTION - resolution.\n"
|
||||
"\n"
|
||||
"Returns -1 in case of user hang up or any channel error.\n"
|
||||
"Returns 0 on success.\n";
|
||||
|
||||
static char *app_rcvfax_name = "ReceiveFAX";
|
||||
static char *app_rcvfax_synopsis = "Receive a FAX";
|
||||
static char *app_rcvfax_desc =
|
||||
" ReceiveFAX(filename[|options]):\n"
|
||||
"Receives a fax from the channel into the given filename overwriting\n"
|
||||
"the file if it already exists. File created will have TIFF format.\n"
|
||||
"The option string may contain zero or more of the following characters:\n"
|
||||
" 'c' -- makes the application behave as a calling machine\n"
|
||||
" The default behaviour is to behave as an answering machine.\n"
|
||||
"\n"
|
||||
"This application uses following variables:\n"
|
||||
" LOCALSTATIONID to identify itself to the remote end.\n"
|
||||
" LOCALHEADERINFO to generate a header line on each page.\n"
|
||||
"\n"
|
||||
"This application sets the following channel variables upon completion:\n"
|
||||
" FAXSTATUS - status of operation:\n"
|
||||
" SUCCESS | FAILED\n"
|
||||
" FAXERROR - Error when FAILED\n"
|
||||
" REMOTESTATIONID - CSID of the remote side.\n"
|
||||
" FAXPAGES - number of pages sent.\n"
|
||||
" FAXBITRATE - transmition rate.\n"
|
||||
" FAXRESOLUTION - resolution.\n"
|
||||
"\n"
|
||||
"Returns -1 in case of user hang up or any channel error.\n"
|
||||
"Returns 0 on success.\n";
|
||||
|
||||
#define MAX_SAMPLES 240
|
||||
|
||||
/* Watchdog. I have seen situations when remote fax disconnects (because of poor line
|
||||
quality) while SpanDSP continues staying in T30_STATE_IV_CTC state forever.
|
||||
To avoid this, we terminate when we see that T30 state does not change for 5 minutes.
|
||||
We also terminate application when more than 30 minutes passed regardless of
|
||||
state changes. This is just a precaution measure - no fax should take that long */
|
||||
|
||||
#define WATCHDOG_TOTAL_TIMEOUT 30 * 60
|
||||
#define WATCHDOG_STATE_TIMEOUT 5 * 60
|
||||
|
||||
typedef struct {
|
||||
struct ast_channel *chan;
|
||||
enum ast_t38_state t38state; /* T38 state of the channel */
|
||||
int direction; /* Fax direction: 0 - receiving, 1 - sending */
|
||||
int caller_mode;
|
||||
char *file_name;
|
||||
|
||||
volatile int finished;
|
||||
} fax_session;
|
||||
|
||||
static void span_message(int level, const char *msg)
|
||||
{
|
||||
if (level == SPAN_LOG_ERROR) {
|
||||
ast_log(LOG_ERROR, "%s", msg);
|
||||
} else if (level == SPAN_LOG_WARNING) {
|
||||
ast_log(LOG_WARNING, "%s", msg);
|
||||
} else {
|
||||
ast_log(LOG_DEBUG, "%s", msg);
|
||||
}
|
||||
}
|
||||
|
||||
static int t38_tx_packet_handler(t38_core_state_t *s, void *user_data, const uint8_t *buf, int len, int count)
|
||||
{
|
||||
struct ast_channel *chan = (struct ast_channel *) user_data;
|
||||
|
||||
struct ast_frame outf = {
|
||||
.frametype = AST_FRAME_MODEM,
|
||||
.subclass = AST_MODEM_T38,
|
||||
.src = __FUNCTION__,
|
||||
};
|
||||
|
||||
/* TODO: Asterisk does not provide means of resending the same packet multiple
|
||||
times so count is ignored at the moment */
|
||||
|
||||
AST_FRAME_SET_BUFFER(&outf, buf, 0, len);
|
||||
|
||||
if (ast_write(chan, &outf) < 0) {
|
||||
ast_log(LOG_WARNING, "Unable to write frame to channel; %s\n", strerror(errno));
|
||||
return -1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void phase_e_handler(t30_state_t *f, void *user_data, int result)
|
||||
{
|
||||
const char *local_ident;
|
||||
const char *far_ident;
|
||||
char buf[20];
|
||||
fax_session *s = (fax_session *) user_data;
|
||||
t30_stats_t stat;
|
||||
|
||||
ast_debug(1, "Fax phase E handler. result=%d\n", result);
|
||||
|
||||
t30_get_transfer_statistics(f, &stat);
|
||||
|
||||
s = (fax_session *) user_data;
|
||||
|
||||
if (result != T30_ERR_OK) {
|
||||
s->finished = -1;
|
||||
|
||||
/* FAXSTATUS is already set to FAILED */
|
||||
pbx_builtin_setvar_helper(s->chan, "FAXERROR", t30_completion_code_to_str(result));
|
||||
|
||||
ast_log(LOG_WARNING, "Error transmitting fax. result=%d: %s.\n", result, t30_completion_code_to_str(result));
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
s->finished = 1;
|
||||
|
||||
local_ident = t30_get_tx_ident(f);
|
||||
far_ident = t30_get_rx_ident(f);
|
||||
pbx_builtin_setvar_helper(s->chan, "FAXSTATUS", "SUCCESS");
|
||||
pbx_builtin_setvar_helper(s->chan, "FAXERROR", NULL);
|
||||
pbx_builtin_setvar_helper(s->chan, "REMOTESTATIONID", far_ident);
|
||||
snprintf(buf, sizeof(buf), "%d", stat.pages_transferred);
|
||||
pbx_builtin_setvar_helper(s->chan, "FAXPAGES", buf);
|
||||
snprintf(buf, sizeof(buf), "%d", stat.y_resolution);
|
||||
pbx_builtin_setvar_helper(s->chan, "FAXRESOLUTION", buf);
|
||||
snprintf(buf, sizeof(buf), "%d", stat.bit_rate);
|
||||
pbx_builtin_setvar_helper(s->chan, "FAXBITRATE", buf);
|
||||
|
||||
ast_debug(1, "Fax transmitted successfully.\n");
|
||||
ast_debug(1, " Remote station ID: %s\n", far_ident);
|
||||
ast_debug(1, " Pages transferred: %d\n", stat.pages_transferred);
|
||||
ast_debug(1, " Image resolution: %d x %d\n", stat.x_resolution, stat.y_resolution);
|
||||
ast_debug(1, " Transfer Rate: %d\n", stat.bit_rate);
|
||||
|
||||
manager_event(EVENT_FLAG_CALL,
|
||||
s->direction ? "FaxSent" : "FaxReceived",
|
||||
"Channel: %s\r\n"
|
||||
"Exten: %s\r\n"
|
||||
"CallerID: %s\r\n"
|
||||
"RemoteStationID: %s\r\n"
|
||||
"LocalStationID: %s\r\n"
|
||||
"PagesTransferred: %d\r\n"
|
||||
"Resolution: %d\r\n"
|
||||
"TransferRate: %d\r\n"
|
||||
"FileName: %s\r\n",
|
||||
s->chan->name,
|
||||
s->chan->exten,
|
||||
S_OR(s->chan->cid.cid_num, ""),
|
||||
far_ident,
|
||||
local_ident,
|
||||
stat.pages_transferred,
|
||||
stat.y_resolution,
|
||||
stat.bit_rate,
|
||||
s->file_name);
|
||||
}
|
||||
|
||||
/* === Helper functions to configure fax === */
|
||||
|
||||
/* Setup SPAN logging according to Asterisk debug level */
|
||||
static int set_logging(logging_state_t *state)
|
||||
{
|
||||
int level = SPAN_LOG_WARNING + option_debug;
|
||||
|
||||
span_log_set_message_handler(state, span_message);
|
||||
span_log_set_level(state, SPAN_LOG_SHOW_SEVERITY | SPAN_LOG_SHOW_PROTOCOL | level);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void set_local_info(t30_state_t *state, fax_session *s)
|
||||
{
|
||||
const char *x;
|
||||
|
||||
x = pbx_builtin_getvar_helper(s->chan, "LOCALSTATIONID");
|
||||
if (!ast_strlen_zero(x))
|
||||
t30_set_tx_ident(state, x);
|
||||
|
||||
x = pbx_builtin_getvar_helper(s->chan, "LOCALHEADERINFO");
|
||||
if (!ast_strlen_zero(x))
|
||||
t30_set_tx_page_header_info(state, x);
|
||||
}
|
||||
|
||||
static void set_file(t30_state_t *state, fax_session *s)
|
||||
{
|
||||
if (s->direction)
|
||||
t30_set_tx_file(state, s->file_name, -1, -1);
|
||||
else
|
||||
t30_set_rx_file(state, s->file_name, -1);
|
||||
}
|
||||
|
||||
static void set_ecm(t30_state_t *state, int ecm)
|
||||
{
|
||||
t30_set_ecm_capability(state, ecm);
|
||||
t30_set_supported_compressions(state, T30_SUPPORT_T4_1D_COMPRESSION | T30_SUPPORT_T4_2D_COMPRESSION | T30_SUPPORT_T6_COMPRESSION);
|
||||
}
|
||||
|
||||
/* === Generator === */
|
||||
|
||||
/* This function is only needed to return passed params so
|
||||
generator_activate will save it to channel's generatordata */
|
||||
static void *fax_generator_alloc(struct ast_channel *chan, void *params)
|
||||
{
|
||||
return params;
|
||||
}
|
||||
|
||||
static int fax_generator_generate(struct ast_channel *chan, void *data, int len, int samples)
|
||||
{
|
||||
fax_state_t *fax = (fax_state_t*) data;
|
||||
uint8_t buffer[AST_FRIENDLY_OFFSET + MAX_SAMPLES * sizeof(uint16_t)];
|
||||
int16_t *buf = (int16_t *) (buffer + AST_FRIENDLY_OFFSET);
|
||||
|
||||
struct ast_frame outf = {
|
||||
.frametype = AST_FRAME_VOICE,
|
||||
.subclass = AST_FORMAT_SLINEAR,
|
||||
.src = __FUNCTION__,
|
||||
};
|
||||
|
||||
if (samples > MAX_SAMPLES) {
|
||||
ast_log(LOG_WARNING, "Only generating %d samples, where %d requested\n", MAX_SAMPLES, samples);
|
||||
samples = MAX_SAMPLES;
|
||||
}
|
||||
|
||||
if ((len = fax_tx(fax, buf, samples)) > 0) {
|
||||
outf.samples = len;
|
||||
AST_FRAME_SET_BUFFER(&outf, buffer, AST_FRIENDLY_OFFSET, len * sizeof(int16_t));
|
||||
|
||||
if (ast_write(chan, &outf) < 0) {
|
||||
ast_log(LOG_WARNING, "Failed to write frame to '%s': %s\n", chan->name, strerror(errno));
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
struct ast_generator generator = {
|
||||
alloc: fax_generator_alloc,
|
||||
generate: fax_generator_generate,
|
||||
};
|
||||
|
||||
|
||||
/* === Transmission === */
|
||||
|
||||
static int transmit_audio(fax_session *s)
|
||||
{
|
||||
int res = -1;
|
||||
int original_read_fmt = AST_FORMAT_SLINEAR;
|
||||
int original_write_fmt = AST_FORMAT_SLINEAR;
|
||||
fax_state_t fax;
|
||||
struct ast_dsp *dsp = NULL;
|
||||
int detect_tone = 0;
|
||||
struct ast_frame *inf = NULL;
|
||||
struct ast_frame *fr;
|
||||
int last_state = 0;
|
||||
struct timeval now, start, state_change;
|
||||
enum ast_control_t38 t38control;
|
||||
|
||||
original_read_fmt = s->chan->readformat;
|
||||
if (original_read_fmt != AST_FORMAT_SLINEAR) {
|
||||
res = ast_set_read_format(s->chan, AST_FORMAT_SLINEAR);
|
||||
if (res < 0) {
|
||||
ast_log(LOG_WARNING, "Unable to set to linear read mode, giving up\n");
|
||||
goto done;
|
||||
}
|
||||
}
|
||||
|
||||
original_write_fmt = s->chan->writeformat;
|
||||
if (original_write_fmt != AST_FORMAT_SLINEAR) {
|
||||
res = ast_set_write_format(s->chan, AST_FORMAT_SLINEAR);
|
||||
if (res < 0) {
|
||||
ast_log(LOG_WARNING, "Unable to set to linear write mode, giving up\n");
|
||||
goto done;
|
||||
}
|
||||
}
|
||||
|
||||
/* Initialize T30 terminal */
|
||||
fax_init(&fax, s->caller_mode);
|
||||
|
||||
/* Setup logging */
|
||||
set_logging(&fax.logging);
|
||||
set_logging(&fax.t30_state.logging);
|
||||
|
||||
/* Configure terminal */
|
||||
set_local_info(&fax.t30_state, s);
|
||||
set_file(&fax.t30_state, s);
|
||||
set_ecm(&fax.t30_state, TRUE);
|
||||
|
||||
fax_set_transmit_on_idle(&fax, TRUE);
|
||||
|
||||
t30_set_phase_e_handler(&fax.t30_state, phase_e_handler, s);
|
||||
|
||||
if (s->t38state == T38_STATE_UNAVAILABLE) {
|
||||
ast_debug(1, "T38 is unavailable on %s\n", s->chan->name);
|
||||
} else if (!s->direction) {
|
||||
/* We are receiving side and this means we are the side which should
|
||||
request T38 when the fax is detected. Use DSP to detect fax tone */
|
||||
ast_debug(1, "Setting up CNG detection on %s\n", s->chan->name);
|
||||
dsp = ast_dsp_new();
|
||||
ast_dsp_set_features(dsp, DSP_FEATURE_FAX_DETECT);
|
||||
ast_dsp_set_faxmode(dsp, DSP_FAXMODE_DETECT_CNG);
|
||||
detect_tone = 1;
|
||||
}
|
||||
|
||||
start = state_change = ast_tvnow();
|
||||
|
||||
ast_activate_generator(s->chan, &generator, &fax);
|
||||
|
||||
while (!s->finished) {
|
||||
res = ast_waitfor(s->chan, 20);
|
||||
if (res < 0)
|
||||
break;
|
||||
else if (res > 0)
|
||||
res = 0;
|
||||
|
||||
inf = ast_read(s->chan);
|
||||
if (inf == NULL) {
|
||||
ast_debug(1, "Channel hangup\n");
|
||||
res = -1;
|
||||
break;
|
||||
}
|
||||
|
||||
ast_debug(10, "frame %d/%d, len=%d\n", inf->frametype, inf->subclass, inf->datalen);
|
||||
|
||||
/* Detect fax tone */
|
||||
if (detect_tone && inf->frametype == AST_FRAME_VOICE) {
|
||||
/* Duplicate frame because ast_dsp_process may free the frame passed */
|
||||
fr = ast_frdup(inf);
|
||||
|
||||
/* Do not pass channel to ast_dsp_process otherwise it may queue modified audio frame back */
|
||||
fr = ast_dsp_process(NULL, dsp, fr);
|
||||
if (fr && fr->frametype == AST_FRAME_DTMF && fr->subclass == 'f') {
|
||||
ast_debug(1, "Fax tone detected. Requesting T38\n");
|
||||
t38control = AST_T38_REQUEST_NEGOTIATE;
|
||||
ast_indicate_data(s->chan, AST_CONTROL_T38, &t38control, sizeof(t38control));
|
||||
detect_tone = 0;
|
||||
}
|
||||
|
||||
ast_frfree(fr);
|
||||
}
|
||||
|
||||
|
||||
/* Check the frame type. Format also must be checked because there is a chance
|
||||
that a frame in old format was already queued before we set chanel format
|
||||
to slinear so it will still be received by ast_read */
|
||||
if (inf->frametype == AST_FRAME_VOICE && inf->subclass == AST_FORMAT_SLINEAR) {
|
||||
|
||||
if (fax_rx(&fax, inf->data.ptr, inf->samples) < 0) {
|
||||
/* I know fax_rx never returns errors. The check here is for good style only */
|
||||
ast_log(LOG_WARNING, "fax_rx returned error\n");
|
||||
res = -1;
|
||||
break;
|
||||
}
|
||||
|
||||
/* Watchdog */
|
||||
if (last_state != fax.t30_state.state) {
|
||||
state_change = ast_tvnow();
|
||||
last_state = fax.t30_state.state;
|
||||
}
|
||||
} else if (inf->frametype == AST_FRAME_CONTROL && inf->subclass == AST_CONTROL_T38 &&
|
||||
inf->datalen == sizeof(enum ast_control_t38)) {
|
||||
t38control =*((enum ast_control_t38 *) inf->data.ptr);
|
||||
if (t38control == AST_T38_NEGOTIATED) {
|
||||
/* T38 switchover completed */
|
||||
ast_debug(1, "T38 negotiated, finishing audio loop\n");
|
||||
res = 1;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
ast_frfree(inf);
|
||||
inf = NULL;
|
||||
|
||||
/* Watchdog */
|
||||
now = ast_tvnow();
|
||||
if (ast_tvdiff_sec(now, start) > WATCHDOG_TOTAL_TIMEOUT || ast_tvdiff_sec(now, state_change) > WATCHDOG_STATE_TIMEOUT) {
|
||||
ast_log(LOG_WARNING, "It looks like we hung. Aborting.\n");
|
||||
res = -1;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
ast_debug(1, "Loop finished, res=%d\n", res);
|
||||
|
||||
if (inf)
|
||||
ast_frfree(inf);
|
||||
|
||||
if (dsp)
|
||||
ast_dsp_free(dsp);
|
||||
|
||||
ast_deactivate_generator(s->chan);
|
||||
|
||||
/* Remove phase E handler because we do not want it to be executed
|
||||
only because we called t30_terminate */
|
||||
t30_set_phase_e_handler(&fax.t30_state, NULL, NULL);
|
||||
|
||||
t30_terminate(&fax.t30_state);
|
||||
fax_release(&fax);
|
||||
|
||||
done:
|
||||
if (original_write_fmt != AST_FORMAT_SLINEAR) {
|
||||
if (ast_set_write_format(s->chan, original_write_fmt) < 0)
|
||||
ast_log(LOG_WARNING, "Unable to restore write format on '%s'\n", s->chan->name);
|
||||
}
|
||||
|
||||
if (original_read_fmt != AST_FORMAT_SLINEAR) {
|
||||
if (ast_set_read_format(s->chan, original_read_fmt) < 0)
|
||||
ast_log(LOG_WARNING, "Unable to restore read format on '%s'\n", s->chan->name);
|
||||
}
|
||||
|
||||
return res;
|
||||
|
||||
}
|
||||
|
||||
static int transmit_t38(fax_session *s)
|
||||
{
|
||||
int res = 0;
|
||||
t38_terminal_state_t t38;
|
||||
struct ast_frame *inf = NULL;
|
||||
int last_state = 0;
|
||||
struct timeval now, start, state_change, last_frame;
|
||||
enum ast_control_t38 t38control;
|
||||
|
||||
/* Initialize terminal */
|
||||
memset(&t38, 0, sizeof(t38));
|
||||
if (t38_terminal_init(&t38, s->caller_mode, t38_tx_packet_handler, s->chan) == NULL) {
|
||||
ast_log(LOG_WARNING, "Unable to start T.38 termination.\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
/* Setup logging */
|
||||
set_logging(&t38.logging);
|
||||
set_logging(&t38.t30_state.logging);
|
||||
set_logging(&t38.t38.logging);
|
||||
|
||||
/* Configure terminal */
|
||||
set_local_info(&t38.t30_state, s);
|
||||
set_file(&t38.t30_state, s);
|
||||
set_ecm(&t38.t30_state, TRUE);
|
||||
|
||||
t30_set_phase_e_handler(&t38.t30_state, phase_e_handler, s);
|
||||
|
||||
now = start = state_change = ast_tvnow();
|
||||
|
||||
while (!s->finished) {
|
||||
|
||||
res = ast_waitfor(s->chan, 20);
|
||||
if (res < 0)
|
||||
break;
|
||||
else if (res > 0)
|
||||
res = 0;
|
||||
|
||||
last_frame = now;
|
||||
now = ast_tvnow();
|
||||
t38_terminal_send_timeout(&t38, ast_tvdiff_us(now, last_frame) / (1000000 / 8000));
|
||||
|
||||
inf = ast_read(s->chan);
|
||||
if (inf == NULL) {
|
||||
ast_debug(1, "Channel hangup\n");
|
||||
res = -1;
|
||||
break;
|
||||
}
|
||||
|
||||
ast_debug(10, "frame %d/%d, len=%d\n", inf->frametype, inf->subclass, inf->datalen);
|
||||
|
||||
if (inf->frametype == AST_FRAME_MODEM && inf->subclass == AST_MODEM_T38) {
|
||||
t38_core_rx_ifp_packet(&t38.t38, inf->data.ptr, inf->datalen, inf->seqno);
|
||||
|
||||
/* Watchdog */
|
||||
if (last_state != t38.t30_state.state) {
|
||||
state_change = ast_tvnow();
|
||||
last_state = t38.t30_state.state;
|
||||
}
|
||||
} else if (inf->frametype == AST_FRAME_CONTROL && inf->subclass == AST_CONTROL_T38 &&
|
||||
inf->datalen == sizeof(enum ast_control_t38)) {
|
||||
|
||||
t38control = *((enum ast_control_t38 *) inf->data.ptr);
|
||||
|
||||
if (t38control == AST_T38_TERMINATED || t38control == AST_T38_REFUSED) {
|
||||
ast_debug(1, "T38 down, terminating\n");
|
||||
res = -1;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
ast_frfree(inf);
|
||||
inf = NULL;
|
||||
|
||||
/* Watchdog */
|
||||
if (ast_tvdiff_sec(now, start) > WATCHDOG_TOTAL_TIMEOUT || ast_tvdiff_sec(now, state_change) > WATCHDOG_STATE_TIMEOUT) {
|
||||
ast_log(LOG_WARNING, "It looks like we hung. Aborting.\n");
|
||||
res = -1;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
ast_debug(1, "Loop finished, res=%d\n", res);
|
||||
|
||||
if (inf)
|
||||
ast_frfree(inf);
|
||||
|
||||
/* Remove phase E handler because we do not want it to be executed
|
||||
only because we called t30_terminate */
|
||||
t30_set_phase_e_handler(&t38.t30_state, NULL, NULL);
|
||||
|
||||
t30_terminate(&t38.t30_state);
|
||||
|
||||
return res;
|
||||
}
|
||||
|
||||
static int transmit(fax_session *s)
|
||||
{
|
||||
int res = 0;
|
||||
|
||||
/* Clear all channel variables which to be set by the application.
|
||||
Pre-set status to error so in case of any problems we can just leave */
|
||||
pbx_builtin_setvar_helper(s->chan, "FAXSTATUS", "FAILED");
|
||||
pbx_builtin_setvar_helper(s->chan, "FAXERROR", "Channel problems");
|
||||
|
||||
pbx_builtin_setvar_helper(s->chan, "REMOTESTATIONID", NULL);
|
||||
pbx_builtin_setvar_helper(s->chan, "FAXPAGES", NULL);
|
||||
pbx_builtin_setvar_helper(s->chan, "FAXRESOLUTION", NULL);
|
||||
pbx_builtin_setvar_helper(s->chan, "FAXBITRATE", NULL);
|
||||
|
||||
if (s->chan->_state != AST_STATE_UP) {
|
||||
/* Shouldn't need this, but checking to see if channel is already answered
|
||||
* Theoretically asterisk should already have answered before running the app */
|
||||
res = ast_answer(s->chan);
|
||||
if (res) {
|
||||
ast_log(LOG_WARNING, "Could not answer channel '%s'\n", s->chan->name);
|
||||
return res;
|
||||
}
|
||||
}
|
||||
|
||||
s->t38state = ast_channel_get_t38_state(s->chan);
|
||||
if (s->t38state != T38_STATE_NEGOTIATED) {
|
||||
/* T38 is not negotiated on the channel yet. First start regular transmission. If it switches to T38, follow */
|
||||
res = transmit_audio(s);
|
||||
if (res > 0) {
|
||||
/* transmit_audio reports switchover to T38. Update t38state */
|
||||
s->t38state = ast_channel_get_t38_state(s->chan);
|
||||
if (s->t38state != T38_STATE_NEGOTIATED) {
|
||||
ast_log(LOG_ERROR, "Audio loop reports T38 switchover but t38state != T38_STATE_NEGOTIATED\n");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (s->t38state == T38_STATE_NEGOTIATED) {
|
||||
res = transmit_t38(s);
|
||||
}
|
||||
|
||||
if (res) {
|
||||
ast_log(LOG_WARNING, "Transmission error\n");
|
||||
res = -1;
|
||||
} else if (s->finished < 0) {
|
||||
ast_log(LOG_WARNING, "Transmission failed\n");
|
||||
} else if (s->finished > 0) {
|
||||
ast_debug(1, "Transmission finished Ok\n");
|
||||
}
|
||||
|
||||
return res;
|
||||
}
|
||||
|
||||
/* === Application functions === */
|
||||
|
||||
static int sndfax_exec(struct ast_channel *chan, void *data)
|
||||
{
|
||||
int res = 0;
|
||||
char *parse;
|
||||
fax_session session;
|
||||
|
||||
AST_DECLARE_APP_ARGS(args,
|
||||
AST_APP_ARG(file_name);
|
||||
AST_APP_ARG(options);
|
||||
);
|
||||
|
||||
if (chan == NULL) {
|
||||
ast_log(LOG_ERROR, "Fax channel is NULL. Giving up.\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
/* The next few lines of code parse out the filename and header from the input string */
|
||||
if (ast_strlen_zero(data)) {
|
||||
/* No data implies no filename or anything is present */
|
||||
ast_log(LOG_ERROR, "SendFAX requires an argument (filename)\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
parse = ast_strdupa(data);
|
||||
AST_STANDARD_APP_ARGS(args, parse);
|
||||
|
||||
session.caller_mode = TRUE;
|
||||
|
||||
if (args.options) {
|
||||
if (strchr(args.options, 'a'))
|
||||
session.caller_mode = FALSE;
|
||||
}
|
||||
|
||||
/* Done parsing */
|
||||
session.direction = 1;
|
||||
session.file_name = args.file_name;
|
||||
session.chan = chan;
|
||||
session.finished = 0;
|
||||
|
||||
res = transmit(&session);
|
||||
|
||||
return res;
|
||||
}
|
||||
|
||||
static int rcvfax_exec(struct ast_channel *chan, void *data)
|
||||
{
|
||||
int res = 0;
|
||||
char *parse;
|
||||
fax_session session;
|
||||
|
||||
AST_DECLARE_APP_ARGS(args,
|
||||
AST_APP_ARG(file_name);
|
||||
AST_APP_ARG(options);
|
||||
);
|
||||
|
||||
if (chan == NULL) {
|
||||
ast_log(LOG_ERROR, "Fax channel is NULL. Giving up.\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
/* The next few lines of code parse out the filename and header from the input string */
|
||||
if (ast_strlen_zero(data)) {
|
||||
/* No data implies no filename or anything is present */
|
||||
ast_log(LOG_ERROR, "ReceiveFAX requires an argument (filename)\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
parse = ast_strdupa(data);
|
||||
AST_STANDARD_APP_ARGS(args, parse);
|
||||
|
||||
session.caller_mode = FALSE;
|
||||
|
||||
if (args.options) {
|
||||
if (strchr(args.options, 'c'))
|
||||
session.caller_mode = TRUE;
|
||||
}
|
||||
|
||||
/* Done parsing */
|
||||
session.direction = 0;
|
||||
session.file_name = args.file_name;
|
||||
session.chan = chan;
|
||||
session.finished = 0;
|
||||
|
||||
res = transmit(&session);
|
||||
|
||||
return res;
|
||||
}
|
||||
|
||||
static int unload_module(void)
|
||||
{
|
||||
int res;
|
||||
|
||||
res = ast_unregister_application(app_sndfax_name);
|
||||
res |= ast_unregister_application(app_rcvfax_name);
|
||||
|
||||
return res;
|
||||
}
|
||||
|
||||
static int load_module(void)
|
||||
{
|
||||
int res ;
|
||||
|
||||
res = ast_register_application(app_sndfax_name, sndfax_exec, app_sndfax_synopsis, app_sndfax_desc);
|
||||
res |= ast_register_application(app_rcvfax_name, rcvfax_exec, app_rcvfax_synopsis, app_rcvfax_desc);
|
||||
|
||||
/* The default SPAN message handler prints to stderr. It is something we do not want */
|
||||
span_set_message_handler(NULL);
|
||||
|
||||
return res;
|
||||
}
|
||||
|
||||
|
||||
AST_MODULE_INFO(ASTERISK_GPL_KEY, AST_MODFLAG_DEFAULT, "Simple FAX Application",
|
||||
.load = load_module,
|
||||
.unload = unload_module,
|
||||
);
|
||||
|
||||
|
||||
+19
-19
@@ -18,7 +18,7 @@
|
||||
|
||||
/*! \file
|
||||
*
|
||||
* \brief App to flash a zap trunk
|
||||
* \brief App to flash a DAHDI trunk
|
||||
*
|
||||
* \author Mark Spencer <markster@digium.com>
|
||||
*
|
||||
@@ -26,14 +26,14 @@
|
||||
*/
|
||||
|
||||
/*** MODULEINFO
|
||||
<depend>zaptel</depend>
|
||||
<depend>dahdi</depend>
|
||||
***/
|
||||
|
||||
#include "asterisk.h"
|
||||
|
||||
ASTERISK_FILE_VERSION(__FILE__, "$Revision$")
|
||||
|
||||
#include "asterisk/zapata.h"
|
||||
#include "asterisk/dahdi.h"
|
||||
|
||||
#include "asterisk/lock.h"
|
||||
#include "asterisk/file.h"
|
||||
@@ -45,22 +45,22 @@ ASTERISK_FILE_VERSION(__FILE__, "$Revision$")
|
||||
|
||||
static char *app = "Flash";
|
||||
|
||||
static char *synopsis = "Flashes a Zap Trunk";
|
||||
static char *synopsis = "Flashes a DAHDI Trunk";
|
||||
|
||||
static char *descrip =
|
||||
"Performs a flash on a zap trunk. This can be used\n"
|
||||
"Performs a flash on a DAHDI trunk. This can be used\n"
|
||||
"to access features provided on an incoming analogue circuit\n"
|
||||
"such as conference and call waiting. Use with SendDTMF() to\n"
|
||||
"perform external transfers\n";
|
||||
|
||||
|
||||
static inline int zt_wait_event(int fd)
|
||||
static inline int dahdi_wait_event(int fd)
|
||||
{
|
||||
/* Avoid the silly zt_waitevent which ignores a bunch of events */
|
||||
/* Avoid the silly dahdi_waitevent which ignores a bunch of events */
|
||||
int i,j=0;
|
||||
i = ZT_IOMUX_SIGEVENT;
|
||||
if (ioctl(fd, ZT_IOMUX, &i) == -1) return -1;
|
||||
if (ioctl(fd, ZT_GETEVENT, &j) == -1) return -1;
|
||||
i = DAHDI_IOMUX_SIGEVENT;
|
||||
if (ioctl(fd, DAHDI_IOMUX, &i) == -1) return -1;
|
||||
if (ioctl(fd, DAHDI_GETEVENT, &j) == -1) return -1;
|
||||
return j;
|
||||
}
|
||||
|
||||
@@ -68,23 +68,23 @@ static int flash_exec(struct ast_channel *chan, void *data)
|
||||
{
|
||||
int res = -1;
|
||||
int x;
|
||||
struct zt_params ztp;
|
||||
struct dahdi_params dahdip;
|
||||
|
||||
if (strcasecmp(chan->tech->type, "Zap")) {
|
||||
ast_log(LOG_WARNING, "%s is not a Zap channel\n", chan->name);
|
||||
if (strcasecmp(chan->tech->type, "DAHDI")) {
|
||||
ast_log(LOG_WARNING, "%s is not a DAHDI channel\n", chan->name);
|
||||
return -1;
|
||||
}
|
||||
|
||||
memset(&ztp, 0, sizeof(ztp));
|
||||
res = ioctl(chan->fds[0], ZT_GET_PARAMS, &ztp);
|
||||
memset(&dahdip, 0, sizeof(dahdip));
|
||||
res = ioctl(chan->fds[0], DAHDI_GET_PARAMS, &dahdip);
|
||||
if (!res) {
|
||||
if (ztp.sigtype & __ZT_SIG_FXS) {
|
||||
x = ZT_FLASH;
|
||||
res = ioctl(chan->fds[0], ZT_HOOK, &x);
|
||||
if (dahdip.sigtype & __DAHDI_SIG_FXS) {
|
||||
x = DAHDI_FLASH;
|
||||
res = ioctl(chan->fds[0], DAHDI_HOOK, &x);
|
||||
if (!res || (errno == EINPROGRESS)) {
|
||||
if (res) {
|
||||
/* Wait for the event to finish */
|
||||
zt_wait_event(chan->fds[0]);
|
||||
dahdi_wait_event(chan->fds[0]);
|
||||
}
|
||||
res = ast_safe_sleep(chan, 1000);
|
||||
ast_verb(3, "Flashed channel %s\n", chan->name);
|
||||
|
||||
+1
-1
@@ -42,7 +42,7 @@ static char *synopsis = "Get ADSI CPE ID";
|
||||
|
||||
static char *descrip =
|
||||
" GetCPEID(): Obtains and displays ADSI CPE ID and other information in order\n"
|
||||
"to properly setup zapata.conf for on-hook operations.\n";
|
||||
"to properly setup dahdi.conf for on-hook operations.\n";
|
||||
|
||||
|
||||
static int cpeid_setstatus(struct ast_channel *chan, char *stuff[], int voice)
|
||||
|
||||
+93
-93
@@ -30,14 +30,14 @@
|
||||
*/
|
||||
|
||||
/*** MODULEINFO
|
||||
<depend>zaptel</depend>
|
||||
<depend>dahdi</depend>
|
||||
***/
|
||||
|
||||
#include "asterisk.h"
|
||||
|
||||
ASTERISK_FILE_VERSION(__FILE__, "$Revision$")
|
||||
|
||||
#include "asterisk/zapata.h"
|
||||
#include "asterisk/dahdi.h"
|
||||
|
||||
#include "asterisk/lock.h"
|
||||
#include "asterisk/file.h"
|
||||
@@ -228,15 +228,15 @@ static const char *descrip =
|
||||
"conference. If the conference number is omitted, the user will be prompted\n"
|
||||
"to enter one. User can exit the conference by hangup, or if the 'p' option\n"
|
||||
"is specified, by pressing '#'.\n"
|
||||
"Please note: The Zaptel kernel modules and at least one hardware driver (or ztdummy)\n"
|
||||
" must be present for conferencing to operate properly. In addition, the chan_zap\n"
|
||||
"Please note: The DAHDI kernel modules and at least one hardware driver (or dahdi_dummy)\n"
|
||||
" must be present for conferencing to operate properly. In addition, the chan_dahdi\n"
|
||||
" channel driver must be loaded for the 'i' and 'r' options to operate at all.\n\n"
|
||||
"The option string may contain zero or more of the following characters:\n"
|
||||
" 'a' -- set admin mode\n"
|
||||
" 'A' -- set marked mode\n"
|
||||
" 'b' -- run AGI script specified in ${MEETME_AGI_BACKGROUND}\n"
|
||||
" Default: conf-background.agi (Note: This does not work with\n"
|
||||
" non-Zap channels in the same conference)\n"
|
||||
" non-DAHDI channels in the same conference)\n"
|
||||
" 'c' -- announce user(s) count on joining a conference\n"
|
||||
" 'C' -- continue in dialplan when kicked out of conference\n"
|
||||
" 'd' -- dynamically add conference\n"
|
||||
@@ -361,7 +361,7 @@ struct ast_conference {
|
||||
struct ast_channel *chan; /*!< Announcements channel */
|
||||
struct ast_channel *lchan; /*!< Listen/Record channel */
|
||||
int fd; /*!< Announcements fd */
|
||||
int zapconf; /*!< Zaptel Conf # */
|
||||
int dahdiconf; /*!< DAHDI Conf # */
|
||||
int users; /*!< Number of active users */
|
||||
int markedusers; /*!< Number of marked users */
|
||||
int maxusers; /*!< Participant limit if scheduled */
|
||||
@@ -403,7 +403,7 @@ struct ast_conf_user {
|
||||
int adminflags; /*!< Flags set by the Admin */
|
||||
struct ast_channel *chan; /*!< Connected channel */
|
||||
int talking; /*!< Is user talking */
|
||||
int zapchannel; /*!< Is a Zaptel channel */
|
||||
int dahdichannel; /*!< Is a DAHDI channel */
|
||||
char usrvalue[50]; /*!< Custom User Value */
|
||||
char namerecloc[PATH_MAX]; /*!< Name Recorded file Location */
|
||||
time_t jointime; /*!< Time the user joined the conference */
|
||||
@@ -639,8 +639,8 @@ static int careful_write(int fd, unsigned char *data, int len, int block)
|
||||
|
||||
while (len) {
|
||||
if (block) {
|
||||
x = ZT_IOMUX_WRITE | ZT_IOMUX_SIGEVENT;
|
||||
res = ioctl(fd, ZT_IOMUX, &x);
|
||||
x = DAHDI_IOMUX_WRITE | DAHDI_IOMUX_SIGEVENT;
|
||||
res = ioctl(fd, DAHDI_IOMUX, &x);
|
||||
} else
|
||||
res = 0;
|
||||
if (res >= 0)
|
||||
@@ -801,7 +801,7 @@ static void conf_play(struct ast_channel *chan, struct ast_conference *conf, enu
|
||||
static struct ast_conference *build_conf(char *confno, char *pin, char *pinadmin, int make, int dynamic, int refcount, const struct ast_channel *chan)
|
||||
{
|
||||
struct ast_conference *cnf;
|
||||
struct zt_confinfo ztc = { 0, };
|
||||
struct dahdi_confinfo dahdic = { 0, };
|
||||
int confno_int = 0;
|
||||
|
||||
AST_LIST_LOCK(&confs);
|
||||
@@ -827,11 +827,11 @@ static struct ast_conference *build_conf(char *confno, char *pin, char *pinadmin
|
||||
ast_copy_string(cnf->pinadmin, pinadmin, sizeof(cnf->pinadmin));
|
||||
ast_copy_string(cnf->uniqueid, chan->uniqueid, sizeof(cnf->uniqueid));
|
||||
|
||||
/* Setup a new zap conference */
|
||||
ztc.confno = -1;
|
||||
ztc.confmode = ZT_CONF_CONFANN | ZT_CONF_CONFANNMON;
|
||||
cnf->fd = open("/dev/zap/pseudo", O_RDWR);
|
||||
if (cnf->fd < 0 || ioctl(cnf->fd, ZT_SETCONF, &ztc)) {
|
||||
/* Setup a new dahdi conference */
|
||||
dahdic.confno = -1;
|
||||
dahdic.confmode = DAHDI_CONF_CONFANN | DAHDI_CONF_CONFANNMON;
|
||||
cnf->fd = open("/dev/dahdi/pseudo", O_RDWR);
|
||||
if (cnf->fd < 0 || ioctl(cnf->fd, DAHDI_SETCONF, &dahdic)) {
|
||||
ast_log(LOG_WARNING, "Unable to open pseudo device\n");
|
||||
if (cnf->fd >= 0)
|
||||
close(cnf->fd);
|
||||
@@ -840,17 +840,17 @@ static struct ast_conference *build_conf(char *confno, char *pin, char *pinadmin
|
||||
goto cnfout;
|
||||
}
|
||||
|
||||
cnf->zapconf = ztc.confno;
|
||||
cnf->dahdiconf = dahdic.confno;
|
||||
|
||||
/* Setup a new channel for playback of audio files */
|
||||
cnf->chan = ast_request("zap", AST_FORMAT_SLINEAR, "pseudo", NULL);
|
||||
cnf->chan = ast_request("DAHDI", AST_FORMAT_SLINEAR, "pseudo", NULL);
|
||||
if (cnf->chan) {
|
||||
ast_set_read_format(cnf->chan, AST_FORMAT_SLINEAR);
|
||||
ast_set_write_format(cnf->chan, AST_FORMAT_SLINEAR);
|
||||
ztc.chan = 0;
|
||||
ztc.confno = cnf->zapconf;
|
||||
ztc.confmode = ZT_CONF_CONFANN | ZT_CONF_CONFANNMON;
|
||||
if (ioctl(cnf->chan->fds[0], ZT_SETCONF, &ztc)) {
|
||||
dahdic.chan = 0;
|
||||
dahdic.confno = cnf->dahdiconf;
|
||||
dahdic.confmode = DAHDI_CONF_CONFANN | DAHDI_CONF_CONFANNMON;
|
||||
if (ioctl(cnf->chan->fds[0], DAHDI_SETCONF, &dahdic)) {
|
||||
ast_log(LOG_WARNING, "Error setting conference\n");
|
||||
if (cnf->chan)
|
||||
ast_hangup(cnf->chan);
|
||||
@@ -867,7 +867,7 @@ static struct ast_conference *build_conf(char *confno, char *pin, char *pinadmin
|
||||
cnf->start = time(NULL);
|
||||
cnf->maxusers = 0x7fffffff;
|
||||
cnf->isdynamic = dynamic ? 1 : 0;
|
||||
ast_verb(3, "Created MeetMe conference %d for conference '%s'\n", cnf->zapconf, cnf->confno);
|
||||
ast_verb(3, "Created MeetMe conference %d for conference '%s'\n", cnf->dahdiconf, cnf->confno);
|
||||
AST_LIST_INSERT_HEAD(&confs, cnf, list);
|
||||
|
||||
/* Reserve conference number in map */
|
||||
@@ -1309,8 +1309,8 @@ static void conf_flush(int fd, struct ast_channel *chan)
|
||||
}
|
||||
|
||||
/* flush any data sitting in the pseudo channel */
|
||||
x = ZT_FLUSH_ALL;
|
||||
if (ioctl(fd, ZT_FLUSH, &x))
|
||||
x = DAHDI_FLUSH_ALL;
|
||||
if (ioctl(fd, DAHDI_FLUSH, &x))
|
||||
ast_log(LOG_WARNING, "Error flushing channel\n");
|
||||
|
||||
}
|
||||
@@ -1484,7 +1484,7 @@ static int conf_run(struct ast_channel *chan, struct ast_conference *conf, int c
|
||||
struct ast_conf_user *user = NULL;
|
||||
struct ast_conf_user *usr = NULL;
|
||||
int fd;
|
||||
struct zt_confinfo ztc, ztc_empty;
|
||||
struct dahdi_confinfo dahdic, dahdic_empty;
|
||||
struct ast_frame *f;
|
||||
struct ast_channel *c;
|
||||
struct ast_frame fr;
|
||||
@@ -1493,7 +1493,7 @@ static int conf_run(struct ast_channel *chan, struct ast_conference *conf, int c
|
||||
int nfds;
|
||||
int res;
|
||||
int flags;
|
||||
int retryzap;
|
||||
int retrydahdi;
|
||||
int origfd;
|
||||
int musiconhold = 0;
|
||||
int firstpass = 0;
|
||||
@@ -1520,7 +1520,7 @@ static int conf_run(struct ast_channel *chan, struct ast_conference *conf, int c
|
||||
char members[10] = "";
|
||||
int dtmf, opt_waitmarked_timeout = 0;
|
||||
time_t timeout = 0;
|
||||
ZT_BUFFERINFO bi;
|
||||
DAHDI_BUFFERINFO bi;
|
||||
char __buf[CONF_SIZE + AST_FRIENDLY_OFFSET];
|
||||
char *buf = __buf + AST_FRIENDLY_OFFSET;
|
||||
char *exitkeys = NULL;
|
||||
@@ -1645,13 +1645,13 @@ static int conf_run(struct ast_channel *chan, struct ast_conference *conf, int c
|
||||
}
|
||||
|
||||
ast_mutex_lock(&conf->recordthreadlock);
|
||||
if ((conf->recordthread == AST_PTHREADT_NULL) && (confflags & CONFFLAG_RECORDCONF) && ((conf->lchan = ast_request("zap", AST_FORMAT_SLINEAR, "pseudo", NULL)))) {
|
||||
if ((conf->recordthread == AST_PTHREADT_NULL) && (confflags & CONFFLAG_RECORDCONF) && ((conf->lchan = ast_request("DAHDI", AST_FORMAT_SLINEAR, "pseudo", NULL)))) {
|
||||
ast_set_read_format(conf->lchan, AST_FORMAT_SLINEAR);
|
||||
ast_set_write_format(conf->lchan, AST_FORMAT_SLINEAR);
|
||||
ztc.chan = 0;
|
||||
ztc.confno = conf->zapconf;
|
||||
ztc.confmode = ZT_CONF_CONFANN | ZT_CONF_CONFANNMON;
|
||||
if (ioctl(conf->lchan->fds[0], ZT_SETCONF, &ztc)) {
|
||||
dahdic.chan = 0;
|
||||
dahdic.confno = conf->dahdiconf;
|
||||
dahdic.confmode = DAHDI_CONF_CONFANN | DAHDI_CONF_CONFANNMON;
|
||||
if (ioctl(conf->lchan->fds[0], DAHDI_SETCONF, &dahdic)) {
|
||||
ast_log(LOG_WARNING, "Error starting listen channel\n");
|
||||
ast_hangup(conf->lchan);
|
||||
conf->lchan = NULL;
|
||||
@@ -1832,13 +1832,13 @@ static int conf_run(struct ast_channel *chan, struct ast_conference *conf, int c
|
||||
goto outrun;
|
||||
}
|
||||
|
||||
retryzap = (strcasecmp(chan->tech->type, "Zap") || (chan->audiohooks || chan->monitor) ? 1 : 0);
|
||||
user->zapchannel = !retryzap;
|
||||
retrydahdi = (strcasecmp(chan->tech->type, "DAHDI") || (chan->audiohooks || chan->monitor) ? 1 : 0);
|
||||
user->dahdichannel = !retrydahdi;
|
||||
|
||||
zapretry:
|
||||
dahdiretry:
|
||||
origfd = chan->fds[0];
|
||||
if (retryzap) {
|
||||
fd = open("/dev/zap/pseudo", O_RDWR);
|
||||
if (retrydahdi) {
|
||||
fd = open("/dev/dahdi/pseudo", O_RDWR);
|
||||
if (fd < 0) {
|
||||
ast_log(LOG_WARNING, "Unable to open pseudo channel: %s\n", strerror(errno));
|
||||
goto outrun;
|
||||
@@ -1859,16 +1859,16 @@ static int conf_run(struct ast_channel *chan, struct ast_conference *conf, int c
|
||||
/* Setup buffering information */
|
||||
memset(&bi, 0, sizeof(bi));
|
||||
bi.bufsize = CONF_SIZE / 2;
|
||||
bi.txbufpolicy = ZT_POLICY_IMMEDIATE;
|
||||
bi.rxbufpolicy = ZT_POLICY_IMMEDIATE;
|
||||
bi.txbufpolicy = DAHDI_POLICY_IMMEDIATE;
|
||||
bi.rxbufpolicy = DAHDI_POLICY_IMMEDIATE;
|
||||
bi.numbufs = audio_buffers;
|
||||
if (ioctl(fd, ZT_SET_BUFINFO, &bi)) {
|
||||
if (ioctl(fd, DAHDI_SET_BUFINFO, &bi)) {
|
||||
ast_log(LOG_WARNING, "Unable to set buffering information: %s\n", strerror(errno));
|
||||
close(fd);
|
||||
goto outrun;
|
||||
}
|
||||
x = 1;
|
||||
if (ioctl(fd, ZT_SETLINEAR, &x)) {
|
||||
if (ioctl(fd, DAHDI_SETLINEAR, &x)) {
|
||||
ast_log(LOG_WARNING, "Unable to set linear mode: %s\n", strerror(errno));
|
||||
close(fd);
|
||||
goto outrun;
|
||||
@@ -1879,27 +1879,27 @@ static int conf_run(struct ast_channel *chan, struct ast_conference *conf, int c
|
||||
fd = chan->fds[0];
|
||||
nfds = 0;
|
||||
}
|
||||
memset(&ztc, 0, sizeof(ztc));
|
||||
memset(&ztc_empty, 0, sizeof(ztc_empty));
|
||||
memset(&dahdic, 0, sizeof(dahdic));
|
||||
memset(&dahdic_empty, 0, sizeof(dahdic_empty));
|
||||
/* Check to see if we're in a conference... */
|
||||
ztc.chan = 0;
|
||||
if (ioctl(fd, ZT_GETCONF, &ztc)) {
|
||||
dahdic.chan = 0;
|
||||
if (ioctl(fd, DAHDI_GETCONF, &dahdic)) {
|
||||
ast_log(LOG_WARNING, "Error getting conference\n");
|
||||
close(fd);
|
||||
goto outrun;
|
||||
}
|
||||
if (ztc.confmode) {
|
||||
if (dahdic.confmode) {
|
||||
/* Whoa, already in a conference... Retry... */
|
||||
if (!retryzap) {
|
||||
ast_debug(1, "Zap channel is in a conference already, retrying with pseudo\n");
|
||||
retryzap = 1;
|
||||
goto zapretry;
|
||||
if (!retrydahdi) {
|
||||
ast_debug(1, "DAHDI channel is in a conference already, retrying with pseudo\n");
|
||||
retrydahdi = 1;
|
||||
goto dahdiretry;
|
||||
}
|
||||
}
|
||||
memset(&ztc, 0, sizeof(ztc));
|
||||
memset(&dahdic, 0, sizeof(dahdic));
|
||||
/* Add us to the conference */
|
||||
ztc.chan = 0;
|
||||
ztc.confno = conf->zapconf;
|
||||
dahdic.chan = 0;
|
||||
dahdic.confno = conf->dahdiconf;
|
||||
|
||||
ast_mutex_lock(&conf->playlock);
|
||||
|
||||
@@ -1913,21 +1913,21 @@ static int conf_run(struct ast_channel *chan, struct ast_conference *conf, int c
|
||||
}
|
||||
|
||||
if (confflags & CONFFLAG_WAITMARKED && !conf->markedusers)
|
||||
ztc.confmode = ZT_CONF_CONF;
|
||||
dahdic.confmode = DAHDI_CONF_CONF;
|
||||
else if (confflags & CONFFLAG_MONITOR)
|
||||
ztc.confmode = ZT_CONF_CONFMON | ZT_CONF_LISTENER;
|
||||
dahdic.confmode = DAHDI_CONF_CONFMON | DAHDI_CONF_LISTENER;
|
||||
else if (confflags & CONFFLAG_TALKER)
|
||||
ztc.confmode = ZT_CONF_CONF | ZT_CONF_TALKER;
|
||||
dahdic.confmode = DAHDI_CONF_CONF | DAHDI_CONF_TALKER;
|
||||
else
|
||||
ztc.confmode = ZT_CONF_CONF | ZT_CONF_TALKER | ZT_CONF_LISTENER;
|
||||
dahdic.confmode = DAHDI_CONF_CONF | DAHDI_CONF_TALKER | DAHDI_CONF_LISTENER;
|
||||
|
||||
if (ioctl(fd, ZT_SETCONF, &ztc)) {
|
||||
if (ioctl(fd, DAHDI_SETCONF, &dahdic)) {
|
||||
ast_log(LOG_WARNING, "Error setting conference\n");
|
||||
close(fd);
|
||||
ast_mutex_unlock(&conf->playlock);
|
||||
goto outrun;
|
||||
}
|
||||
ast_debug(1, "Placed channel %s in ZAP conf %d\n", chan->name, conf->zapconf);
|
||||
ast_debug(1, "Placed channel %s in ZAP conf %d\n", chan->name, conf->dahdiconf);
|
||||
|
||||
if (!sent_event) {
|
||||
manager_event(EVENT_FLAG_CALL, "MeetmeJoin",
|
||||
@@ -1968,8 +1968,8 @@ static int conf_run(struct ast_channel *chan, struct ast_conference *conf, int c
|
||||
}
|
||||
ast_channel_unlock(chan);
|
||||
|
||||
if (user->zapchannel) {
|
||||
/* Set CONFMUTE mode on Zap channel to mute DTMF tones */
|
||||
if (user->dahdichannel) {
|
||||
/* Set CONFMUTE mode on DAHDI channel to mute DTMF tones */
|
||||
x = 1;
|
||||
ast_channel_setoption(chan, AST_OPTION_TONE_VERIFY, &x, sizeof(char), 0);
|
||||
}
|
||||
@@ -1981,14 +1981,14 @@ static int conf_run(struct ast_channel *chan, struct ast_conference *conf, int c
|
||||
ast_log(LOG_WARNING, "Could not find application (agi)\n");
|
||||
ret = -2;
|
||||
}
|
||||
if (user->zapchannel) {
|
||||
/* Remove CONFMUTE mode on Zap channel */
|
||||
if (user->dahdichannel) {
|
||||
/* Remove CONFMUTE mode on DAHDI channel */
|
||||
x = 0;
|
||||
ast_channel_setoption(chan, AST_OPTION_TONE_VERIFY, &x, sizeof(char), 0);
|
||||
}
|
||||
} else {
|
||||
if (user->zapchannel && (confflags & CONFFLAG_STARMENU)) {
|
||||
/* Set CONFMUTE mode on Zap channel to mute DTMF tones when the menu is enabled */
|
||||
if (user->dahdichannel && (confflags & CONFFLAG_STARMENU)) {
|
||||
/* Set CONFMUTE mode on DAHDI channel to mute DTMF tones when the menu is enabled */
|
||||
x = 1;
|
||||
ast_channel_setoption(chan, AST_OPTION_TONE_VERIFY, &x, sizeof(char), 0);
|
||||
}
|
||||
@@ -2139,8 +2139,8 @@ static int conf_run(struct ast_channel *chan, struct ast_conference *conf, int c
|
||||
ret = 0;
|
||||
break;
|
||||
} else {
|
||||
ztc.confmode = ZT_CONF_CONF;
|
||||
if (ioctl(fd, ZT_SETCONF, &ztc)) {
|
||||
dahdic.confmode = DAHDI_CONF_CONF;
|
||||
if (ioctl(fd, DAHDI_SETCONF, &dahdic)) {
|
||||
ast_log(LOG_WARNING, "Error setting conference\n");
|
||||
close(fd);
|
||||
goto outrun;
|
||||
@@ -2155,12 +2155,12 @@ static int conf_run(struct ast_channel *chan, struct ast_conference *conf, int c
|
||||
/* Marked user entered, so cancel timeout */
|
||||
timeout = 0;
|
||||
if (confflags & CONFFLAG_MONITOR)
|
||||
ztc.confmode = ZT_CONF_CONFMON | ZT_CONF_LISTENER;
|
||||
dahdic.confmode = DAHDI_CONF_CONFMON | DAHDI_CONF_LISTENER;
|
||||
else if (confflags & CONFFLAG_TALKER)
|
||||
ztc.confmode = ZT_CONF_CONF | ZT_CONF_TALKER;
|
||||
dahdic.confmode = DAHDI_CONF_CONF | DAHDI_CONF_TALKER;
|
||||
else
|
||||
ztc.confmode = ZT_CONF_CONF | ZT_CONF_TALKER | ZT_CONF_LISTENER;
|
||||
if (ioctl(fd, ZT_SETCONF, &ztc)) {
|
||||
dahdic.confmode = DAHDI_CONF_CONF | DAHDI_CONF_TALKER | DAHDI_CONF_LISTENER;
|
||||
if (ioctl(fd, DAHDI_SETCONF, &dahdic)) {
|
||||
ast_log(LOG_WARNING, "Error setting conference\n");
|
||||
close(fd);
|
||||
goto outrun;
|
||||
@@ -2204,9 +2204,9 @@ static int conf_run(struct ast_channel *chan, struct ast_conference *conf, int c
|
||||
/* Check if my modes have changed */
|
||||
|
||||
/* If I should be muted but am still talker, mute me */
|
||||
if ((user->adminflags & (ADMINFLAG_MUTED | ADMINFLAG_SELFMUTED)) && (ztc.confmode & ZT_CONF_TALKER)) {
|
||||
ztc.confmode ^= ZT_CONF_TALKER;
|
||||
if (ioctl(fd, ZT_SETCONF, &ztc)) {
|
||||
if ((user->adminflags & (ADMINFLAG_MUTED | ADMINFLAG_SELFMUTED)) && (dahdic.confmode & DAHDI_CONF_TALKER)) {
|
||||
dahdic.confmode ^= DAHDI_CONF_TALKER;
|
||||
if (ioctl(fd, DAHDI_SETCONF, &dahdic)) {
|
||||
ast_log(LOG_WARNING, "Error setting conference - Un/Mute \n");
|
||||
ret = -1;
|
||||
break;
|
||||
@@ -2222,9 +2222,9 @@ static int conf_run(struct ast_channel *chan, struct ast_conference *conf, int c
|
||||
}
|
||||
|
||||
/* If I should be un-muted but am not talker, un-mute me */
|
||||
if (!(user->adminflags & (ADMINFLAG_MUTED | ADMINFLAG_SELFMUTED)) && !(confflags & CONFFLAG_MONITOR) && !(ztc.confmode & ZT_CONF_TALKER)) {
|
||||
ztc.confmode |= ZT_CONF_TALKER;
|
||||
if (ioctl(fd, ZT_SETCONF, &ztc)) {
|
||||
if (!(user->adminflags & (ADMINFLAG_MUTED | ADMINFLAG_SELFMUTED)) && !(confflags & CONFFLAG_MONITOR) && !(dahdic.confmode & DAHDI_CONF_TALKER)) {
|
||||
dahdic.confmode |= DAHDI_CONF_TALKER;
|
||||
if (ioctl(fd, DAHDI_SETCONF, &dahdic)) {
|
||||
ast_log(LOG_WARNING, "Error setting conference - Un/Mute \n");
|
||||
ret = -1;
|
||||
break;
|
||||
@@ -2283,16 +2283,16 @@ static int conf_run(struct ast_channel *chan, struct ast_conference *conf, int c
|
||||
if (c) {
|
||||
char dtmfstr[2] = "";
|
||||
|
||||
if (c->fds[0] != origfd || (user->zapchannel && (c->audiohooks || c->monitor))) {
|
||||
if (c->fds[0] != origfd || (user->dahdichannel && (c->audiohooks || c->monitor))) {
|
||||
if (using_pseudo) {
|
||||
/* Kill old pseudo */
|
||||
close(fd);
|
||||
using_pseudo = 0;
|
||||
}
|
||||
ast_debug(1, "Ooh, something swapped out under us, starting over\n");
|
||||
retryzap = (strcasecmp(c->tech->type, "Zap") || (c->audiohooks || c->monitor) ? 1 : 0);
|
||||
user->zapchannel = !retryzap;
|
||||
goto zapretry;
|
||||
retrydahdi = (strcasecmp(c->tech->type, "DAHDI") || (c->audiohooks || c->monitor) ? 1 : 0);
|
||||
user->dahdichannel = !retrydahdi;
|
||||
goto dahdiretry;
|
||||
}
|
||||
if ((confflags & CONFFLAG_MONITOR) || (user->adminflags & (ADMINFLAG_MUTED | ADMINFLAG_SELFMUTED)))
|
||||
f = ast_read_noaudio(c);
|
||||
@@ -2358,7 +2358,7 @@ static int conf_run(struct ast_channel *chan, struct ast_conference *conf, int c
|
||||
} else if (((f->frametype == AST_FRAME_DTMF) && (f->subclass == '*') && (confflags & CONFFLAG_STARMENU)) || ((f->frametype == AST_FRAME_DTMF) && menu_active)) {
|
||||
if (confflags & CONFFLAG_PASS_DTMF)
|
||||
conf_queue_dtmf(conf, user, f);
|
||||
if (ioctl(fd, ZT_SETCONF, &ztc_empty)) {
|
||||
if (ioctl(fd, DAHDI_SETCONF, &dahdic_empty)) {
|
||||
ast_log(LOG_WARNING, "Error setting conference\n");
|
||||
close(fd);
|
||||
ast_frfree(f);
|
||||
@@ -2513,7 +2513,7 @@ static int conf_run(struct ast_channel *chan, struct ast_conference *conf, int c
|
||||
if (musiconhold)
|
||||
conf_start_moh(chan, optargs[OPT_ARG_MOH_CLASS]);
|
||||
|
||||
if (ioctl(fd, ZT_SETCONF, &ztc)) {
|
||||
if (ioctl(fd, DAHDI_SETCONF, &dahdic)) {
|
||||
ast_log(LOG_WARNING, "Error setting conference\n");
|
||||
close(fd);
|
||||
ast_frfree(f);
|
||||
@@ -2625,10 +2625,10 @@ bailoutandtrynormal:
|
||||
close(fd);
|
||||
else {
|
||||
/* Take out of conference */
|
||||
ztc.chan = 0;
|
||||
ztc.confno = 0;
|
||||
ztc.confmode = 0;
|
||||
if (ioctl(fd, ZT_SETCONF, &ztc)) {
|
||||
dahdic.chan = 0;
|
||||
dahdic.confno = 0;
|
||||
dahdic.confmode = 0;
|
||||
if (ioctl(fd, DAHDI_SETCONF, &dahdic)) {
|
||||
ast_log(LOG_WARNING, "Error setting conference\n");
|
||||
}
|
||||
}
|
||||
@@ -2834,13 +2834,13 @@ static struct ast_conference *find_conf_realtime(struct ast_channel *chan, char
|
||||
if (confflags && !cnf->chan &&
|
||||
!ast_test_flag(confflags, CONFFLAG_QUIET) &&
|
||||
ast_test_flag(confflags, CONFFLAG_INTROUSER)) {
|
||||
ast_log(LOG_WARNING, "No Zap channel available for conference, user introduction disabled (is chan_zap loaded?)\n");
|
||||
ast_log(LOG_WARNING, "No DAHDI channel available for conference, user introduction disabled (is chan_dahdi loaded?)\n");
|
||||
ast_clear_flag(confflags, CONFFLAG_INTROUSER);
|
||||
}
|
||||
|
||||
if (confflags && !cnf->chan &&
|
||||
ast_test_flag(confflags, CONFFLAG_RECORDCONF)) {
|
||||
ast_log(LOG_WARNING, "No Zap channel available for conference, conference recording disabled (is chan_zap loaded?)\n");
|
||||
ast_log(LOG_WARNING, "No DAHDI channel available for conference, conference recording disabled (is chan_dahdi loaded?)\n");
|
||||
ast_clear_flag(confflags, CONFFLAG_RECORDCONF);
|
||||
}
|
||||
}
|
||||
@@ -2932,13 +2932,13 @@ static struct ast_conference *find_conf(struct ast_channel *chan, char *confno,
|
||||
if (confflags && !cnf->chan &&
|
||||
!ast_test_flag(confflags, CONFFLAG_QUIET) &&
|
||||
ast_test_flag(confflags, CONFFLAG_INTROUSER)) {
|
||||
ast_log(LOG_WARNING, "No Zap channel available for conference, user introduction disabled (is chan_zap loaded?)\n");
|
||||
ast_log(LOG_WARNING, "No DAHDI channel available for conference, user introduction disabled (is chan_dahdi loaded?)\n");
|
||||
ast_clear_flag(confflags, CONFFLAG_INTROUSER);
|
||||
}
|
||||
|
||||
if (confflags && !cnf->chan &&
|
||||
ast_test_flag(confflags, CONFFLAG_RECORDCONF)) {
|
||||
ast_log(LOG_WARNING, "No Zap channel available for conference, conference recording disabled (is chan_zap loaded?)\n");
|
||||
ast_log(LOG_WARNING, "No DAHDI channel available for conference, conference recording disabled (is chan_dahdi loaded?)\n");
|
||||
ast_clear_flag(confflags, CONFFLAG_RECORDCONF);
|
||||
}
|
||||
}
|
||||
@@ -3722,9 +3722,9 @@ static void load_config_meetme(void)
|
||||
if ((sscanf(val, "%d", &audio_buffers) != 1)) {
|
||||
ast_log(LOG_WARNING, "audiobuffers setting must be a number, not '%s'\n", val);
|
||||
audio_buffers = DEFAULT_AUDIO_BUFFERS;
|
||||
} else if ((audio_buffers < ZT_DEFAULT_NUM_BUFS) || (audio_buffers > ZT_MAX_NUM_BUFS)) {
|
||||
} else if ((audio_buffers < DAHDI_DEFAULT_NUM_BUFS) || (audio_buffers > DAHDI_MAX_NUM_BUFS)) {
|
||||
ast_log(LOG_WARNING, "audiobuffers setting must be between %d and %d\n",
|
||||
ZT_DEFAULT_NUM_BUFS, ZT_MAX_NUM_BUFS);
|
||||
DAHDI_DEFAULT_NUM_BUFS, DAHDI_MAX_NUM_BUFS);
|
||||
audio_buffers = DEFAULT_AUDIO_BUFFERS;
|
||||
}
|
||||
if (audio_buffers != DEFAULT_AUDIO_BUFFERS)
|
||||
|
||||
+1
-1
@@ -26,7 +26,7 @@
|
||||
*/
|
||||
|
||||
/*** MODULEINFO
|
||||
<depend>zaptel</depend>
|
||||
<depend>dahdi</depend>
|
||||
<depend>app_meetme</depend>
|
||||
***/
|
||||
|
||||
|
||||
+16
-98
@@ -529,7 +529,6 @@ static struct ao2_container *queues;
|
||||
static void update_realtime_members(struct call_queue *q);
|
||||
static int set_member_paused(const char *queuename, const char *interface, const char *reason, int paused);
|
||||
|
||||
static void queue_transfer_fixup(void *data, struct ast_channel *old_chan, struct ast_channel *new_chan);
|
||||
/*! \brief sets the QUEUESTATUS channel variable */
|
||||
static void set_queue_result(struct ast_channel *chan, enum queue_result res)
|
||||
{
|
||||
@@ -3043,82 +3042,6 @@ static void send_agent_complete(const struct queue_ent *qe, const char *queuenam
|
||||
qe->parent->eventwhencalled == QUEUE_EVENT_VARIABLES ? vars2manager(qe->chan, vars, vars_len) : "");
|
||||
}
|
||||
|
||||
struct queue_transfer_ds {
|
||||
struct queue_ent *qe;
|
||||
struct member *member;
|
||||
int starttime;
|
||||
};
|
||||
|
||||
/*! \brief a datastore used to help correctly log attended transfers of queue callers
|
||||
*/
|
||||
static const struct ast_datastore_info queue_transfer_info = {
|
||||
.type = "queue_transfer",
|
||||
.chan_fixup = queue_transfer_fixup,
|
||||
};
|
||||
|
||||
/*! \brief Log an attended transfer when a queue caller channel is masqueraded
|
||||
*
|
||||
* When a caller is masqueraded, we want to log a transfer. Fixup time is the closest we can come to when
|
||||
* the actual transfer occurs. This happens during the masquerade after datastores are moved from old_chan
|
||||
* to new_chan. This is why new_chan is referenced for exten, context, and datastore information.
|
||||
*
|
||||
* At the end of this, we want to remove the datastore so that this fixup function is not called on any
|
||||
* future masquerades of the caller during the current call.
|
||||
*/
|
||||
static void queue_transfer_fixup(void *data, struct ast_channel *old_chan, struct ast_channel *new_chan)
|
||||
{
|
||||
struct queue_transfer_ds *qtds = data;
|
||||
struct queue_ent *qe = qtds->qe;
|
||||
struct member *member = qtds->member;
|
||||
int callstart = qtds->starttime;
|
||||
struct ast_datastore *datastore;
|
||||
|
||||
ast_queue_log(qe->parent->name, qe->chan->uniqueid, member->membername, "TRANSFER", "%s|%s|%ld|%ld",
|
||||
new_chan->exten, new_chan->context, (long) (callstart - qe->start),
|
||||
(long) (time(NULL) - callstart));
|
||||
|
||||
if (!(datastore = ast_channel_datastore_find(new_chan, &queue_transfer_info, NULL))) {
|
||||
ast_log(LOG_WARNING, "Can't find the queue_transfer datastore.\n");
|
||||
return;
|
||||
}
|
||||
|
||||
ast_channel_datastore_remove(new_chan, datastore);
|
||||
}
|
||||
|
||||
/*! \brief mechanism to tell if a queue caller was atxferred by a queue member.
|
||||
*
|
||||
* When a caller is atxferred, then the queue_transfer_info datastore
|
||||
* is removed from the channel. If it's still there after the bridge is
|
||||
* broken, then the caller was not atxferred.
|
||||
*/
|
||||
static int attended_transfer_occurred(struct ast_channel *chan)
|
||||
{
|
||||
return ast_channel_datastore_find(chan, &queue_transfer_info, NULL) ? 0 : 1;
|
||||
}
|
||||
|
||||
/*! \brief create a datastore for storing relevant info to log attended transfers in the queue_log
|
||||
*/
|
||||
static void setup_transfer_datastore(struct queue_ent *qe, struct member *member, int starttime)
|
||||
{
|
||||
struct ast_datastore *ds;
|
||||
struct queue_transfer_ds qtds;
|
||||
|
||||
ast_channel_lock(qe->chan);
|
||||
if (!(ds = ast_channel_datastore_alloc(&queue_transfer_info, NULL))) {
|
||||
ast_channel_unlock(qe->chan);
|
||||
ast_log(LOG_WARNING, "Unable to create transfer datastore. queue_log will not show attended transfer\n");
|
||||
return;
|
||||
}
|
||||
|
||||
qtds.qe = qe;
|
||||
/* This member is refcounted in try_calling, so no need to add it here, too */
|
||||
qtds.member = member;
|
||||
qtds.starttime = starttime;
|
||||
ds->data = &qtds;
|
||||
ast_channel_datastore_add(qe->chan, ds);
|
||||
ast_channel_unlock(qe->chan);
|
||||
}
|
||||
|
||||
/*! \brief A large function which calls members, updates statistics, and bridges the caller and a member
|
||||
*
|
||||
* Here is the process of this function
|
||||
@@ -3396,9 +3319,9 @@ static int try_calling(struct queue_ent *qe, const char *options, char *announce
|
||||
/* Ah ha! Someone answered within the desired timeframe. Of course after this
|
||||
we will always return with -1 so that it is hung up properly after the
|
||||
conversation. */
|
||||
if (!strcmp(qe->chan->tech->type, "Zap"))
|
||||
if (!strcmp(qe->chan->tech->type, "DAHDI"))
|
||||
ast_channel_setoption(qe->chan, AST_OPTION_TONE_VERIFY, &nondataquality, sizeof(nondataquality), 0);
|
||||
if (!strcmp(peer->tech->type, "Zap"))
|
||||
if (!strcmp(peer->tech->type, "DAHDI"))
|
||||
ast_channel_setoption(peer, AST_OPTION_TONE_VERIFY, &nondataquality, sizeof(nondataquality), 0);
|
||||
/* Update parameters for the queue */
|
||||
time(&now);
|
||||
@@ -3758,27 +3681,22 @@ static int try_calling(struct queue_ent *qe, const char *options, char *announce
|
||||
ast_copy_string(oldcontext, qe->chan->context, sizeof(oldcontext));
|
||||
ast_copy_string(oldexten, qe->chan->exten, sizeof(oldexten));
|
||||
time(&callstart);
|
||||
setup_transfer_datastore(qe, member, callstart);
|
||||
|
||||
bridge = ast_bridge_call(qe->chan,peer, &bridge_config);
|
||||
|
||||
/* If the queue member did an attended transfer, then the TRANSFER already was logged in the queue_log
|
||||
* when the masquerade occurred. These other "ending" queue_log messages are unnecessary
|
||||
*/
|
||||
if (!attended_transfer_occurred(qe->chan)) {
|
||||
if (strcasecmp(oldcontext, qe->chan->context) || strcasecmp(oldexten, qe->chan->exten)) {
|
||||
ast_queue_log(queuename, qe->chan->uniqueid, member->membername, "TRANSFER", "%s|%s|%ld|%ld",
|
||||
qe->chan->exten, qe->chan->context, (long) (callstart - qe->start),
|
||||
(long) (time(NULL) - callstart));
|
||||
send_agent_complete(qe, queuename, peer, member, callstart, vars, sizeof(vars), TRANSFER);
|
||||
} else if (ast_check_hangup(qe->chan)) {
|
||||
ast_queue_log(queuename, qe->chan->uniqueid, member->membername, "COMPLETECALLER", "%ld|%ld|%d",
|
||||
(long) (callstart - qe->start), (long) (time(NULL) - callstart), qe->opos);
|
||||
send_agent_complete(qe, queuename, peer, member, callstart, vars, sizeof(vars), CALLER);
|
||||
} else {
|
||||
ast_queue_log(queuename, qe->chan->uniqueid, member->membername, "COMPLETEAGENT", "%ld|%ld|%d",
|
||||
(long) (callstart - qe->start), (long) (time(NULL) - callstart), qe->opos);
|
||||
send_agent_complete(qe, queuename, peer, member, callstart, vars, sizeof(vars), AGENT);
|
||||
}
|
||||
if (strcasecmp(oldcontext, qe->chan->context) || strcasecmp(oldexten, qe->chan->exten)) {
|
||||
ast_queue_log(queuename, qe->chan->uniqueid, member->membername, "TRANSFER", "%s|%s|%ld|%ld",
|
||||
qe->chan->exten, qe->chan->context, (long) (callstart - qe->start),
|
||||
(long) (time(NULL) - callstart));
|
||||
send_agent_complete(qe, queuename, peer, member, callstart, vars, sizeof(vars), TRANSFER);
|
||||
} else if (ast_check_hangup(qe->chan)) {
|
||||
ast_queue_log(queuename, qe->chan->uniqueid, member->membername, "COMPLETECALLER", "%ld|%ld|%d",
|
||||
(long) (callstart - qe->start), (long) (time(NULL) - callstart), qe->opos);
|
||||
send_agent_complete(qe, queuename, peer, member, callstart, vars, sizeof(vars), CALLER);
|
||||
} else {
|
||||
ast_queue_log(queuename, qe->chan->uniqueid, member->membername, "COMPLETEAGENT", "%ld|%ld|%d",
|
||||
(long) (callstart - qe->start), (long) (time(NULL) - callstart), qe->opos);
|
||||
send_agent_complete(qe, queuename, peer, member, callstart, vars, sizeof(vars), AGENT);
|
||||
}
|
||||
|
||||
if (bridge != AST_PBX_NO_HANGUP_PEER)
|
||||
|
||||
+201
-201
@@ -152,7 +152,7 @@
|
||||
*/
|
||||
|
||||
/*** MODULEINFO
|
||||
<depend>zaptel</depend>
|
||||
<depend>dahdi</depend>
|
||||
<depend>tonezone</depend>
|
||||
<defaultenabled>no</defaultenabled>
|
||||
***/
|
||||
@@ -763,7 +763,7 @@ static struct rpt
|
||||
int parrottimer;
|
||||
unsigned int parrotcnt;
|
||||
struct ast_channel *rxchannel,*txchannel, *monchannel, *parrotchannel;
|
||||
struct ast_channel *pchannel,*txpchannel, *zaprxchannel, *zaptxchannel;
|
||||
struct ast_channel *pchannel,*txpchannel, *dahdirxchannel, *dahditxchannel;
|
||||
struct ast_channel *voxchannel;
|
||||
struct ast_frame *lastf1,*lastf2;
|
||||
struct rpt_tele tele;
|
||||
@@ -3601,13 +3601,13 @@ static struct morse_bits mbits[] = {
|
||||
ast_stopstream(chan);
|
||||
|
||||
/*
|
||||
* Wait for the zaptel driver to physically write the tone blocks to the hardware
|
||||
* Wait for the DAHDI driver to physically write the tone blocks to the hardware
|
||||
*/
|
||||
|
||||
for(i = 0; i < 20 ; i++){
|
||||
flags = ZT_IOMUX_WRITEEMPTY | ZT_IOMUX_NOWAIT;
|
||||
res = ioctl(chan->fds[0], ZT_IOMUX, &flags);
|
||||
if(flags & ZT_IOMUX_WRITEEMPTY)
|
||||
flags = DAHDI_IOMUX_WRITEEMPTY | DAHDI_IOMUX_NOWAIT;
|
||||
res = ioctl(chan->fds[0], DAHDI_IOMUX, &flags);
|
||||
if(flags & DAHDI_IOMUX_WRITEEMPTY)
|
||||
break;
|
||||
if( ast_safe_sleep(chan, 50)){
|
||||
res = -1;
|
||||
@@ -3658,13 +3658,13 @@ static int send_tone_telemetry(struct ast_channel *chan, char *tonestring)
|
||||
ast_stopstream(chan);
|
||||
|
||||
/*
|
||||
* Wait for the zaptel driver to physically write the tone blocks to the hardware
|
||||
* Wait for the DAHDI driver to physically write the tone blocks to the hardware
|
||||
*/
|
||||
|
||||
for(i = 0; i < 20 ; i++){
|
||||
flags = ZT_IOMUX_WRITEEMPTY | ZT_IOMUX_NOWAIT;
|
||||
res = ioctl(chan->fds[0], ZT_IOMUX, &flags);
|
||||
if(flags & ZT_IOMUX_WRITEEMPTY)
|
||||
flags = DAHDI_IOMUX_WRITEEMPTY | DAHDI_IOMUX_NOWAIT;
|
||||
res = ioctl(chan->fds[0], DAHDI_IOMUX, &flags);
|
||||
if(flags & DAHDI_IOMUX_WRITEEMPTY)
|
||||
break;
|
||||
if( ast_safe_sleep(chan, 50)){
|
||||
res = -1;
|
||||
@@ -3934,7 +3934,7 @@ static int split_freq(char *mhz, char *decimals, char *freq);
|
||||
|
||||
static void *rpt_tele_thread(void *this)
|
||||
{
|
||||
ZT_CONFINFO ci; /* conference info */
|
||||
DAHDI_CONFINFO ci; /* conference info */
|
||||
int res = 0,haslink,hastx,hasremote,imdone = 0, unkeys_queued, x;
|
||||
struct rpt_tele *mytele = (struct rpt_tele *)this;
|
||||
struct rpt_tele *tlist;
|
||||
@@ -3954,7 +3954,7 @@ int i,ns,rbimode;
|
||||
char mhz[MAXREMSTR];
|
||||
char decimals[MAXREMSTR];
|
||||
char mystr[200];
|
||||
struct zt_params par;
|
||||
struct dahdi_params par;
|
||||
|
||||
|
||||
/* get a pointer to myrpt */
|
||||
@@ -4002,7 +4002,7 @@ struct zt_params par;
|
||||
|
||||
|
||||
/* allocate a pseudo-channel thru asterisk */
|
||||
mychannel = ast_request("zap",AST_FORMAT_SLINEAR,"pseudo",NULL);
|
||||
mychannel = ast_request("DAHDI",AST_FORMAT_SLINEAR,"pseudo",NULL);
|
||||
if (!mychannel)
|
||||
{
|
||||
fprintf(stderr,"rpt:Sorry unable to obtain pseudo channel\n");
|
||||
@@ -4047,9 +4047,9 @@ struct zt_params par;
|
||||
(mytele->mode == TAILMSG) || (mytele->mode == LINKUNKEY) || (mytele->mode == TIMEOUT) ||
|
||||
(mytele->mode == PARROT) || (mytele->mode == STATS_TIME_LOCAL)) ?
|
||||
myrpt->txconf : myrpt->conf);
|
||||
ci.confmode = ZT_CONF_CONFANN;
|
||||
ci.confmode = DAHDI_CONF_CONFANN;
|
||||
/* first put the channel on the conference in announce mode */
|
||||
if (ioctl(mychannel->fds[0],ZT_SETCONF,&ci) == -1)
|
||||
if (ioctl(mychannel->fds[0],DAHDI_SETCONF,&ci) == -1)
|
||||
{
|
||||
ast_log(LOG_WARNING, "Unable to set conference mode to Announce\n");
|
||||
rpt_mutex_lock(&myrpt->lock);
|
||||
@@ -4242,9 +4242,9 @@ struct zt_params par;
|
||||
/* set for all to hear */
|
||||
ci.chan = 0;
|
||||
ci.confno = myrpt->conf;
|
||||
ci.confmode = ZT_CONF_CONFANN;
|
||||
ci.confmode = DAHDI_CONF_CONFANN;
|
||||
/* first put the channel on the conference in announce mode */
|
||||
if (ioctl(mychannel->fds[0],ZT_SETCONF,&ci) == -1)
|
||||
if (ioctl(mychannel->fds[0],DAHDI_SETCONF,&ci) == -1)
|
||||
{
|
||||
ast_log(LOG_WARNING, "Unable to set conference mode to Announce\n");
|
||||
rpt_mutex_lock(&myrpt->lock);
|
||||
@@ -4283,9 +4283,9 @@ struct zt_params par;
|
||||
/* set for all to hear */
|
||||
ci.chan = 0;
|
||||
ci.confno = myrpt->txconf;
|
||||
ci.confmode = ZT_CONF_CONFANN;
|
||||
ci.confmode = DAHDI_CONF_CONFANN;
|
||||
/* first put the channel on the conference in announce mode */
|
||||
if (ioctl(mychannel->fds[0],ZT_SETCONF,&ci) == -1)
|
||||
if (ioctl(mychannel->fds[0],DAHDI_SETCONF,&ci) == -1)
|
||||
{
|
||||
ast_log(LOG_WARNING, "Unable to set conference mode to Announce\n");
|
||||
rpt_mutex_lock(&myrpt->lock);
|
||||
@@ -4512,15 +4512,15 @@ struct zt_params par;
|
||||
}
|
||||
if (myrpt->iofd < 0)
|
||||
{
|
||||
i = ZT_FLUSH_EVENT;
|
||||
if (ioctl(myrpt->zaptxchannel->fds[0],ZT_FLUSH,&i) == -1)
|
||||
i = DAHDI_FLUSH_EVENT;
|
||||
if (ioctl(myrpt->dahditxchannel->fds[0],DAHDI_FLUSH,&i) == -1)
|
||||
{
|
||||
ast_mutex_unlock(&myrpt->remlock);
|
||||
ast_log(LOG_ERROR,"Cant flush events");
|
||||
res = -1;
|
||||
break;
|
||||
}
|
||||
if (ioctl(myrpt->zaprxchannel->fds[0],ZT_GET_PARAMS,&par) == -1)
|
||||
if (ioctl(myrpt->dahdirxchannel->fds[0],DAHDI_GET_PARAMS,&par) == -1)
|
||||
{
|
||||
ast_mutex_unlock(&myrpt->remlock);
|
||||
ast_log(LOG_ERROR,"Cant get params");
|
||||
@@ -5285,7 +5285,7 @@ char *v1, *v2;
|
||||
|
||||
static void *rpt_call(void *this)
|
||||
{
|
||||
ZT_CONFINFO ci; /* conference info */
|
||||
DAHDI_CONFINFO ci; /* conference info */
|
||||
struct rpt *myrpt = (struct rpt *)this;
|
||||
int res;
|
||||
int stopped,congstarted,dialtimer,lastcidx,aborted;
|
||||
@@ -5293,7 +5293,7 @@ struct ast_channel *mychannel,*genchannel;
|
||||
|
||||
myrpt->mydtmf = 0;
|
||||
/* allocate a pseudo-channel thru asterisk */
|
||||
mychannel = ast_request("zap",AST_FORMAT_SLINEAR,"pseudo",NULL);
|
||||
mychannel = ast_request("DAHDI",AST_FORMAT_SLINEAR,"pseudo",NULL);
|
||||
if (!mychannel)
|
||||
{
|
||||
fprintf(stderr,"rpt:Sorry unable to obtain pseudo channel\n");
|
||||
@@ -5306,12 +5306,12 @@ struct ast_channel *mychannel,*genchannel;
|
||||
ci.chan = 0;
|
||||
ci.confno = myrpt->conf; /* use the pseudo conference */
|
||||
#if 0
|
||||
ci.confmode = ZT_CONF_REALANDPSEUDO | ZT_CONF_TALKER | ZT_CONF_LISTENER
|
||||
| ZT_CONF_PSEUDO_TALKER | ZT_CONF_PSEUDO_LISTENER;
|
||||
ci.confmode = DAHDI_CONF_REALANDPSEUDO | DAHDI_CONF_TALKER | DAHDI_CONF_LISTENER
|
||||
| DAHDI_CONF_PSEUDO_TALKER | DAHDI_CONF_PSEUDO_LISTENER;
|
||||
#endif
|
||||
ci.confmode = ZT_CONF_CONF | ZT_CONF_TALKER | ZT_CONF_LISTENER;
|
||||
ci.confmode = DAHDI_CONF_CONF | DAHDI_CONF_TALKER | DAHDI_CONF_LISTENER;
|
||||
/* first put the channel on the conference */
|
||||
if (ioctl(mychannel->fds[0],ZT_SETCONF,&ci) == -1)
|
||||
if (ioctl(mychannel->fds[0],DAHDI_SETCONF,&ci) == -1)
|
||||
{
|
||||
ast_log(LOG_WARNING, "Unable to set conference mode to Announce\n");
|
||||
ast_hangup(mychannel);
|
||||
@@ -5319,7 +5319,7 @@ struct ast_channel *mychannel,*genchannel;
|
||||
pthread_exit(NULL);
|
||||
}
|
||||
/* allocate a pseudo-channel thru asterisk */
|
||||
genchannel = ast_request("zap",AST_FORMAT_SLINEAR,"pseudo",NULL);
|
||||
genchannel = ast_request("DAHDI",AST_FORMAT_SLINEAR,"pseudo",NULL);
|
||||
if (!genchannel)
|
||||
{
|
||||
fprintf(stderr,"rpt:Sorry unable to obtain pseudo channel\n");
|
||||
@@ -5332,10 +5332,10 @@ struct ast_channel *mychannel,*genchannel;
|
||||
#endif
|
||||
ci.chan = 0;
|
||||
ci.confno = myrpt->conf;
|
||||
ci.confmode = ZT_CONF_REALANDPSEUDO | ZT_CONF_TALKER | ZT_CONF_LISTENER
|
||||
| ZT_CONF_PSEUDO_TALKER | ZT_CONF_PSEUDO_LISTENER;
|
||||
ci.confmode = DAHDI_CONF_REALANDPSEUDO | DAHDI_CONF_TALKER | DAHDI_CONF_LISTENER
|
||||
| DAHDI_CONF_PSEUDO_TALKER | DAHDI_CONF_PSEUDO_LISTENER;
|
||||
/* first put the channel on the conference */
|
||||
if (ioctl(genchannel->fds[0],ZT_SETCONF,&ci) == -1)
|
||||
if (ioctl(genchannel->fds[0],DAHDI_SETCONF,&ci) == -1)
|
||||
{
|
||||
ast_log(LOG_WARNING, "Unable to set conference mode to Announce\n");
|
||||
ast_hangup(mychannel);
|
||||
@@ -5360,7 +5360,7 @@ struct ast_channel *mychannel,*genchannel;
|
||||
pthread_exit(NULL);
|
||||
}
|
||||
/* start dialtone if patchquiet is 0. Special patch modes don't send dial tone */
|
||||
if ((!myrpt->patchquiet) && (tone_zone_play_tone(genchannel->fds[0],ZT_TONE_DIALTONE) < 0))
|
||||
if ((!myrpt->patchquiet) && (tone_zone_play_tone(genchannel->fds[0],DAHDI_TONE_DIALTONE) < 0))
|
||||
{
|
||||
ast_log(LOG_WARNING, "Cannot start dialtone\n");
|
||||
ast_hangup(mychannel);
|
||||
@@ -5414,7 +5414,7 @@ struct ast_channel *mychannel,*genchannel;
|
||||
if(!congstarted){
|
||||
congstarted = 1;
|
||||
/* start congestion tone */
|
||||
tone_zone_play_tone(genchannel->fds[0],ZT_TONE_CONGESTION);
|
||||
tone_zone_play_tone(genchannel->fds[0],DAHDI_TONE_CONGESTION);
|
||||
}
|
||||
}
|
||||
res = ast_safe_sleep(mychannel, MSWAIT);
|
||||
@@ -5492,10 +5492,10 @@ struct ast_channel *mychannel,*genchannel;
|
||||
/* set appropriate conference for the pseudo */
|
||||
ci.chan = 0;
|
||||
ci.confno = myrpt->conf;
|
||||
ci.confmode = (myrpt->p.duplex == 2) ? ZT_CONF_CONFANNMON :
|
||||
(ZT_CONF_CONF | ZT_CONF_LISTENER | ZT_CONF_TALKER);
|
||||
ci.confmode = (myrpt->p.duplex == 2) ? DAHDI_CONF_CONFANNMON :
|
||||
(DAHDI_CONF_CONF | DAHDI_CONF_LISTENER | DAHDI_CONF_TALKER);
|
||||
/* first put the channel on the conference in announce mode */
|
||||
if (ioctl(myrpt->pchannel->fds[0],ZT_SETCONF,&ci) == -1)
|
||||
if (ioctl(myrpt->pchannel->fds[0],DAHDI_SETCONF,&ci) == -1)
|
||||
{
|
||||
ast_log(LOG_WARNING, "Unable to set conference mode to Announce\n");
|
||||
ast_hangup(mychannel);
|
||||
@@ -5504,7 +5504,7 @@ struct ast_channel *mychannel,*genchannel;
|
||||
pthread_exit(NULL);
|
||||
}
|
||||
/* get its channel number */
|
||||
if (ioctl(mychannel->fds[0],ZT_CHANNO,&res) == -1)
|
||||
if (ioctl(mychannel->fds[0],DAHDI_CHANNO,&res) == -1)
|
||||
{
|
||||
ast_log(LOG_WARNING, "Unable to get autopatch channel number\n");
|
||||
ast_hangup(mychannel);
|
||||
@@ -5513,9 +5513,9 @@ struct ast_channel *mychannel,*genchannel;
|
||||
}
|
||||
ci.chan = 0;
|
||||
ci.confno = res;
|
||||
ci.confmode = ZT_CONF_MONITOR;
|
||||
ci.confmode = DAHDI_CONF_MONITOR;
|
||||
/* put vox channel monitoring on the channel */
|
||||
if (ioctl(myrpt->voxchannel->fds[0],ZT_SETCONF,&ci) == -1)
|
||||
if (ioctl(myrpt->voxchannel->fds[0],DAHDI_SETCONF,&ci) == -1)
|
||||
{
|
||||
ast_log(LOG_WARNING, "Unable to set conference mode to Announce\n");
|
||||
ast_hangup(mychannel);
|
||||
@@ -5542,7 +5542,7 @@ struct ast_channel *mychannel,*genchannel;
|
||||
myrpt->callmode = 4;
|
||||
rpt_mutex_unlock(&myrpt->lock);
|
||||
/* start congestion tone */
|
||||
tone_zone_play_tone(genchannel->fds[0],ZT_TONE_CONGESTION);
|
||||
tone_zone_play_tone(genchannel->fds[0],DAHDI_TONE_CONGESTION);
|
||||
rpt_mutex_lock(&myrpt->lock);
|
||||
}
|
||||
}
|
||||
@@ -5578,10 +5578,10 @@ struct ast_channel *mychannel,*genchannel;
|
||||
/* set appropriate conference for the pseudo */
|
||||
ci.chan = 0;
|
||||
ci.confno = myrpt->conf;
|
||||
ci.confmode = ((myrpt->p.duplex == 2) || (myrpt->p.duplex == 4)) ? ZT_CONF_CONFANNMON :
|
||||
(ZT_CONF_CONF | ZT_CONF_LISTENER | ZT_CONF_TALKER);
|
||||
ci.confmode = ((myrpt->p.duplex == 2) || (myrpt->p.duplex == 4)) ? DAHDI_CONF_CONFANNMON :
|
||||
(DAHDI_CONF_CONF | DAHDI_CONF_LISTENER | DAHDI_CONF_TALKER);
|
||||
/* first put the channel on the conference in announce mode */
|
||||
if (ioctl(myrpt->pchannel->fds[0],ZT_SETCONF,&ci) == -1)
|
||||
if (ioctl(myrpt->pchannel->fds[0],DAHDI_SETCONF,&ci) == -1)
|
||||
{
|
||||
ast_log(LOG_WARNING, "Unable to set conference mode to Announce\n");
|
||||
}
|
||||
@@ -5690,7 +5690,7 @@ static int connect_link(struct rpt *myrpt, char* node, int mode, int perma)
|
||||
struct rpt_link *l;
|
||||
int reconnects = 0;
|
||||
int i,n;
|
||||
ZT_CONFINFO ci; /* conference info */
|
||||
DAHDI_CONFINFO ci; /* conference info */
|
||||
|
||||
val = node_lookup(myrpt,node);
|
||||
if (!val){
|
||||
@@ -5829,7 +5829,7 @@ static int connect_link(struct rpt *myrpt, char* node, int mode, int perma)
|
||||
return -1;
|
||||
}
|
||||
/* allocate a pseudo-channel thru asterisk */
|
||||
l->pchan = ast_request("zap",AST_FORMAT_SLINEAR,"pseudo",NULL);
|
||||
l->pchan = ast_request("DAHDI",AST_FORMAT_SLINEAR,"pseudo",NULL);
|
||||
if (!l->pchan){
|
||||
ast_log(LOG_WARNING,"rpt connect: Sorry unable to obtain pseudo channel\n");
|
||||
ast_hangup(l->chan);
|
||||
@@ -5845,9 +5845,9 @@ static int connect_link(struct rpt *myrpt, char* node, int mode, int perma)
|
||||
/* make a conference for the tx */
|
||||
ci.chan = 0;
|
||||
ci.confno = myrpt->conf;
|
||||
ci.confmode = ZT_CONF_CONF | ZT_CONF_LISTENER | ZT_CONF_TALKER;
|
||||
ci.confmode = DAHDI_CONF_CONF | DAHDI_CONF_LISTENER | DAHDI_CONF_TALKER;
|
||||
/* first put the channel on the conference in proper mode */
|
||||
if (ioctl(l->pchan->fds[0], ZT_SETCONF, &ci) == -1)
|
||||
if (ioctl(l->pchan->fds[0], DAHDI_SETCONF, &ci) == -1)
|
||||
{
|
||||
ast_log(LOG_WARNING, "Unable to set conference mode to Announce\n");
|
||||
ast_hangup(l->chan);
|
||||
@@ -7384,22 +7384,22 @@ static void rbi_out_parallel(struct rpt *myrpt,unsigned char *data)
|
||||
|
||||
static void rbi_out(struct rpt *myrpt,unsigned char *data)
|
||||
{
|
||||
struct zt_radio_param r;
|
||||
struct dahdi_radio_param r;
|
||||
|
||||
memset(&r,0,sizeof(struct zt_radio_param));
|
||||
r.radpar = ZT_RADPAR_REMMODE;
|
||||
r.data = ZT_RADPAR_REM_RBI1;
|
||||
memset(&r,0,sizeof(struct dahdi_radio_param));
|
||||
r.radpar = DAHDI_RADPAR_REMMODE;
|
||||
r.data = DAHDI_RADPAR_REM_RBI1;
|
||||
/* if setparam ioctl fails, its probably not a pciradio card */
|
||||
if (ioctl(myrpt->zaprxchannel->fds[0],ZT_RADIO_SETPARAM,&r) == -1)
|
||||
if (ioctl(myrpt->dahdirxchannel->fds[0],DAHDI_RADIO_SETPARAM,&r) == -1)
|
||||
{
|
||||
rbi_out_parallel(myrpt,data);
|
||||
return;
|
||||
}
|
||||
r.radpar = ZT_RADPAR_REMCOMMAND;
|
||||
r.radpar = DAHDI_RADPAR_REMCOMMAND;
|
||||
memcpy(&r.data,data,5);
|
||||
if (ioctl(myrpt->zaprxchannel->fds[0],ZT_RADIO_SETPARAM,&r) == -1)
|
||||
if (ioctl(myrpt->dahdirxchannel->fds[0],DAHDI_RADIO_SETPARAM,&r) == -1)
|
||||
{
|
||||
ast_log(LOG_WARNING,"Cannot send RBI command for channel %s\n",myrpt->zaprxchannel->name);
|
||||
ast_log(LOG_WARNING,"Cannot send RBI command for channel %s\n",myrpt->dahdirxchannel->name);
|
||||
return;
|
||||
}
|
||||
}
|
||||
@@ -7408,7 +7408,7 @@ static int serial_remote_io(struct rpt *myrpt, unsigned char *txbuf, int txbytes
|
||||
unsigned char *rxbuf, int rxmaxbytes, int asciiflag)
|
||||
{
|
||||
int i,j,index,oldmode,olddata;
|
||||
struct zt_radio_param prm;
|
||||
struct dahdi_radio_param prm;
|
||||
char c;
|
||||
|
||||
if(debug) {
|
||||
@@ -7453,50 +7453,50 @@ static int serial_remote_io(struct rpt *myrpt, unsigned char *txbuf, int txbytes
|
||||
return(i);
|
||||
}
|
||||
|
||||
/* if not a zap channel, cant use pciradio stuff */
|
||||
if (myrpt->rxchannel != myrpt->zaprxchannel) return -1;
|
||||
/* if not a DAHDI channel, cant use pciradio stuff */
|
||||
if (myrpt->rxchannel != myrpt->dahdirxchannel) return -1;
|
||||
|
||||
prm.radpar = ZT_RADPAR_UIOMODE;
|
||||
if (ioctl(myrpt->zaprxchannel->fds[0],ZT_RADIO_GETPARAM,&prm) == -1) return -1;
|
||||
prm.radpar = DAHDI_RADPAR_UIOMODE;
|
||||
if (ioctl(myrpt->dahdirxchannel->fds[0],DAHDI_RADIO_GETPARAM,&prm) == -1) return -1;
|
||||
oldmode = prm.data;
|
||||
prm.radpar = ZT_RADPAR_UIODATA;
|
||||
if (ioctl(myrpt->zaprxchannel->fds[0],ZT_RADIO_GETPARAM,&prm) == -1) return -1;
|
||||
prm.radpar = DAHDI_RADPAR_UIODATA;
|
||||
if (ioctl(myrpt->dahdirxchannel->fds[0],DAHDI_RADIO_GETPARAM,&prm) == -1) return -1;
|
||||
olddata = prm.data;
|
||||
prm.radpar = ZT_RADPAR_REMMODE;
|
||||
if (asciiflag & 1) prm.data = ZT_RADPAR_REM_SERIAL_ASCII;
|
||||
else prm.data = ZT_RADPAR_REM_SERIAL;
|
||||
if (ioctl(myrpt->zaprxchannel->fds[0],ZT_RADIO_SETPARAM,&prm) == -1) return -1;
|
||||
prm.radpar = DAHDI_RADPAR_REMMODE;
|
||||
if (asciiflag & 1) prm.data = DAHDI_RADPAR_REM_SERIAL_ASCII;
|
||||
else prm.data = DAHDI_RADPAR_REM_SERIAL;
|
||||
if (ioctl(myrpt->dahdirxchannel->fds[0],DAHDI_RADIO_SETPARAM,&prm) == -1) return -1;
|
||||
if (asciiflag & 2)
|
||||
{
|
||||
i = ZT_ONHOOK;
|
||||
if (ioctl(myrpt->zaprxchannel->fds[0],ZT_HOOK,&i) == -1) return -1;
|
||||
i = DAHDI_ONHOOK;
|
||||
if (ioctl(myrpt->dahdirxchannel->fds[0],DAHDI_HOOK,&i) == -1) return -1;
|
||||
usleep(100000);
|
||||
}
|
||||
prm.radpar = ZT_RADPAR_REMCOMMAND;
|
||||
prm.radpar = DAHDI_RADPAR_REMCOMMAND;
|
||||
prm.data = rxmaxbytes;
|
||||
memcpy(prm.buf,txbuf,txbytes);
|
||||
prm.index = txbytes;
|
||||
if (ioctl(myrpt->zaprxchannel->fds[0],ZT_RADIO_SETPARAM,&prm) == -1) return -1;
|
||||
if (ioctl(myrpt->dahdirxchannel->fds[0],DAHDI_RADIO_SETPARAM,&prm) == -1) return -1;
|
||||
if (rxbuf)
|
||||
{
|
||||
*rxbuf = 0;
|
||||
memcpy(rxbuf,prm.buf,prm.index);
|
||||
}
|
||||
index = prm.index;
|
||||
prm.radpar = ZT_RADPAR_REMMODE;
|
||||
prm.data = ZT_RADPAR_REM_NONE;
|
||||
if (ioctl(myrpt->zaprxchannel->fds[0],ZT_RADIO_SETPARAM,&prm) == -1) return -1;
|
||||
prm.radpar = DAHDI_RADPAR_REMMODE;
|
||||
prm.data = DAHDI_RADPAR_REM_NONE;
|
||||
if (ioctl(myrpt->dahdirxchannel->fds[0],DAHDI_RADIO_SETPARAM,&prm) == -1) return -1;
|
||||
if (asciiflag & 2)
|
||||
{
|
||||
i = ZT_OFFHOOK;
|
||||
if (ioctl(myrpt->zaprxchannel->fds[0],ZT_HOOK,&i) == -1) return -1;
|
||||
i = DAHDI_OFFHOOK;
|
||||
if (ioctl(myrpt->dahdirxchannel->fds[0],DAHDI_HOOK,&i) == -1) return -1;
|
||||
}
|
||||
prm.radpar = ZT_RADPAR_UIOMODE;
|
||||
prm.radpar = DAHDI_RADPAR_UIOMODE;
|
||||
prm.data = oldmode;
|
||||
if (ioctl(myrpt->zaprxchannel->fds[0],ZT_RADIO_SETPARAM,&prm) == -1) return -1;
|
||||
prm.radpar = ZT_RADPAR_UIODATA;
|
||||
if (ioctl(myrpt->dahdirxchannel->fds[0],DAHDI_RADIO_SETPARAM,&prm) == -1) return -1;
|
||||
prm.radpar = DAHDI_RADPAR_UIODATA;
|
||||
prm.data = olddata;
|
||||
if (ioctl(myrpt->zaprxchannel->fds[0],ZT_RADIO_SETPARAM,&prm) == -1) return -1;
|
||||
if (ioctl(myrpt->dahdirxchannel->fds[0],DAHDI_RADIO_SETPARAM,&prm) == -1) return -1;
|
||||
return(index);
|
||||
}
|
||||
|
||||
@@ -10726,7 +10726,7 @@ char *tele,*idtalkover,c,myfirst,*p;
|
||||
int ms = MSWAIT,i,lasttx=0,val,remrx=0,identqueued,othertelemqueued;
|
||||
int tailmessagequeued,ctqueued,dtmfed,lastmyrx,localmsgqueued;
|
||||
struct ast_channel *who;
|
||||
ZT_CONFINFO ci; /* conference info */
|
||||
DAHDI_CONFINFO ci; /* conference info */
|
||||
time_t t;
|
||||
struct rpt_link *l,*m;
|
||||
struct rpt_tele *telem;
|
||||
@@ -10782,9 +10782,9 @@ char tmpstr[300],lstr[MAXLINKLIST];
|
||||
}
|
||||
*tele++ = 0;
|
||||
myrpt->rxchannel = ast_request(tmpstr,AST_FORMAT_SLINEAR,tele,NULL);
|
||||
myrpt->zaprxchannel = NULL;
|
||||
if (!strcasecmp(tmpstr,"Zap"))
|
||||
myrpt->zaprxchannel = myrpt->rxchannel;
|
||||
myrpt->dahdirxchannel = NULL;
|
||||
if (!strcasecmp(tmpstr,"DAHDI"))
|
||||
myrpt->dahdirxchannel = myrpt->rxchannel;
|
||||
if (myrpt->rxchannel)
|
||||
{
|
||||
if (myrpt->rxchannel->_state == AST_STATE_BUSY)
|
||||
@@ -10825,7 +10825,7 @@ char tmpstr[300],lstr[MAXLINKLIST];
|
||||
myrpt->rpt_thread = AST_PTHREADT_STOP;
|
||||
pthread_exit(NULL);
|
||||
}
|
||||
myrpt->zaptxchannel = NULL;
|
||||
myrpt->dahditxchannel = NULL;
|
||||
if (myrpt->txchanname)
|
||||
{
|
||||
strncpy(tmpstr,myrpt->txchanname,sizeof(tmpstr) - 1);
|
||||
@@ -10840,8 +10840,8 @@ char tmpstr[300],lstr[MAXLINKLIST];
|
||||
}
|
||||
*tele++ = 0;
|
||||
myrpt->txchannel = ast_request(tmpstr,AST_FORMAT_SLINEAR,tele,NULL);
|
||||
if (!strcasecmp(tmpstr,"Zap"))
|
||||
myrpt->zaptxchannel = myrpt->txchannel;
|
||||
if (!strcasecmp(tmpstr,"DAHDI"))
|
||||
myrpt->dahditxchannel = myrpt->txchannel;
|
||||
if (myrpt->txchannel)
|
||||
{
|
||||
if (myrpt->txchannel->_state == AST_STATE_BUSY)
|
||||
@@ -10889,13 +10889,13 @@ char tmpstr[300],lstr[MAXLINKLIST];
|
||||
else
|
||||
{
|
||||
myrpt->txchannel = myrpt->rxchannel;
|
||||
if (!strncasecmp(myrpt->rxchanname,"Zap",3))
|
||||
myrpt->zaptxchannel = myrpt->txchannel;
|
||||
if (!strncasecmp(myrpt->rxchanname,"DAHDI",3))
|
||||
myrpt->dahditxchannel = myrpt->txchannel;
|
||||
}
|
||||
ast_indicate(myrpt->txchannel,AST_CONTROL_RADIO_KEY);
|
||||
ast_indicate(myrpt->txchannel,AST_CONTROL_RADIO_UNKEY);
|
||||
/* allocate a pseudo-channel thru asterisk */
|
||||
myrpt->pchannel = ast_request("zap",AST_FORMAT_SLINEAR,"pseudo",NULL);
|
||||
myrpt->pchannel = ast_request("DAHDI",AST_FORMAT_SLINEAR,"pseudo",NULL);
|
||||
if (!myrpt->pchannel)
|
||||
{
|
||||
fprintf(stderr,"rpt:Sorry unable to obtain pseudo channel\n");
|
||||
@@ -10910,12 +10910,12 @@ char tmpstr[300],lstr[MAXLINKLIST];
|
||||
if (myrpt->pchannel->cdr)
|
||||
ast_set_flag(myrpt->pchannel->cdr,AST_CDR_FLAG_POST_DISABLED);
|
||||
#endif
|
||||
if (!myrpt->zaprxchannel) myrpt->zaprxchannel = myrpt->pchannel;
|
||||
if (!myrpt->zaptxchannel)
|
||||
if (!myrpt->dahdirxchannel) myrpt->dahdirxchannel = myrpt->pchannel;
|
||||
if (!myrpt->dahditxchannel)
|
||||
{
|
||||
/* allocate a pseudo-channel thru asterisk */
|
||||
myrpt->zaptxchannel = ast_request("zap",AST_FORMAT_SLINEAR,"pseudo",NULL);
|
||||
if (!myrpt->zaptxchannel)
|
||||
myrpt->dahditxchannel = ast_request("DAHDI",AST_FORMAT_SLINEAR,"pseudo",NULL);
|
||||
if (!myrpt->dahditxchannel)
|
||||
{
|
||||
fprintf(stderr,"rpt:Sorry unable to obtain pseudo channel\n");
|
||||
rpt_mutex_unlock(&myrpt->lock);
|
||||
@@ -10925,15 +10925,15 @@ char tmpstr[300],lstr[MAXLINKLIST];
|
||||
myrpt->rpt_thread = AST_PTHREADT_STOP;
|
||||
pthread_exit(NULL);
|
||||
}
|
||||
ast_set_read_format(myrpt->zaptxchannel,AST_FORMAT_SLINEAR);
|
||||
ast_set_write_format(myrpt->zaptxchannel,AST_FORMAT_SLINEAR);
|
||||
ast_set_read_format(myrpt->dahditxchannel,AST_FORMAT_SLINEAR);
|
||||
ast_set_write_format(myrpt->dahditxchannel,AST_FORMAT_SLINEAR);
|
||||
#ifdef AST_CDR_FLAG_POST_DISABLED
|
||||
if (myrpt->zaptxchannel->cdr)
|
||||
ast_set_flag(myrpt->zaptxchannel->cdr,AST_CDR_FLAG_POST_DISABLED);
|
||||
if (myrpt->dahditxchannel->cdr)
|
||||
ast_set_flag(myrpt->dahditxchannel->cdr,AST_CDR_FLAG_POST_DISABLED);
|
||||
#endif
|
||||
}
|
||||
/* allocate a pseudo-channel thru asterisk */
|
||||
myrpt->monchannel = ast_request("zap",AST_FORMAT_SLINEAR,"pseudo",NULL);
|
||||
myrpt->monchannel = ast_request("DAHDI",AST_FORMAT_SLINEAR,"pseudo",NULL);
|
||||
if (!myrpt->monchannel)
|
||||
{
|
||||
fprintf(stderr,"rpt:Sorry unable to obtain pseudo channel\n");
|
||||
@@ -10953,9 +10953,9 @@ char tmpstr[300],lstr[MAXLINKLIST];
|
||||
/* make a conference for the tx */
|
||||
ci.chan = 0;
|
||||
ci.confno = -1; /* make a new conf */
|
||||
ci.confmode = ZT_CONF_CONF | ZT_CONF_LISTENER;
|
||||
ci.confmode = DAHDI_CONF_CONF | DAHDI_CONF_LISTENER;
|
||||
/* first put the channel on the conference in proper mode */
|
||||
if (ioctl(myrpt->zaptxchannel->fds[0],ZT_SETCONF,&ci) == -1)
|
||||
if (ioctl(myrpt->dahditxchannel->fds[0],DAHDI_SETCONF,&ci) == -1)
|
||||
{
|
||||
ast_log(LOG_WARNING, "Unable to set conference mode to Announce\n");
|
||||
rpt_mutex_unlock(&myrpt->lock);
|
||||
@@ -10972,10 +10972,10 @@ char tmpstr[300],lstr[MAXLINKLIST];
|
||||
/* make a conference for the pseudo */
|
||||
ci.chan = 0;
|
||||
ci.confno = -1; /* make a new conf */
|
||||
ci.confmode = ((myrpt->p.duplex == 2) || (myrpt->p.duplex == 4)) ? ZT_CONF_CONFANNMON :
|
||||
(ZT_CONF_CONF | ZT_CONF_LISTENER | ZT_CONF_TALKER);
|
||||
ci.confmode = ((myrpt->p.duplex == 2) || (myrpt->p.duplex == 4)) ? DAHDI_CONF_CONFANNMON :
|
||||
(DAHDI_CONF_CONF | DAHDI_CONF_LISTENER | DAHDI_CONF_TALKER);
|
||||
/* first put the channel on the conference in announce mode */
|
||||
if (ioctl(myrpt->pchannel->fds[0],ZT_SETCONF,&ci) == -1)
|
||||
if (ioctl(myrpt->pchannel->fds[0],DAHDI_SETCONF,&ci) == -1)
|
||||
{
|
||||
ast_log(LOG_WARNING, "Unable to set conference mode to Announce\n");
|
||||
rpt_mutex_unlock(&myrpt->lock);
|
||||
@@ -10992,10 +10992,10 @@ char tmpstr[300],lstr[MAXLINKLIST];
|
||||
/* make a conference for the pseudo */
|
||||
ci.chan = 0;
|
||||
if ((strstr(myrpt->txchannel->name,"pseudo") == NULL) &&
|
||||
(myrpt->zaptxchannel == myrpt->txchannel))
|
||||
(myrpt->dahditxchannel == myrpt->txchannel))
|
||||
{
|
||||
/* get tx channel's port number */
|
||||
if (ioctl(myrpt->txchannel->fds[0],ZT_CHANNO,&ci.confno) == -1)
|
||||
if (ioctl(myrpt->txchannel->fds[0],DAHDI_CHANNO,&ci.confno) == -1)
|
||||
{
|
||||
ast_log(LOG_WARNING, "Unable to set tx channel's chan number\n");
|
||||
rpt_mutex_unlock(&myrpt->lock);
|
||||
@@ -11007,15 +11007,15 @@ char tmpstr[300],lstr[MAXLINKLIST];
|
||||
myrpt->rpt_thread = AST_PTHREADT_STOP;
|
||||
pthread_exit(NULL);
|
||||
}
|
||||
ci.confmode = ZT_CONF_MONITORTX;
|
||||
ci.confmode = DAHDI_CONF_MONITORTX;
|
||||
}
|
||||
else
|
||||
{
|
||||
ci.confno = myrpt->txconf;
|
||||
ci.confmode = ZT_CONF_CONFANNMON;
|
||||
ci.confmode = DAHDI_CONF_CONFANNMON;
|
||||
}
|
||||
/* first put the channel on the conference in announce mode */
|
||||
if (ioctl(myrpt->monchannel->fds[0],ZT_SETCONF,&ci) == -1)
|
||||
if (ioctl(myrpt->monchannel->fds[0],DAHDI_SETCONF,&ci) == -1)
|
||||
{
|
||||
ast_log(LOG_WARNING, "Unable to set conference mode for monitor\n");
|
||||
rpt_mutex_unlock(&myrpt->lock);
|
||||
@@ -11028,7 +11028,7 @@ char tmpstr[300],lstr[MAXLINKLIST];
|
||||
pthread_exit(NULL);
|
||||
}
|
||||
/* allocate a pseudo-channel thru asterisk */
|
||||
myrpt->parrotchannel = ast_request("zap",AST_FORMAT_SLINEAR,"pseudo",NULL);
|
||||
myrpt->parrotchannel = ast_request("DAHDI",AST_FORMAT_SLINEAR,"pseudo",NULL);
|
||||
if (!myrpt->parrotchannel)
|
||||
{
|
||||
fprintf(stderr,"rpt:Sorry unable to obtain pseudo channel\n");
|
||||
@@ -11046,7 +11046,7 @@ char tmpstr[300],lstr[MAXLINKLIST];
|
||||
ast_set_flag(myrpt->parrotchannel->cdr,AST_CDR_FLAG_POST_DISABLED);
|
||||
#endif
|
||||
/* allocate a pseudo-channel thru asterisk */
|
||||
myrpt->voxchannel = ast_request("zap",AST_FORMAT_SLINEAR,"pseudo",NULL);
|
||||
myrpt->voxchannel = ast_request("DAHDI",AST_FORMAT_SLINEAR,"pseudo",NULL);
|
||||
if (!myrpt->voxchannel)
|
||||
{
|
||||
fprintf(stderr,"rpt:Sorry unable to obtain pseudo channel\n");
|
||||
@@ -11064,7 +11064,7 @@ char tmpstr[300],lstr[MAXLINKLIST];
|
||||
ast_set_flag(myrpt->voxchannel->cdr,AST_CDR_FLAG_POST_DISABLED);
|
||||
#endif
|
||||
/* allocate a pseudo-channel thru asterisk */
|
||||
myrpt->txpchannel = ast_request("zap",AST_FORMAT_SLINEAR,"pseudo",NULL);
|
||||
myrpt->txpchannel = ast_request("DAHDI",AST_FORMAT_SLINEAR,"pseudo",NULL);
|
||||
if (!myrpt->txpchannel)
|
||||
{
|
||||
fprintf(stderr,"rpt:Sorry unable to obtain pseudo channel\n");
|
||||
@@ -11084,9 +11084,9 @@ char tmpstr[300],lstr[MAXLINKLIST];
|
||||
/* make a conference for the tx */
|
||||
ci.chan = 0;
|
||||
ci.confno = myrpt->txconf;
|
||||
ci.confmode = ZT_CONF_CONF | ZT_CONF_TALKER ;
|
||||
ci.confmode = DAHDI_CONF_CONF | DAHDI_CONF_TALKER ;
|
||||
/* first put the channel on the conference in proper mode */
|
||||
if (ioctl(myrpt->txpchannel->fds[0],ZT_SETCONF,&ci) == -1)
|
||||
if (ioctl(myrpt->txpchannel->fds[0],DAHDI_SETCONF,&ci) == -1)
|
||||
{
|
||||
ast_log(LOG_WARNING, "Unable to set conference mode to Announce\n");
|
||||
rpt_mutex_unlock(&myrpt->lock);
|
||||
@@ -11179,8 +11179,8 @@ char tmpstr[300],lstr[MAXLINKLIST];
|
||||
|
||||
/* DEBUG Dump */
|
||||
if((myrpt->disgorgetime) && (time(NULL) >= myrpt->disgorgetime)){
|
||||
struct rpt_link *zl;
|
||||
struct rpt_tele *zt;
|
||||
struct rpt_link *dl;
|
||||
struct rpt_tele *dt;
|
||||
|
||||
myrpt->disgorgetime = 0;
|
||||
ast_log(LOG_NOTICE,"********** Variable Dump Start (app_rpt) **********\n");
|
||||
@@ -11201,30 +11201,30 @@ char tmpstr[300],lstr[MAXLINKLIST];
|
||||
ast_log(LOG_NOTICE,"myrpt->tailtimer = %d\n",myrpt->tailtimer);
|
||||
ast_log(LOG_NOTICE,"myrpt->tailevent = %d\n",myrpt->tailevent);
|
||||
|
||||
zl = myrpt->links.next;
|
||||
while(zl != &myrpt->links){
|
||||
ast_log(LOG_NOTICE,"*** Link Name: %s ***\n",zl->name);
|
||||
ast_log(LOG_NOTICE," link->lasttx %d\n",zl->lasttx);
|
||||
ast_log(LOG_NOTICE," link->lastrx %d\n",zl->lastrx);
|
||||
ast_log(LOG_NOTICE," link->connected %d\n",zl->connected);
|
||||
ast_log(LOG_NOTICE," link->hasconnected %d\n",zl->hasconnected);
|
||||
ast_log(LOG_NOTICE," link->outbound %d\n",zl->outbound);
|
||||
ast_log(LOG_NOTICE," link->disced %d\n",zl->disced);
|
||||
ast_log(LOG_NOTICE," link->killme %d\n",zl->killme);
|
||||
ast_log(LOG_NOTICE," link->disctime %ld\n",zl->disctime);
|
||||
ast_log(LOG_NOTICE," link->retrytimer %ld\n",zl->retrytimer);
|
||||
ast_log(LOG_NOTICE," link->retries = %d\n",zl->retries);
|
||||
ast_log(LOG_NOTICE," link->reconnects = %d\n",zl->reconnects);
|
||||
ast_log(LOG_NOTICE," link->newkey = %d\n",zl->newkey);
|
||||
zl = zl->next;
|
||||
dl = myrpt->links.next;
|
||||
while(dl != &myrpt->links){
|
||||
ast_log(LOG_NOTICE,"*** Link Name: %s ***\n",dl->name);
|
||||
ast_log(LOG_NOTICE," link->lasttx %d\n",dl->lasttx);
|
||||
ast_log(LOG_NOTICE," link->lastrx %d\n",dl->lastrx);
|
||||
ast_log(LOG_NOTICE," link->connected %d\n",dl->connected);
|
||||
ast_log(LOG_NOTICE," link->hasconnected %d\n",dl->hasconnected);
|
||||
ast_log(LOG_NOTICE," link->outbound %d\n",dl->outbound);
|
||||
ast_log(LOG_NOTICE," link->disced %d\n",dl->disced);
|
||||
ast_log(LOG_NOTICE," link->killme %d\n",dl->killme);
|
||||
ast_log(LOG_NOTICE," link->disctime %ld\n",dl->disctime);
|
||||
ast_log(LOG_NOTICE," link->retrytimer %ld\n",dl->retrytimer);
|
||||
ast_log(LOG_NOTICE," link->retries = %d\n",dl->retries);
|
||||
ast_log(LOG_NOTICE," link->reconnects = %d\n",dl->reconnects);
|
||||
ast_log(LOG_NOTICE," link->newkey = %d\n",dl->newkey);
|
||||
dl = dl->next;
|
||||
}
|
||||
|
||||
zt = myrpt->tele.next;
|
||||
if(zt != &myrpt->tele)
|
||||
dt = myrpt->tele.next;
|
||||
if(dt != &myrpt->tele)
|
||||
ast_log(LOG_NOTICE,"*** Telemetry Queue ***\n");
|
||||
while(zt != &myrpt->tele){
|
||||
ast_log(LOG_NOTICE," Telemetry mode: %d\n",zt->mode);
|
||||
zt = zt->next;
|
||||
while(dt != &myrpt->tele){
|
||||
ast_log(LOG_NOTICE," Telemetry mode: %d\n",dt->mode);
|
||||
dt = dt->next;
|
||||
}
|
||||
ast_log(LOG_NOTICE,"******* Variable Dump End (app_rpt) *******\n");
|
||||
|
||||
@@ -11266,7 +11266,7 @@ char tmpstr[300],lstr[MAXLINKLIST];
|
||||
if (myrpt->voxchannel &&
|
||||
ast_check_hangup(myrpt->voxchannel)) break;
|
||||
if (ast_check_hangup(myrpt->txpchannel)) break;
|
||||
if (myrpt->zaptxchannel && ast_check_hangup(myrpt->zaptxchannel)) break;
|
||||
if (myrpt->dahditxchannel && ast_check_hangup(myrpt->dahditxchannel)) break;
|
||||
|
||||
/* Set local tx with keyed */
|
||||
myrpt->localtx = myrpt->keyed;
|
||||
@@ -11547,11 +11547,11 @@ char tmpstr[300],lstr[MAXLINKLIST];
|
||||
char myfname[300];
|
||||
|
||||
ci.confno = myrpt->conf;
|
||||
ci.confmode = ZT_CONF_CONFANNMON;
|
||||
ci.confmode = DAHDI_CONF_CONFANNMON;
|
||||
ci.chan = 0;
|
||||
|
||||
/* first put the channel on the conference in announce mode */
|
||||
if (ioctl(myrpt->parrotchannel->fds[0],ZT_SETCONF,&ci) == -1)
|
||||
if (ioctl(myrpt->parrotchannel->fds[0],DAHDI_SETCONF,&ci) == -1)
|
||||
{
|
||||
ast_log(LOG_WARNING, "Unable to set conference mode for parrot\n");
|
||||
break;
|
||||
@@ -11601,8 +11601,8 @@ char tmpstr[300],lstr[MAXLINKLIST];
|
||||
if (myrpt->voxchannel) cs[n++] = myrpt->voxchannel;
|
||||
cs[n++] = myrpt->txpchannel;
|
||||
if (myrpt->txchannel != myrpt->rxchannel) cs[n++] = myrpt->txchannel;
|
||||
if (myrpt->zaptxchannel != myrpt->txchannel)
|
||||
cs[n++] = myrpt->zaptxchannel;
|
||||
if (myrpt->dahditxchannel != myrpt->txchannel)
|
||||
cs[n++] = myrpt->dahditxchannel;
|
||||
l = myrpt->links.next;
|
||||
while(l != &myrpt->links)
|
||||
{
|
||||
@@ -11977,7 +11977,7 @@ char tmpstr[300],lstr[MAXLINKLIST];
|
||||
ci.chan = 0;
|
||||
|
||||
/* first put the channel on the conference in announce mode */
|
||||
if (ioctl(myrpt->parrotchannel->fds[0],ZT_SETCONF,&ci) == -1)
|
||||
if (ioctl(myrpt->parrotchannel->fds[0],DAHDI_SETCONF,&ci) == -1)
|
||||
{
|
||||
ast_log(LOG_WARNING, "Unable to set conference mode for parrot\n");
|
||||
break;
|
||||
@@ -12088,7 +12088,7 @@ char tmpstr[300],lstr[MAXLINKLIST];
|
||||
/* apply inbound filters, if any */
|
||||
rpt_filter(myrpt,f->data,f->datalen / 2);
|
||||
#endif
|
||||
if (ioctl(myrpt->zaprxchannel->fds[0], ZT_GETCONFMUTE, &ismuted) == -1)
|
||||
if (ioctl(myrpt->dahdirxchannel->fds[0], DAHDI_GETCONFMUTE, &ismuted) == -1)
|
||||
{
|
||||
ismuted = 0;
|
||||
}
|
||||
@@ -12276,9 +12276,9 @@ char tmpstr[300],lstr[MAXLINKLIST];
|
||||
ast_frfree(f);
|
||||
continue;
|
||||
}
|
||||
if (who == myrpt->zaptxchannel) /* if it was a read from pseudo-tx */
|
||||
if (who == myrpt->dahditxchannel) /* if it was a read from pseudo-tx */
|
||||
{
|
||||
f = ast_read(myrpt->zaptxchannel);
|
||||
f = ast_read(myrpt->dahditxchannel);
|
||||
if (!f)
|
||||
{
|
||||
if (debug) printf("@@@@ rpt:Hung Up\n");
|
||||
@@ -12517,7 +12517,7 @@ char tmpstr[300],lstr[MAXLINKLIST];
|
||||
ast_frfree(f);
|
||||
f = AST_LIST_REMOVE_HEAD(&l->rxq,frame_list);
|
||||
}
|
||||
if (ioctl(l->chan->fds[0], ZT_GETCONFMUTE, &ismuted) == -1)
|
||||
if (ioctl(l->chan->fds[0], DAHDI_GETCONFMUTE, &ismuted) == -1)
|
||||
{
|
||||
ismuted = 0;
|
||||
}
|
||||
@@ -12878,7 +12878,7 @@ char tmpstr[300],lstr[MAXLINKLIST];
|
||||
if (myrpt->voxchannel) ast_hangup(myrpt->voxchannel);
|
||||
ast_hangup(myrpt->txpchannel);
|
||||
if (myrpt->txchannel != myrpt->rxchannel) ast_hangup(myrpt->txchannel);
|
||||
if (myrpt->zaptxchannel != myrpt->txchannel) ast_hangup(myrpt->zaptxchannel);
|
||||
if (myrpt->dahditxchannel != myrpt->txchannel) ast_hangup(myrpt->dahditxchannel);
|
||||
if (myrpt->lastf1) ast_frfree(myrpt->lastf1);
|
||||
myrpt->lastf1 = NULL;
|
||||
if (myrpt->lastf2) ast_frfree(myrpt->lastf2);
|
||||
@@ -13125,11 +13125,11 @@ static int rpt_exec(struct ast_channel *chan, void *data)
|
||||
struct ast_channel *who;
|
||||
struct ast_channel *cs[20];
|
||||
struct rpt_link *l;
|
||||
ZT_CONFINFO ci; /* conference info */
|
||||
ZT_PARAMS par;
|
||||
DAHDI_CONFINFO ci; /* conference info */
|
||||
DAHDI_PARAMS par;
|
||||
int ms,elap,nullfd;
|
||||
time_t t,last_timeout_warning;
|
||||
struct zt_radio_param z;
|
||||
struct dahdi_radio_param z;
|
||||
struct rpt_tele *telem;
|
||||
int numlinks;
|
||||
|
||||
@@ -13617,7 +13617,7 @@ static int rpt_exec(struct ast_channel *chan, void *data)
|
||||
ast_set_read_format(l->chan,AST_FORMAT_SLINEAR);
|
||||
ast_set_write_format(l->chan,AST_FORMAT_SLINEAR);
|
||||
/* allocate a pseudo-channel thru asterisk */
|
||||
l->pchan = ast_request("zap",AST_FORMAT_SLINEAR,"pseudo",NULL);
|
||||
l->pchan = ast_request("DAHDI",AST_FORMAT_SLINEAR,"pseudo",NULL);
|
||||
if (!l->pchan)
|
||||
{
|
||||
fprintf(stderr,"rpt:Sorry unable to obtain pseudo channel\n");
|
||||
@@ -13632,9 +13632,9 @@ static int rpt_exec(struct ast_channel *chan, void *data)
|
||||
/* make a conference for the tx */
|
||||
ci.chan = 0;
|
||||
ci.confno = myrpt->conf;
|
||||
ci.confmode = ZT_CONF_CONF | ZT_CONF_LISTENER | ZT_CONF_TALKER;
|
||||
ci.confmode = DAHDI_CONF_CONF | DAHDI_CONF_LISTENER | DAHDI_CONF_TALKER;
|
||||
/* first put the channel on the conference in proper mode */
|
||||
if (ioctl(l->pchan->fds[0],ZT_SETCONF,&ci) == -1)
|
||||
if (ioctl(l->pchan->fds[0],DAHDI_SETCONF,&ci) == -1)
|
||||
{
|
||||
ast_log(LOG_WARNING, "Unable to set conference mode to Announce\n");
|
||||
pthread_exit(NULL);
|
||||
@@ -13760,9 +13760,9 @@ static int rpt_exec(struct ast_channel *chan, void *data)
|
||||
}
|
||||
*tele++ = 0;
|
||||
myrpt->rxchannel = ast_request(myrpt->rxchanname,AST_FORMAT_SLINEAR,tele,NULL);
|
||||
myrpt->zaprxchannel = NULL;
|
||||
if (!strcasecmp(myrpt->rxchanname,"Zap"))
|
||||
myrpt->zaprxchannel = myrpt->rxchannel;
|
||||
myrpt->dahdirxchannel = NULL;
|
||||
if (!strcasecmp(myrpt->rxchanname,"DAHDI"))
|
||||
myrpt->dahdirxchannel = myrpt->rxchannel;
|
||||
if (myrpt->rxchannel)
|
||||
{
|
||||
ast_set_read_format(myrpt->rxchannel,AST_FORMAT_SLINEAR);
|
||||
@@ -13790,7 +13790,7 @@ static int rpt_exec(struct ast_channel *chan, void *data)
|
||||
pthread_exit(NULL);
|
||||
}
|
||||
*--tele = '/';
|
||||
myrpt->zaptxchannel = NULL;
|
||||
myrpt->dahditxchannel = NULL;
|
||||
if (myrpt->txchanname)
|
||||
{
|
||||
tele = strchr(myrpt->txchanname,'/');
|
||||
@@ -13803,8 +13803,8 @@ static int rpt_exec(struct ast_channel *chan, void *data)
|
||||
}
|
||||
*tele++ = 0;
|
||||
myrpt->txchannel = ast_request(myrpt->txchanname,AST_FORMAT_SLINEAR,tele,NULL);
|
||||
if (!strncasecmp(myrpt->txchanname,"Zap",3))
|
||||
myrpt->zaptxchannel = myrpt->txchannel;
|
||||
if (!strncasecmp(myrpt->txchanname,"DAHDI",3))
|
||||
myrpt->dahditxchannel = myrpt->txchannel;
|
||||
if (myrpt->txchannel)
|
||||
{
|
||||
ast_set_read_format(myrpt->txchannel,AST_FORMAT_SLINEAR);
|
||||
@@ -13837,11 +13837,11 @@ static int rpt_exec(struct ast_channel *chan, void *data)
|
||||
else
|
||||
{
|
||||
myrpt->txchannel = myrpt->rxchannel;
|
||||
if (!strncasecmp(myrpt->rxchanname,"Zap",3))
|
||||
myrpt->zaptxchannel = myrpt->rxchannel;
|
||||
if (!strncasecmp(myrpt->rxchanname,"DAHDI",3))
|
||||
myrpt->dahditxchannel = myrpt->rxchannel;
|
||||
}
|
||||
/* allocate a pseudo-channel thru asterisk */
|
||||
myrpt->pchannel = ast_request("zap",AST_FORMAT_SLINEAR,"pseudo",NULL);
|
||||
myrpt->pchannel = ast_request("DAHDI",AST_FORMAT_SLINEAR,"pseudo",NULL);
|
||||
if (!myrpt->pchannel)
|
||||
{
|
||||
fprintf(stderr,"rpt:Sorry unable to obtain pseudo channel\n");
|
||||
@@ -13857,14 +13857,14 @@ static int rpt_exec(struct ast_channel *chan, void *data)
|
||||
if (myrpt->pchannel->cdr)
|
||||
ast_set_flag(myrpt->pchannel->cdr,AST_CDR_FLAG_POST_DISABLED);
|
||||
#endif
|
||||
if (!myrpt->zaprxchannel) myrpt->zaprxchannel = myrpt->pchannel;
|
||||
if (!myrpt->zaptxchannel) myrpt->zaptxchannel = myrpt->pchannel;
|
||||
if (!myrpt->dahdirxchannel) myrpt->dahdirxchannel = myrpt->pchannel;
|
||||
if (!myrpt->dahditxchannel) myrpt->dahditxchannel = myrpt->pchannel;
|
||||
/* make a conference for the pseudo */
|
||||
ci.chan = 0;
|
||||
ci.confno = -1; /* make a new conf */
|
||||
ci.confmode = ZT_CONF_CONFANNMON ;
|
||||
ci.confmode = DAHDI_CONF_CONFANNMON ;
|
||||
/* first put the channel on the conference in announce/monitor mode */
|
||||
if (ioctl(myrpt->pchannel->fds[0],ZT_SETCONF,&ci) == -1)
|
||||
if (ioctl(myrpt->pchannel->fds[0],DAHDI_SETCONF,&ci) == -1)
|
||||
{
|
||||
ast_log(LOG_WARNING, "Unable to set conference mode to Announce\n");
|
||||
rpt_mutex_unlock(&myrpt->lock);
|
||||
@@ -13889,30 +13889,30 @@ static int rpt_exec(struct ast_channel *chan, void *data)
|
||||
}
|
||||
iskenwood_pci4 = 0;
|
||||
memset(&z,0,sizeof(z));
|
||||
if ((myrpt->iofd < 1) && (myrpt->txchannel == myrpt->zaptxchannel))
|
||||
if ((myrpt->iofd < 1) && (myrpt->txchannel == myrpt->dahditxchannel))
|
||||
{
|
||||
z.radpar = ZT_RADPAR_REMMODE;
|
||||
z.data = ZT_RADPAR_REM_NONE;
|
||||
res = ioctl(myrpt->zaptxchannel->fds[0],ZT_RADIO_SETPARAM,&z);
|
||||
z.radpar = DAHDI_RADPAR_REMMODE;
|
||||
z.data = DAHDI_RADPAR_REM_NONE;
|
||||
res = ioctl(myrpt->dahditxchannel->fds[0],DAHDI_RADIO_SETPARAM,&z);
|
||||
/* if PCIRADIO and kenwood selected */
|
||||
if ((!res) && (!strcmp(myrpt->remoterig,remote_rig_kenwood)))
|
||||
{
|
||||
z.radpar = ZT_RADPAR_UIOMODE;
|
||||
z.radpar = DAHDI_RADPAR_UIOMODE;
|
||||
z.data = 1;
|
||||
if (ioctl(myrpt->zaptxchannel->fds[0],ZT_RADIO_SETPARAM,&z) == -1)
|
||||
if (ioctl(myrpt->dahditxchannel->fds[0],DAHDI_RADIO_SETPARAM,&z) == -1)
|
||||
{
|
||||
ast_log(LOG_ERROR,"Cannot set UIOMODE\n");
|
||||
return -1;
|
||||
}
|
||||
z.radpar = ZT_RADPAR_UIODATA;
|
||||
z.radpar = DAHDI_RADPAR_UIODATA;
|
||||
z.data = 3;
|
||||
if (ioctl(myrpt->zaptxchannel->fds[0],ZT_RADIO_SETPARAM,&z) == -1)
|
||||
if (ioctl(myrpt->dahditxchannel->fds[0],DAHDI_RADIO_SETPARAM,&z) == -1)
|
||||
{
|
||||
ast_log(LOG_ERROR,"Cannot set UIODATA\n");
|
||||
return -1;
|
||||
}
|
||||
i = ZT_OFFHOOK;
|
||||
if (ioctl(myrpt->zaptxchannel->fds[0],ZT_HOOK,&i) == -1)
|
||||
i = DAHDI_OFFHOOK;
|
||||
if (ioctl(myrpt->dahditxchannel->fds[0],DAHDI_HOOK,&i) == -1)
|
||||
{
|
||||
ast_log(LOG_ERROR,"Cannot set hook\n");
|
||||
return -1;
|
||||
@@ -13920,26 +13920,26 @@ static int rpt_exec(struct ast_channel *chan, void *data)
|
||||
iskenwood_pci4 = 1;
|
||||
}
|
||||
}
|
||||
if (myrpt->txchannel == myrpt->zaptxchannel)
|
||||
if (myrpt->txchannel == myrpt->dahditxchannel)
|
||||
{
|
||||
i = ZT_ONHOOK;
|
||||
ioctl(myrpt->zaptxchannel->fds[0],ZT_HOOK,&i);
|
||||
i = DAHDI_ONHOOK;
|
||||
ioctl(myrpt->dahditxchannel->fds[0],DAHDI_HOOK,&i);
|
||||
/* if PCIRADIO and Yaesu ft897/ICOM IC-706 selected */
|
||||
if ((myrpt->iofd < 1) && (!res) &&
|
||||
((!strcmp(myrpt->remoterig,remote_rig_ft897)) ||
|
||||
(!strcmp(myrpt->remoterig,remote_rig_ic706)) ||
|
||||
(!strcmp(myrpt->remoterig,remote_rig_tm271))))
|
||||
{
|
||||
z.radpar = ZT_RADPAR_UIOMODE;
|
||||
z.radpar = DAHDI_RADPAR_UIOMODE;
|
||||
z.data = 1;
|
||||
if (ioctl(myrpt->zaptxchannel->fds[0],ZT_RADIO_SETPARAM,&z) == -1)
|
||||
if (ioctl(myrpt->dahditxchannel->fds[0],DAHDI_RADIO_SETPARAM,&z) == -1)
|
||||
{
|
||||
ast_log(LOG_ERROR,"Cannot set UIOMODE\n");
|
||||
return -1;
|
||||
}
|
||||
z.radpar = ZT_RADPAR_UIODATA;
|
||||
z.radpar = DAHDI_RADPAR_UIODATA;
|
||||
z.data = 3;
|
||||
if (ioctl(myrpt->zaptxchannel->fds[0],ZT_RADIO_SETPARAM,&z) == -1)
|
||||
if (ioctl(myrpt->dahditxchannel->fds[0],DAHDI_RADIO_SETPARAM,&z) == -1)
|
||||
{
|
||||
ast_log(LOG_ERROR,"Cannot set UIODATA\n");
|
||||
return -1;
|
||||
@@ -13976,16 +13976,16 @@ static int rpt_exec(struct ast_channel *chan, void *data)
|
||||
if (myrpt->remote && (myrpt->rxchannel == myrpt->txchannel))
|
||||
{
|
||||
i = 128;
|
||||
ioctl(myrpt->zaprxchannel->fds[0],ZT_ECHOCANCEL,&i);
|
||||
ioctl(myrpt->dahdirxchannel->fds[0],DAHDI_ECHOCANCEL,&i);
|
||||
}
|
||||
if (chan->_state != AST_STATE_UP) {
|
||||
ast_answer(chan);
|
||||
if (!phone_mode) send_newkey(chan);
|
||||
}
|
||||
|
||||
if (myrpt->rxchannel == myrpt->zaprxchannel)
|
||||
if (myrpt->rxchannel == myrpt->dahdirxchannel)
|
||||
{
|
||||
if (ioctl(myrpt->zaprxchannel->fds[0],ZT_GET_PARAMS,&par) != -1)
|
||||
if (ioctl(myrpt->dahdirxchannel->fds[0],DAHDI_GET_PARAMS,&par) != -1)
|
||||
{
|
||||
if (par.rxisoffhook)
|
||||
{
|
||||
@@ -14255,11 +14255,11 @@ static int rpt_exec(struct ast_channel *chan, void *data)
|
||||
if((myrpt->remtxfreqok = check_tx_freq(myrpt)))
|
||||
{
|
||||
time(&myrpt->last_activity_time);
|
||||
if ((iskenwood_pci4) && (myrpt->txchannel == myrpt->zaptxchannel))
|
||||
if ((iskenwood_pci4) && (myrpt->txchannel == myrpt->dahditxchannel))
|
||||
{
|
||||
z.radpar = ZT_RADPAR_UIODATA;
|
||||
z.radpar = DAHDI_RADPAR_UIODATA;
|
||||
z.data = 1;
|
||||
if (ioctl(myrpt->zaptxchannel->fds[0],ZT_RADIO_SETPARAM,&z) == -1)
|
||||
if (ioctl(myrpt->dahditxchannel->fds[0],DAHDI_RADIO_SETPARAM,&z) == -1)
|
||||
{
|
||||
ast_log(LOG_ERROR,"Cannot set UIODATA\n");
|
||||
return -1;
|
||||
@@ -14279,11 +14279,11 @@ static int rpt_exec(struct ast_channel *chan, void *data)
|
||||
if(!myrpt->remtxfreqok){
|
||||
rpt_telemetry(myrpt,UNAUTHTX,NULL);
|
||||
}
|
||||
if ((iskenwood_pci4) && (myrpt->txchannel == myrpt->zaptxchannel))
|
||||
if ((iskenwood_pci4) && (myrpt->txchannel == myrpt->dahditxchannel))
|
||||
{
|
||||
z.radpar = ZT_RADPAR_UIODATA;
|
||||
z.radpar = DAHDI_RADPAR_UIODATA;
|
||||
z.data = 3;
|
||||
if (ioctl(myrpt->zaptxchannel->fds[0],ZT_RADIO_SETPARAM,&z) == -1)
|
||||
if (ioctl(myrpt->dahditxchannel->fds[0],DAHDI_RADIO_SETPARAM,&z) == -1)
|
||||
{
|
||||
ast_log(LOG_ERROR,"Cannot set UIODATA\n");
|
||||
return -1;
|
||||
@@ -14333,7 +14333,7 @@ static int rpt_exec(struct ast_channel *chan, void *data)
|
||||
}
|
||||
if (f->frametype == AST_FRAME_VOICE)
|
||||
{
|
||||
if (ioctl(chan->fds[0], ZT_GETCONFMUTE, &ismuted) == -1)
|
||||
if (ioctl(chan->fds[0], DAHDI_GETCONFMUTE, &ismuted) == -1)
|
||||
{
|
||||
ismuted = 0;
|
||||
}
|
||||
@@ -14556,24 +14556,24 @@ static int rpt_exec(struct ast_channel *chan, void *data)
|
||||
myrpt->lastf1 = NULL;
|
||||
if (myrpt->lastf2) ast_frfree(myrpt->lastf2);
|
||||
myrpt->lastf2 = NULL;
|
||||
if ((iskenwood_pci4) && (myrpt->txchannel == myrpt->zaptxchannel))
|
||||
if ((iskenwood_pci4) && (myrpt->txchannel == myrpt->dahditxchannel))
|
||||
{
|
||||
z.radpar = ZT_RADPAR_UIOMODE;
|
||||
z.radpar = DAHDI_RADPAR_UIOMODE;
|
||||
z.data = 3;
|
||||
if (ioctl(myrpt->zaptxchannel->fds[0],ZT_RADIO_SETPARAM,&z) == -1)
|
||||
if (ioctl(myrpt->dahditxchannel->fds[0],DAHDI_RADIO_SETPARAM,&z) == -1)
|
||||
{
|
||||
ast_log(LOG_ERROR,"Cannot set UIOMODE\n");
|
||||
return -1;
|
||||
}
|
||||
z.radpar = ZT_RADPAR_UIODATA;
|
||||
z.radpar = DAHDI_RADPAR_UIODATA;
|
||||
z.data = 3;
|
||||
if (ioctl(myrpt->zaptxchannel->fds[0],ZT_RADIO_SETPARAM,&z) == -1)
|
||||
if (ioctl(myrpt->dahditxchannel->fds[0],DAHDI_RADIO_SETPARAM,&z) == -1)
|
||||
{
|
||||
ast_log(LOG_ERROR,"Cannot set UIODATA\n");
|
||||
return -1;
|
||||
}
|
||||
i = ZT_OFFHOOK;
|
||||
if (ioctl(myrpt->zaptxchannel->fds[0],ZT_HOOK,&i) == -1)
|
||||
i = DAHDI_OFFHOOK;
|
||||
if (ioctl(myrpt->dahditxchannel->fds[0],DAHDI_HOOK,&i) == -1)
|
||||
{
|
||||
ast_log(LOG_ERROR,"Cannot set hook\n");
|
||||
return -1;
|
||||
|
||||
Reference in New Issue
Block a user