Lines Matching refs:subs
71 static int usX2Y_urb_capt_retire(struct snd_usX2Y_substream *subs) in usX2Y_urb_capt_retire() argument
73 struct urb *urb = subs->completed_urb; in usX2Y_urb_capt_retire()
74 struct snd_pcm_runtime *runtime = subs->pcm_substream->runtime; in usX2Y_urb_capt_retire()
76 int i, len, lens = 0, hwptr_done = subs->hwptr_done; in usX2Y_urb_capt_retire()
77 struct usX2Ydev *usX2Y = subs->usX2Y; in usX2Y_urb_capt_retire()
108 subs->hwptr_done = hwptr_done; in usX2Y_urb_capt_retire()
109 subs->transfer_done += lens; in usX2Y_urb_capt_retire()
111 if (subs->transfer_done >= runtime->period_size) { in usX2Y_urb_capt_retire()
112 subs->transfer_done -= runtime->period_size; in usX2Y_urb_capt_retire()
113 snd_pcm_period_elapsed(subs->pcm_substream); in usX2Y_urb_capt_retire()
127 static int usX2Y_urb_play_prepare(struct snd_usX2Y_substream *subs, in usX2Y_urb_play_prepare() argument
132 struct usX2Ydev *usX2Y = subs->usX2Y; in usX2Y_urb_play_prepare()
133 struct snd_pcm_runtime *runtime = subs->pcm_substream->runtime; in usX2Y_urb_play_prepare()
151 if (atomic_read(&subs->state) >= state_PRERUNNING) in usX2Y_urb_play_prepare()
152 if (subs->hwptr + count > runtime->buffer_size) { in usX2Y_urb_play_prepare()
157 len = runtime->buffer_size - subs->hwptr; in usX2Y_urb_play_prepare()
158 urb->transfer_buffer = subs->tmpbuf; in usX2Y_urb_play_prepare()
159 memcpy(subs->tmpbuf, runtime->dma_area + in usX2Y_urb_play_prepare()
160 subs->hwptr * usX2Y->stride, len * usX2Y->stride); in usX2Y_urb_play_prepare()
161 memcpy(subs->tmpbuf + len * usX2Y->stride, in usX2Y_urb_play_prepare()
163 subs->hwptr += count; in usX2Y_urb_play_prepare()
164 subs->hwptr -= runtime->buffer_size; in usX2Y_urb_play_prepare()
167 urb->transfer_buffer = runtime->dma_area + subs->hwptr * usX2Y->stride; in usX2Y_urb_play_prepare()
168 if ((subs->hwptr += count) >= runtime->buffer_size) in usX2Y_urb_play_prepare()
169 subs->hwptr -= runtime->buffer_size; in usX2Y_urb_play_prepare()
172 urb->transfer_buffer = subs->tmpbuf; in usX2Y_urb_play_prepare()
182 static void usX2Y_urb_play_retire(struct snd_usX2Y_substream *subs, struct urb *urb) in usX2Y_urb_play_retire() argument
184 struct snd_pcm_runtime *runtime = subs->pcm_substream->runtime; in usX2Y_urb_play_retire()
185 int len = urb->actual_length / subs->usX2Y->stride; in usX2Y_urb_play_retire()
187 subs->transfer_done += len; in usX2Y_urb_play_retire()
188 subs->hwptr_done += len; in usX2Y_urb_play_retire()
189 if (subs->hwptr_done >= runtime->buffer_size) in usX2Y_urb_play_retire()
190 subs->hwptr_done -= runtime->buffer_size; in usX2Y_urb_play_retire()
191 if (subs->transfer_done >= runtime->period_size) { in usX2Y_urb_play_retire()
192 subs->transfer_done -= runtime->period_size; in usX2Y_urb_play_retire()
193 snd_pcm_period_elapsed(subs->pcm_substream); in usX2Y_urb_play_retire()
197 static int usX2Y_urb_submit(struct snd_usX2Y_substream *subs, struct urb *urb, int frame) in usX2Y_urb_submit() argument
204 urb->dev = subs->usX2Y->dev; /* we need to set this at each time */ in usX2Y_urb_submit()
266 struct snd_usX2Y_substream *subs = usX2Y->subs[s]; in usX2Y_clients_stop() local
267 if (subs) { in usX2Y_clients_stop()
268 snd_printdd("%i %p state=%i\n", s, subs, atomic_read(&subs->state)); in usX2Y_clients_stop()
269 atomic_set(&subs->state, state_STOPPED); in usX2Y_clients_stop()
273 struct snd_usX2Y_substream *subs = usX2Y->subs[s]; in usX2Y_clients_stop() local
274 if (subs) { in usX2Y_clients_stop()
275 if (atomic_read(&subs->state) >= state_PRERUNNING) in usX2Y_clients_stop()
276 snd_pcm_stop_xrun(subs->pcm_substream); in usX2Y_clients_stop()
278 struct urb *urb = subs->urb[u]; in usX2Y_clients_stop()
290 struct snd_usX2Y_substream *subs, struct urb *urb) in usX2Y_error_urb_status() argument
292 snd_printk(KERN_ERR "ep=%i stalled with status=%i\n", subs->endpoint, urb->status); in usX2Y_error_urb_status()
299 struct snd_usX2Y_substream *subs = urb->context; in i_usX2Y_urb_complete() local
300 struct usX2Ydev *usX2Y = subs->usX2Y; in i_usX2Y_urb_complete()
302 if (unlikely(atomic_read(&subs->state) < state_PREPARED)) { in i_usX2Y_urb_complete()
305 subs->endpoint, usb_pipein(urb->pipe) ? "in" : "out", in i_usX2Y_urb_complete()
310 usX2Y_error_urb_status(usX2Y, subs, urb); in i_usX2Y_urb_complete()
314 subs->completed_urb = urb; in i_usX2Y_urb_complete()
317 struct snd_usX2Y_substream *capsubs = usX2Y->subs[SNDRV_PCM_STREAM_CAPTURE], in i_usX2Y_urb_complete()
318 *playbacksubs = usX2Y->subs[SNDRV_PCM_STREAM_PLAYBACK]; in i_usX2Y_urb_complete()
338 struct snd_usX2Y_substream *subs = usX2Y->subs[s]; in usX2Y_urbs_set_complete() local
339 if (NULL != subs) in usX2Y_urbs_set_complete()
341 struct urb * urb = subs->urb[u]; in usX2Y_urbs_set_complete()
356 struct snd_usX2Y_substream *subs = urb->context; in i_usX2Y_subs_startup() local
357 struct usX2Ydev *usX2Y = subs->usX2Y; in i_usX2Y_subs_startup()
369 static void usX2Y_subs_prepare(struct snd_usX2Y_substream *subs) in usX2Y_subs_prepare() argument
372 subs, subs->endpoint, subs->urb[0], subs->urb[1]); in usX2Y_subs_prepare()
374 subs->hwptr = 0; in usX2Y_subs_prepare()
375 subs->hwptr_done = 0; in usX2Y_subs_prepare()
376 subs->transfer_done = 0; in usX2Y_subs_prepare()
393 static void usX2Y_urbs_release(struct snd_usX2Y_substream *subs) in usX2Y_urbs_release() argument
396 snd_printdd("usX2Y_urbs_release() %i\n", subs->endpoint); in usX2Y_urbs_release()
398 usX2Y_urb_release(subs->urb + i, in usX2Y_urbs_release()
399 subs != subs->usX2Y->subs[SNDRV_PCM_STREAM_PLAYBACK]); in usX2Y_urbs_release()
401 kfree(subs->tmpbuf); in usX2Y_urbs_release()
402 subs->tmpbuf = NULL; in usX2Y_urbs_release()
407 static int usX2Y_urbs_allocate(struct snd_usX2Y_substream *subs) in usX2Y_urbs_allocate() argument
411 int is_playback = subs == subs->usX2Y->subs[SNDRV_PCM_STREAM_PLAYBACK]; in usX2Y_urbs_allocate()
412 struct usb_device *dev = subs->usX2Y->dev; in usX2Y_urbs_allocate()
414 pipe = is_playback ? usb_sndisocpipe(dev, subs->endpoint) : in usX2Y_urbs_allocate()
415 usb_rcvisocpipe(dev, subs->endpoint); in usX2Y_urbs_allocate()
416 subs->maxpacksize = usb_maxpacket(dev, pipe, is_playback); in usX2Y_urbs_allocate()
417 if (!subs->maxpacksize) in usX2Y_urbs_allocate()
420 if (is_playback && NULL == subs->tmpbuf) { /* allocate a temporary buffer for playback */ in usX2Y_urbs_allocate()
421 subs->tmpbuf = kcalloc(nr_of_packs(), subs->maxpacksize, GFP_KERNEL); in usX2Y_urbs_allocate()
422 if (NULL == subs->tmpbuf) { in usX2Y_urbs_allocate()
429 struct urb **purb = subs->urb + i; in usX2Y_urbs_allocate()
436 usX2Y_urbs_release(subs); in usX2Y_urbs_allocate()
441 (*purb)->transfer_buffer = kmalloc(subs->maxpacksize * nr_of_packs(), GFP_KERNEL); in usX2Y_urbs_allocate()
443 usX2Y_urbs_release(subs); in usX2Y_urbs_allocate()
450 (*purb)->context = subs; in usX2Y_urbs_allocate()
457 static void usX2Y_subs_startup(struct snd_usX2Y_substream *subs) in usX2Y_subs_startup() argument
459 struct usX2Ydev *usX2Y = subs->usX2Y; in usX2Y_subs_startup()
460 usX2Y->prepare_subs = subs; in usX2Y_subs_startup()
461 subs->urb[0]->start_frame = -1; in usX2Y_subs_startup()
466 static int usX2Y_urbs_start(struct snd_usX2Y_substream *subs) in usX2Y_urbs_start() argument
469 struct usX2Ydev *usX2Y = subs->usX2Y; in usX2Y_urbs_start()
471 if ((err = usX2Y_urbs_allocate(subs)) < 0) in usX2Y_urbs_start()
473 subs->completed_urb = NULL; in usX2Y_urbs_start()
475 struct snd_usX2Y_substream *subs = usX2Y->subs[i]; in usX2Y_urbs_start() local
476 if (subs != NULL && atomic_read(&subs->state) >= state_PREPARED) in usX2Y_urbs_start()
481 usX2Y_subs_startup(subs); in usX2Y_urbs_start()
483 struct urb *urb = subs->urb[i]; in usX2Y_urbs_start()
487 atomic_set(&subs->state, state_STARTING3); in usX2Y_urbs_start()
490 urb->iso_frame_desc[pack].offset = subs->maxpacksize * pack; in usX2Y_urbs_start()
491 urb->iso_frame_desc[pack].length = subs->maxpacksize; in usX2Y_urbs_start()
493 urb->transfer_buffer_length = subs->maxpacksize * nr_of_packs(); in usX2Y_urbs_start()
503 atomic_set(&subs->state, state_STARTING1); in usX2Y_urbs_start()
509 if (atomic_read(&subs->state) != state_PREPARED) in usX2Y_urbs_start()
525 struct snd_usX2Y_substream *subs = substream->runtime->private_data; in snd_usX2Y_pcm_pointer() local
526 return subs->hwptr_done; in snd_usX2Y_pcm_pointer()
533 struct snd_usX2Y_substream *subs = substream->runtime->private_data; in snd_usX2Y_pcm_trigger() local
538 if (atomic_read(&subs->state) == state_PREPARED && in snd_usX2Y_pcm_trigger()
539 atomic_read(&subs->usX2Y->subs[SNDRV_PCM_STREAM_CAPTURE]->state) >= state_PREPARED) { in snd_usX2Y_pcm_trigger()
540 atomic_set(&subs->state, state_PRERUNNING); in snd_usX2Y_pcm_trigger()
548 if (atomic_read(&subs->state) >= state_PRERUNNING) in snd_usX2Y_pcm_trigger()
549 atomic_set(&subs->state, state_PREPARED); in snd_usX2Y_pcm_trigger()
759 struct snd_usX2Y_substream *subs = dev->subs[i]; in snd_usX2Y_pcm_hw_params() local
762 if (!subs) in snd_usX2Y_pcm_hw_params()
764 test_substream = subs->pcm_substream; in snd_usX2Y_pcm_hw_params()
796 struct snd_usX2Y_substream *subs = runtime->private_data; in snd_usX2Y_pcm_hw_free() local
797 mutex_lock(&subs->usX2Y->pcm_mutex); in snd_usX2Y_pcm_hw_free()
801 struct snd_usX2Y_substream *cap_subs = subs->usX2Y->subs[SNDRV_PCM_STREAM_CAPTURE]; in snd_usX2Y_pcm_hw_free()
802 atomic_set(&subs->state, state_STOPPED); in snd_usX2Y_pcm_hw_free()
803 usX2Y_urbs_release(subs); in snd_usX2Y_pcm_hw_free()
812 struct snd_usX2Y_substream *playback_subs = subs->usX2Y->subs[SNDRV_PCM_STREAM_PLAYBACK]; in snd_usX2Y_pcm_hw_free()
814 atomic_set(&subs->state, state_STOPPED); in snd_usX2Y_pcm_hw_free()
815 usX2Y_urbs_release(subs); in snd_usX2Y_pcm_hw_free()
818 mutex_unlock(&subs->usX2Y->pcm_mutex); in snd_usX2Y_pcm_hw_free()
829 struct snd_usX2Y_substream *subs = runtime->private_data; in snd_usX2Y_pcm_prepare() local
830 struct usX2Ydev *usX2Y = subs->usX2Y; in snd_usX2Y_pcm_prepare()
831 struct snd_usX2Y_substream *capsubs = subs->usX2Y->subs[SNDRV_PCM_STREAM_CAPTURE]; in snd_usX2Y_pcm_prepare()
836 usX2Y_subs_prepare(subs); in snd_usX2Y_pcm_prepare()
846 snd_printdd("starting capture pipe for %s\n", subs == capsubs ? "self" : "playpipe"); in snd_usX2Y_pcm_prepare()
851 if (subs != capsubs && atomic_read(&subs->state) < state_PREPARED) in snd_usX2Y_pcm_prepare()
852 err = usX2Y_urbs_start(subs); in snd_usX2Y_pcm_prepare()
883 struct snd_usX2Y_substream *subs = ((struct snd_usX2Y_substream **) in snd_usX2Y_pcm_open() local
887 if (subs->usX2Y->chip_status & USX2Y_STAT_CHIP_MMAP_PCM_URBS) in snd_usX2Y_pcm_open()
891 runtime->private_data = subs; in snd_usX2Y_pcm_open()
892 subs->pcm_substream = substream; in snd_usX2Y_pcm_open()
902 struct snd_usX2Y_substream *subs = runtime->private_data; in snd_usX2Y_pcm_close() local
904 subs->pcm_substream = NULL; in snd_usX2Y_pcm_close()
947 usX2Y(card)->subs + 2 * usX2Y(card)->pcm_devs; in usX2Y_audio_stream_new()