19a747e4fSDavid du Colombier #include "acd.h"
29a747e4fSDavid du Colombier
39a747e4fSDavid du Colombier int debug;
49a747e4fSDavid du Colombier
59a747e4fSDavid du Colombier void
usage(void)69a747e4fSDavid du Colombier usage(void)
79a747e4fSDavid du Colombier {
8*3ff48bf5SDavid du Colombier fprint(2, "usage: acd dev\n");
99a747e4fSDavid du Colombier threadexitsall("usage");
109a747e4fSDavid du Colombier }
119a747e4fSDavid du Colombier
129a747e4fSDavid du Colombier Alt
mkalt(Channel * c,void * v,int op)139a747e4fSDavid du Colombier mkalt(Channel *c, void *v, int op)
149a747e4fSDavid du Colombier {
159a747e4fSDavid du Colombier Alt a;
169a747e4fSDavid du Colombier
179a747e4fSDavid du Colombier memset(&a, 0, sizeof(a));
189a747e4fSDavid du Colombier a.c = c;
199a747e4fSDavid du Colombier a.v = v;
209a747e4fSDavid du Colombier a.op = op;
219a747e4fSDavid du Colombier return a;
229a747e4fSDavid du Colombier }
239a747e4fSDavid du Colombier
249a747e4fSDavid du Colombier void
freetoc(Toc * t)259a747e4fSDavid du Colombier freetoc(Toc *t)
269a747e4fSDavid du Colombier {
279a747e4fSDavid du Colombier int i;
289a747e4fSDavid du Colombier
299a747e4fSDavid du Colombier free(t->title);
309a747e4fSDavid du Colombier for(i=0; i<t->ntrack; i++)
319a747e4fSDavid du Colombier free(t->track[i].title);
329a747e4fSDavid du Colombier }
339a747e4fSDavid du Colombier
349a747e4fSDavid du Colombier void
eventwatcher(Drive * d)359a747e4fSDavid du Colombier eventwatcher(Drive *d)
369a747e4fSDavid du Colombier {
379a747e4fSDavid du Colombier enum { STATUS, WEVENT, TOCDISP, DBREQ, DBREPLY, NALT };
389a747e4fSDavid du Colombier Alt alts[NALT+1];
399a747e4fSDavid du Colombier Toc nt, tdb;
409a747e4fSDavid du Colombier Event *e;
419a747e4fSDavid du Colombier Window *w;
429a747e4fSDavid du Colombier Cdstatus s;
439a747e4fSDavid du Colombier char buf[40];
449a747e4fSDavid du Colombier
459a747e4fSDavid du Colombier w = d->w;
469a747e4fSDavid du Colombier
479a747e4fSDavid du Colombier alts[STATUS] = mkalt(d->cstatus, &s, CHANRCV);
489a747e4fSDavid du Colombier alts[WEVENT] = mkalt(w->cevent, &e, CHANRCV);
499a747e4fSDavid du Colombier alts[TOCDISP] = mkalt(d->ctocdisp, &nt, CHANRCV);
509a747e4fSDavid du Colombier alts[DBREQ] = mkalt(d->cdbreq, &tdb, CHANNOP);
519a747e4fSDavid du Colombier alts[DBREPLY] = mkalt(d->cdbreply, &nt, CHANRCV);
529a747e4fSDavid du Colombier alts[NALT] = mkalt(nil, nil, CHANEND);
539a747e4fSDavid du Colombier for(;;) {
549a747e4fSDavid du Colombier switch(alt(alts)) {
559a747e4fSDavid du Colombier case STATUS:
569a747e4fSDavid du Colombier //DPRINT(2, "s...");
579a747e4fSDavid du Colombier d->status = s;
589a747e4fSDavid du Colombier if(s.state == Scompleted) {
599a747e4fSDavid du Colombier s.state = Sunknown;
609a747e4fSDavid du Colombier advancetrack(d, w);
619a747e4fSDavid du Colombier }
629a747e4fSDavid du Colombier //DPRINT(2, "status %d %d %d %M %M\n", s.state, s.track, s.index, s.abs, s.rel);
639a747e4fSDavid du Colombier sprint(buf, "%d:%2.2d", s.rel.m, s.rel.s);
649a747e4fSDavid du Colombier setplaytime(w, buf);
659a747e4fSDavid du Colombier break;
669a747e4fSDavid du Colombier case WEVENT:
679a747e4fSDavid du Colombier //DPRINT(2, "w...");
689a747e4fSDavid du Colombier acmeevent(d, w, e);
699a747e4fSDavid du Colombier break;
709a747e4fSDavid du Colombier case TOCDISP:
719a747e4fSDavid du Colombier //DPRINT(2,"td...");
729a747e4fSDavid du Colombier freetoc(&d->toc);
739a747e4fSDavid du Colombier d->toc = nt;
749a747e4fSDavid du Colombier drawtoc(w, d, &d->toc);
759a747e4fSDavid du Colombier tdb = nt;
769a747e4fSDavid du Colombier alts[DBREQ].op = CHANSND;
779a747e4fSDavid du Colombier break;
789a747e4fSDavid du Colombier case DBREQ: /* sent */
799a747e4fSDavid du Colombier //DPRINT(2,"dreq...");
809a747e4fSDavid du Colombier alts[DBREQ].op = CHANNOP;
819a747e4fSDavid du Colombier break;
829a747e4fSDavid du Colombier case DBREPLY:
839a747e4fSDavid du Colombier //DPRINT(2,"drep...");
849a747e4fSDavid du Colombier freetoc(&d->toc);
859a747e4fSDavid du Colombier d->toc = nt;
869a747e4fSDavid du Colombier redrawtoc(w, &d->toc);
879a747e4fSDavid du Colombier break;
889a747e4fSDavid du Colombier }
899a747e4fSDavid du Colombier }
909a747e4fSDavid du Colombier }
919a747e4fSDavid du Colombier
929a747e4fSDavid du Colombier void
threadmain(int argc,char ** argv)939a747e4fSDavid du Colombier threadmain(int argc, char **argv)
949a747e4fSDavid du Colombier {
959a747e4fSDavid du Colombier Scsi *s;
969a747e4fSDavid du Colombier Drive *d;
979a747e4fSDavid du Colombier char buf[80];
989a747e4fSDavid du Colombier
999a747e4fSDavid du Colombier ARGBEGIN{
1009a747e4fSDavid du Colombier case 'v':
1019a747e4fSDavid du Colombier debug++;
1029a747e4fSDavid du Colombier scsiverbose++;
1039a747e4fSDavid du Colombier }ARGEND
1049a747e4fSDavid du Colombier
1059a747e4fSDavid du Colombier if(argc != 1)
1069a747e4fSDavid du Colombier usage();
1079a747e4fSDavid du Colombier
1089a747e4fSDavid du Colombier fmtinstall('M', msfconv);
1099a747e4fSDavid du Colombier
1109a747e4fSDavid du Colombier if((s = openscsi(argv[0])) == nil)
1119a747e4fSDavid du Colombier error("opening scsi: %r");
1129a747e4fSDavid du Colombier
1139a747e4fSDavid du Colombier d = malloc(sizeof(*d));
1149a747e4fSDavid du Colombier if(d == nil)
1159a747e4fSDavid du Colombier error("out of memory");
1169a747e4fSDavid du Colombier memset(d, 0, sizeof d);
1179a747e4fSDavid du Colombier
1189a747e4fSDavid du Colombier d->scsi = s;
1199a747e4fSDavid du Colombier d->w = newwindow();
1209a747e4fSDavid du Colombier d->ctocdisp = chancreate(sizeof(Toc), 0);
1219a747e4fSDavid du Colombier d->cdbreq = chancreate(sizeof(Toc), 0);
1229a747e4fSDavid du Colombier d->cdbreply = chancreate(sizeof(Toc), 0);
1239a747e4fSDavid du Colombier d->cstatus = chancreate(sizeof(Cdstatus), 0);
1249a747e4fSDavid du Colombier
1259a747e4fSDavid du Colombier proccreate(wineventproc, d->w, STACK);
1269a747e4fSDavid du Colombier proccreate(cddbproc, d, STACK);
1279a747e4fSDavid du Colombier proccreate(cdstatusproc, d, STACK);
1289a747e4fSDavid du Colombier
1299a747e4fSDavid du Colombier cleanname(argv[0]);
1309a747e4fSDavid du Colombier snprint(buf, sizeof(buf), "%s/", argv[0]);
1319a747e4fSDavid du Colombier winname(d->w, buf);
1329a747e4fSDavid du Colombier
1339a747e4fSDavid du Colombier wintagwrite(d->w, "Stop Pause Resume Eject Ingest ", 5+6+7+6+7);
1349a747e4fSDavid du Colombier eventwatcher(d);
1359a747e4fSDavid du Colombier }
136