1 #include <u.h> 2 #include <libc.h> 3 #include <bio.h> 4 #include <disk.h> 5 #include <auth.h> 6 #include <fcall.h> 7 #include <thread.h> 8 #include <9p.h> 9 10 /* acme */ 11 typedef struct Event Event; 12 typedef struct Window Window; 13 14 enum 15 { 16 STACK = 16384, 17 EVENTSIZE = 256, 18 NEVENT = 5, 19 }; 20 21 struct Event 22 { 23 int c1; 24 int c2; 25 int q0; 26 int q1; 27 int flag; 28 int nb; 29 int nr; 30 char b[EVENTSIZE*UTFmax+1]; 31 Rune r[EVENTSIZE+1]; 32 }; 33 34 struct Window 35 { 36 /* file descriptors */ 37 int ctl; 38 int event; 39 int addr; 40 int data; 41 Biobuf *body; 42 43 /* event input */ 44 char buf[512]; 45 char *bufp; 46 int nbuf; 47 Event e[NEVENT]; 48 49 int id; 50 int open; 51 Channel *cevent; /* chan(Event*) */ 52 }; 53 54 extern Window* newwindow(void); 55 extern int winopenfile(Window*, char*); 56 extern void winopenbody(Window*, int); 57 extern void winclosebody(Window*); 58 extern void wintagwrite(Window*, char*, int); 59 extern void winname(Window*, char*); 60 extern void winwriteevent(Window*, Event*); 61 extern void winread(Window*, uint, uint, char*); 62 extern int windel(Window*, int); 63 extern void wingetevent(Window*, Event*); 64 extern void wineventproc(void*); 65 extern void winwritebody(Window*, char*, int); 66 extern void winclean(Window*); 67 extern int winselect(Window*, char*, int); 68 extern int winsetaddr(Window*, char*, int); 69 extern char* winreadbody(Window*, int*); 70 extern void windormant(Window*); 71 extern void winsetdump(Window*, char*, char*); 72 73 extern char* readfile(char*, char*, int*); 74 extern void ctlprint(int, char*, ...); 75 extern void* emalloc(uint); 76 extern char* estrdup(char*); 77 extern char* estrstrdup(char*, char*); 78 extern char* egrow(char*, char*, char*); 79 extern char* eappend(char*, char*, char*); 80 extern void error(char*, ...); 81 extern int tokenizec(char*, char**, int, char*); 82 83 /* cd stuff */ 84 typedef struct Msf Msf; /* minute, second, frame */ 85 struct Msf { 86 int m; 87 int s; 88 int f; 89 }; 90 91 typedef struct Track Track; 92 struct Track { 93 Msf start; 94 Msf end; 95 ulong bstart; 96 ulong bend; 97 char *title; 98 }; 99 100 enum { 101 MTRACK = 64, 102 }; 103 typedef struct Toc Toc; 104 struct Toc { 105 int ntrack; 106 int nchange; 107 int changetime; 108 int track0; 109 Track track[MTRACK]; 110 char *title; 111 }; 112 113 extern int msfconv(Fmt*); 114 115 #pragma varargck argpos error 1 116 #pragma varargck argpos ctlprint 2 117 #pragma varargck type "M" Msf 118 119 enum { /* state */ 120 Sunknown, 121 Splaying, 122 Spaused, 123 Scompleted, 124 Serror, 125 }; 126 127 typedef struct Cdstatus Cdstatus; 128 struct Cdstatus { 129 int state; 130 int track; 131 int index; 132 Msf abs; 133 Msf rel; 134 }; 135 136 typedef struct Drive Drive; 137 struct Drive { 138 Window *w; 139 Channel *cstatus; /* chan(Cdstatus) */ 140 Channel *ctocdisp; /* chan(Toc) */ 141 Channel *cdbreq; /* chan(Toc) */ 142 Channel *cdbreply; /* chan(Toc) */ 143 Scsi *scsi; 144 Toc toc; 145 Cdstatus status; 146 }; 147 148 int gettoc(Scsi*, Toc*); 149 void drawtoc(Window*, Drive*, Toc*); 150 void redrawtoc(Window*, Toc*); 151 void tocproc(void*); /* Drive* */ 152 void cddbproc(void*); /* Drive* */ 153 void cdstatusproc(void*); /* Drive* */ 154 155 extern int debug; 156 157 #define DPRINT if(debug)fprint 158 void acmeevent(Drive*, Window*, Event*); 159 160 int playtrack(Drive*, int, int); 161 int pause(Drive*); 162 int resume(Drive*); 163 int stop(Drive*); 164 int eject(Drive*); 165 int ingest(Drive*); 166 167 int markplay(Window*, ulong); 168 int setplaytime(Window*, char*); 169 void advancetrack(Drive*, Window*); 170 171 172