xref: /inferno-os/appl/lib/volume.b (revision 9b29ac7ea714507a9c0690620c02c8ca5ab25f90)
1*37da2899SCharles.Forsythimplement Volumectl;
2*37da2899SCharles.Forsyth
3*37da2899SCharles.Forsythinclude "sys.m";
4*37da2899SCharles.Forsythsys: Sys;
5*37da2899SCharles.Forsythsprint: import sys;
6*37da2899SCharles.Forsyth
7*37da2899SCharles.Forsythinclude "draw.m";
8*37da2899SCharles.Forsythdraw: Draw;
9*37da2899SCharles.ForsythContext, Display, Font, Rect, Point, Image, Screen, Pointer: import draw;
10*37da2899SCharles.Forsyth
11*37da2899SCharles.Forsythinclude "prefab.m";
12*37da2899SCharles.Forsythprefab: Prefab;
13*37da2899SCharles.ForsythStyle, Element, Compound, Environ: import prefab;
14*37da2899SCharles.Forsyth
15*37da2899SCharles.Forsythinclude "muxclient.m";
16*37da2899SCharles.Forsythinclude "volume.m";
17*37da2899SCharles.Forsyth
18*37da2899SCharles.Forsythinclude "bufio.m";
19*37da2899SCharles.Forsythbufio: Bufio;
20*37da2899SCharles.ForsythIobuf: import bufio;
21*37da2899SCharles.Forsyth
22*37da2899SCharles.Forsythinclude "ir.m";
23*37da2899SCharles.Forsyth
24*37da2899SCharles.Forsythscreen: ref Screen;
25*37da2899SCharles.Forsythdisplay: ref Display;
26*37da2899SCharles.Forsythwindows: array of ref Image;
27*37da2899SCharles.Forsythenv: ref Environ;
28*37da2899SCharles.Forsythzr := ((0,0),(0,0));
29*37da2899SCharles.Forsyth
30*37da2899SCharles.Forsythel, et: ref Element;
31*37da2899SCharles.Forsyth
32*37da2899SCharles.Forsythstyle: ref Style;
33*37da2899SCharles.Forsyth
34*37da2899SCharles.Forsythc: ref Compound;
35*37da2899SCharles.Forsyth
36*37da2899SCharles.Forsythtics: int;
37*37da2899SCharles.ForsythINTERVAL: con 500;
38*37da2899SCharles.Forsyth
39*37da2899SCharles.Forsythvalue: int;
40*37da2899SCharles.Forsyth
41*37da2899SCharles.Forsythones, white, red: ref Image;
42*37da2899SCharles.Forsyth
43*37da2899SCharles.Forsythvolumectl(ctxt: ref Context, ch: chan of int, var: string)
44*37da2899SCharles.Forsyth{
45*37da2899SCharles.Forsyth	key: int;
46*37da2899SCharles.Forsyth
47*37da2899SCharles.Forsyth	sys = load Sys Sys->PATH;
48*37da2899SCharles.Forsyth	draw = load Draw Draw->PATH;
49*37da2899SCharles.Forsyth	prefab = load Prefab Prefab->PATH;
50*37da2899SCharles.Forsyth	if ((bufio = load Bufio Bufio->PATH) == nil) {
51*37da2899SCharles.Forsyth		sys->print("Audioctl: Can't load bufio\n");
52*37da2899SCharles.Forsyth		exit;
53*37da2899SCharles.Forsyth	}
54*37da2899SCharles.Forsyth
55*37da2899SCharles.Forsyth	if ((ac := bufio->open("/dev/volume", bufio->ORDWR)) == nil) {
56*37da2899SCharles.Forsyth		sys->print("Audioctl: Can't open /dev/volume: %r\n");
57*37da2899SCharles.Forsyth		exit;
58*37da2899SCharles.Forsyth	}
59*37da2899SCharles.Forsyth
60*37da2899SCharles.Forsyth	screen = ctxt.screen;
61*37da2899SCharles.Forsyth	display = ctxt.display;
62*37da2899SCharles.Forsyth	windows = array[1] of ref Image;
63*37da2899SCharles.Forsyth
64*37da2899SCharles.Forsyth	ones = display.opaque;
65*37da2899SCharles.Forsyth	white = display.color(draw->White);
66*37da2899SCharles.Forsyth	red = display.color(draw->Red);
67*37da2899SCharles.Forsyth
68*37da2899SCharles.Forsyth	textfont := Font.open(display, "*default*");
69*37da2899SCharles.Forsyth
70*37da2899SCharles.Forsyth	style = ref Style(
71*37da2899SCharles.Forsyth			textfont,			# titlefont
72*37da2899SCharles.Forsyth			textfont,			# textfont
73*37da2899SCharles.Forsyth			display.color(draw->White),	# elemcolor
74*37da2899SCharles.Forsyth			display.color(draw->Black),	# edgecolor
75*37da2899SCharles.Forsyth			display.color(draw->Yellow),	# titlecolor
76*37da2899SCharles.Forsyth			display.color(draw->Black),	# textcolor
77*37da2899SCharles.Forsyth			display.color(130));		# highlightcolor
78*37da2899SCharles.Forsyth
79*37da2899SCharles.Forsyth	env = ref Environ (ctxt.screen, style);
80*37da2899SCharles.Forsyth
81*37da2899SCharles.Forsyth	slavectl := chan of int;
82*37da2899SCharles.Forsyth	spawn timerslave(slavectl);
83*37da2899SCharles.Forsyth
84*37da2899SCharles.Forsyth	while ((s := ac.gets('\n')) != nil) {
85*37da2899SCharles.Forsyth		sp := -1;
86*37da2899SCharles.Forsyth		for (i := 0; i < len s; i++) if (s[i] == ' ') sp = i;
87*37da2899SCharles.Forsyth		if (sp <= 1) {
88*37da2899SCharles.Forsyth			sys->print("Volume: /dev/volume bad:\n%s\n", s);
89*37da2899SCharles.Forsyth			exit;
90*37da2899SCharles.Forsyth		}
91*37da2899SCharles.Forsyth		if (var == s[0:sp]) {
92*37da2899SCharles.Forsyth			value = int s[sp+1:];
93*37da2899SCharles.Forsyth		}
94*37da2899SCharles.Forsyth	}
95*37da2899SCharles.Forsyth
96*37da2899SCharles.Forsyth	for(;;) {
97*37da2899SCharles.Forsyth		key = <- ch;
98*37da2899SCharles.Forsyth		case key {
99*37da2899SCharles.Forsyth		Ir->Enter =>
100*37da2899SCharles.Forsyth			slavectl <-= Muxclient->AMexit;
101*37da2899SCharles.Forsyth			return;
102*37da2899SCharles.Forsyth		Ir->VolUP =>
103*37da2899SCharles.Forsyth			if (value++ >= 100) value = 100;
104*37da2899SCharles.Forsyth			ac.puts(sprint("%s %d\n", var, value));
105*37da2899SCharles.Forsyth			displayslider();
106*37da2899SCharles.Forsyth		Ir->VolDN =>
107*37da2899SCharles.Forsyth			if (value-- <= 0) value = 0;
108*37da2899SCharles.Forsyth			ac.puts(sprint("%s %d\n", var, value));
109*37da2899SCharles.Forsyth			displayslider();
110*37da2899SCharles.Forsyth		}
111*37da2899SCharles.Forsyth	}
112*37da2899SCharles.Forsyth}
113*37da2899SCharles.Forsyth
114*37da2899SCharles.Forsythslider(): ref Element
115*37da2899SCharles.Forsyth{
116*37da2899SCharles.Forsyth	r: Rect;
117*37da2899SCharles.Forsyth
118*37da2899SCharles.Forsyth	r = ((0,0),(200,20));
119*37da2899SCharles.Forsyth	chans := display.image.chans;
120*37da2899SCharles.Forsyth	icon := display.newimage(r.inset(-2), chans, 0, draw->Black);
121*37da2899SCharles.Forsyth	icon.draw(r, white, ones, (0,0));
122*37da2899SCharles.Forsyth	rr := r;
123*37da2899SCharles.Forsyth	rr.max.x = 2*value;
124*37da2899SCharles.Forsyth	icon.draw(rr, red, ones, (0,0));
125*37da2899SCharles.Forsyth	return Element.icon(env, zr, icon, ones);
126*37da2899SCharles.Forsyth}
127*37da2899SCharles.Forsyth
128*37da2899SCharles.Forsythdisplayslider()
129*37da2899SCharles.Forsyth{
130*37da2899SCharles.Forsyth	if (et == nil) {
131*37da2899SCharles.Forsyth		et = Element.text(env, "Volume", zr, Prefab->EText);
132*37da2899SCharles.Forsyth		el = slider();
133*37da2899SCharles.Forsyth	}
134*37da2899SCharles.Forsyth
135*37da2899SCharles.Forsyth	img := el.image;
136*37da2899SCharles.Forsyth	r: Rect = ((0,0),(200,20));
137*37da2899SCharles.Forsyth	img.draw(r, white, nil, (0,0));
138*37da2899SCharles.Forsyth	r.max.x = 2*value;
139*37da2899SCharles.Forsyth	img.draw(r, red, nil, (0,0));
140*37da2899SCharles.Forsyth
141*37da2899SCharles.Forsyth	if (c == nil) {
142*37da2899SCharles.Forsyth		c = Compound.box(env, Point(100, 100), et, el);
143*37da2899SCharles.Forsyth		windows[0] = c.image;
144*37da2899SCharles.Forsyth	}
145*37da2899SCharles.Forsyth	c.draw();
146*37da2899SCharles.Forsyth	screen.top(windows);
147*37da2899SCharles.Forsyth	tics = 5;
148*37da2899SCharles.Forsyth}
149*37da2899SCharles.Forsyth
150*37da2899SCharles.Forsythtimerslave(ctl: chan of int)
151*37da2899SCharles.Forsyth{
152*37da2899SCharles.Forsyth	m: int;
153*37da2899SCharles.Forsyth
154*37da2899SCharles.Forsyth	for(;;) {
155*37da2899SCharles.Forsyth		sys->sleep(INTERVAL);
156*37da2899SCharles.Forsyth		if (tics-- <= 0) {
157*37da2899SCharles.Forsyth			tics = 0;
158*37da2899SCharles.Forsyth			c = nil;
159*37da2899SCharles.Forsyth			el = nil;
160*37da2899SCharles.Forsyth			et = nil;
161*37da2899SCharles.Forsyth			windows[0] = nil;
162*37da2899SCharles.Forsyth		}
163*37da2899SCharles.Forsyth
164*37da2899SCharles.Forsyth		alt{
165*37da2899SCharles.Forsyth		m = <-ctl =>
166*37da2899SCharles.Forsyth			return;
167*37da2899SCharles.Forsyth		* =>
168*37da2899SCharles.Forsyth			continue;
169*37da2899SCharles.Forsyth		}
170*37da2899SCharles.Forsyth	}
171*37da2899SCharles.Forsyth}
172