Fedora kernel-2.6.17-1.2142_FC4 patched with stable patch-2.6.17.4-vs2.0.2-rc26.diff
[linux-2.6.git] / sound / usb / usx2y / usbusx2y.h
index 71883dc..456b5fd 100644 (file)
@@ -3,58 +3,80 @@
 #include "../usbaudio.h"
 #include "usbus428ctldefs.h" 
 
-#define NRURBS         2       /* */
-#define NRPACKS                1       /* FIXME: Currently only 1 works.
-                                  usb-frames/ms per urb: 1 and 2 are supported.
-                                  setting to 2 will PERHAPS make it easier for slow machines.
-                                  Jitter will be higher though.
-                                  On my PIII 500Mhz Laptop setting to 1 is the only way to go 
-                                  for PLAYING synths. i.e. Jack & Aeolus sound quit nicely 
-                                  at 4 periods 64 frames. 
-                               */
+#define NRURBS         2       
+
 
 #define URBS_AsyncSeq 10
 #define URB_DataLen_AsyncSeq 32
-typedef struct {
-       struct urb*     urb[URBS_AsyncSeq];
-       char*   buffer;
-} snd_usX2Y_AsyncSeq_t;
+struct snd_usX2Y_AsyncSeq {
+       struct urb      *urb[URBS_AsyncSeq];
+       char            *buffer;
+};
 
-typedef struct {
+struct snd_usX2Y_urbSeq {
        int     submitted;
        int     len;
-       struct urb*     urb[0];
-} snd_usX2Y_urbSeq_t;
+       struct urb      *urb[0];
+};
 
-typedef struct snd_usX2Y_substream snd_usX2Y_substream_t;
+#include "usx2yhwdeppcm.h"
 
-typedef struct {
-       snd_usb_audio_t         chip;
+struct usX2Ydev {
+       struct snd_usb_audio    chip;
        int                     stride;
        struct urb              *In04urb;
        void                    *In04Buf;
        char                    In04Last[24];
        unsigned                In04IntCalls;
-       snd_usX2Y_urbSeq_t      *US04;
+       struct snd_usX2Y_urbSeq *US04;
        wait_queue_head_t       In04WaitQueue;
-       snd_usX2Y_AsyncSeq_t    AS04;
+       struct snd_usX2Y_AsyncSeq       AS04;
        unsigned int            rate,
                                format;
-       int                     refframes;
        int                     chip_status;
-       struct semaphore        open_mutex;
-       us428ctls_sharedmem_t   *us428ctls_sharedmem;
+       struct mutex            prepare_mutex;
+       struct us428ctls_sharedmem      *us428ctls_sharedmem;
+       int                     wait_iso_frame;
        wait_queue_head_t       us428ctls_wait_queue_head;
-       snd_usX2Y_substream_t   *substream[4];
-} usX2Ydev_t;
+       struct snd_usX2Y_hwdep_pcm_shm  *hwdep_pcm_shm;
+       struct snd_usX2Y_substream      *subs[4];
+       struct snd_usX2Y_substream      * volatile  prepare_subs;
+       wait_queue_head_t       prepare_wait_queue;
+};
+
+
+struct snd_usX2Y_substream {
+       struct usX2Ydev *usX2Y;
+       struct snd_pcm_substream *pcm_substream;
+
+       int                     endpoint;               
+       unsigned int            maxpacksize;            /* max packet size in bytes */
+
+       atomic_t                state;
+#define state_STOPPED  0
+#define state_STARTING1 1
+#define state_STARTING2 2
+#define state_STARTING3 3
+#define state_PREPARED 4
+#define state_PRERUNNING  6
+#define state_RUNNING  8
+
+       int                     hwptr;                  /* free frame position in the buffer (only for playback) */
+       int                     hwptr_done;             /* processed frame position in the buffer */
+       int                     transfer_done;          /* processed frames since last period update */
+
+       struct urb              *urb[NRURBS];   /* data urb table */
+       struct urb              *completed_urb;
+       char                    *tmpbuf;                        /* temporary buffer for playback */
+};
 
 
-#define usX2Y(c) ((usX2Ydev_t*)(c)->private_data)
+#define usX2Y(c) ((struct usX2Ydev *)(c)->private_data)
 
-int usX2Y_audio_create(snd_card_t* card);
+int usX2Y_audio_create(struct snd_card *card);
 
-int usX2Y_AsyncSeq04_init(usX2Ydev_t* usX2Y);
-int usX2Y_In04_init(usX2Ydev_t* usX2Y);
+int usX2Y_AsyncSeq04_init(struct usX2Ydev *usX2Y);
+int usX2Y_In04_init(struct usX2Ydev *usX2Y);
 
 #define NAME_ALLCAPS "US-X2Y"