- @(#)README.bsd386	1.1 1/30/94 -

To compile and run WorkMan on BSD/386, you will need two things not
provided in the BSD/386 release:

	1) XView libraries and include files (3.0 or later). (available on
	bsdi.com for anonymous FTP)

	2) the attached diffs for the CDROM library (to provide a volume
	function with better resolution).

If you have a SoundBlaster Pro with a driver installed (also available
from bsdi.com, the SBlast-1.5 version, not Steve McCanne's version), you
can compile SoundBlaster volume control code, which is useful for
non-SCSI CDROM devices.  To do so, edit the Imakefile to remove the
comments around LOCALDEFS.  Once you have compiled, you can enable the
SoundBlaster volume control by patching the sb_fd variable to -1, like
so:

% /usr/bin/gdb -w workman
(gdb) set sb_fd = -1
(gdb) quit
%

Use imake to generate a BSD/386 Makefile, with something like:

imake -DUseInstalled -I/usr/src/local/XView3.0/config -I/usr/X11/lib/X11/config

For SCSI CD-ROM drives, WorkMan must be run as root (perhaps as setuid,
but that may have security implications on database file reading) in
order to have access to issue SCSI audio commands.

==John Kohl
jtk@kolvir.blrc.ma.us
---------------
And here's a patch file:

diff -c -r /cdrom/usr/src/lib/libcdrom/common.c ./common.c
*** /cdrom/usr/src/lib/libcdrom/common.c	Mon Mar  8 01:13:11 1993
--- ./common.c	Fri Jun 25 02:23:30 1993
***************
*** 28,33 ****
--- 28,34 ----
  	scsi2_status,
  	scsi2_eject,
  	scsi2_volume,
+ 	scsi2_volume2,
  },
  {
  	"panasonic",
***************
*** 38,43 ****
--- 39,45 ----
  	panasonic_status,
  	panasonic_eject,
  	panasonic_volume,
+ 	panasonic_volume2,
  },
  {
  	"toshiba",
***************
*** 48,53 ****
--- 50,56 ----
  	toshiba_status,
  	toshiba_eject,
  	toshiba_volume,
+ 	toshiba_volume2,
  },
  { 
  	"mitsumi",
***************
*** 58,63 ****
--- 61,67 ----
  	mitsumi_status,
  	mitsumi_eject,
  	mitsumi_volume,
+ 	mitsumi_volume2,
  },
  { NULL },
  };
***************
*** 198,201 ****
--- 202,216 ----
  int volume;
  {
  	return((*cdinfo->funcs->volume)(cdinfo, volume));
+ }
+ 
+ /*
+  * Set the stereo volume level 0 = min, 255 = max
+  */
+ int
+ cdvolume2(cdinfo, left, right)
+ struct cdinfo *cdinfo;
+ int left, right;
+ {
+ 	return((*cdinfo->funcs->volume2)(cdinfo, left, right));
  }
diff -c -r /cdrom/usr/src/lib/libcdrom/devs.h ./devs.h
*** /cdrom/usr/src/lib/libcdrom/devs.h	Mon Mar  8 11:42:08 1993
--- ./devs.h	Fri Jun 25 02:21:35 1993
***************
*** 21,26 ****
--- 21,27 ----
  	int	__P((*status)(struct cdinfo *, struct cdstatus *));
  	int	__P((*eject)(struct cdinfo *));
  	int	__P((*volume)(struct cdinfo *, int));
+ 	int	__P((*volume2)(struct cdinfo *, int, int));
  };
  
  struct	cdinfo *scsi2_probe __P((int, char *, char *, char *, int));
***************
*** 30,35 ****
--- 31,37 ----
  int	scsi2_status __P((struct cdinfo *, struct cdstatus *));
  int	scsi2_eject __P((struct cdinfo *));
  int	scsi2_volume __P((struct cdinfo *, int));
+ int	scsi2_volume2 __P((struct cdinfo *, int, int));
  
  struct cdinfo *panasonic_probe __P((int, char *, char *, char *, int));
  int	panasonic_close __P((struct cdinfo *));
***************
*** 38,43 ****
--- 40,46 ----
  int	panasonic_status __P((struct cdinfo *, struct cdstatus *));
  int	panasonic_eject __P((struct cdinfo *));
  int	panasonic_volume __P((struct cdinfo *, int));
+ int	panasonic_volume2 __P((struct cdinfo *, int, int));
  
  struct cdinfo *toshiba_probe __P((int, char *, char *, char *, int));
  int	toshiba_close __P((struct cdinfo *));
***************
*** 46,51 ****
--- 49,55 ----
  int	toshiba_status __P((struct cdinfo *, struct cdstatus *));
  int	toshiba_eject __P((struct cdinfo *));
  int	toshiba_volume __P((struct cdinfo *, int));
+ int	toshiba_volume2 __P((struct cdinfo *, int, int));
  
  struct cdinfo *mitsumi_probe __P((int, char *, char *, char *, int));
  int	mitsumi_close __P((struct cdinfo *));
***************
*** 54,59 ****
--- 58,64 ----
  int	mitsumi_status __P((struct cdinfo *, struct cdstatus *));
  int	mitsumi_eject __P((struct cdinfo *));
  int	mitsumi_volume __P((struct cdinfo *, int));
