8 fprint(2, "usage: acd dev\n");
9 threadexitsall("usage");
13 mkalt(Channel *c, void *v, int op)
17 memset(&a, 0, sizeof(a));
30 for(i=0; i<t->ntrack; i++)
31 free(t->track[i].title);
35 eventwatcher(Drive *d)
37 enum { STATUS, WEVENT, TOCDISP, DBREQ, DBREPLY, NALT };
47 alts[STATUS] = mkalt(d->cstatus, &s, CHANRCV);
48 alts[WEVENT] = mkalt(w->cevent, &e, CHANRCV);
49 alts[TOCDISP] = mkalt(d->ctocdisp, &nt, CHANRCV);
50 alts[DBREQ] = mkalt(d->cdbreq, &tdb, CHANNOP);
51 alts[DBREPLY] = mkalt(d->cdbreply, &nt, CHANRCV);
52 alts[NALT] = mkalt(nil, nil, CHANEND);
58 if(s.state == Scompleted) {
62 //DPRINT(2, "status %d %d %d %M %M\n", s.state, s.track, s.index, s.abs, s.rel);
63 sprint(buf, "%d:%2.2d", s.rel.m, s.rel.s);
74 drawtoc(w, d, &d->toc);
76 alts[DBREQ].op = CHANSND;
78 case DBREQ: /* sent */
79 //DPRINT(2,"dreq...");
80 alts[DBREQ].op = CHANNOP;
83 //DPRINT(2,"drep...");
86 redrawtoc(w, &d->toc);
93 threadmain(int argc, char **argv)
108 fmtinstall('M', msfconv);
110 if((s = openscsi(argv[0])) == nil)
111 error("opening scsi: %r");
113 d = malloc(sizeof(*d));
115 error("out of memory");
116 memset(d, 0, sizeof d);
120 d->ctocdisp = chancreate(sizeof(Toc), 0);
121 d->cdbreq = chancreate(sizeof(Toc), 0);
122 d->cdbreply = chancreate(sizeof(Toc), 0);
123 d->cstatus = chancreate(sizeof(Cdstatus), 0);
125 proccreate(wineventproc, d->w, STACK);
126 proccreate(cddbproc, d, STACK);
127 proccreate(cdstatusproc, d, STACK);
130 snprint(buf, sizeof(buf), "%s/", argv[0]);
133 wintagwrite(d->w, "Stop Pause Resume Eject Ingest ", 5+6+7+6+7);