#include <u.h>
#include <libc.h>
#include <bio.h>
#include <thread.h>
#include "audio.h"

Audio *a;

void
usage(void)
{
	fprint(2, "usage: volume [-i] [-x dev] [name] [left [right]]\n");
	threadexitsall("usage");
}

char*
names[] = 
{
	"pcm",
	"master",	/* does nothing on Linux 2.4! */
	"speaker",
	"bass",
	"treble",
	"line",
	"synth",
	"cd",
	"mic",
	"record",
	"mix",
	"pcm2",
	"line1",
	"line2",
	"line3",
	"digital1",
	"digital2",
	"digital3",
	"phonein",
	"phoneout",
	"radio",
	"video",
	"monitor",
	"igain",
	"ogain",
	0
};

void
get(char *name, int explicit)
{
	int i, l, r;
	char *p;
	
	if(name == nil){
		for(i=0; names[i]; i++)
			get(names[i], 0);
		return;
	}
	if(a->getvolume(a, name, &l, &r) < 0){
		if(explicit)
			fprint(2, "volume %s: %r\n", name);
		return;
	}
	if(strcmp(name, names[0]) == 0){
		p = "";
		name = "";
	}else
		p = " ";
	if(l == r)
		print("volume%s%s %d\n", p, name, l);
	else
		print("volume%s%s %d %d\n", p, name, l, r);
}

void
set(char *name, int l, int r)
{
	if(name == nil)
		name = names[0];
	if(a->setvolume(a, name, l, r) < 0)
		fprint(2, "volume: %r\n");
}

Biobuf b;
void
interactive(void)
{
	char *p, *f[5], buf[100];
	int nf, l, r;
	
	Binit(&b, 0, OREAD);
	print("ok\n");
	while((p = Brdstr(&b, '\n', 1)) != nil){
		nf = tokenize(p, f, nelem(f));
		if(nf == 1){
			if(a->getvolume(a, f[0], &l, &r) < 0){
				rerrstr(buf, sizeof buf);
				print("E%s\n", buf);
			}else
				print("%d %d\n", l, r);
		}else if(nf == 3){
			if(a->setvolume(a, f[0], atoi(f[1]), atoi(f[2])) < 0){
				rerrstr(buf, sizeof buf);
				print("E%s\n", buf);
			}else
				print("ok\n");
		}else
			print("Eunknown command\n");
		free(p);
	}
}

void
threadmain(int argc, char **argv)
{
	char *what, *p, *dev;
	int l, r, c, iflag;
	
	quotefmtinstall();
	dev = nil;
	what = nil;
	iflag = 0;
	ARGBEGIN{
	case 'x':
		dev = EARGF(usage());
		break;
	case 'i':
		iflag = 1;
		break;
	default:
		usage();
	}ARGEND

	if(iflag){
		if(argc != 0)
			usage();
		if((a = openaudio(dev, VOLUME)) == nil)
			sysfatal("openaudio: %r");
		interactive();
		threadexitsall(0);
	}
		
	if(argc > 0){
		c = argv[0][0];
		if(!isdigit(c)){
			what = argv[0];
			argv++;
			argc--;
		}
	}
	if(argc > 2)
		usage();

	if((a = openaudio(dev, VOLUME)) == nil)
		sysfatal("openaudio: %r");

	if(argc == 0){
		get(what, 1);
		threadexitsall(nil);
	}
	l = strtol(argv[0], &p, 0);
	if(*argv[0] == 0 || *p != 0)
		usage();
	if(argc > 1){
		r = strtol(argv[1], &p, 0);
		if(*argv[1] == 0 || *p != 0)
			usage();
	}else
		r = l;
	set(what, l, r);
	threadexitsall(nil);
}

