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