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*);
|