summaryrefslogtreecommitdiffstats
path: root/usr.sbin/cdcontrol
diff options
context:
space:
mode:
authorache <ache@FreeBSD.org>1996-02-03 14:13:36 +0000
committerache <ache@FreeBSD.org>1996-02-03 14:13:36 +0000
commita768aedccd73f95fd008d27b24248922358b35c6 (patch)
tree004e500e7ab608b961a19e89494b465d6005c793 /usr.sbin/cdcontrol
parent660a4cf0c0f7f298b2e2980b86664c8ba12d5f72 (diff)
downloadFreeBSD-src-a768aedccd73f95fd008d27b24248922358b35c6.zip
FreeBSD-src-a768aedccd73f95fd008d27b24248922358b35c6.tar.gz
Implement several new commands
Diffstat (limited to 'usr.sbin/cdcontrol')
-rw-r--r--usr.sbin/cdcontrol/cdcontrol.118
-rw-r--r--usr.sbin/cdcontrol/cdcontrol.c119
2 files changed, 102 insertions, 35 deletions
diff --git a/usr.sbin/cdcontrol/cdcontrol.1 b/usr.sbin/cdcontrol/cdcontrol.1
index 9ef306f..9705cb2 100644
--- a/usr.sbin/cdcontrol/cdcontrol.1
+++ b/usr.sbin/cdcontrol/cdcontrol.1
@@ -40,7 +40,7 @@ characters as are required to uniquely identify a command
need be specified.
.Bl -tag -width Cm
-.It Cm play Op Ar first_track Op Ar last_track
+.It Cm play Ar first_track Op Ar last_track
Play from track
.Nm first_track
to track
@@ -64,7 +64,7 @@ in seconds and
(frame number). Minutes are in the range 0-99. Seconds are in the range 0-59.
Frame numbers are in the range 0-74.
-.It Cm play Ar #start_block Op length
+.It Cm play Op Ar #start_block Op length
Play starting from the logical block
.Nm start_block
using
@@ -111,10 +111,12 @@ Play the left subtrack on both left and right channels.
Play the right subtrack on both left and right channels.
.It Cm info
+Print the the table of contents.
+
+.It Cm status
Print the information about the disc:
the current playing status and position,
-the current values of the volume for left and right channels,
-and the table of contents.
+the current values of the volume for left and right channels.
.It Cm help
Print the list of available commands.
@@ -125,9 +127,15 @@ Enable the debugging mode of the CD device driver.
.It Cm debug Ar off
Disable the driver debugging mode.
-.It Cm debug Ar reset
+.It Cm reset
Perform the hardware reset of the device.
+.It Cm set Ar msf
+Set minute-second-frame ioctl mode (default).
+
+.It Cm set Ar lba
+Set LBA ioctl mode.
+
.It Cm quit
Quit the program.
diff --git a/usr.sbin/cdcontrol/cdcontrol.c b/usr.sbin/cdcontrol/cdcontrol.c
index ec47ab9..8223db6 100644
--- a/usr.sbin/cdcontrol/cdcontrol.c
+++ b/usr.sbin/cdcontrol/cdcontrol.c
@@ -1,7 +1,9 @@
/*
- * Compact Disc Control Utility by Serge V. Vakulenko, <vak@cronyx.ru>.
+ * Compact Disc Control Utility by Serge V. Vakulenko <vak@cronyx.ru>.
* Based on the non-X based CD player by Jean-Marc Zucconi and
* Andrey A. Chernov.
+ *
+ * $Id$
*/
#include <stdio.h>
#include <stdlib.h>
@@ -12,7 +14,7 @@
#include <sys/cdio.h>
#include <sys/ioctl.h>
-#define VERSION "1.1"
+#define VERSION "2.0"
/*
* Audio Status Codes
@@ -30,29 +32,39 @@ struct cmdtab {
char *args;
} cmdtab[] = {
#define CMD_DEBUG 1
- { CMD_DEBUG, "Debug", "[ on | off | reset ]", },
+ { CMD_DEBUG, "Debug", "on | off", },
#define CMD_EJECT 2
{ CMD_EJECT, "Eject", "", },
#define CMD_HELP 3
{ CMD_HELP, "?", 0, },
{ CMD_HELP, "Help", "", },
#define CMD_INFO 4
- { CMD_INFO, "INFo", "", },
+ { CMD_INFO, "I", 0, },
+ { CMD_INFO, "Info", "", },
#define CMD_INJECT 5
{ CMD_INJECT, "INJect", "", },
#define CMD_PAUSE 6
{ CMD_PAUSE, "PAuse", "", },
#define CMD_PLAY 7
- { CMD_PLAY, "PLay", "min1:sec1[.fr1] [min2:sec2[.fr2]]", },
- { CMD_PLAY, "PLay", "track1[.index1] [track2.[index2]]", },
- { CMD_PLAY, "PLay", "[#block [len]]", },
+ { CMD_PLAY, "P", 0, },
+ { CMD_PLAY, "Play", "min1:sec1[.fr1] [min2:sec2[.fr2]]", },
+ { CMD_PLAY, "Play", "track1[.index1] [track2.[index2]]", },
+ { CMD_PLAY, "Play", "[#block [len]]", },
#define CMD_QUIT 8
{ CMD_QUIT, "Quit", "", },
-#define CMD_RESUME 9
+#define CMD_RESET 9
+ { CMD_RESET, "RESEt", "", },
+#define CMD_RESUME 10
+ { CMD_RESUME, "R", 0, },
{ CMD_RESUME, "Resume", "", },
-#define CMD_STOP 10
- { CMD_STOP, "Stop", "", },
-#define CMD_VOLUME 11
+#define CMD_SET 11
+ { CMD_SET, "SEt", "msf | lba", },
+#define CMD_STATUS 12
+ { CMD_STATUS, "S", 0, },
+ { CMD_STATUS, "Status", "", },
+#define CMD_STOP 13
+ { CMD_STOP, "STOp", "", },
+#define CMD_VOLUME 14
{ CMD_VOLUME, "Volume", "<l> <r> | left | right | mute | mono | stereo", },
{ 0, 0, },
};
@@ -62,6 +74,7 @@ struct cd_toc_entry toc_buffer[100];
char *cdname;
int fd = -1;
int verbose = 1;
+int msf = 1;
extern char *optarg;
extern int optind;
@@ -75,6 +88,7 @@ int status (int *, int *, int *, int *);
int open_cd (void);
int play (char *arg);
int info (char *arg);
+int pstatus (char *arg);
char *input (int*);
void prtrack (struct cd_toc_entry *e, int lastflag);
void lba2msf (int lba, u_char *m, u_char *s, u_char *f);
@@ -205,6 +219,10 @@ int run (int cmd, char *arg)
if (fd<0 && ! open_cd ()) return (0);
return info (arg);
+ case CMD_STATUS:
+ if (fd<0 && ! open_cd ()) return (0);
+ return pstatus (arg);
+
case CMD_PAUSE:
if (fd<0 && ! open_cd ()) return (0);
return ioctl (fd, CDIOCPAUSE);
@@ -217,14 +235,21 @@ int run (int cmd, char *arg)
if (fd<0 && ! open_cd ()) return (0);
return ioctl (fd, CDIOCSTOP);
+ case CMD_RESET:
+ if (fd<0 && ! open_cd ()) return (0);
+ rc = ioctl (fd, CDIOCRESET);
+ if (rc < 0)
+ return rc;
+ close(fd);
+ fd = -1;
+ return (0);
+
case CMD_DEBUG:
if (fd<0 && ! open_cd ()) return (0);
if (strcasecmp (arg, "on") == 0)
return ioctl (fd, CDIOCSETDEBUG);
if (strcasecmp (arg, "off") == 0)
return ioctl (fd, CDIOCCLRDEBUG);
- if (strcasecmp (arg, "reset") == 0)
- return ioctl (fd, CDIOCRESET);
printf ("Invalid command arguments\n");
return (0);
@@ -249,6 +274,15 @@ int run (int cmd, char *arg)
if (fd<0 && ! open_cd ()) return (0);
return play (arg);
+ case CMD_SET:
+ if (strcasecmp (arg, "msf") == 0)
+ msf = 1;
+ else if (strcasecmp (arg, "lba") == 0)
+ msf = 0;
+ else
+ printf ("Invalid command arguments\n");
+ return (0);
+
case CMD_VOLUME:
if (fd<0 && ! open_cd ()) return (0);
@@ -360,11 +394,10 @@ char *strstatus (int sts)
}
}
-int info (char *arg)
+int pstatus (char *arg)
{
- struct ioc_toc_header h;
struct ioc_vol v;
- int rc, i, n, trk, m, s, f;
+ int rc, trk, m, s, f;
rc = status (&trk, &m, &s, &f);
if (rc >= 0)
@@ -384,7 +417,14 @@ int info (char *arg)
else
printf ("%d %d\n", v.vol[0], v.vol[1]);
else
- printf ("No volume info\n");
+ printf ("No volume level info\n");
+ return(0);
+}
+
+int info (char *arg)
+{
+ struct ioc_toc_header h;
+ int rc, i, n;
rc = ioctl (fd, CDIOREADTOCHEADER, &h);
if (rc >= 0)
@@ -436,20 +476,30 @@ void prtrack (struct cd_toc_entry *e, int lastflag)
int block, next, len;
u_char m, s, f;
- /* Print track start */
- printf ("%2d:%02d.%02d ", e->addr.msf.minute,
- e->addr.msf.second, e->addr.msf.frame);
-
- block = msf2lba (e->addr.msf.minute, e->addr.msf.second,
- e->addr.msf.frame);
+ if (msf) {
+ /* Print track start */
+ printf ("%2d:%02d.%02d ", e->addr.msf.minute,
+ e->addr.msf.second, e->addr.msf.frame);
+
+ block = msf2lba (e->addr.msf.minute, e->addr.msf.second,
+ e->addr.msf.frame);
+ } else {
+ block = ntohl(e->addr.lba);
+ lba2msf(block, &m, &s, &f);
+ /* Print track start */
+ printf ("%2d:%02d.%02d ", m, s, f);
+ }
if (lastflag) {
/* Last track -- print block */
printf (" - %6d - -\n", block);
return;
}
- next = msf2lba (e[1].addr.msf.minute, e[1].addr.msf.second,
- e[1].addr.msf.frame);
+ if (msf)
+ next = msf2lba (e[1].addr.msf.minute, e[1].addr.msf.second,
+ e[1].addr.msf.frame);
+ else
+ next = ntohl(e[1].addr.lba);
len = next - block;
lba2msf (len, &m, &s, &f);
@@ -493,7 +543,7 @@ int read_toc_entrys (int len)
{
struct ioc_read_toc_entry t;
- t.address_format = CD_MSF_FORMAT;
+ t.address_format = msf ? CD_MSF_FORMAT : CD_LBA_FORMAT;
t.starting_track = 0;
t.data_len = len;
t.data = toc_buffer;
@@ -518,18 +568,27 @@ int status (int *trk, int *min, int *sec, int *frame)
{
struct ioc_read_subchannel s;
struct cd_sub_channel_info data;
+ u_char mm, ss, ff;
bzero (&s, sizeof (s));
s.data = &data;
s.data_len = sizeof (data);
- s.address_format = CD_MSF_FORMAT;
+ s.address_format = msf ? CD_MSF_FORMAT : CD_LBA_FORMAT;
s.data_format = CD_CURRENT_POSITION;
if (ioctl (fd, CDIOCREADSUBCHANNEL, (char *) &s) < 0)
return -1;
*trk = s.data->what.position.track_number;
- *min = s.data->what.position.reladdr.msf.minute;
- *sec = s.data->what.position.reladdr.msf.second;
- *frame = s.data->what.position.reladdr.msf.frame;
+ if (msf) {
+ *min = s.data->what.position.reladdr.msf.minute;
+ *sec = s.data->what.position.reladdr.msf.second;
+ *frame = s.data->what.position.reladdr.msf.frame;
+ } else {
+ lba2msf(ntohl(s.data->what.position.reladdr.lba),
+ &mm, &ss, &ff);
+ *min = mm;
+ *sec = ss;
+ *frame = ff;
+ }
return s.data->header.audio_status;
}
OpenPOWER on IntegriCloud