40
41
#include <dahdi/user.h>
41
42
#include "dahdi_tools_version.h"
43
#include "wavformat.h"
44
#include "autoconfig.h"
43
#include <linux/soundcard.h>
46
#ifdef HAVE_SYS_SOUNDCARD_H
47
# include <sys/soundcard.h>
49
# ifdef HAVE_LINUX_SOUNDCARD_H
50
# include <linux/soundcard.h>
52
# error "Your installation appears to be missing soundcard.h which is needed to continue."
46
57
* defines for file handle numbers
59
70
#define FRAG_SIZE 8
61
74
/* Put the ofh (output file handles) outside the main loop in case we ever add a
77
static FILE *ofh[MAX_OFH];
67
81
static int verbose;
83
/* handler to catch ctrl-c */
84
void cleanup_and_exit(int signal)
86
fprintf(stderr, "cntrl-c pressed\n");
87
run = 0; /* stop reading */
90
int filename_is_wav(char *filename)
92
if (NULL != strstr(filename, ".wav"))
98
* Fill the wav header with default info
99
* num_chans - 0 = mono; 1 = stereo
101
void wavheader_init(struct wavheader *wavheader, int num_chans)
103
memset(wavheader, 0, sizeof(struct wavheader));
105
memcpy(&wavheader->riff_chunk_id, "RIFF", 4);
106
memcpy(&wavheader->riff_type, "WAVE", 4);
108
memcpy(&wavheader->fmt_chunk_id, "fmt ", 4);
109
wavheader->fmt_data_size = 16;
110
wavheader->fmt_compression_code = 1;
111
wavheader->fmt_num_channels = num_chans;
112
wavheader->fmt_sample_rate = 8000;
113
wavheader->fmt_avg_bytes_per_sec = 16000;
114
wavheader->fmt_block_align = 2;
115
wavheader->fmt_significant_bps = 16;
117
memcpy(&wavheader->data_chunk_id, "data", 4);
69
120
int audio_open(void)
280
331
struct dahdi_confinfo zc;
282
333
extern char *optarg;
334
struct wavheader wavheaders[MAX_OFH]; /* we have one for each potential filehandle */
335
unsigned int bytes_written[MAX_OFH] = {0};
336
int file_is_wav[MAX_OFH] = {0};
284
339
if ((argc < 2) || (atoi(argv[1]) < 1)) {
285
340
fprintf(stderr, "Usage: dahdi_monitor <channel num> [-v[v]] [-m] [-o] [-l limit] [-f FILE | -s FILE | -r FILE1 -t FILE2] [-F FILE | -S FILE | -R FILE1 -T FILE2]\n");
289
344
fprintf(stderr, " -l LIMIT: Stop after reading LIMIT bytes\n");
290
345
fprintf(stderr, " -m: Separate rx/tx streams.\n");
291
346
fprintf(stderr, " -o: Output audio via OSS. Note: Only 'normal' combined rx/tx streams are output via OSS.\n");
292
fprintf(stderr, " -f FILE: Save combined rx/tx stream to FILE. Cannot be used with -m.\n");
347
fprintf(stderr, " -f FILE: Save combined rx/tx stream to mono FILE. Cannot be used with -m.\n");
293
348
fprintf(stderr, " -r FILE: Save rx stream to FILE. Implies -m.\n");
294
349
fprintf(stderr, " -t FILE: Save tx stream to FILE. Implies -m.\n");
295
350
fprintf(stderr, " -s FILE: Save stereo rx/tx stream to FILE. Implies -m.\n");
348
403
exit(EXIT_FAILURE);
350
405
fprintf(stderr, "Writing combined stream to %s\n", optarg);
406
file_is_wav[MON_BRX] = filename_is_wav(optarg);
407
if (file_is_wav[MON_BRX]) {
408
wavheader_init(&wavheaders[MON_BRX], 1);
409
if (fwrite(&wavheaders[MON_BRX], 1, sizeof(struct wavheader), ofh[MON_BRX]) != sizeof(struct wavheader)) {
410
fprintf(stderr, "Could not write wav header to %s: %s\n", optarg, strerror(errno));
381
444
exit(EXIT_FAILURE);
383
446
fprintf(stderr, "Writing receive stream to %s\n", optarg);
447
file_is_wav[MON_BRX] = filename_is_wav(optarg);
448
if (file_is_wav[MON_BRX]) {
449
wavheader_init(&wavheaders[MON_BRX], 1);
450
if (fwrite(&wavheaders[MON_BRX], 1, sizeof(struct wavheader), ofh[MON_BRX]) != sizeof(struct wavheader)) {
451
fprintf(stderr, "Could not write wav header to %s: %s\n", optarg, strerror(errno));
384
455
multichannel = 1;
398
469
exit(EXIT_FAILURE);
400
471
fprintf(stderr, "Writing pre-echo receive stream to %s\n", optarg);
472
file_is_wav[MON_PRE_BRX] = filename_is_wav(optarg);
473
if (file_is_wav[MON_PRE_BRX]) {
474
wavheader_init(&wavheaders[MON_PRE_BRX], 1);
475
if (fwrite(&wavheaders[MON_PRE_BRX], 1, sizeof(struct wavheader), ofh[MON_PRE_BRX]) != sizeof(struct wavheader)) {
476
fprintf(stderr, "Could not write wav header to %s: %s\n", optarg, strerror(errno));
402
481
multichannel = 1;
416
495
exit(EXIT_FAILURE);
418
497
fprintf(stderr, "Writing transmit stream to %s\n", optarg);
498
file_is_wav[MON_TX] = filename_is_wav(optarg);
499
if (file_is_wav[MON_TX]) {
500
wavheader_init(&wavheaders[MON_TX], 1);
501
if (fwrite(&wavheaders[MON_TX], 1, sizeof(struct wavheader), ofh[MON_TX]) != sizeof(struct wavheader)) {
502
fprintf(stderr, "Could not write wav header to %s: %s\n", optarg, strerror(errno));
419
506
multichannel = 1;
433
520
exit(EXIT_FAILURE);
435
522
fprintf(stderr, "Writing pre-echo transmit stream to %s\n", optarg);
523
file_is_wav[MON_PRE_TX] = filename_is_wav(optarg);
524
if (file_is_wav[MON_PRE_TX]) {
525
wavheader_init(&wavheaders[MON_PRE_TX], 1);
526
if (fwrite(&wavheaders[MON_PRE_TX], 1, sizeof(struct wavheader), ofh[MON_PRE_TX]) != sizeof(struct wavheader)) {
527
fprintf(stderr, "Could not write wav header to %s: %s\n", optarg, strerror(errno));
437
532
multichannel = 1;
451
546
exit(EXIT_FAILURE);
453
548
fprintf(stderr, "Writing stereo stream to %s\n", optarg);
549
file_is_wav[MON_STEREO] = filename_is_wav(optarg);
550
if (file_is_wav[MON_STEREO]) {
551
wavheader_init(&wavheaders[MON_STEREO], 2);
552
if (fwrite(&wavheaders[MON_STEREO], 1, sizeof(struct wavheader), ofh[MON_STEREO]) != sizeof(struct wavheader)) {
553
fprintf(stderr, "Could not write wav header to %s: %s\n", optarg, strerror(errno));
454
557
multichannel = 1;
458
562
if (!multichannel && ofh[MON_PRE_BRX]) {
468
572
exit(EXIT_FAILURE);
470
574
fprintf(stderr, "Writing pre-echo stereo stream to %s\n", optarg);
575
file_is_wav[MON_PRE_STEREO] = filename_is_wav(optarg);
576
if (file_is_wav[MON_PRE_STEREO]) {
577
wavheader_init(&wavheaders[MON_PRE_STEREO], 2);
578
if (fwrite(&wavheaders[MON_PRE_STEREO], 1, sizeof(struct wavheader), ofh[MON_PRE_STEREO]) != sizeof(struct wavheader)) {
579
fprintf(stderr, "Could not write wav header to %s: %s\n", optarg, strerror(errno));
472
584
multichannel = 1;
677
if (signal(SIGINT, cleanup_and_exit) == SIG_ERR) {
678
fprintf(stderr, "Error registering signal handler: %s\n", strerror(errno));
565
681
printf("\nVisual Audio Levels.\n");
566
682
printf("--------------------\n");
569
685
draw_barheader();
571
687
/* Now, copy from pseudo to audio */
573
689
res_brx = read(pfd[MON_BRX], buf_brx, sizeof(buf_brx));
576
692
readcount += res_brx;
577
693
if (ofh[MON_BRX])
578
x = fwrite(buf_brx, 1, res_brx, ofh[MON_BRX]);
694
bytes_written[MON_BRX] += fwrite(buf_brx, 1, res_brx, ofh[MON_BRX]);
580
696
if (multichannel) {
581
697
res_tx = read(pfd[MON_TX], buf_tx, res_brx);
585
x = fwrite(buf_tx, 1, res_tx, ofh[MON_TX]);
701
bytes_written[MON_TX] += fwrite(buf_tx, 1, res_tx, ofh[MON_TX]);
587
703
if (stereo_output && ofh[MON_STEREO]) {
588
704
for (x = 0; x < res_tx; x++) {
589
705
stereobuf[x*2] = buf_brx[x];
590
706
stereobuf[x*2+1] = buf_tx[x];
592
x = fwrite(stereobuf, 1, res_tx*2, ofh[MON_STEREO]);
708
bytes_written[MON_STEREO] += fwrite(stereobuf, 1, res_tx*2, ofh[MON_STEREO]);
607
723
if (ofh[MON_PRE_BRX])
608
x = fwrite(buf_brx, 1, res_brx, ofh[MON_PRE_BRX]);
724
bytes_written[MON_PRE_BRX] += fwrite(buf_brx, 1, res_brx, ofh[MON_PRE_BRX]);
610
726
if (multichannel) {
611
727
res_tx = read(pfd[MON_PRE_TX], buf_tx, res_brx);
614
730
if (ofh[MON_PRE_TX])
615
x = fwrite(buf_tx, 1, res_tx, ofh[MON_PRE_TX]);
731
bytes_written[MON_PRE_TX] += fwrite(buf_tx, 1, res_tx, ofh[MON_PRE_TX]);
617
733
if (stereo_output && ofh[MON_PRE_STEREO]) {
618
734
for (x = 0; x < res_brx; x++) {
619
735
stereobuf[x*2] = buf_brx[x];
620
736
stereobuf[x*2+1] = buf_tx[x];
622
x = fwrite(stereobuf, 1, res_brx * 2, ofh[MON_PRE_STEREO]);
738
bytes_written[MON_PRE_STEREO] += fwrite(stereobuf, 1, res_brx * 2, ofh[MON_PRE_STEREO]);
643
if (ofh[MON_BRX]) fclose(ofh[MON_BRX]);
644
if (ofh[MON_TX]) fclose(ofh[MON_TX]);
645
if (ofh[MON_PRE_BRX]) fclose(ofh[MON_PRE_BRX]);
646
if (ofh[MON_PRE_TX]) fclose(ofh[MON_PRE_TX]);
647
if (ofh[MON_STEREO]) fclose(ofh[MON_STEREO]);
648
if (ofh[MON_PRE_STEREO]) fclose(ofh[MON_PRE_STEREO]);
759
/* write filesize info */
760
for (i = 0; i < MAX_OFH; i++) {
763
if (!(file_is_wav[i]))
768
if (fread(&wavheaders[i], 1, sizeof(struct wavheader), ofh[i]) != sizeof(struct wavheader)) {
769
fprintf(stderr, "Failed to read in a full wav header. Expect bad things.\n");
772
wavheaders[i].riff_chunk_size = (bytes_written[i]) + sizeof(struct wavheader) - 8; /* filesize - 8 */
773
wavheaders[i].data_data_size = bytes_written[i];
776
if (fwrite(&wavheaders[i], 1, sizeof(struct wavheader), ofh[i]) != sizeof(struct wavheader)) {
777
fprintf(stderr, "Failed to write out a full wav header.\n");
781
printf("done cleaning up ... exiting.\n");