From c863386a34d481bf58d00657ee021f172e9ee708 Mon Sep 17 00:00:00 2001 From: Pietro Cerutti Date: Mon, 14 Jul 2008 13:22:09 +0000 Subject: [PATCH] - Enhance volume handling PR: 125054 Submitted by: gahr Approved by: cperciva --- usr.sbin/cdcontrol/cdcontrol.1 | 10 ++++++++- usr.sbin/cdcontrol/cdcontrol.c | 38 ++++++++++++++++++++++++++-------- 2 files changed, 38 insertions(+), 10 deletions(-) diff --git a/usr.sbin/cdcontrol/cdcontrol.1 b/usr.sbin/cdcontrol/cdcontrol.1 index 7f1e94a37804..b8cf92ddf2d5 100644 --- a/usr.sbin/cdcontrol/cdcontrol.1 +++ b/usr.sbin/cdcontrol/cdcontrol.1 @@ -1,6 +1,6 @@ .\" $FreeBSD$ .\" -.Dd May 8, 2002 +.Dd June 27, 2008 .Dt CDCONTROL 1 .Os .Sh NAME @@ -130,6 +130,14 @@ Stop the disc. Eject the disc. .It Ic close Inject the disc. +.It Ic volume +Same as +.Em status volume +command. +.It Ic volume Ar level +Set the volume of both channels to +.Ar level . +Allowed values are in the range 0-255. .It Ic volume Ar left_channel right_channel Set the volume of left channel to .Ar left_channel diff --git a/usr.sbin/cdcontrol/cdcontrol.c b/usr.sbin/cdcontrol/cdcontrol.c index eb914cf40c0a..ede590432013 100644 --- a/usr.sbin/cdcontrol/cdcontrol.c +++ b/usr.sbin/cdcontrol/cdcontrol.c @@ -16,6 +16,19 @@ * 11-Oct-1995: Serge V.Vakulenko * New eject algorithm. * Some code style reformatting. + * + * 13-Dec-1999: Knut A. Syed + * Volume-command modified. If used with only one + * parameter it now sets both channels. If used without + * parameters it will print volume-info. + * Version 2.0.1 + * + * 27-Jun-2008 Pietro Cerutti + * Further enhancement to volume. Values not in range 0-255 + * are now reduced to be in range. This prevents overflow in + * the uchar storing the volume (256 -> 0, -20 -> 236, ...). + * Version 2.0.2 + * */ #include @@ -39,7 +52,7 @@ __FBSDID("$FreeBSD$"); #include #include -#define VERSION "2.0" +#define VERSION "2.0.2" #define ASTS_INVALID 0x00 /* Audio status byte not valid */ #define ASTS_PLAYING 0x11 /* Audio play operation in progress */ @@ -100,7 +113,7 @@ struct cmdtab { { CMD_STATUS, "status", 1, "[audio | media | volume]" }, { CMD_STOP, "stop", 3, "" }, { CMD_VOLUME, "volume", 1, - " | left | right | mute | mono | stereo" }, + " | left | right | mute | mono | stereo" }, { CMD_CDID, "cdid", 2, "" }, { CMD_SPEED, "speed", 2, "speed" }, { 0, NULL, 0, NULL } @@ -270,7 +283,7 @@ int main (int argc, char **argv) int run (int cmd, char *arg) { long speed; - int l, r, rc; + int l, r, rc, count; switch (cmd) { @@ -396,6 +409,9 @@ int run (int cmd, char *arg) if (fd < 0 && !open_cd ()) return (0); + if (! strlen (arg)) + return pstatus ("volume"); + if (! strncasecmp (arg, "left", strlen(arg))) return ioctl (fd, CDIOCSETLEFT); @@ -411,12 +427,13 @@ int run (int cmd, char *arg) if (! strncasecmp (arg, "mute", strlen(arg))) return ioctl (fd, CDIOCSETMUTE); - if (2 != sscanf (arg, "%d %d", &l, &r)) { - warnx("invalid command arguments"); - return (0); - } - - return setvol (l, r); + count = sscanf (arg, "%d %d", &l, &r); + if (count == 1) + return setvol (l, l); + if (count == 2) + return setvol (l, r); + warnx("invalid command arguments"); + return (0); case CMD_SPEED: if (fd < 0 && ! open_cd ()) @@ -1039,6 +1056,9 @@ int setvol (int left, int right) { struct ioc_vol v; + left = left < 0 ? 0 : left > 255 ? 255 : left; + right = right < 0 ? 0 : right > 255 ? 255 : right; + v.vol[0] = left; v.vol[1] = right; v.vol[2] = 0;