diff options
Diffstat (limited to 'usr.sbin/cdcontrol')
-rw-r--r-- | usr.sbin/cdcontrol/cdcontrol.1 | 12 | ||||
-rw-r--r-- | usr.sbin/cdcontrol/cdcontrol.c | 78 |
2 files changed, 61 insertions, 29 deletions
diff --git a/usr.sbin/cdcontrol/cdcontrol.1 b/usr.sbin/cdcontrol/cdcontrol.1 index d2dcd8c..ba7ee16 100644 --- a/usr.sbin/cdcontrol/cdcontrol.1 +++ b/usr.sbin/cdcontrol/cdcontrol.1 @@ -1,4 +1,4 @@ -.\" $Id: cdcontrol.1,v 1.13 1997/12/08 07:43:13 charnier Exp $ +.\" $Id: cdcontrol.1,v 1.14 1998/01/07 07:43:04 charnier Exp $ .\" .Dd July 3, 1995 .Dt CDCONTROL 1 @@ -126,10 +126,18 @@ Play the right subtrack on both left and right channels. .It Cm info Print the table of contents. -.It Cm status +.It Cm status +.Op Ar audio | media | volume + Print the information about the disc: + +.Nm audio the current playing status and position, + +.Nm media the current media catalog status, + +.Nm volume the current values of the volume for left and right channels. .It Cm help diff --git a/usr.sbin/cdcontrol/cdcontrol.c b/usr.sbin/cdcontrol/cdcontrol.c index 092410d..fc375ee 100644 --- a/usr.sbin/cdcontrol/cdcontrol.c +++ b/usr.sbin/cdcontrol/cdcontrol.c @@ -20,7 +20,7 @@ #ifndef lint static const char rcsid[] = - "$Id$"; + "$Id: cdcontrol.c,v 1.16 1997/09/04 11:52:28 charnier Exp $"; #endif /* not lint */ #include <ctype.h> @@ -65,6 +65,9 @@ static const char rcsid[] = #define CMD_RESET 12 #define CMD_SET 13 #define CMD_STATUS 14 +#define STATUS_AUDIO 0x1 +#define STATUS_MEDIA 0x2 +#define STATUS_VOLUME 0x4 struct cmdtab { int command; @@ -87,7 +90,7 @@ struct cmdtab { { CMD_RESET, "reset", 4, "" }, { CMD_RESUME, "resume", 1, "" }, { CMD_SET, "set", 2, "msf | lba" }, -{ CMD_STATUS, "status", 1, "" }, +{ CMD_STATUS, "status", 1, "[audio | media | volume]" }, { CMD_STOP, "stop", 3, "" }, { CMD_VOLUME, "volume", 1, "<l> <r> | left | right | mute | mono | stereo" }, { 0, } @@ -677,43 +680,64 @@ int pstatus (char *arg) struct ioc_read_subchannel ss; struct cd_sub_channel_info data; int rc, trk, m, s, f; + int what = 0; + char *p; - rc = status (&trk, &m, &s, &f); - if (rc >= 0) + while ((p = strtok(arg, " \t"))) { + arg = 0; + if (!strncasecmp(p, "audio", strlen(p))) + what |= STATUS_AUDIO; + else if (!strncasecmp(p, "media", strlen(p))) + what |= STATUS_MEDIA; + else if (!strncasecmp(p, "volume", strlen(p))) + what |= STATUS_VOLUME; + else { + warnx("invalid command arguments"); + return 0; + } + } + if (!what) + what = STATUS_AUDIO|STATUS_MEDIA|STATUS_VOLUME; + if (what & STATUS_AUDIO) { + rc = status (&trk, &m, &s, &f); + if (rc >= 0) if (verbose) - printf ("Audio status = %d<%s>, current track = %d, current position = %d:%02d.%02d\n", - rc, strstatus (rc), trk, m, s, f); + printf ("Audio status = %d<%s>, current track = %d, current position = %d:%02d.%02d\n", + rc, strstatus (rc), trk, m, s, f); else - printf ("%d %d %d:%02d.%02d\n", rc, trk, m, s, f); - else + printf ("%d %d %d:%02d.%02d\n", rc, trk, m, s, f); + else printf ("No current status info available\n"); - - bzero (&ss, sizeof (ss)); - ss.data = &data; - ss.data_len = sizeof (data); - ss.address_format = msf ? CD_MSF_FORMAT : CD_LBA_FORMAT; - ss.data_format = CD_MEDIA_CATALOG; - rc = ioctl (fd, CDIOCREADSUBCHANNEL, (char *) &ss); - if (rc >= 0) { + } + if (what & STATUS_MEDIA) { + bzero (&ss, sizeof (ss)); + ss.data = &data; + ss.data_len = sizeof (data); + ss.address_format = msf ? CD_MSF_FORMAT : CD_LBA_FORMAT; + ss.data_format = CD_MEDIA_CATALOG; + rc = ioctl (fd, CDIOCREADSUBCHANNEL, (char *) &ss); + if (rc >= 0) { printf("Media catalog is %sactive", - ss.data->what.media_catalog.mc_valid ? "": "in"); + ss.data->what.media_catalog.mc_valid ? "": "in"); if (ss.data->what.media_catalog.mc_valid && ss.data->what.media_catalog.mc_number[0]) - printf(", number \"%.15s\"", - ss.data->what.media_catalog.mc_number); + printf(", number \"%.15s\"", + ss.data->what.media_catalog.mc_number); putchar('\n'); - } else + } else printf("No media catalog info available\n"); - - rc = ioctl (fd, CDIOCGETVOL, &v); - if (rc >= 0) + } + if (what & STATUS_VOLUME) { + rc = ioctl (fd, CDIOCGETVOL, &v); + if (rc >= 0) if (verbose) - printf ("Left volume = %d, right volume = %d\n", - v.vol[0], v.vol[1]); + printf ("Left volume = %d, right volume = %d\n", + v.vol[0], v.vol[1]); else - printf ("%d %d\n", v.vol[0], v.vol[1]); - else + printf ("%d %d\n", v.vol[0], v.vol[1]); + else printf ("No volume level info available\n"); + } return(0); } |