summaryrefslogtreecommitdiff
path: root/acme/bin/source/acd/acd.h
diff options
context:
space:
mode:
Diffstat (limited to 'acme/bin/source/acd/acd.h')
-rw-r--r--acme/bin/source/acd/acd.h171
1 files changed, 171 insertions, 0 deletions
diff --git a/acme/bin/source/acd/acd.h b/acme/bin/source/acd/acd.h
new file mode 100644
index 000000000..90c4bdb81
--- /dev/null
+++ b/acme/bin/source/acd/acd.h
@@ -0,0 +1,171 @@
+#include <u.h>
+#include <libc.h>
+#include <bio.h>
+#include <disk.h>
+#include <auth.h>
+#include <fcall.h>
+#include <thread.h>
+#include <9p.h>
+
+/* acme */
+typedef struct Event Event;
+typedef struct Window Window;
+
+enum
+{
+ STACK = 16384,
+ EVENTSIZE = 256,
+ NEVENT = 5,
+};
+
+struct Event
+{
+ int c1;
+ int c2;
+ int q0;
+ int q1;
+ int flag;
+ int nb;
+ int nr;
+ char b[EVENTSIZE*UTFmax+1];
+ Rune r[EVENTSIZE+1];
+};
+
+struct Window
+{
+ /* file descriptors */
+ int ctl;
+ int event;
+ int addr;
+ int data;
+ Biobuf *body;
+
+ /* event input */
+ char buf[512];
+ char *bufp;
+ int nbuf;
+ Event e[NEVENT];
+
+ int id;
+ int open;
+ Channel *cevent; /* chan(Event*) */
+};
+
+extern Window* newwindow(void);
+extern int winopenfile(Window*, char*);
+extern void winopenbody(Window*, int);
+extern void winclosebody(Window*);
+extern void wintagwrite(Window*, char*, int);
+extern void winname(Window*, char*);
+extern void winwriteevent(Window*, Event*);
+extern void winread(Window*, uint, uint, char*);
+extern int windel(Window*, int);
+extern void wingetevent(Window*, Event*);
+extern void wineventproc(void*);
+extern void winwritebody(Window*, char*, int);
+extern void winclean(Window*);
+extern int winselect(Window*, char*, int);
+extern int winsetaddr(Window*, char*, int);
+extern char* winreadbody(Window*, int*);
+extern void windormant(Window*);
+extern void winsetdump(Window*, char*, char*);
+
+extern char* readfile(char*, char*, int*);
+extern void ctlprint(int, char*, ...);
+extern void* emalloc(uint);
+extern char* estrdup(char*);
+extern char* estrstrdup(char*, char*);
+extern char* egrow(char*, char*, char*);
+extern char* eappend(char*, char*, char*);
+extern void error(char*, ...);
+extern int tokenizec(char*, char**, int, char*);
+
+/* cd stuff */
+typedef struct Msf Msf; /* minute, second, frame */
+struct Msf {
+ int m;
+ int s;
+ int f;
+};
+
+typedef struct Track Track;
+struct Track {
+ Msf start;
+ Msf end;
+ ulong bstart;
+ ulong bend;
+ char *title;
+};
+
+enum {
+ MTRACK = 64,
+};
+typedef struct Toc Toc;
+struct Toc {
+ int ntrack;
+ int nchange;
+ int changetime;
+ int track0;
+ Track track[MTRACK];
+ char *title;
+};
+
+extern int msfconv(Fmt*);
+
+#pragma varargck argpos error 1
+#pragma varargck argpos ctlprint 2
+#pragma varargck type "M" Msf
+
+enum { /* state */
+ Sunknown,
+ Splaying,
+ Spaused,
+ Scompleted,
+ Serror,
+};
+
+typedef struct Cdstatus Cdstatus;
+struct Cdstatus {
+ int state;
+ int track;
+ int index;
+ Msf abs;
+ Msf rel;
+};
+
+typedef struct Drive Drive;
+struct Drive {
+ Window *w;
+ Channel *cstatus; /* chan(Cdstatus) */
+ Channel *ctocdisp; /* chan(Toc) */
+ Channel *cdbreq; /* chan(Toc) */
+ Channel *cdbreply; /* chan(Toc) */
+ Scsi *scsi;
+ Toc toc;
+ Cdstatus status;
+};
+
+int gettoc(Scsi*, Toc*);
+void drawtoc(Window*, Drive*, Toc*);
+void redrawtoc(Window*, Toc*);
+void tocproc(void*); /* Drive* */
+void cddbproc(void*); /* Drive* */
+void cdstatusproc(void*); /* Drive* */
+
+extern int debug;
+
+#define DPRINT if(debug)fprint
+void acmeevent(Drive*, Window*, Event*);
+
+int playtrack(Drive*, int, int);
+int pause(Drive*);
+int resume(Drive*);
+int stop(Drive*);
+int eject(Drive*);
+int ingest(Drive*);
+
+int markplay(Window*, ulong);
+int setplaytime(Window*, char*);
+void advancetrack(Drive*, Window*);
+
+