diff -urN midi_prog-/in.c midi_prog/in.c --- midi_prog-/in.c Fri Aug 28 00:00:00 2015 +++ midi_prog/in.c Sat Aug 29 00:00:00 2015 @@ -7,7 +7,7 @@ out_init(&otr, ac, av); *inp = otr; if(ifn == NULL) ifn = "-i"; - inp->fp = fp_get(ifn, ac, av, "-", "r"); + inp->fp = fp_get(ifn, ac, av, "-", "r", &inp->fn); } int diff -urN midi_prog-/out.c midi_prog/out.c --- midi_prog-/out.c Fri Aug 28 00:00:00 2015 +++ midi_prog/out.c Sat Aug 29 00:00:00 2015 @@ -32,7 +32,7 @@ ot->sign = (opt_idx("-u", ac, av) < 0); ot->ch_num = opt_int("-c", ac, av, 2); - ot->fp = fp_get("-o", ac, av, "-", "w"); + ot->fp = fp_get("-o", ac, av, "-", "w", &ot->fn); cmd[0] = '\0'; fn = ""; if(opt_idx("-play", ac, av) >= 0){ diff -urN midi_prog-/out.h midi_prog/out.h --- midi_prog-/out.h Fri Aug 28 00:00:00 2015 +++ midi_prog/out.h Sat Aug 29 00:00:00 2015 @@ -8,6 +8,7 @@ int bit_len; int sign; int ch_num; + char *fn; FILE *fp; int base; diff -urN midi_prog-/rawmix2.c midi_prog/rawmix2.c --- midi_prog-/rawmix2.c Fri Aug 28 00:00:00 2015 +++ midi_prog/rawmix2.c Sat Aug 29 00:00:00 2015 @@ -2,35 +2,82 @@ #include "in.h" #include "out.h" -int -main(int ac, char **av) +struct mix{ + int ch, en; + in_rec_t in; + double vol, pan; +}; + +void +mix_init(struct mix *m, int ch, int ac, char **av) { - struct out_rec otr; - in_rec_t in_l, in_r; + char key[16], *opt, *a_av[ AVSZ ]; + int a_ac = AVSZ; - char *l_opt = opt_str("-L", ac, av, NULL); - char *r_opt = opt_str("-R", ac, av, NULL); - char *l_av[ AVSZ ], *r_av[ AVSZ ]; - int l_ac = AVSZ, r_ac = AVSZ; + m->ch = ch; + sprintf(key, "-CH%d", ch); + opt = opt_str(key, ac, av, NULL); + m->en = (opt != NULL); + if(!m->en) return; + + line_to_ac_av(opt, &a_ac, a_av); + in_init(&m->in, a_ac, a_av, NULL); + m->vol = opt_double("-vol", a_ac, a_av, 1); + m->pan = opt_double("-pan", a_ac, a_av, 0.5); +} - opt_show(ac, av); +int +mix_get(struct mix *m, double *vs) +{ + int ret; + double v = 0; - line_to_ac_av(l_opt, &l_ac, l_av); - line_to_ac_av(r_opt, &r_ac, r_av); + if(!m->en) return EOF; + if((ret = in_do_mono(&m->in, &v)) == EOF){ + m->en = 0; + return EOF; + } + v *= m->vol; + vs[0] = (1 - m->pan) * v; + vs[1] = m->pan * v; + return ret; +} - in_init(&in_l, l_ac, l_av, NULL); - in_init(&in_r, r_ac, r_av, NULL); - out_init(&otr, ac, av); +#define MIX_N 16 - out_show_info(&otr); +int +main(int ac, char **av) +{ + struct mix mx[ MIX_N ]; + struct out_rec otr; + int i; + + for(i=0; iin.fp == NULL){ + fprintf(stderr, "i=%d fn=%s\n", i, m->in.fn); + ERR("Can't open"); + } + } - if(in_l.fp == NULL || in_r.fp == NULL || otr.fp == NULL) ERR("Can't open"); + out_init(&otr, ac, av); + if(otr.fp == NULL) ERR("Can't open"); while(1){ - double v[2]; - if(in_do_mono(&in_l, &v[0]) == EOF) break; - if(in_do_mono(&in_r, &v[1]) == EOF) break; - out_do2(&otr, v); + double vsum[2] = { 0, 0 }; + int cnt = 0; + for(i=0; ien) continue; + cnt++; + mix_get(m, vs); + vsum[0] += vs[0]; + vsum[1] += vs[1]; + } + if(cnt == 0) break; + out_do2(&otr, vsum); } fclose(otr.fp); return 0; diff -urN midi_prog-/util.c midi_prog/util.c --- midi_prog-/util.c Fri Aug 28 00:00:00 2015 +++ midi_prog/util.c Sat Aug 29 00:00:00 2015 @@ -154,9 +154,10 @@ } FILE * -fp_get(char *key, int ac, char **av, char *def_fn, char *mode) +fp_get(char *key, int ac, char **av, char *def_fn, char *mode, char **ret_fn) { char *fn = opt_str(key, ac, av, def_fn); + if(ret_fn) *ret_fn = fn; if(fn == NULL) return NULL; if(strcmp(fn, "-") == 0) return strcmp(mode, "r") == 0 ? stdin : stdout; return fopen(fn, mode); diff -urN midi_prog-/util.h midi_prog/util.h --- midi_prog-/util.h Fri Aug 28 00:00:00 2015 +++ midi_prog/util.h Sat Aug 29 00:00:00 2015 @@ -46,7 +46,7 @@ int dbl_max_idx(double *p, int next_bytes, int n, double *ret_v); -FILE *fp_get(char *key, int ac, char **av, char *def_fn, char *mode); +FILE *fp_get(char *key, int ac, char **av, char *def_fn, char *mode, char **ret_fn); struct chatt{ diff -urN midi_prog-/voco.c midi_prog/voco.c --- midi_prog-/voco.c Fri Aug 28 00:00:00 2015 +++ midi_prog/voco.c Sat Aug 29 00:00:00 2015 @@ -97,9 +97,10 @@ sscanf(opt_str("-band", ac, av, "500,3000/16"), "%d,%d/%d", &band.fl, &band.fh, &band.n); out_init(&otr, ac, av); - otr.fp = fp_get("-o", ac, av, "-", "w"); + otr.fp = fp_get("-o", ac, av, "-", "w", NULL); in_init(&in_carrier, ac, av, "-carrier"); - if(in_carrier.fp == NULL){ + if(opt_idx("-carrier", ac, av) < 0){ + in_carrier.fp = NULL; vco_init(&vco, ac, av); } in_init(&in_voice, ac, av, "-voice");