diff options
-rw-r--r-- | ztmonitor.c | 135 |
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); } |