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()
278 snd_pcm_stream_lock_irqsave(subs->pcm_substream, flags); in usX2Y_clients_stop()
279 snd_pcm_stop(subs->pcm_substream, SNDRV_PCM_STATE_XRUN); in usX2Y_clients_stop()
280 snd_pcm_stream_unlock_irqrestore(subs->pcm_substream, flags); in usX2Y_clients_stop()
283 struct urb *urb = subs->urb[u]; in usX2Y_clients_stop()
295 struct snd_usX2Y_substream *subs, struct urb *urb) in usX2Y_error_urb_status() argument
297 snd_printk(KERN_ERR "ep=%i stalled with status=%i\n", subs->endpoint, urb->status); in usX2Y_error_urb_status()
304 struct snd_usX2Y_substream *subs = urb->context; in i_usX2Y_urb_complete() local
305 struct usX2Ydev *usX2Y = subs->usX2Y; in i_usX2Y_urb_complete()
307 if (unlikely(atomic_read(&subs->state) < state_PREPARED)) { in i_usX2Y_urb_complete()
310 subs->endpoint, usb_pipein(urb->pipe) ? "in" : "out", in i_usX2Y_urb_complete()
315 usX2Y_error_urb_status(usX2Y, subs, urb); in i_usX2Y_urb_complete()
319 subs->completed_urb = urb; in i_usX2Y_urb_complete()
322 struct snd_usX2Y_substream *capsubs = usX2Y->subs[SNDRV_PCM_STREAM_CAPTURE], in i_usX2Y_urb_complete()
323 *playbacksubs = usX2Y->subs[SNDRV_PCM_STREAM_PLAYBACK]; in i_usX2Y_urb_complete()
343 struct snd_usX2Y_substream *subs = usX2Y->subs[s]; in usX2Y_urbs_set_complete() local
344 if (NULL != subs) in usX2Y_urbs_set_complete()
346 struct urb * urb = subs->urb[u]; in usX2Y_urbs_set_complete()
361 struct snd_usX2Y_substream *subs = urb->context; in i_usX2Y_subs_startup() local
362 struct usX2Ydev *usX2Y = subs->usX2Y; in i_usX2Y_subs_startup()
374 static void usX2Y_subs_prepare(struct snd_usX2Y_substream *subs) in usX2Y_subs_prepare() argument
377 subs, subs->endpoint, subs->urb[0], subs->urb[1]); in usX2Y_subs_prepare()
379 subs->hwptr = 0; in usX2Y_subs_prepare()
380 subs->hwptr_done = 0; in usX2Y_subs_prepare()
381 subs->transfer_done = 0; in usX2Y_subs_prepare()
398 static void usX2Y_urbs_release(struct snd_usX2Y_substream *subs) in usX2Y_urbs_release() argument
401 snd_printdd("usX2Y_urbs_release() %i\n", subs->endpoint); in usX2Y_urbs_release()
403 usX2Y_urb_release(subs->urb + i, in usX2Y_urbs_release()
404 subs != subs->usX2Y->subs[SNDRV_PCM_STREAM_PLAYBACK]); in usX2Y_urbs_release()
406 kfree(subs->tmpbuf); in usX2Y_urbs_release()
407 subs->tmpbuf = NULL; in usX2Y_urbs_release()
412 static int usX2Y_urbs_allocate(struct snd_usX2Y_substream *subs) in usX2Y_urbs_allocate() argument
416 int is_playback = subs == subs->usX2Y->subs[SNDRV_PCM_STREAM_PLAYBACK]; in usX2Y_urbs_allocate()
417 struct usb_device *dev = subs->usX2Y->dev; in usX2Y_urbs_allocate()
419 pipe = is_playback ? usb_sndisocpipe(dev, subs->endpoint) : in usX2Y_urbs_allocate()
420 usb_rcvisocpipe(dev, subs->endpoint); in usX2Y_urbs_allocate()
421 subs->maxpacksize = usb_maxpacket(dev, pipe, is_playback); in usX2Y_urbs_allocate()
422 if (!subs->maxpacksize) in usX2Y_urbs_allocate()
425 if (is_playback && NULL == subs->tmpbuf) { /* allocate a temporary buffer for playback */ in usX2Y_urbs_allocate()
426 subs->tmpbuf = kcalloc(nr_of_packs(), subs->maxpacksize, GFP_KERNEL); in usX2Y_urbs_allocate()
427 if (NULL == subs->tmpbuf) { in usX2Y_urbs_allocate()
434 struct urb **purb = subs->urb + i; in usX2Y_urbs_allocate()
441 usX2Y_urbs_release(subs); in usX2Y_urbs_allocate()
446 (*purb)->transfer_buffer = kmalloc(subs->maxpacksize * nr_of_packs(), GFP_KERNEL); in usX2Y_urbs_allocate()
448 usX2Y_urbs_release(subs); in usX2Y_urbs_allocate()
455 (*purb)->context = subs; in usX2Y_urbs_allocate()
462 static void usX2Y_subs_startup(struct snd_usX2Y_substream *subs) in usX2Y_subs_startup() argument
464 struct usX2Ydev *usX2Y = subs->usX2Y; in usX2Y_subs_startup()
465 usX2Y->prepare_subs = subs; in usX2Y_subs_startup()
466 subs->urb[0]->start_frame = -1; in usX2Y_subs_startup()
471 static int usX2Y_urbs_start(struct snd_usX2Y_substream *subs) in usX2Y_urbs_start() argument
474 struct usX2Ydev *usX2Y = subs->usX2Y; in usX2Y_urbs_start()
476 if ((err = usX2Y_urbs_allocate(subs)) < 0) in usX2Y_urbs_start()
478 subs->completed_urb = NULL; in usX2Y_urbs_start()
480 struct snd_usX2Y_substream *subs = usX2Y->subs[i]; in usX2Y_urbs_start() local
481 if (subs != NULL && atomic_read(&subs->state) >= state_PREPARED) in usX2Y_urbs_start()
486 usX2Y_subs_startup(subs); in usX2Y_urbs_start()
488 struct urb *urb = subs->urb[i]; in usX2Y_urbs_start()
492 atomic_set(&subs->state, state_STARTING3); in usX2Y_urbs_start()
495 urb->iso_frame_desc[pack].offset = subs->maxpacksize * pack; in usX2Y_urbs_start()
496 urb->iso_frame_desc[pack].length = subs->maxpacksize; in usX2Y_urbs_start()
498 urb->transfer_buffer_length = subs->maxpacksize * nr_of_packs(); in usX2Y_urbs_start()
508 atomic_set(&subs->state, state_STARTING1); in usX2Y_urbs_start()
514 if (atomic_read(&subs->state) != state_PREPARED) in usX2Y_urbs_start()
530 struct snd_usX2Y_substream *subs = substream->runtime->private_data; in snd_usX2Y_pcm_pointer() local
531 return subs->hwptr_done; in snd_usX2Y_pcm_pointer()
538 struct snd_usX2Y_substream *subs = substream->runtime->private_data; in snd_usX2Y_pcm_trigger() local
543 if (atomic_read(&subs->state) == state_PREPARED && in snd_usX2Y_pcm_trigger()
544 atomic_read(&subs->usX2Y->subs[SNDRV_PCM_STREAM_CAPTURE]->state) >= state_PREPARED) { in snd_usX2Y_pcm_trigger()
545 atomic_set(&subs->state, state_PRERUNNING); in snd_usX2Y_pcm_trigger()
553 if (atomic_read(&subs->state) >= state_PRERUNNING) in snd_usX2Y_pcm_trigger()
554 atomic_set(&subs->state, state_PREPARED); in snd_usX2Y_pcm_trigger()
764 struct snd_usX2Y_substream *subs = dev->subs[i]; in snd_usX2Y_pcm_hw_params() local
767 if (!subs) in snd_usX2Y_pcm_hw_params()
769 test_substream = subs->pcm_substream; in snd_usX2Y_pcm_hw_params()
801 struct snd_usX2Y_substream *subs = runtime->private_data; in snd_usX2Y_pcm_hw_free() local
802 mutex_lock(&subs->usX2Y->pcm_mutex); in snd_usX2Y_pcm_hw_free()
806 struct snd_usX2Y_substream *cap_subs = subs->usX2Y->subs[SNDRV_PCM_STREAM_CAPTURE]; in snd_usX2Y_pcm_hw_free()
807 atomic_set(&subs->state, state_STOPPED); in snd_usX2Y_pcm_hw_free()
808 usX2Y_urbs_release(subs); in snd_usX2Y_pcm_hw_free()
817 struct snd_usX2Y_substream *playback_subs = subs->usX2Y->subs[SNDRV_PCM_STREAM_PLAYBACK]; in snd_usX2Y_pcm_hw_free()
819 atomic_set(&subs->state, state_STOPPED); in snd_usX2Y_pcm_hw_free()
820 usX2Y_urbs_release(subs); in snd_usX2Y_pcm_hw_free()
823 mutex_unlock(&subs->usX2Y->pcm_mutex); in snd_usX2Y_pcm_hw_free()
834 struct snd_usX2Y_substream *subs = runtime->private_data; in snd_usX2Y_pcm_prepare() local
835 struct usX2Ydev *usX2Y = subs->usX2Y; in snd_usX2Y_pcm_prepare()
836 struct snd_usX2Y_substream *capsubs = subs->usX2Y->subs[SNDRV_PCM_STREAM_CAPTURE]; in snd_usX2Y_pcm_prepare()
841 usX2Y_subs_prepare(subs); in snd_usX2Y_pcm_prepare()
851 snd_printdd("starting capture pipe for %s\n", subs == capsubs ? "self" : "playpipe"); in snd_usX2Y_pcm_prepare()
856 if (subs != capsubs && atomic_read(&subs->state) < state_PREPARED) in snd_usX2Y_pcm_prepare()
857 err = usX2Y_urbs_start(subs); in snd_usX2Y_pcm_prepare()
888 struct snd_usX2Y_substream *subs = ((struct snd_usX2Y_substream **) in snd_usX2Y_pcm_open() local
892 if (subs->usX2Y->chip_status & USX2Y_STAT_CHIP_MMAP_PCM_URBS) in snd_usX2Y_pcm_open()
896 runtime->private_data = subs; in snd_usX2Y_pcm_open()
897 subs->pcm_substream = substream; in snd_usX2Y_pcm_open()
907 struct snd_usX2Y_substream *subs = runtime->private_data; in snd_usX2Y_pcm_close() local
909 subs->pcm_substream = NULL; in snd_usX2Y_pcm_close()
952 usX2Y(card)->subs + 2 * usX2Y(card)->pcm_devs; in usX2Y_audio_stream_new()