+ int	mitsumi_volume2 __P((struct cdinfo *, int, int));
  
  struct cdinfo *make_cdinfo __P((int, int));
  int	scsi_inquiry __P((int, char *, char *, char *, int *));
diff -c -r /cdrom/usr/src/lib/libcdrom/mitsumi.c ./mitsumi.c
*** /cdrom/usr/src/lib/libcdrom/mitsumi.c	Mon Mar  8 01:14:05 1993
--- ./mitsumi.c	Fri Jun 25 02:24:40 1993
***************
*** 238,247 ****
  	if (val > 255)
  		val = 255;
  
  	bzero(args, sizeof args);
  	args[0] = 0xae;
! 	args[1] = val;
! 	args[3] = val;
  	mitsumi_cmd(cdinfo->fd, args, 5, (char *)buf, 5);
  	if (buf[0] & 1)
  		fprintf(stderr, "error setting volume: %x\n", buf[0] & 0xff);
--- 238,258 ----
  	if (val > 255)
  		val = 255;
  
+ 	return mitsumi_volume2(cdinfo, val, val);
+ }
+ 
+ int
+ mitsumi_volume2(cdinfo, left, right)
+ 	struct cdinfo *cdinfo;
+ 	int left, right;
+ {
+ 	char args[20];
+ 	char buf[20];
+ 
  	bzero(args, sizeof args);
  	args[0] = 0xae;
! 	args[1] = left;
! 	args[3] = right;
  	mitsumi_cmd(cdinfo->fd, args, 5, (char *)buf, 5);
  	if (buf[0] & 1)
  		fprintf(stderr, "error setting volume: %x\n", buf[0] & 0xff);
diff -c -r /cdrom/usr/src/lib/libcdrom/panasonic.c ./panasonic.c
*** /cdrom/usr/src/lib/libcdrom/panasonic.c	Mon Mar  8 11:42:10 1993
--- ./panasonic.c	Fri Jun 25 02:24:55 1993
***************
*** 218,220 ****
--- 218,228 ----
  {
  	return (0);
  }
+ 
+ int
+ panasonic_volume2(cdinfo, left, right)
+ struct cdinfo *cdinfo;
+ int left, right;
+ {
+ 	return (0);
+ }
diff -c -r /cdrom/usr/src/lib/libcdrom/scsi2.c ./scsi2.c
*** /cdrom/usr/src/lib/libcdrom/scsi2.c	Mon Mar  8 11:42:11 1993
--- ./scsi2.c	Fri Jun 25 02:26:24 1993
***************
*** 233,240 ****
  	struct cdinfo *cdinfo;
  	int volume;
  {
- 	char cdb[10];
- 	char buf[100];
  	int val;
  
  	val = (volume * 255) / 100;
--- 233,238 ----
***************
*** 243,252 ****
  	if (val > 255)
  		val = 255;
  
  	/* mode select */
  	bzero(cdb, 6);
  	cdb[0] = 0x15;
! 	cdb[1] = 0x10;
  	cdb[4] = 20;
  
  	bzero(buf, sizeof buf);
--- 241,260 ----
  	if (val > 255)
  		val = 255;
  
+ 	return scsi2_volume2(cdinfo, val, val);
+ }
+ 
+ /* each side is [0 .. 255] */
+ int
+ scsi2_volume2(struct cdinfo *cdinfo, int left, int right)
+ {
+ 	char cdb[10];
+ 	char buf[100];
+ 
  	/* mode select */
  	bzero(cdb, 6);
  	cdb[0] = 0x15;
! 	cdb[1] = 0x10;			/* SCSI-2 format */
  	cdb[4] = 20;
  
  	bzero(buf, sizeof buf);
***************
*** 257,271 ****
  
  	buf[4] = 0xe; /* page code */
  	buf[5] = 14;
! 	buf[6] = 4;
! 	buf[12] = 1;
! 	buf[13] = val;
! 	buf[14] = 2;
! 	buf[15] = val;
! 
! 	if (scsi_cmd_write(cdinfo->fd, cdb, buf, 18) < 0) {
! 		perror("scsi command: mode select");
! 		return (-1);
  	}
  
  	return (0);
--- 265,279 ----
  
  	buf[4] = 0xe; /* page code */
  	buf[5] = 14;
! 	buf[6] = 4;			/* immed */
! 	buf[12] = 1;			/* port 0 to channel 0 */
! 	buf[13] = left;
! 	buf[14] = 2;			/* port 1 to channel 1 */
! 	buf[15] = right;
! 
! 	if (scsi_cmd_write(cdinfo->fd, cdb, buf, 20) < 0) {
! 	    perror("scsi command: mode select (volume):");
! 	    return (-1);
  	}
  
  	return (0);
diff -c -r /cdrom/usr/src/lib/libcdrom/toshiba.c ./toshiba.c
*** /cdrom/usr/src/lib/libcdrom/toshiba.c	Mon Mar  8 11:42:12 1993
--- ./toshiba.c	Fri Jun 25 02:25:25 1993
***************
*** 272,274 ****
--- 272,283 ----
  	/* Not supported by drive */
  	return (0);
  }
+ 
+ int
+ toshiba_volume2(cdinfo, left, right)
+ struct cdinfo *cdinfo;
+ int left, right;
+ {
+ 	/* Not supported by drive */
+ 	return (0);
+ }

