- Enhance volume handling
PR: 125054 Submitted by: gahr Approved by: cperciva
This commit is contained in:
parent
9335f224bb
commit
c863386a34
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/head/; revision=180507
@ -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
|
||||
|
@ -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)) {
|
||||
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);
|
||||
}
|
||||
|
||||
return setvol (l, r);
|
||||
|
||||
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;
|
||||
|
Loading…
Reference in New Issue
Block a user