xref: /plan9/acme/bin/source/acd/acd.h (revision 3ff48bf5ed603850fcd251ddf13025d23d693782)
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