summaryrefslogtreecommitdiff
path: root/ztmonitor.c
diff options
context:
space:
mode:
authorqwell <qwell@5390a7c7-147a-4af0-8ec9-7488f05a26cb>2008-01-26 00:09:45 +0000
committerqwell <qwell@5390a7c7-147a-4af0-8ec9-7488f05a26cb>2008-01-26 00:09:45 +0000
commit746c456a4de0b0f9e7de64e4a25bd87e8459bd7d (patch)
tree02912d73262d426d52c5b31c0bb44c97c42fd50b /ztmonitor.c
parent0fdf3e6de86e4afce44e2788a8b965f9602dc2fd (diff)
Swap RX and TX streams in ztmonitor, as the files were being saved incorrectly.
Add several defines, and modify many "magic numbers" to use them correctly (see above) Fix error message in audio_open() (closes issue #11194) Reported by: meneault Patches: ztmonitor-c_patch_txrx_1_4_rev3121 uploaded by meneault (license 260) ztmonitor-c_patch_buffer_1_4_rev3121 uploaded by meneault (license 260) ztmonitor-c_patch_audio_1_4_rev3121 uploaded by meneault (license 260) git-svn-id: http://svn.digium.com/svn/zaptel/branches/1.4@3742 5390a7c7-147a-4af0-8ec9-7488f05a26cb
Diffstat (limited to 'ztmonitor.c')
-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);
}