xref: /plan9/sys/src/games/music/playlistfs/playlist.h (revision 6ca6a3e703ee2ec4aed99c2177f71d7f127da6d9)
1 typedef struct Worker Worker;
2 typedef struct Req Req;
3 typedef struct Fid Fid;
4 typedef struct File File;
5 typedef struct Playlist Playlist;
6 typedef struct Wmsg Wmsg;
7 typedef union Pmsg Pmsg;
8 typedef struct Pacbuf Pacbuf;
9 
10 enum {
11 	Qdir,
12 	Qplayctl,
13 	Qplaylist,
14 	Qplayvol,
15 	Qplaystat,
16 	Nqid,
17 };
18 
19 enum {
20 	DbgPcm		= 0x01000,
21 	DbgPac		= 0x02000,
22 	DbgFs		= 0x10000,
23 	DbgWorker	= 0x20000,
24 	DbgPlayer	= 0x40000,
25 	DbgError	= 0x80000,
26 };
27 
28 enum {
29 	STACKSIZE = 2048*sizeof(void*),
30 	Messagesize = 8*1024+IOHDRSZ,
31 	Undef = 0x80000000,
32 	/* 256 buffers of 4096 bytes represents 5.9 seconds
33 	 * of playout at 44100 Hz (2*16bit samples)
34 	 */
35 	NPacbuf = 256,
36 	Pacbufsize = 4096,
37 	NSparebuf = 16,	/* For in-line commands (Pause, Resume, Error) */
38 };
39 
40 enum {
41 	/* Named commands (see fs.c): */
42 	Nostate,	// can't use zero for state
43 	Error,
44 	Stop,
45 	Pause,
46 	Play,
47 	Resume,
48 	Skip,
49 	/* Unnamed commands */
50 	Work,
51 	Check,
52 	Flush,
53 	Prep,
54 	Preq,
55 };
56 
57 union Pmsg {
58 	ulong m;
59 	struct{
60 		ushort cmd;
61 		ushort off;
62 	};
63 };
64 
65 struct Wmsg {
66 	Pmsg;
67 	void	*arg;	/* if(cmd != Work) mallocated by sender, freed by receiver */
68 };
69 
70 struct Playlist {
71 	/* The play list consists of a sequence of {objectref, filename}
72 	 * entries.  Object ref and file name are separated by a tab.
73 	 * An object ref may not contain a tab.  Entries are seperated
74 	 * by newline characters.  Neither file names, nor object refs
75 	 * may contain newlines.
76 	 */
77 	ulong	*lines;
78 	ulong	nlines;
79 	char	*data;
80 	ulong	ndata;
81 };
82 
83 struct File {
84 	Dir	dir;
85 	Channel	*workers;
86 };
87 
88 struct Worker
89 {
90 	Req	*r;
91 	Channel	*eventc;
92 };
93 
94 struct Fid
95 {
96 	int	fid;
97 	File	*file;
98 	ushort	flags;
99 	short	readers;
100 	ulong	vers;	/* set to file's version when completely read */
101 	Fid	*next;
102 };
103 
104 struct Req
105 {
106 	uchar	indata[Messagesize];
107 	uchar	outdata[Messagesize];
108 	Fcall	ifcall;
109 	Fcall	ofcall;
110 	Fid*	fid;
111 };
112 
113 struct Pacbuf {
114 	Pmsg;
115 	int len;
116 	char data[Pacbufsize];
117 };
118 
119 void	allocwork(Req*);
120 Wmsg	waitmsg(Worker*, Channel*);
121 int	sendmsg(Channel*, Wmsg*);
122 void	bcastmsg(Channel*, Wmsg*);
123 void	reqfree(Req*);
124 Req	*reqalloc(void);
125 void	readbuf(Req*, void*, long);
126 void	readstr(Req*, char*);
127 void	volumeset(int *v);
128 void	playupdate(Pmsg, char*);
129 void	playinit(void);
130 void	volumeproc(void*);
131 void	srv(void *);
132 long	robustread(int, void*, long);
133 void	volumeupdate(int*);
134 char	*getplaylist(int);
135 char	*getplaystat(char*, char*);
136 
137 extern int		debug, aflag;
138 extern char	*user;
139 extern Channel	*playc;
140 extern char	*statetxt[];
141 extern int		volume[8];
142 extern Playlist	playlist;
143 extern Channel	*workers;
144 extern Channel	*volumechan;
145 extern Channel	*playchan;
146 extern Channel	*playlistreq;
147 extern File	files[];
148 extern int		srvfd[];
149