Commit | Line | Data |
---|---|---|
030a07e4 KW |
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 |