--- 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);
