X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=sound%2Fusb%2Fusx2y%2Fusbusx2y.h;h=456b5fdbc339af2dfd195520270fab4f4d5fa9a2;hb=43bc926fffd92024b46cafaf7350d669ba9ca884;hp=71883dc170fb992b9e426693d3f54a7abfdf790e;hpb=a2c21200f1c81b08cb55e417b68150bba439b646;p=linux-2.6.git diff --git a/sound/usb/usx2y/usbusx2y.h b/sound/usb/usx2y/usbusx2y.h index 71883dc17..456b5fdbc 100644 --- a/sound/usb/usx2y/usbusx2y.h +++ b/sound/usb/usx2y/usbusx2y.h @@ -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"