1 /*
2  * Copyright (C) 2007, 2008 Karsten Wiese <fzu@wemgehoertderstaat.de>
3  *
4  * This program is free software; you can redistribute it and/or modify it
5  * under the terms of the GNU General Public License as published by the
6  * Free Software Foundation; either version 2 of the License, or (at your
7  * option) any later version.
8  *
9  * This program is distributed in the hope that it will be useful, but
10  * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
11  * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
12  * for more details.
13  *
14  * You should have received a copy of the GNU General Public License
15  * along with this program; if not, write to the Free Software Foundation,
16  * Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
17  */
18 
19 #define USB_STREAM_INTERFACE_VERSION 2
20 
21 #define SNDRV_USB_STREAM_IOCTL_SET_PARAMS \
22 	_IOW('H', 0x90, struct usb_stream_config)
23 
24 struct usb_stream_packet {
25 	unsigned offset;
26 	unsigned length;
27 };
28 
29 
30 struct usb_stream_config {
31 	unsigned version;
32 	unsigned sample_rate;
33 	unsigned period_frames;
34 	unsigned frame_size;
35 };
36 
37 struct usb_stream {
38 	struct usb_stream_config cfg;
39 	unsigned read_size;
40 	unsigned write_size;
41 
42 	int period_size;
43 
44 	unsigned state;
45 
46 	int idle_insize;
47 	int idle_outsize;
48 	int sync_packet;
49 	unsigned insize_done;
50 	unsigned periods_done;
51 	unsigned periods_polled;
52 
53 	struct usb_stream_packet outpacket[2];
54 	unsigned		 inpackets;
55 	unsigned		 inpacket_head;
56 	unsigned		 inpacket_split;
57 	unsigned		 inpacket_split_at;
58 	unsigned		 next_inpacket_split;
59 	unsigned		 next_inpacket_split_at;
60 	struct usb_stream_packet inpacket[0];
61 };
62 
63 enum usb_stream_state {
64 	usb_stream_invalid,
65 	usb_stream_stopped,
66 	usb_stream_sync0,
67 	usb_stream_sync1,
68 	usb_stream_ready,
69 	usb_stream_running,
70 	usb_stream_xrun,
71 };
72 
73 #if __KERNEL__
74 
75 #define USB_STREAM_NURBS 4
76 #define USB_STREAM_URBDEPTH 4
77 
78 struct usb_stream_kernel {
79 	struct usb_stream *s;
80 
81 	void *write_page;
82 
83 	unsigned n_o_ps;
84 
85 	struct urb *inurb[USB_STREAM_NURBS];
86 	struct urb *idle_inurb;
87 	struct urb *completed_inurb;
88 	struct urb *outurb[USB_STREAM_NURBS];
89 	struct urb *idle_outurb;
90 	struct urb *completed_outurb;
91 	struct urb *i_urb;
92 
93 	int iso_frame_balance;
94 
95 	wait_queue_head_t sleep;
96 
97 	unsigned out_phase;
98 	unsigned out_phase_peeked;
99 	unsigned freqn;
100 };
101 
102 struct usb_stream *usb_stream_new(struct usb_stream_kernel *sk,
103 				  struct usb_device *dev,
104 				  unsigned in_endpoint, unsigned out_endpoint,
105 				  unsigned sample_rate, unsigned use_packsize,
106 				  unsigned period_frames, unsigned frame_size);
107 void usb_stream_free(struct usb_stream_kernel *);
108 int usb_stream_start(struct usb_stream_kernel *);
109 void usb_stream_stop(struct usb_stream_kernel *);
110 
111 
112 #endif
113