19a747e4fSDavid du Colombier #include <u.h> 29a747e4fSDavid du Colombier #include <libc.h> 39a747e4fSDavid du Colombier #include <bio.h> 49a747e4fSDavid du Colombier #include <disk.h> 59a747e4fSDavid du Colombier #include <auth.h> 69a747e4fSDavid du Colombier #include <fcall.h> 79a747e4fSDavid du Colombier #include <thread.h> 89a747e4fSDavid du Colombier #include <9p.h> 99a747e4fSDavid du Colombier 109a747e4fSDavid du Colombier /* acme */ 119a747e4fSDavid du Colombier typedef struct Event Event; 129a747e4fSDavid du Colombier typedef struct Window Window; 139a747e4fSDavid du Colombier 149a747e4fSDavid du Colombier enum 159a747e4fSDavid du Colombier { 16*3ff48bf5SDavid du Colombier STACK = 16384, 179a747e4fSDavid du Colombier EVENTSIZE = 256, 189a747e4fSDavid du Colombier NEVENT = 5, 199a747e4fSDavid du Colombier }; 209a747e4fSDavid du Colombier 219a747e4fSDavid du Colombier struct Event 229a747e4fSDavid du Colombier { 239a747e4fSDavid du Colombier int c1; 249a747e4fSDavid du Colombier int c2; 259a747e4fSDavid du Colombier int q0; 269a747e4fSDavid du Colombier int q1; 279a747e4fSDavid du Colombier int flag; 289a747e4fSDavid du Colombier int nb; 299a747e4fSDavid du Colombier int nr; 309a747e4fSDavid du Colombier char b[EVENTSIZE*UTFmax+1]; 319a747e4fSDavid du Colombier Rune r[EVENTSIZE+1]; 329a747e4fSDavid du Colombier }; 339a747e4fSDavid du Colombier 349a747e4fSDavid du Colombier struct Window 359a747e4fSDavid du Colombier { 369a747e4fSDavid du Colombier /* file descriptors */ 379a747e4fSDavid du Colombier int ctl; 389a747e4fSDavid du Colombier int event; 399a747e4fSDavid du Colombier int addr; 409a747e4fSDavid du Colombier int data; 419a747e4fSDavid du Colombier Biobuf *body; 429a747e4fSDavid du Colombier 439a747e4fSDavid du Colombier /* event input */ 449a747e4fSDavid du Colombier char buf[512]; 459a747e4fSDavid du Colombier char *bufp; 469a747e4fSDavid du Colombier int nbuf; 479a747e4fSDavid du Colombier Event e[NEVENT]; 489a747e4fSDavid du Colombier 499a747e4fSDavid du Colombier int id; 509a747e4fSDavid du Colombier int open; 519a747e4fSDavid du Colombier Channel *cevent; /* chan(Event*) */ 529a747e4fSDavid du Colombier }; 539a747e4fSDavid du Colombier 549a747e4fSDavid du Colombier extern Window* newwindow(void); 559a747e4fSDavid du Colombier extern int winopenfile(Window*, char*); 569a747e4fSDavid du Colombier extern void winopenbody(Window*, int); 579a747e4fSDavid du Colombier extern void winclosebody(Window*); 589a747e4fSDavid du Colombier extern void wintagwrite(Window*, char*, int); 599a747e4fSDavid du Colombier extern void winname(Window*, char*); 609a747e4fSDavid du Colombier extern void winwriteevent(Window*, Event*); 619a747e4fSDavid du Colombier extern void winread(Window*, uint, uint, char*); 629a747e4fSDavid du Colombier extern int windel(Window*, int); 639a747e4fSDavid du Colombier extern void wingetevent(Window*, Event*); 649a747e4fSDavid du Colombier extern void wineventproc(void*); 659a747e4fSDavid du Colombier extern void winwritebody(Window*, char*, int); 669a747e4fSDavid du Colombier extern void winclean(Window*); 679a747e4fSDavid du Colombier extern int winselect(Window*, char*, int); 689a747e4fSDavid du Colombier extern int winsetaddr(Window*, char*, int); 699a747e4fSDavid du Colombier extern char* winreadbody(Window*, int*); 709a747e4fSDavid du Colombier extern void windormant(Window*); 719a747e4fSDavid du Colombier extern void winsetdump(Window*, char*, char*); 729a747e4fSDavid du Colombier 739a747e4fSDavid du Colombier extern char* readfile(char*, char*, int*); 749a747e4fSDavid du Colombier extern void ctlprint(int, char*, ...); 759a747e4fSDavid du Colombier extern void* emalloc(uint); 769a747e4fSDavid du Colombier extern char* estrdup(char*); 779a747e4fSDavid du Colombier extern char* estrstrdup(char*, char*); 789a747e4fSDavid du Colombier extern char* egrow(char*, char*, char*); 799a747e4fSDavid du Colombier extern char* eappend(char*, char*, char*); 809a747e4fSDavid du Colombier extern void error(char*, ...); 819a747e4fSDavid du Colombier extern int tokenizec(char*, char**, int, char*); 829a747e4fSDavid du Colombier 839a747e4fSDavid du Colombier /* cd stuff */ 849a747e4fSDavid du Colombier typedef struct Msf Msf; /* minute, second, frame */ 859a747e4fSDavid du Colombier struct Msf { 869a747e4fSDavid du Colombier int m; 879a747e4fSDavid du Colombier int s; 889a747e4fSDavid du Colombier int f; 899a747e4fSDavid du Colombier }; 909a747e4fSDavid du Colombier 919a747e4fSDavid du Colombier typedef struct Track Track; 929a747e4fSDavid du Colombier struct Track { 939a747e4fSDavid du Colombier Msf start; 949a747e4fSDavid du Colombier Msf end; 959a747e4fSDavid du Colombier ulong bstart; 969a747e4fSDavid du Colombier ulong bend; 979a747e4fSDavid du Colombier char *title; 989a747e4fSDavid du Colombier }; 999a747e4fSDavid du Colombier 1009a747e4fSDavid du Colombier enum { 1019a747e4fSDavid du Colombier MTRACK = 64, 1029a747e4fSDavid du Colombier }; 1039a747e4fSDavid du Colombier typedef struct Toc Toc; 1049a747e4fSDavid du Colombier struct Toc { 1059a747e4fSDavid du Colombier int ntrack; 1069a747e4fSDavid du Colombier int nchange; 1079a747e4fSDavid du Colombier int changetime; 1089a747e4fSDavid du Colombier int track0; 1099a747e4fSDavid du Colombier Track track[MTRACK]; 1109a747e4fSDavid du Colombier char *title; 1119a747e4fSDavid du Colombier }; 1129a747e4fSDavid du Colombier 113*3ff48bf5SDavid du Colombier extern int msfconv(Fmt*); 1149a747e4fSDavid du Colombier 1159a747e4fSDavid du Colombier #pragma varargck argpos error 1 1169a747e4fSDavid du Colombier #pragma varargck argpos ctlprint 2 1179a747e4fSDavid du Colombier #pragma varargck type "M" Msf 1189a747e4fSDavid du Colombier 1199a747e4fSDavid du Colombier enum { /* state */ 1209a747e4fSDavid du Colombier Sunknown, 1219a747e4fSDavid du Colombier Splaying, 1229a747e4fSDavid du Colombier Spaused, 1239a747e4fSDavid du Colombier Scompleted, 1249a747e4fSDavid du Colombier Serror, 1259a747e4fSDavid du Colombier }; 1269a747e4fSDavid du Colombier 1279a747e4fSDavid du Colombier typedef struct Cdstatus Cdstatus; 1289a747e4fSDavid du Colombier struct Cdstatus { 1299a747e4fSDavid du Colombier int state; 1309a747e4fSDavid du Colombier int track; 1319a747e4fSDavid du Colombier int index; 1329a747e4fSDavid du Colombier Msf abs; 1339a747e4fSDavid du Colombier Msf rel; 1349a747e4fSDavid du Colombier }; 1359a747e4fSDavid du Colombier 1369a747e4fSDavid du Colombier typedef struct Drive Drive; 1379a747e4fSDavid du Colombier struct Drive { 1389a747e4fSDavid du Colombier Window *w; 1399a747e4fSDavid du Colombier Channel *cstatus; /* chan(Cdstatus) */ 1409a747e4fSDavid du Colombier Channel *ctocdisp; /* chan(Toc) */ 1419a747e4fSDavid du Colombier Channel *cdbreq; /* chan(Toc) */ 1429a747e4fSDavid du Colombier Channel *cdbreply; /* chan(Toc) */ 1439a747e4fSDavid du Colombier Scsi *scsi; 1449a747e4fSDavid du Colombier Toc toc; 1459a747e4fSDavid du Colombier Cdstatus status; 1469a747e4fSDavid du Colombier }; 1479a747e4fSDavid du Colombier 1489a747e4fSDavid du Colombier int gettoc(Scsi*, Toc*); 1499a747e4fSDavid du Colombier void drawtoc(Window*, Drive*, Toc*); 1509a747e4fSDavid du Colombier void redrawtoc(Window*, Toc*); 1519a747e4fSDavid du Colombier void tocproc(void*); /* Drive* */ 1529a747e4fSDavid du Colombier void cddbproc(void*); /* Drive* */ 1539a747e4fSDavid du Colombier void cdstatusproc(void*); /* Drive* */ 1549a747e4fSDavid du Colombier 1559a747e4fSDavid du Colombier extern int debug; 1569a747e4fSDavid du Colombier 157*3ff48bf5SDavid du Colombier #define DPRINT if(debug)fprint 1589a747e4fSDavid du Colombier void acmeevent(Drive*, Window*, Event*); 1599a747e4fSDavid du Colombier 1609a747e4fSDavid du Colombier int playtrack(Drive*, int, int); 1619a747e4fSDavid du Colombier int pause(Drive*); 1629a747e4fSDavid du Colombier int resume(Drive*); 1639a747e4fSDavid du Colombier int stop(Drive*); 1649a747e4fSDavid du Colombier int eject(Drive*); 1659a747e4fSDavid du Colombier int ingest(Drive*); 1669a747e4fSDavid du Colombier 1679a747e4fSDavid du Colombier int markplay(Window*, ulong); 1689a747e4fSDavid du Colombier int setplaytime(Window*, char*); 1699a747e4fSDavid du Colombier void advancetrack(Drive*, Window*); 1709a747e4fSDavid du Colombier 1719a747e4fSDavid du Colombier 172