1 /*	$OpenBSD$	*/
2 /*
3  * Copyright (c) 2008-2012 Alexandre Ratchov <alex@caoua.org>
4  *
5  * Permission to use, copy, modify, and distribute this software for any
6  * purpose with or without fee is hereby granted, provided that the above
7  * copyright notice and this permission notice appear in all copies.
8  *
9  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
10  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
11  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
12  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
13  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
14  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
15  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
16  */
17 #ifndef SOCK_H
18 #define SOCK_H
19 
20 #include "amsg.h"
21 
22 struct file;
23 struct slot;
24 struct midi;
25 
26 struct sock {
27 	struct sock *next;
28 	int fd;
29 	struct file *file;
30 	struct amsg rmsg, wmsg;		/* messages being sent/received */
31 	unsigned int wmax;		/* max bytes we're allowed to write */
32 	unsigned int rmax;		/* max bytes we're allowed to read */
33 	unsigned int rsize;		/* input bytes to read (DATA msg) */
34 	unsigned int wsize;		/* output bytes to write (DATA msg) */
35 	unsigned int rtodo;		/* input bytes not read yet */
36 	unsigned int wtodo;		/* output bytes not written yet */
37 #define SOCK_RIDLE	0		/* not expecting messages */
38 #define SOCK_RMSG	1		/* expecting a message */
39 #define SOCK_RDATA	2		/* data chunk being read */
40 #define SOCK_RRET	3		/* reply being returned */
41 	unsigned int rstate;		/* state of the read-end FSM */
42 #define SOCK_WIDLE	0		/* nothing to do */
43 #define SOCK_WMSG	1		/* amsg being written */
44 #define SOCK_WDATA	2		/* data chunk being written */
45 	unsigned int wstate;		/* state of the write-end FSM */
46 #define SOCK_AUTH	0		/* waiting for AUTH message */
47 #define SOCK_HELLO	1		/* waiting for HELLO message */
48 #define SOCK_INIT	2		/* parameter negotiation */
49 #define SOCK_START	3		/* filling play buffers */
50 #define SOCK_STOP	4		/* draining rec buffers */
51 	unsigned int pstate;		/* one of the above */
52 	int tickpending;		/* tick waiting to be transmitted */
53 	int fillpending;		/* flowctl waiting to be transmitted */
54 	int stoppending;		/* last STOP ack to be sent */
55 	unsigned int walign;		/* align written data to this */
56 	unsigned int ralign;		/* read data is aligned to this */
57 	int lastvol;			/* last volume */
58 	struct slot *slot;		/* audio device slot number */
59 	struct midi *midi;		/* midi endpoint */
60 	struct port *port;		/* midi port */
61 	struct ctlslot *ctlslot;
62 	struct amsg_ctl_desc *ctldesc;	/* temporary buffer */
63 #define SOCK_CTLDESC	1		/* dump desc and send changes */
64 #define SOCK_CTLVAL	2		/* send value changes */
65 	unsigned int ctlops;		/* bitmap of above */
66 	int ctlsyncpending;		/* CTLSYNC waiting to be transmitted */
67 	unsigned int sesrefs;		/* 1 if socket belongs to a session */
68 };
69 
70 struct sock *sock_new(int fd);
71 void sock_close(struct sock *);
72 extern struct sock *sock_list;
73 
74 #endif /* !defined(SOCK_H) */
75