summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ztmonitor.c135
1 files changed, 74 insertions, 61 deletions
diff --git a/ztmonitor.c b/ztmonitor.c
index b759f45..707a705 100644
--- a/ztmonitor.c
+++ b/ztmonitor.c
@@ -47,6 +47,16 @@
#endif
#include <linux/soundcard.h>
+/*
+* defines for file handle numbers
+*/
+#define MON_BRX 0 /*!< both channels if multichannel==1 or receive otherwise */
+#define MON_TX 1 /*!< transmit channel */
+#define MON_PRE_BRX 2 /*!< same as MON_BRX but before echo cancellation */
+#define MON_PRE_TX 3 /*!< same as MON_TX but before echo cancellation */
+
+#define BLOCK_SIZE 240
+
#define BUFFERS 4
#define FRAG_SIZE 8
@@ -96,8 +106,8 @@ int audio_open(void)
if (speed != 8000)
fprintf(stderr, "Warning: Requested 8000 Hz, got %d\n", speed);
if (ioctl(fd, SNDCTL_DSP_SETFRAGMENT, &fragsize)) {
- fprintf(stderr, "Sound card won't let me set fragment size to 10 64-byte buffers (%x)\n"
- "so sound may be choppy: %s.\n", fragsize, strerror(errno));
+ fprintf(stderr, "Sound card won't let me set fragment size to %u %u-byte buffers (%x)\n"
+ "so sound may be choppy: %s.\n", BUFFERS, (1 << FRAG_SIZE), fragsize, strerror(errno));
}
bzero(&ispace, sizeof(ispace));
bzero(&ospace, sizeof(ospace));
@@ -131,7 +141,7 @@ int pseudo_open(void)
close(fd);
return -1;
}
- x = 240;
+ x = BLOCK_SIZE;
if (ioctl(fd, ZT_SET_BLOCKSIZE, &x)) {
fprintf(stderr, "unable to set sane block size: %s\n", strerror(errno));
close(fd);
@@ -257,15 +267,15 @@ int main(int argc, char *argv[])
{
int afd = -1;
int pfd[4] = {-1, -1, -1, -1};
- short buf[8192];
- short buf2[16384];
- int res, res2;
+ short buf_brx[BLOCK_SIZE * 2];
+ short buf_tx[BLOCK_SIZE * 4];
+ int res_brx, res_tx;
int visual = 0;
int multichannel = 0;
int ossoutput = 0;
int preecho = 0;
int savefile = 0;
- int x, i;
+ int x, i, chan;
struct zt_confinfo zc;
if ((argc < 2) || (atoi(argv[1]) < 1)) {
@@ -295,6 +305,9 @@ int main(int argc, char *argv[])
fprintf(stderr, " ztmonitor 1 -m -p -r streamrx.raw -t streamtx.raw -R streampreechorx.raw -T streampreechotx.raw\n");
exit(1);
}
+
+ chan = atoi(argv[1]);
+
for (i = 2; i < argc; ++i) {
if (!strcmp(argv[i], "-v")) {
if (visual)
@@ -313,31 +326,31 @@ int main(int argc, char *argv[])
/* Set which file descriptor to use */
if (!strcmp(argv[i], "-f")) {
savefile = 1;
- x = 0;
+ x = MON_BRX;
} else if (!strcmp(argv[i], "-r")) {
savefile = 1;
multichannel = 1;
- x = 0;
+ x = MON_BRX;
} else if (!strcmp(argv[i], "-t")) {
savefile = 1;
multichannel = 1;
- x = 1;
+ x = MON_TX;
} else if (!strcmp(argv[i], "-F")) {
savefile = 1;
preecho = 1;
- x = 2;
+ x = MON_PRE_BRX;
} else if (!strcmp(argv[i], "-R")) {
savefile = 1;
multichannel = 1;
preecho = 1;
- x = 2;
+ x = MON_PRE_BRX;
} else if (!strcmp(argv[i], "-T")) {
savefile = 1;
multichannel = 1;
preecho = 1;
- x = 3;
+ x = MON_PRE_TX;
} else
- x = 0;
+ x = MON_BRX;
++i; /* we care about the file name */
output_file = argv[i];
@@ -376,50 +389,50 @@ int main(int argc, char *argv[])
}
/* Open Pseudo device */
- if ((pfd[0] = pseudo_open()) < 0)
+ if ((pfd[MON_BRX] = pseudo_open()) < 0)
exit(1);
- if (multichannel && ((pfd[1] = pseudo_open()) < 0))
+ if (multichannel && ((pfd[MON_TX] = pseudo_open()) < 0))
exit(1);
if (preecho) {
- if ((pfd[2] = pseudo_open()) < 0)
+ if ((pfd[MON_PRE_BRX] = pseudo_open()) < 0)
exit(1);
- if (multichannel && ((pfd[3] = pseudo_open()) < 0))
+ if (multichannel && ((pfd[MON_PRE_TX] = pseudo_open()) < 0))
exit(1);
}
/* Conference them */
if (multichannel) {
memset(&zc, 0, sizeof(zc));
zc.chan = 0;
- zc.confno = atoi(argv[1]);
+ zc.confno = chan;
/* Two pseudo's, one for tx, one for rx */
- zc.confmode = ZT_CONF_MONITORTX;
- if (ioctl(pfd[0], ZT_SETCONF, &zc) < 0) {
+ zc.confmode = ZT_CONF_MONITOR;
+ if (ioctl(pfd[MON_BRX], ZT_SETCONF, &zc) < 0) {
fprintf(stderr, "Unable to monitor: %s\n", strerror(errno));
exit(1);
}
memset(&zc, 0, sizeof(zc));
zc.chan = 0;
- zc.confno = atoi(argv[1]);
- zc.confmode = ZT_CONF_MONITOR;
- if (ioctl(pfd[1], ZT_SETCONF, &zc) < 0) {
+ zc.confno = chan;
+ zc.confmode = ZT_CONF_MONITORTX;
+ if (ioctl(pfd[MON_TX], ZT_SETCONF, &zc) < 0) {
fprintf(stderr, "Unable to monitor: %s\n", strerror(errno));
exit(1);
}
if (preecho) {
memset(&zc, 0, sizeof(zc));
zc.chan = 0;
- zc.confno = atoi(argv[1]);
+ zc.confno = chan;
/* Two pseudo's, one for tx, one for rx */
- zc.confmode = ZT_CONF_MONITOR_TX_PREECHO;
- if (ioctl(pfd[2], ZT_SETCONF, &zc) < 0) {
+ zc.confmode = ZT_CONF_MONITOR_RX_PREECHO;
+ if (ioctl(pfd[MON_PRE_BRX], ZT_SETCONF, &zc) < 0) {
fprintf(stderr, "Unable to monitor: %s\n", strerror(errno));
exit(1);
}
memset(&zc, 0, sizeof(zc));
zc.chan = 0;
- zc.confno = atoi(argv[1]);
- zc.confmode = ZT_CONF_MONITOR_RX_PREECHO;
- if (ioctl(pfd[3], ZT_SETCONF, &zc) < 0) {
+ zc.confno = chan;
+ zc.confmode = ZT_CONF_MONITOR_TX_PREECHO;
+ if (ioctl(pfd[MON_PRE_TX], ZT_SETCONF, &zc) < 0) {
fprintf(stderr, "Unable to monitor: %s\n", strerror(errno));
exit(1);
}
@@ -427,18 +440,18 @@ int main(int argc, char *argv[])
} else {
memset(&zc, 0, sizeof(zc));
zc.chan = 0;
- zc.confno = atoi(argv[1]);
+ zc.confno = chan;
zc.confmode = ZT_CONF_MONITORBOTH;
- if (ioctl(pfd[0], ZT_SETCONF, &zc) < 0) {
+ if (ioctl(pfd[MON_BRX], ZT_SETCONF, &zc) < 0) {
fprintf(stderr, "Unable to monitor: %s\n", strerror(errno));
exit(1);
}
if (preecho) {
memset(&zc, 0, sizeof(zc));
zc.chan = 0;
- zc.confno = atoi(argv[1]);
+ zc.confno = chan;
zc.confmode = ZT_CONF_MONITORBOTH_PREECHO;
- if (ioctl(pfd[2], ZT_SETCONF, &zc) < 0) {
+ if (ioctl(pfd[MON_PRE_BRX], ZT_SETCONF, &zc) < 0) {
fprintf(stderr, "Unable to monitor: %s\n", strerror(errno));
exit(1);
}
@@ -453,40 +466,40 @@ int main(int argc, char *argv[])
}
/* Now, copy from pseudo to audio */
for (;;) {
- res = read(pfd[0], buf, sizeof(buf));
- if (res < 1)
+ res_brx = read(pfd[MON_BRX], buf_brx, sizeof(buf_brx));
+ if (res_brx < 1)
break;
- if (ofh[0])
- fwrite(buf, 1, res, ofh[0]);
+ if (ofh[MON_BRX])
+ fwrite(buf_brx, 1, res_brx, ofh[MON_BRX]);
if (multichannel) {
- res2 = read(pfd[1], buf2, res);
- if (res2 < 1)
+ res_tx = read(pfd[MON_TX], buf_tx, res_brx);
+ if (res_tx < 1)
break;
- if (ofh[1])
- fwrite(buf2, 1, res2, ofh[1]);
+ if (ofh[MON_TX])
+ fwrite(buf_tx, 1, res_tx, ofh[MON_TX]);
if (visual) {
- if (res == res2)
- visualize((short *)buf, (short *)buf2, res/2);
+ if (res_brx == res_tx)
+ visualize((short *)buf_tx, (short *)buf_brx, res_brx/2);
else
- printf("Huh? res = %d, res2 = %d?\n", res, res2);
+ printf("Huh? res_tx = %d, res_brx = %d?\n", res_tx, res_brx);
}
}
if (preecho) {
- res = read(pfd[2], buf, sizeof(buf));
- if (res < 1)
+ res_brx = read(pfd[MON_PRE_BRX], buf_brx, sizeof(buf_brx));
+ if (res_brx < 1)
break;
- if (ofh[2])
- fwrite(buf, 1, res, ofh[2]);
+ if (ofh[MON_PRE_BRX])
+ fwrite(buf_brx, 1, res_brx, ofh[MON_PRE_BRX]);
if (multichannel) {
- res2 = read(pfd[3], buf2, res);
- if (res2 < 1)
+ res_tx = read(pfd[MON_PRE_TX], buf_tx, res_brx);
+ if (res_tx < 1)
break;
- if (ofh[3])
- fwrite(buf2, 1, res, ofh[3]);
+ if (ofh[MON_PRE_TX])
+ fwrite(buf_tx, 1, res_tx, ofh[MON_PRE_TX]);
/* XXX How are we going to visualize the preecho set of streams?
if (visual) {
@@ -500,16 +513,16 @@ int main(int argc, char *argv[])
if (ossoutput && afd) {
if (stereo) {
- for (x=0;x<res;x++)
- buf2[x<<1] = buf2[(x<<1) + 1] = buf[x];
- write(afd, buf2, res << 1);
+ for (x=0;x<res_brx;x++)
+ buf_tx[x<<1] = buf_tx[(x<<1) + 1] = buf_brx[x];
+ write(afd, buf_tx, res_brx << 1);
} else
- write(afd, buf, res);
+ write(afd, buf_brx, res_brx);
}
}
- if (ofh[0]) fclose(ofh[0]);
- if (ofh[1]) fclose(ofh[1]);
- if (ofh[2]) fclose(ofh[2]);
- if (ofh[3]) fclose(ofh[3]);
+ if (ofh[MON_BRX]) fclose(ofh[MON_BRX]);
+ if (ofh[MON_TX]) fclose(ofh[MON_TX]);
+ if (ofh[MON_PRE_BRX]) fclose(ofh[MON_PRE_BRX]);
+ if (ofh[MON_PRE_TX]) fclose(ofh[MON_PRE_TX]);
exit(0);
}