#include #include #include #include int vol, muted, headphones; Image *bg, *mlevel, *level; Rectangle slider; struct{ char *sys; int phones; int speakers; } pins[] = { "asquith", 27, 21, "x201", 25, 31, "r400", 22, 26, }; char* b2menugen(int n) { if(n == 0) return muted ? "unmute" : "mute"; return nil; } char* b3menugen(int n) { if(n == 0) return headphones ? "speakers" : "headphones"; return nil; } void redraw(void) { slider.min = screen->r.min; slider.max = screen->r.max; slider.min.y += (100 - vol) * Dy(screen->r) / 100; draw(screen, screen->r, bg, nil, ZP); draw(screen, slider, muted ? mlevel : level, nil, ZP); flushimage(display, 1); } void eresized(int new) { if(new && getwindow(display, Refnone) < 0) fprint(2,"can't reattach to window"); redraw(); } void main() { char *system; int i, hpin, spin, volfd, pinfd; Mouse m; Event e; Menu b2menu = {nil, b2menugen, 0}; Menu b3menu = {nil, b3menugen, 0}; volfd = open("/dev/volume", OWRITE); if (volfd < 0) sysfatal("open /dev/volume: %r"); pinfd = open("/dev/audioctl", OWRITE); if (pinfd < 0) sysfatal("open /dev/audioctl: %r"); hpin = spin = 0; system = getenv("sysname"); for(i = 0; i < (sizeof(pins) / sizeof(pins[0])); i++){ if(strcmp(pins[i].sys, system) == 0){ hpin = pins[i].phones; spin = pins[i].speakers; break; } } if(initdraw(nil, nil, "vol") < 0) sysfatal("initdraw: %r"); einit(Emouse); bg = allocimagemix(display, DPalebluegreen, DWhite); level = allocimage(display, Rect(0,0,1,1), screen->chan, 1, DPalegreygreen); mlevel = allocimage(display, Rect(0,0,1,1), screen->chan, 1, 0xCCCCCCFF); if(bg == nil || level == nil || mlevel == nil) sysfatal ("allocimage"); vol = 75; muted = headphones = 0; if(hpin && spin) fprint (pinfd, "pin %d\n", spin); fprint (volfd, "%d\n", vol); redraw(); for(;;){ if(event(&e) == Emouse){ m = e.mouse; if(m.buttons & 1){ vol = (slider.max.y - m.xy.y) * 100 / Dy(screen->r); redraw(); if(!muted) fprint (volfd, "%d\n", vol); sleep(50); } if(m.buttons & 2) if(emenuhit(2, &m, &b2menu) == 0){ if(muted) fprint (volfd, "%d\n", vol); else fprint (volfd, "0\n"); muted ^= 1; redraw(); } if(m.buttons & 4) if(emenuhit(3, &m, &b3menu) == 0){ headphones ^= 1; if(hpin && spin){ muted = 0; fprint (pinfd, "pin %d\n", headphones ? hpin : spin); fprint (volfd, "%d\n", vol); } } } } }