- Enhance volume handling

PR:		125054
Submitted by:	gahr
Approved by:	cperciva
This commit is contained in:
Pietro Cerutti 2008-07-14 13:22:09 +00:00
parent 9335f224bb
commit c863386a34
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=180507
2 changed files with 38 additions and 10 deletions

View File

@ -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

View File

@ -16,6 +16,19 @@
* 11-Oct-1995: Serge V.Vakulenko <vak@cronyx.ru>
* New eject algorithm.
* Some code style reformatting.
*
* 13-Dec-1999: Knut A. Syed <kas@kas.no>
* 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 <gahr@FreeBSD.org>
* 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 <sys/cdefs.h>
@ -39,7 +52,7 @@ __FBSDID("$FreeBSD$");
#include <unistd.h>
#include <vis.h>
#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,
"<l> <r> | left | right | mute | mono | stereo" },
"<l&r> <l> <r> | 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;