--- sox.20050917-inst6/src/interactive.h.orig 2007-02-21 13:27:33.000000000 +0100 +++ sox.20050917-inst6/src/interactive.h 2007-02-21 18:21:33.000000000 +0100 @@ -31,6 +31,8 @@ #define Y0 10 /* first row */ +#define DGAIN 0.5 + extern WINDOW *win; extern int beinteractive, quit; /* interactive mode */ --- sox.20050917-inst6/src/interactive.c.orig 2007-02-21 13:27:33.000000000 +0100 +++ sox.20050917-inst6/src/interactive.c 2007-02-21 22:07:12.000000000 +0100 @@ -7,7 +7,8 @@ WINDOW *win; extern int optind; extern unsigned long read_samples; -float speed = 1; +float stretch = 3.0; +float gain = -10; int beinteractive = 0; /* interactive mode */ int pfile = -1; /* communication file descriptor */ int pausecount = 0; /* total pause on 200000000 ns units */ @@ -149,7 +150,7 @@ difft = curt - playt; difftd = difft/86400; difft -= 86400 * difftd; tm = gmtime(&difft); /* mday-1 cos it is Jan 1st '70 */ - snprintf(stime, sizeof(stime), "%4d %02d:%02d:%02d", difftd, tm->tm_hour, tm->tm_min, tm->tm_sec); + snprintf(stime, sizeof(stime), "%4ld %02d:%02d:%02d", difftd, tm->tm_hour, tm->tm_min, tm->tm_sec); return stime; } @@ -157,10 +158,12 @@ draw_fixed(WINDOW *win, float ttime, ft_t informat0, ft_t outformat) { int col; +mvwprintw(win, 2, 0, "`1234567890-=<- speeds 0.5 - 3.2 f v gain +-0.5 dB\nup down speed +-0.1 times p[ause]\n' prev speed ^L redraw\n<- { [ ] } -> back/forw by 1, 4, 30 s t[ag begin] T[ag end]\nb[egin] e[nd] of file < > prev/next tag\nB[egin] q[uit] prev/next file d[elete tag] up to 5 s ago\nQ[uit] full stop D[elete tag] last before cursor"); mvwprintw(win, Y0 + 0, 0, "Time total: %s", hhmmss(ttime)); - mvwprintw(win, Y0 + 1, 0, "Speed"); + mvwprintw(win, Y0 + 1, 0, "Speed:%6.1f Gain:%8.1f dB", stretch, gain); mvwprintw(win, Y0 + 2, 0, "%s -> %s", informat0->filename, outformat->filename); - mvwprintw(win, 0, 0, "sox %s, interactive sox v. %s, %s", st_version(), VERSION_ISOX, ISOX_URL); + mvwprintw(win, 0, 0, " sox %s, interactive sox v. %s", st_version(), VERSION_ISOX); + mvwprintw(win, 1, 0, " %s", ISOX_URL); for (col = 0; col <= COLS; col++) { mvwprintw(win, Y0 + PTRROW-1, col, "_"); mvwprintw(win, Y0 + PTRROW+1, col, "^"); @@ -238,12 +241,12 @@ } void -restart_effect(float speed, struct st_effect efftab[]) { +restart_effect(float stretch, struct st_effect efftab[]) { char buffer[100], *argv[2] = { buffer, NULL }; drain_effect(1); (*efftab[1].h->stop)(&efftab[1]); - snprintf(buffer, sizeof(buffer), "%5.3f", 1/speed); + snprintf(buffer, sizeof(buffer), "%5.3f", 1/stretch); (*efftab[1].h->getopts)(&efftab[1], 1, &argv[0]); (*efftab[1].h->start)(&efftab[1]); } @@ -260,6 +263,7 @@ release_effect_buf(); /* releasing effects' internal output buffers */ stop_effects(); +neffects = 3; /* we return # of effects but sox can be started without any so 1st time we release the original # of eff. */ optind = 0; parse_effects(argc, argv); /* build efftab */ @@ -299,11 +303,11 @@ int interactive(WINDOW *win, ft_t informat0, ft_t outformat, struct st_effect efftab[], struct st_effect efftabR[], int *pneffects, struct st_effect user_efftab[], int nuser_effects, int *pquit) { - int jump, c, chspeed; + int jump, c, chstretch, chgain, argc; static int pause = 0; - char buf[100], *argv[10]; - float tmpspeed; - static float time = 0, ptime, pos = 0, oldspeed = -1; + char stretchbuf[100], gainbuf[100], *argv[10]; + float tmpstretch; + static float time = 0, ptime, pos = 0, oldstretch = -1; static struct timespec sl = { 0, 200000000 }; #if defined(TAGGING) int passtag; @@ -311,13 +315,13 @@ float ntime; #endif - if (oldspeed == -1) oldspeed = speed; + if (oldstretch == -1) oldstretch = stretch; time = (double)(read_samples) / (double)(informat0->info.rate); pos = (double)(read_samples) / (double)(informat0->length); draw_pos(win, pos); - chspeed = 0; + chstretch = chgain = 0; ptime = time; pause: while ( (c = read_char(win, pfile)) != ERR) { @@ -335,29 +339,32 @@ case 'e': time = (double)(informat0->length) / (double)(informat0->info.rate) - 60; if (time < 0) time = 0; break; - case KEY_DOWN: speed -= 0.1; if (speed <= 0) speed = 0.1; chspeed = 1; break; - case KEY_UP: speed += 0.1; if (speed > 5) speed = 5; chspeed = 1; break; - case KEY_NPAGE: speed -= 0.2; if (speed <= 0) speed = 0.1; chspeed = 1; break; - case KEY_PPAGE: speed += 0.2; if (speed > 5) speed = 5; chspeed = 1; break; - case '\'': tmpspeed = oldspeed; oldspeed = speed; speed = tmpspeed; chspeed = 1; break; - case 'p': pause = !pause; break; + case KEY_DOWN: stretch -= 0.1; if (stretch <= 0) stretch = 0.1; chstretch = 1; break; + case KEY_UP: stretch += 0.1; if (stretch > 5) stretch = 5; chstretch = 1; break; + case KEY_NPAGE: stretch -= 0.2; if (stretch <= 0) stretch = 0.1; chstretch = 1; break; + case KEY_PPAGE: stretch += 0.2; if (stretch > 5) stretch = 5; chstretch = 1; break; + case '\'': tmpstretch = oldstretch; oldstretch = stretch; stretch = tmpstretch; chstretch = 1; break; + case 'p': if (pause) mvwprintw(win, Y0 + 1, 6, "%6.1f", stretch); pause = !pause; break; /* upper keys row scale - except SPACE */ - case '`': oldspeed = speed; speed = 0.6; chspeed = 1; break; - case '1': oldspeed = speed; speed = 0.7; chspeed = 1; break; - case '2': oldspeed = speed; speed = 0.9; chspeed = 1; break; - case ' ': oldspeed = speed; speed = 1; chspeed = 1; break; - case '3': oldspeed = speed; speed = 1.1; chspeed = 1; break; - case '4': oldspeed = speed; speed = 1.3; chspeed = 1; break; - case '5': oldspeed = speed; speed = 1.6; chspeed = 1; break; - case '6': oldspeed = speed; speed = 1.8; chspeed = 1; break; - case '7': oldspeed = speed; speed = 2.0; chspeed = 1; break; - case '8': oldspeed = speed; speed = 2.2; chspeed = 1; break; - case '9': oldspeed = speed; speed = 2.4; chspeed = 1; break; - case '0': oldspeed = speed; speed = 2.6; chspeed = 1; break; - case '-': oldspeed = speed; speed = 2.8; chspeed = 1; break; - case '=': oldspeed = speed; speed = 3.0; chspeed = 1; break; - case '\177': oldspeed = speed; speed = 3.2; chspeed = 1; break; + case '`': oldstretch = stretch; stretch = 0.6; chstretch = 1; break; + case '1': oldstretch = stretch; stretch = 0.7; chstretch = 1; break; + case '2': oldstretch = stretch; stretch = 0.9; chstretch = 1; break; + case ' ': oldstretch = stretch; stretch = 1; chstretch = 1; break; + case '3': oldstretch = stretch; stretch = 1.1; chstretch = 1; break; + case '4': oldstretch = stretch; stretch = 1.3; chstretch = 1; break; + case '5': oldstretch = stretch; stretch = 1.6; chstretch = 1; break; + case '6': oldstretch = stretch; stretch = 1.8; chstretch = 1; break; + case '7': oldstretch = stretch; stretch = 2.0; chstretch = 1; break; + case '8': oldstretch = stretch; stretch = 2.2; chstretch = 1; break; + case '9': oldstretch = stretch; stretch = 2.4; chstretch = 1; break; + case '0': oldstretch = stretch; stretch = 2.6; chstretch = 1; break; + case '-': oldstretch = stretch; stretch = 2.8; chstretch = 1; break; + case '=': oldstretch = stretch; stretch = 3.0; chstretch = 1; break; + case '\177': oldstretch = stretch; stretch = 3.2; chstretch = 1; break; + + case 'f': case 'F': gain += DGAIN; chgain = 1; break; + case 'v': case 'V': gain -= DGAIN; chgain = 1; break; #if defined(TAGGING) case 't': case KEY_HOME: tag_add(time, 'b'); tag_display(win, time); break; @@ -385,7 +392,7 @@ prevpasstag = passtag; #endif - if (pause) { nanosleep(&sl, NULL); pausecount++; goto pause; } + if (pause) { mvwprintw(win, Y0 + 1, 7, "PAUSE"); nanosleep(&sl, NULL); pausecount++; goto pause; } jump = (time != ptime); @@ -393,14 +400,21 @@ (*informat0->h->seek)(informat0, time*informat0->info.rate); read_samples = time * (double)(informat0->info.rate); } - if (chspeed) { - mvwprintw(win, Y0 + 1, 8, "%.1f", speed); - /* restart_effect(speed); */ + if (chstretch || chgain) { + /* change stretch (pitch corrected speed) */ + mvwprintw(win, Y0 + 1, 6, "%6.1f", stretch); + /* restart_effect(stretch); */ argv[0] = "stretch"; - snprintf(buf, sizeof(buf), "%f", 1/speed); - argv[1] = buf; - argv[2] = NULL; - restart_all_eff(efftab, efftabR, pneffects, user_efftab, nuser_effects, 2, argv); + snprintf(stretchbuf, sizeof(stretchbuf), "%.3f", 1/stretch); + argv[1] = stretchbuf; + /* change gain */ + mvwprintw(win, Y0 + 1, 21, "%8.1f dB", gain); + argv[2] = "vol"; + snprintf(gainbuf, sizeof(gainbuf), "%.3f", gain); + argv[3] = gainbuf; + argv[4] = "dB"; + argv[5] = NULL; argc = 5; + restart_all_eff(efftab, efftabR, pneffects, user_efftab, nuser_effects, argc, argv); } mvwprintw(win, Y0 + 0, 8, "%s %4.1f%%", hhmmss(time), 100*pos); .