summaryrefslogtreecommitdiff
path: root/acme/bin/source/acd/acd.h
blob: 90c4bdb81a2ac0489c2b41cc509d5c0952fbf66c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
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*);