komarimf@clutx.clarkson.edu (Mark Komarinski,,,) (03/06/91)
Thanks to all that responded. To those that asked for the sources as soon as I found them, here it is. The only thing you have to remember is that root has to own it and have some other bits set so that joe user can use it. Check out README.play for more info. Mark Komarinski - take yer pick - komarimf@clutx.clarkson.edu .bitnet "Nothing can stop him. Not even common sense." *** Cut here and go nuts *** #!/bin/sh # This is a shell archive, meaning: # 1. Remove everything above the #!/bin/sh line. # 2. Save the resulting text in a file. # 3. Execute the file with /bin/sh (not csh) to create the files: # Makefile # README.play # play.c # This archive created: Tue Mar 5 14:51:24 1991 export PATH; PATH=/bin:$PATH echo shar: extracting "'Makefile'" '(75 characters)' if test -f 'Makefile' then echo shar: over-writing existing file "'Makefile'" fi sed 's/^X//' << \SHAR_EOF > 'Makefile' X# Makefile for PLAY X# Xall: play.o X cc -o play play.o -lX11 -lXt -lXm -lIM SHAR_EOF if test 75 -ne "`wc -c 'Makefile'`" then echo shar: error transmitting "'Makefile'" '(should have been 75 characters)' fi echo shar: extracting "'README.play'" '(1627 characters)' if test -f 'README.play' then echo shar: over-writing existing file "'README.play'" fi sed 's/^X//' << \SHAR_EOF > 'README.play' X README.play X Version 1.2 X XPLAY is a motif interface to the CD ROM that allows you to Xplay audio CDs. I haven't bothered to figure out permission Xrestrictions involved with opening the CD device, so at this Xpoint, you need to be root to run PLAY. There is nothing Xfancy about PLAY. All it really lets you do is pick a track Xand play it. Since the first release, I've been shown how to Xreference tracks beyond #9, so now you can play any track on Xany CD. Once you start the player on any particular Xtrack, it will play until it's done or until the end of the XCD. X XTo build the executable, just type "make" and the Makefile Xshould do the rest. X XThis code comes with no guarantees, warranties, or Xresponsibilities. Feel free to distribute it. I was just Xtrying to figure out how to use motif. If you have any Xuseful ideas, or know where there's more documentation on the XCD command codes, feel free to enlighten me. X X XBruce Greer CAMBRIDG(GREER) XCambridge Porting Center X(617)576-9324 tie 767-9324 X X X----------- X X- If the executable is owned by root and has the S_ISUID bit set, X (-r-sr-xr-x == 4555) it'll work OK for an ordinary user. X X- I've taken the explicit .c.o rule out of the Makefile; the default X rule works fine. X X- If anyone knows whether the Toshiba CD drive used by IBM supports X the pause function or can report the track number currently playing, X I'm sure lots of us would like to hear about it. As things are now, X the `track' indication on the control panel just reports the last X track selected, not the track that's playing. X XChuck Karish Xkarish@mindcraft.com X(415) 323-9000 X9 August 1990 SHAR_EOF if test 1627 -ne "`wc -c 'README.play'`" then echo shar: error transmitting "'README.play'" '(should have been 1627 characters)' fi echo shar: extracting "'play.c'" '(30027 characters)' if test -f 'play.c' then echo shar: over-writing existing file "'play.c'" fi sed 's/^X//' << \SHAR_EOF > 'play.c' X/********************************/ X/* Motif CD Player */ X/* */ X/* Author: Bruce Greer */ X/* CAMBRIDG(GREER) */ X/* Tie: 767-9324 */ X/********************************/ X X/* c includes */ X#include <stdio.h> X#include "fcntl.h" X#include <sys/ioctl.h> X#include <sys/cdrom.h> X X/* Xt Intrinsics */ X#include <X11/IntrinsicP.h> X#include <X11/Intrinsic.h> X#include <X11/ShellP.h> X#include <X11/Shell.h> X#include <X11/StringDefs.h> X X/* motif includes */ X#include <Xm/Xm.h> X#include <Xm/DrawnB.h> X#include <Xm/Frame.h> X#include <Xm/Form.h> X#include <Xm/Label.h> X#include <Xm/PushB.h> X#include <Xm/PushBG.h> X#include <Xm/RowColumn.h> X#include <Xm/TextP.h> X#include <Xm/Text.h> X X/* global variables */ XDisplay *display; XWindow window; Xint current_track, current_function; Xint top_track=50; XWidget trackBox, functionBox; Xint fd,rc; Xextern errno; Xuchar track; X Xtypedef enum cd_function { X CD_STOP, X CD_PLAY X} ; X X#define CMD_PLAY 0xC0 X#define CMD_STOP 0xC1 X#define CMD_EJECT 0xC4 X X/* bitmap data */ X#define play_width 64 X#define play_height 64 Xstatic char play_bits[] = { X 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, X 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, X 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, X 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, X 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, X 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, X 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, X 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, X 0x00, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0x03, 0x00, X 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, X 0x00, 0xf8, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0xff, 0x00, X 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0xff, 0x03, 0x00, 0x00, 0x00, 0x00, X 0x00, 0xf0, 0xff, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0xff, 0x3f, X 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, X 0x00, 0xe0, 0xff, 0xff, 0x03, 0x00, 0x00, 0x00, 0x00, 0xe0, 0xff, 0xff, X 0x0f, 0x00, 0x00, 0x00, 0x00, 0xe0, 0xff, 0xff, 0x3f, 0x00, 0x00, 0x00, X 0x00, 0xe0, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xff, 0xff, X 0xff, 0x03, 0x00, 0x00, 0x00, 0xc0, 0xff, 0xff, 0xff, 0x0f, 0x00, 0x00, X 0x00, 0xc0, 0xff, 0xff, 0xff, 0x3f, 0x00, 0x00, 0x00, 0xc0, 0xff, 0xff, X 0xff, 0xff, 0x00, 0x00, 0x00, 0x80, 0xff, 0xff, 0xff, 0xff, 0x03, 0x00, X 0x00, 0x80, 0xff, 0xff, 0xff, 0xff, 0x0f, 0x00, 0x00, 0x80, 0xff, 0xff, X 0xff, 0xff, 0x3f, 0x00, 0x00, 0x80, 0xff, 0xff, 0xff, 0xff, 0x3f, 0x00, X 0x00, 0x80, 0xff, 0xff, 0xff, 0xff, 0x0f, 0x00, 0x00, 0x80, 0xff, 0xff, X 0xff, 0xff, 0x03, 0x00, 0x00, 0xc0, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, X 0x00, 0xc0, 0xff, 0xff, 0xff, 0x3f, 0x00, 0x00, 0x00, 0xc0, 0xff, 0xff, X 0xff, 0x0f, 0x00, 0x00, 0x00, 0xc0, 0xff, 0xff, 0xff, 0x03, 0x00, 0x00, X 0x00, 0xe0, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xe0, 0xff, 0xff, X 0x3f, 0x00, 0x00, 0x00, 0x00, 0xe0, 0xff, 0xff, 0x0f, 0x00, 0x00, 0x00, X 0x00, 0xe0, 0xff, 0xff, 0x03, 0x00, 0x00, 0x00, 0x00, 0xf0, 0xff, 0xff, X 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0xff, 0x3f, 0x00, 0x00, 0x00, 0x00, X 0x00, 0xf0, 0xff, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0xff, 0x03, X 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, X 0x00, 0xf8, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0x0f, 0x00, X 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, X 0x00, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x00, X 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, X 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, X 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, X 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, X 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, X 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, X 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, X 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; X X#define stop_width 64 X#define stop_height 64 Xstatic char stop_bits[] = { X 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, X 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, X 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, X 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, X 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, X 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, X 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, X 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, X 0x00, 0xf0, 0xff, 0xff, 0xff, 0xff, 0x0f, 0x00, 0x00, 0xf0, 0xff, 0xff, X 0xff, 0xff, 0x0f, 0x00, 0x00, 0xf0, 0xff, 0xff, 0xff, 0xff, 0x0f, 0x00, X 0x00, 0xf0, 0xff, 0xff, 0xff, 0xff, 0x0f, 0x00, 0x00, 0xf0, 0xff, 0xff, X 0xff, 0xff, 0x0f, 0x00, 0x00, 0xf0, 0xff, 0xff, 0xff, 0xff, 0x0f, 0x00, X 0x00, 0xf0, 0xff, 0xff, 0xff, 0xff, 0x0f, 0x00, 0x00, 0xf0, 0xff, 0xff, X 0xff, 0xff, 0x0f, 0x00, 0x00, 0xf0, 0xff, 0xff, 0xff, 0xff, 0x0f, 0x00, X 0x00, 0xf0, 0xff, 0xff, 0xff, 0xff, 0x0f, 0x00, 0x00, 0xf0, 0xff, 0xff, X 0xff, 0xff, 0x0f, 0x00, 0x00, 0xf0, 0xff, 0xff, 0xff, 0xff, 0x0f, 0x00, X 0x00, 0xf0, 0xff, 0xff, 0xff, 0xff, 0x0f, 0x00, 0x00, 0xf0, 0xff, 0xff, X 0xff, 0xff, 0x0f, 0x00, 0x00, 0xf0, 0xff, 0xff, 0xff, 0xff, 0x0f, 0x00, X 0x00, 0xf0, 0xff, 0xff, 0xff, 0xff, 0x0f, 0x00, 0x00, 0xf0, 0xff, 0xff, X 0xff, 0xff, 0x0f, 0x00, 0x00, 0xf0, 0xff, 0xff, 0xff, 0xff, 0x0f, 0x00, X 0x00, 0xf0, 0xff, 0xff, 0xff, 0xff, 0x0f, 0x00, 0x00, 0xf0, 0xff, 0xff, X 0xff, 0xff, 0x0f, 0x00, 0x00, 0xf0, 0xff, 0xff, 0xff, 0xff, 0x0f, 0x00, X 0x00, 0xf0, 0xff, 0xff, 0xff, 0xff, 0x0f, 0x00, 0x00, 0xf0, 0xff, 0xff, X 0xff, 0xff, 0x0f, 0x00, 0x00, 0xf0, 0xff, 0xff, 0xff, 0xff, 0x0f, 0x00, X 0x00, 0xf0, 0xff, 0xff, 0xff, 0xff, 0x0f, 0x00, 0x00, 0xf0, 0xff, 0xff, X 0xff, 0xff, 0x0f, 0x00, 0x00, 0xf0, 0xff, 0xff, 0xff, 0xff, 0x0f, 0x00, X 0x00, 0xf0, 0xff, 0xff, 0xff, 0xff, 0x0f, 0x00, 0x00, 0xf0, 0xff, 0xff, X 0xff, 0xff, 0x0f, 0x00, 0x00, 0xf0, 0xff, 0xff, 0xff, 0xff, 0x0f, 0x00, X 0x00, 0xf0, 0xff, 0xff, 0xff, 0xff, 0x0f, 0x00, 0x00, 0xf0, 0xff, 0xff, X 0xff, 0xff, 0x0f, 0x00, 0x00, 0xf0, 0xff, 0xff, 0xff, 0xff, 0x0f, 0x00, X 0x00, 0xf0, 0xff, 0xff, 0xff, 0xff, 0x0f, 0x00, 0x00, 0xf0, 0xff, 0xff, X 0xff, 0xff, 0x0f, 0x00, 0x00, 0xf0, 0xff, 0xff, 0xff, 0xff, 0x0f, 0x00, X 0x00, 0xf0, 0xff, 0xff, 0xff, 0xff, 0x0f, 0x00, 0x00, 0xf0, 0xff, 0xff, X 0xff, 0xff, 0x0f, 0x00, 0x00, 0xf0, 0xff, 0xff, 0xff, 0xff, 0x0f, 0x00, X 0x00, 0xf0, 0xff, 0xff, 0xff, 0xff, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, X 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, X 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, X 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, X 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, X 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, X 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, X 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, X 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; X X#define ahead_width 64 X#define ahead_height 64 Xstatic char ahead_bits[] = { X 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, X 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, X 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, X 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, X 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, X 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, X 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, X 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, X 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x40, X 0x00, 0x00, 0x38, 0x00, 0x00, 0x06, 0x00, 0xc0, 0x00, 0x00, 0x38, 0x00, X 0x00, 0x0e, 0x00, 0xc0, 0x01, 0x00, 0x38, 0x00, 0x00, 0x1e, 0x00, 0xc0, X 0x03, 0x00, 0x38, 0x00, 0x00, 0x3c, 0x00, 0x80, 0x07, 0x00, 0x38, 0x00, X 0x00, 0x7c, 0x00, 0x80, 0x0f, 0x00, 0x38, 0x00, 0x00, 0xfc, 0x00, 0x80, X 0x1f, 0x00, 0x38, 0x00, 0x00, 0xfc, 0x01, 0x80, 0x3f, 0x00, 0x38, 0x00, X 0x00, 0xfc, 0x03, 0x80, 0x7f, 0x00, 0x38, 0x00, 0x00, 0xfc, 0x07, 0x80, X 0xff, 0x00, 0x38, 0x00, 0x00, 0xf8, 0x0f, 0x00, 0xff, 0x01, 0x38, 0x00, X 0x00, 0xf8, 0x1f, 0x00, 0xff, 0x03, 0x38, 0x00, 0x00, 0xf8, 0x3f, 0x00, X 0xff, 0x07, 0x38, 0x00, 0x00, 0xf8, 0x7f, 0x00, 0xff, 0x0f, 0x38, 0x00, X 0x00, 0xf8, 0xff, 0x00, 0xff, 0x1f, 0x38, 0x00, 0x00, 0xf8, 0xff, 0x01, X 0xff, 0x3f, 0x38, 0x00, 0x00, 0xf0, 0xff, 0x03, 0xfe, 0x7f, 0x38, 0x00, X 0x00, 0xf0, 0xff, 0x07, 0xfe, 0xff, 0x38, 0x00, 0x00, 0xf0, 0xff, 0x0f, X 0xfe, 0xff, 0x39, 0x00, 0x00, 0xf0, 0xff, 0x0f, 0xfe, 0xff, 0x39, 0x00, X 0x00, 0xf0, 0xff, 0x07, 0xfe, 0xff, 0x38, 0x00, 0x00, 0xf0, 0xff, 0x03, X 0xfe, 0x7f, 0x38, 0x00, 0x00, 0xf0, 0xff, 0x01, 0xfe, 0x3f, 0x38, 0x00, X 0x00, 0xf8, 0xff, 0x00, 0xff, 0x1f, 0x38, 0x00, 0x00, 0xf8, 0x7f, 0x00, X 0xff, 0x0f, 0x38, 0x00, 0x00, 0xf8, 0x3f, 0x00, 0xff, 0x07, 0x38, 0x00, X 0x00, 0xf8, 0x1f, 0x00, 0xff, 0x03, 0x38, 0x00, 0x00, 0xf8, 0x0f, 0x00, X 0xff, 0x01, 0x38, 0x00, 0x00, 0xf8, 0x07, 0x00, 0xff, 0x00, 0x38, 0x00, X 0x00, 0xfc, 0x03, 0x80, 0x7f, 0x00, 0x38, 0x00, 0x00, 0xfc, 0x01, 0x80, X 0x3f, 0x00, 0x38, 0x00, 0x00, 0xfc, 0x00, 0x80, 0x1f, 0x00, 0x38, 0x00, X 0x00, 0x7c, 0x00, 0x80, 0x0f, 0x00, 0x38, 0x00, 0x00, 0x3c, 0x00, 0x80, X 0x07, 0x00, 0x38, 0x00, 0x00, 0x1c, 0x00, 0x80, 0x03, 0x00, 0x38, 0x00, X 0x00, 0x0e, 0x00, 0xc0, 0x01, 0x00, 0x38, 0x00, 0x00, 0x06, 0x00, 0xc0, X 0x00, 0x00, 0x38, 0x00, 0x00, 0x02, 0x00, 0x40, 0x00, 0x00, 0x38, 0x00, X 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, X 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, X 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, X 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, X 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, X 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, X 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, X 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, X 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; X X#define back_width 64 X#define back_height 64 Xstatic char back_bits[] = { X 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, X 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, X 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, X 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, X 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, X 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, X 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, X 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, X 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, X 0x02, 0x00, 0x40, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x03, 0x00, 0x60, 0x00, X 0x00, 0x1c, 0x00, 0x80, 0x03, 0x00, 0x70, 0x00, 0x00, 0x1c, 0x00, 0xc0, X 0x01, 0x00, 0x38, 0x00, 0x00, 0x1c, 0x00, 0xe0, 0x01, 0x00, 0x3c, 0x00, X 0x00, 0x1c, 0x00, 0xf0, 0x01, 0x00, 0x3e, 0x00, 0x00, 0x1c, 0x00, 0xf8, X 0x01, 0x00, 0x3f, 0x00, 0x00, 0x1c, 0x00, 0xfc, 0x01, 0x80, 0x3f, 0x00, X 0x00, 0x1c, 0x00, 0xfe, 0x01, 0xc0, 0x3f, 0x00, 0x00, 0x1c, 0x00, 0xff, X 0x00, 0xe0, 0x1f, 0x00, 0x00, 0x1c, 0x80, 0xff, 0x00, 0xf0, 0x1f, 0x00, X 0x00, 0x1c, 0xc0, 0xff, 0x00, 0xf8, 0x1f, 0x00, 0x00, 0x1c, 0xe0, 0xff, X 0x00, 0xfc, 0x1f, 0x00, 0x00, 0x1c, 0xf0, 0xff, 0x00, 0xfe, 0x1f, 0x00, X 0x00, 0x1c, 0xf8, 0xff, 0x00, 0xff, 0x1f, 0x00, 0x00, 0x1c, 0xfc, 0x7f, X 0x80, 0xff, 0x0f, 0x00, 0x00, 0x1c, 0xfe, 0x7f, 0xc0, 0xff, 0x0f, 0x00, X 0x00, 0x1c, 0xff, 0x7f, 0xe0, 0xff, 0x0f, 0x00, 0x00, 0x9c, 0xff, 0x7f, X 0xf0, 0xff, 0x0f, 0x00, 0x00, 0x9c, 0xff, 0x7f, 0xf0, 0xff, 0x0f, 0x00, X 0x00, 0x1c, 0xff, 0x7f, 0xe0, 0xff, 0x0f, 0x00, 0x00, 0x1c, 0xfe, 0x7f, X 0xc0, 0xff, 0x0f, 0x00, 0x00, 0x1c, 0xfc, 0xff, 0x80, 0xff, 0x1f, 0x00, X 0x00, 0x1c, 0xf8, 0xff, 0x00, 0xff, 0x1f, 0x00, 0x00, 0x1c, 0xf0, 0xff, X 0x00, 0xfe, 0x1f, 0x00, 0x00, 0x1c, 0xe0, 0xff, 0x00, 0xfc, 0x1f, 0x00, X 0x00, 0x1c, 0xc0, 0xff, 0x00, 0xf8, 0x1f, 0x00, 0x00, 0x1c, 0x80, 0xff, X 0x00, 0xf0, 0x1f, 0x00, 0x00, 0x1c, 0x00, 0xff, 0x01, 0xe0, 0x3f, 0x00, X 0x00, 0x1c, 0x00, 0xfe, 0x01, 0xc0, 0x3f, 0x00, 0x00, 0x1c, 0x00, 0xfc, X 0x01, 0x80, 0x3f, 0x00, 0x00, 0x1c, 0x00, 0xf8, 0x01, 0x00, 0x3f, 0x00, X 0x00, 0x1c, 0x00, 0xf0, 0x01, 0x00, 0x3e, 0x00, 0x00, 0x1c, 0x00, 0xe0, X 0x01, 0x00, 0x3c, 0x00, 0x00, 0x1c, 0x00, 0xc0, 0x03, 0x00, 0x78, 0x00, X 0x00, 0x1c, 0x00, 0x80, 0x03, 0x00, 0x70, 0x00, 0x00, 0x1c, 0x00, 0x00, X 0x03, 0x00, 0x60, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x02, 0x00, 0x40, 0x00, X 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, X 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, X 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, X 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, X 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, X 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, X 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, X 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, X 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; X X/* prototype functions */ Xvoid CreateControlWindow(); Xvoid CreateControlButtons(); XWidget MyXtInitialize(); Xvoid DoPlay(); Xvoid DoStop(); Xvoid DoAhead(); Xvoid DoBack(); Xvoid DoEject(); Xvoid DoQuit(); Xvoid cd_cmd(); Xvoid open_cd(); X X X/************************/ X/* main() */ X/************************/ Xvoid main (argc, argv) X int argc; X char **argv; X{ X TopLevelShellWidget shell; X X/* initialize toolkit */ X shell = (TopLevelShellWidget)MyXtInitialize (argv); X X/* create Control Window */ X CreateControlWindow (shell); X X/* realize widgets */ X XtRealizeWidget (shell); X X/* open cd player */ X open_cd (); X X/* main loop */ X XtMainLoop(); X X} /* end main */ X X/********************************************************************/ X/* MyXtInitialize() */ X/********************************************************************/ XWidget MyXtInitialize(argv) X char **argv; X{ X Widget eggShell; X Arg args[10]; X int windowID = 0, n; X int argc = 0; X X if (argv[1]) sscanf(argv[1], "%d", &windowID); X X XtToolkitInitialize(); X X /* the class name of the application is the name of the application, */ X /* with the 1st letter changed to uppercase unless it starts with an */ X /* 'X'. in that case, the X is capital and the 2nd letter as well. */ X /* application_name = argv[0], application_class = "XMSetClass". */ X X display = XtOpenDisplay(NULL, NULL, argv[0], "Cd", NULL, 0, &argc, argv); X if (!display) { fprintf(stderr, "Error open display.\n"); exit(1); } X X n = 0; X XtSetArg(args[n], XmNwidth, 330); n++; X XtSetArg(args[n], XmNheight, 150); n++; X XtSetArg(args[n], XmNallowShellResize, True); n++; X eggShell = XtAppCreateShell(argv[0], "Cd", applicationShellWidgetClass, display, args, n); X/* eggShell = XtCreateApplicationShell(argv[0], applicationShellWidgetClass, args, n); */ X X if (windowID) eggShell->core.window = windowID; X X return eggShell; X} X/********************************/ X/* CreateControlWindow */ X/********************************/ Xvoid CreateControlWindow (shell) X Widget shell; X{ X int x, y, w=320, h=201, halfHeight; X int n; X unsigned int d; X Window root; X Arg args[10]; X Widget frame, form, menubar, statFrame, controlFrame; X Widget statRowCol, statLabel1, statText1; X Widget statLabel2, statText2, quitButton, ejectButton; X XmString text; X X/* get window and display values for shell widget */ X if (window = XtWindow (shell)){ X XGetGeometry (display, window, &root, &x, &y, &w, &h, &d); X } X X/* create the Frame widget */ X n = 0; X XtSetArg (args[n], XmNwidth, w); n++; X XtSetArg (args[n], XmNheight, h); n++; X frame = XmCreateFrame (shell, "frame", args, n); X XtManageChild (frame); X X/* create the Form widget */ X n = 0; X form = XmCreateForm (frame, "form", args, n); X XtManageChild (form); X X/* create menu bar */ X n = 0; X XtSetArg (args[n], XmNleftAttachment, XmATTACH_FORM); n++; X XtSetArg (args[n], XmNtopAttachment, XmATTACH_FORM); n++; X XtSetArg (args[n], XmNrightAttachment, XmATTACH_FORM); n++; X menubar = XmCreateMenuBar (form, "MenuBar", args, n); X XtManageChild (menubar); X X/* set up status display */ X halfHeight = h / 2; X n = 0; X XtSetArg (args[n], XmNwidth, w); n++; X XtSetArg (args[n], XmNheight, halfHeight); n++; X XtSetArg (args[n], XmNtopAttachment, XmATTACH_WIDGET); n++; X XtSetArg (args[n], XmNleftAttachment, XmATTACH_FORM); n++; X XtSetArg (args[n], XmNrightAttachment, XmATTACH_FORM); n++; X XtSetArg (args[n], XmNtopWidget, menubar); n++; X statFrame = XmCreateFrame (form, "statFrame", args, n); X XtManageChild (statFrame); X X/* set up status row/col widget */ X n = 0; X XtSetArg (args[n], XmNorientation, XmHORIZONTAL); n++; X statRowCol = XmCreateRowColumn (statFrame, "statRowCol", args, n); X XtManageChild (statRowCol); X X/* add eject and quit buttons */ X n = 0; X text = XmStringCreateLtoR ("Eject", XmSTRING_DEFAULT_CHARSET); X XtSetArg (args[n], XmNlabelType, XmSTRING); n++; X XtSetArg (args[n], XmNlabelString, text); n++; X ejectButton = XmCreatePushButton (statRowCol, "ejectButton", args, n); X XtManageChild (ejectButton); X XtAddCallback (ejectButton, XmNactivateCallback, DoEject, NULL); X n = 0; X text = XmStringCreateLtoR ("Quit", XmSTRING_DEFAULT_CHARSET); X XtSetArg (args[n], XmNlabelType, XmSTRING); n++; X XtSetArg (args[n], XmNlabelString, text); n++; X quitButton = XmCreatePushButton (statRowCol, "quitButton", args, n); X XtManageChild (quitButton); X XtAddCallback (quitButton, XmNactivateCallback, DoQuit, NULL); X X/* put in the status labels and text */ X n = 0; X text = XmStringCreateLtoR ("Track", XmSTRING_DEFAULT_CHARSET); X XtSetArg (args[n], XmNlabelType, XmSTRING); n++; X XtSetArg (args[n], XmNleftOffset, 5); n++; X XtSetArg (args[n], XmNlabelString, text); n++; X statLabel1 = XmCreateLabel (statRowCol, "statLabel1", args, n); X n = 0; X XtSetArg (args[n], XmNeditable, FALSE); n++; X XtSetArg (args[n], XmNcolumns, 2); n++; X XtSetArg (args[n], XmNautoShowCursorPosition, FALSE); n++; X XtSetArg (args[n], XmNcursorPositionVisible, FALSE); n++; X statText1 = XmCreateText (statRowCol, "statText1", args, n); X XmTextSetString (statText1, " 0"); X XtManageChild (statLabel1); X XtManageChild (statText1); X trackBox = statText1; X X n = 0; X text = XmStringCreateLtoR ("Function", XmSTRING_DEFAULT_CHARSET); X XtSetArg (args[n], XmNleftOffset, 5); n++; X XtSetArg (args[n], XmNlabelType, XmSTRING); n++; X XtSetArg (args[n], XmNlabelString, text); n++; X statLabel2 = XmCreateLabel (statRowCol, "statLabel2", args, n); X n = 0; X XtSetArg (args[n], XmNeditable, FALSE); n++; X XtSetArg (args[n], XmNcolumns, 4); n++; X XtSetArg (args[n], XmNautoShowCursorPosition, FALSE); n++; X XtSetArg (args[n], XmNcursorPositionVisible, FALSE); n++; X statText2 = XmCreateText (statRowCol, "statText2", args, n); X XmTextSetString (statText2, "STOP"); X XtManageChild (statLabel2); X XtManageChild (statText2); X functionBox = statText2; X X/* set up control button frame */ X n = 0; X XtSetArg (args[n], XmNwidth, w); n++; X XtSetArg (args[n], XmNheight, halfHeight); n++; X XtSetArg (args[n], XmNtopAttachment, XmATTACH_WIDGET); n++; X XtSetArg (args[n], XmNtopWidget, statFrame); n++; X controlFrame = XmCreateFrame (form, "controlFrame", args, n); X XtManageChild (controlFrame); X X/* create control buttons */ X CreateControlButtons (controlFrame); X X} /* end CreateControlWindow */ X X X/********************************/ X/* CreateControlButtons */ X/********************************/ Xvoid CreateControlButtons (frame) X Widget frame; X{ X Widget controlRowCol, backButton, stopButton, playButton; X Widget aheadButton; X Pixmap playPixmap, stopPixmap, aheadPixmap, backPixmap; X int n; X Arg args[10]; X X/* set up control row/col widget */ X n = 0; X XtSetArg (args[n], XmNorientation, XmHORIZONTAL); n++; X controlRowCol = XmCreateRowColumn (frame, "controlRowCol", args, n); X XtManageChild (controlRowCol); X X/* create control pixmaps */ X stopPixmap = XCreatePixmapFromBitmapData (display, X DefaultRootWindow(display), stop_bits, stop_width, stop_height, X BlackPixel(display,DefaultScreen(display)), X frame->core.background_pixel, X DefaultDepth(display,DefaultScreen(display))); X X backPixmap = XCreatePixmapFromBitmapData (display, X DefaultRootWindow(display), back_bits, back_width, back_height, X BlackPixel(display,DefaultScreen(display)), X frame->core.background_pixel, X DefaultDepth(display,DefaultScreen(display))); X X aheadPixmap = XCreatePixmapFromBitmapData (display, X DefaultRootWindow(display), ahead_bits, ahead_width, ahead_height, X BlackPixel(display,DefaultScreen(display)), X frame->core.background_pixel, X DefaultDepth(display,DefaultScreen(display))); X X playPixmap = XCreatePixmapFromBitmapData (display, X DefaultRootWindow(display), play_bits, play_width, play_height, X BlackPixel(display,DefaultScreen(display)), X frame->core.background_pixel, X DefaultDepth(display,DefaultScreen(display))); X X/* create button widgets */ X n = 0; X XtSetArg (args[n], XmNwidth, back_width); n++; X XtSetArg (args[n], XmNheight, back_height); n++; X XtSetArg (args[n], XmNlabelPixmap, backPixmap); n++; X XtSetArg (args[n], XmNlabelType, XmPIXMAP); n++; X XtSetArg (args[n], XmNpushButtonEnabled, TRUE); n++; X XtSetArg (args[n], XmNshadowThickness, 5); n++; X backButton = XmCreateDrawnButton (controlRowCol, "backButton", args, n); X XtManageChild (backButton); X XtAddCallback (backButton, XmNactivateCallback, DoBack, NULL); X X n = 0; X XtSetArg (args[n], XmNwidth, stop_width); n++; X XtSetArg (args[n], XmNheight, stop_height); n++; X XtSetArg (args[n], XmNlabelPixmap, stopPixmap); n++; X XtSetArg (args[n], XmNlabelType, XmPIXMAP); n++; X XtSetArg (args[n], XmNpushButtonEnabled, TRUE); n++; X XtSetArg (args[n], XmNshadowThickness, 5); n++; X stopButton = XmCreateDrawnButton (controlRowCol, "stopButton", args, n); X XtManageChild (stopButton); X XtAddCallback (stopButton, XmNactivateCallback, DoStop, NULL); X X n = 0; X XtSetArg (args[n], XmNwidth, play_width); n++; X XtSetArg (args[n], XmNheight, play_height); n++; X XtSetArg (args[n], XmNlabelPixmap, playPixmap); n++; X XtSetArg (args[n], XmNlabelType, XmPIXMAP); n++; X XtSetArg (args[n], XmNpushButtonEnabled, TRUE); n++; X XtSetArg (args[n], XmNshadowThickness, 5); n++; X playButton = XmCreateDrawnButton (controlRowCol, "playButton", args, n); X XtManageChild (playButton); X XtAddCallback (playButton, XmNactivateCallback, DoPlay, NULL); X X n = 0; X XtSetArg (args[n], XmNwidth, ahead_width); n++; X XtSetArg (args[n], XmNheight, ahead_height); n++; X XtSetArg (args[n], XmNlabelPixmap, aheadPixmap); n++; X XtSetArg (args[n], XmNlabelType, XmPIXMAP); n++; X XtSetArg (args[n], XmNpushButtonEnabled, TRUE); n++; X XtSetArg (args[n], XmNshadowThickness, 5); n++; X aheadButton = XmCreateDrawnButton (controlRowCol, "aheadButton", args, n); X XtManageChild (aheadButton); X XtAddCallback (aheadButton, XmNactivateCallback, DoAhead, NULL); X X} /* end of CreateControlButtons */ X X/************************/ X/* DoStop */ X/************************/ Xvoid DoStop(widget, client_data, call_data) X Widget widget; X caddr_t client_data; X caddr_t call_data; X{ X/* stop player */ X if (current_function == CD_PLAY) X cd_cmd (current_track, CMD_STOP); X X/* set current function to stop */ X current_function = CD_STOP; X XmTextSetString (functionBox, "STOP"); X} /* end of DoStop */ X X/************************/ X/* DoAhead */ X/************************/ Xvoid DoAhead(widget, client_data, call_data) X Widget widget; X caddr_t client_data; X caddr_t call_data; X{ Xchar track_string[5]; X X/* increment current track */ X if (current_track < top_track) X current_track++; X sprintf (track_string, "%2d", current_track); X XmTextSetString (trackBox, track_string); X if (current_function == CD_PLAY) X cd_cmd (current_track, CMD_PLAY); X} /* end of DoAhead */ X X/************************/ X/* DoBack */ X/************************/ Xvoid DoBack(widget, client_data, call_data) X Widget widget; X caddr_t client_data; X caddr_t call_data; X{ Xchar track_string[5]; X X/* decrement current track */ X if (current_track > 1) X current_track--; X sprintf (track_string, "%2d", current_track); X XmTextSetString (trackBox, track_string); X if (current_function == CD_PLAY) X cd_cmd (current_track, CMD_PLAY); X} /* end of DoBack */ X X/************************/ X/* DoEject */ X/************************/ Xvoid DoEject(widget, client_data, call_data) X Widget widget; X caddr_t client_data; X caddr_t call_data; X{ Xchar track_string[5]; X X current_function = CD_STOP; X current_track = 0; X sprintf (track_string, "%2d", current_track); X XmTextSetString (functionBox, "STOP"); X cd_cmd (current_track, CMD_EJECT); X top_track = 50; X} /* end of DoEject */ X X/************************/ X/* DoQuit */ X/************************/ Xvoid DoQuit(widget, client_data, call_data) X Widget widget; X caddr_t client_data; X caddr_t call_data; X{ Xexit(0); X} /* end of DoQuit */ X X/************************/ X/* DoPlay */ X/************************/ Xvoid DoPlay(widget, client_data, call_data) X Widget widget; X caddr_t client_data; X caddr_t call_data; X{ Xchar track_string[5]; X X/* set current function to play */ X current_function = CD_PLAY; X XmTextSetString (functionBox, "PLAY"); X X X/* play current track */ X if (!current_track) X current_track = 1; X sprintf (track_string, "%2d", current_track); X XmTextSetString (trackBox, track_string); X X cd_cmd (current_track, CMD_PLAY); X} /* end of DoPlay */ X X Xint pass_thru(track, cmd) Xuchar track; Xuchar cmd; X{ X uchar adj_track; X char track_string[5]; X struct sc_iocmd pt; X char menuopt; X int i, rc; X static int retry; X X /* Convert decimal number to hex 10 -> 16 11-> 17 */ X adj_track = (track / 10) * 16 + (track % 10); X X /* Issue 2 test unit ready's */ X for (i=0 ; i<2 ; i++) { X pt.command_length = 0x06; X pt.scsi_cdb[0] = 0x00; X pt.scsi_cdb[1] = 0x00; X pt.scsi_cdb[2] = 0x00; X pt.scsi_cdb[3] = 0x00; X pt.scsi_cdb[4] = 0x00; X pt.scsi_cdb[5] = 0x00; X pt.flags = 0x00; X pt.buffer = 0x00; X pt.data_length = 0x00; X pt.timeout_value = 0x05; X pt.status_validity = 0x00; X pt.scsi_bus_status = 0x00; X pt.adapter_status = 0x00; X rc = ioctl(fd, CDIOCMD, &pt); X } X if (retry) { X retry = FALSE; X return (rc); X } X if (rc == -1) { X retry = TRUE; X XmTextSetString (functionBox, "WAIT"); X XFlush (display); X sleep (3); X if ((rc = pass_thru(track, cmd)) == -1) X XmTextSetString (functionBox, "NOCD"); X else { X if (current_function == CD_PLAY) X XmTextSetString (functionBox, "PLAY"); X else X XmTextSetString (functionBox, "STOP"); X rc = pass_thru(track, cmd); X } X return(rc); X } X /* issue the cd command */ X pt.command_length = 0x0A; X pt.scsi_cdb[0] = cmd; X pt.scsi_cdb[1] = 0x01; /* was 0x01 */ X pt.scsi_cdb[2] = adj_track; X for (i = 3 ; i < 9 ; i ++) { X pt.scsi_cdb[i] = 0x00; X } X pt.scsi_cdb[9] = 0x80; X pt.flags = SC_ASYNC; X pt.buffer = 0x00; X pt.data_length = 0x00; X pt.timeout_value = 0x05; X pt.status_validity = 0x00; X pt.scsi_bus_status = 0x00; X pt.adapter_status = 0x00; X rc = ioctl(fd, CDIOCMD, &pt); X if (rc == -1) { X#ifdef DEBUG X printf("\nioctl failed. errno = %d", errno); X printf("\n\nstatus_validity = %.2X",pt.status_validity); X printf("\nscsi_bus_status = %.2X", pt.scsi_bus_status); X printf("\nadapter_status = %.2X", pt.adapter_status); X#endif X X current_track--; X top_track = current_track; X sprintf (track_string, "%2d", current_track); X XmTextSetString (trackBox, track_string); X cd_cmd (current_track, CMD_PLAY); X } X return(rc); X} X Xvoid cd_cmd(track, cmd) Xint track; Xuchar cmd; X{ X if (track != -1) { X rc = pass_thru(track, cmd); X } X else X printf("\nError in track number.\n"); X} X Xvoid open_cd () X{ X/* open cd player */ X if ( (fd = openx("/dev/rcd0", O_RDONLY, NULL, SC_DIAGNOSTIC)) < 0) { X fprintf (stderr, "Failed to open /dev/rcd0\n"); X exit (0); X return; } X} /* end of open_cd */ SHAR_EOF if test 30027 -ne "`wc -c 'play.c'`" then echo shar: error transmitting "'play.c'" '(should have been 30027 characters)' fi # End of shell archive exit 0
karish@mindcraft.com (Chuck Karish) (03/07/91)
In article <1991Mar5.194642.7299@grape.ecs.clarkson.edu> komarimf@clutx.clarkson.edu (Mark Komarinski) writes: >Thanks to all that responded. To those that asked for the sources as soon >as I found them, here it is. I mailed this to Mark because it had already been posted here twice. We need an archive site that can support anonymous FTP and uucp to save S/6000-specific information like this and like the information on third-party memory and peripherals. And a regular FAQ posting to point out where the archive is. Any volunteers? I can't do it, both for practical and for business reasons. Note that AIX provides Honey-Danber UUCP, which makes it relatively save to set up anonymous uucp. Chuck Karish karish@mindcraft.com Mindcraft, Inc. (415) 323-9000