/* * volume.C * * Renaud Waldura * * Tue Sep 13 19:39:32 1994 * Mon Nov 21 15:32:23 1994 * * To adjust the speaker volume on a SparcStation IPC. * */ #include #include #include #include #include #include #include #define dieif(e) if (e) { perror(argv[0]); return errno; } else {} #define DEFAULT_INCREMENT (AUDIO_MAX_GAIN / 20) #define scale(n) (AUDIO_MAX_GAIN * (n) / 100) void usage (const char* progname) { cerr << "Usage: " << progname << " [=value|++|+value|--|-value] ; value in 0..100" << endl; exit(1); } main (int argc, char* argv[ ]) { int print_vol = 0; if (argc == 1) print_vol = 1; else if (!(argc == 2 && (argv[1][0] == '-' || argv[1][0] == '+' || argv[1][0] == '='))) usage(argv[0]); int au = open("/dev/audioctl", O_RDWR); // open audio driver dieif( au < 0 ); audio_info_t aif; dieif( ioctl(au, AUDIO_GETINFO, &aif) < 0 ); // get speaker volume int vol = aif.play.gain; if (print_vol) // no argument, just print the current volume { cout << 100 * vol / AUDIO_MAX_GAIN << endl; return 0; } if (argv[1][0] == '=') // argument is = vol = scale(atoi(&argv[1][1])); else if (argv[1][0] == '+') if (argv[1][1] == '+') // argument is ++ vol += DEFAULT_INCREMENT; else // argument is +n vol += scale(atoi(&argv[1][1])); else if (argv[1][0] == '-') if (argv[1][1] == '-') // argument is -- vol -= DEFAULT_INCREMENT; else // argument is -n vol -= scale(atoi(&argv[1][1])); if (vol > AUDIO_MAX_GAIN) vol = AUDIO_MAX_GAIN; else if (vol < AUDIO_MIN_GAIN) vol = AUDIO_MIN_GAIN; AUDIO_INITINFO(&aif); aif.play.gain = vol; dieif( ioctl(au, AUDIO_SETINFO, &aif) < 0 ); // change volume value return close(au); // and close keyboard driver }