Lines Matching refs:cdev

30 #define MAKE_CHECKBYTE(cdev,stream,i) \  argument
31 (stream << 1) | (~(i / (cdev->n_streams * BYTES_PER_SAMPLE_USB)) & 1)
51 activate_substream(struct snd_usb_caiaqdev *cdev, in activate_substream() argument
54 spin_lock(&cdev->spinlock); in activate_substream()
57 cdev->sub_playback[sub->number] = sub; in activate_substream()
59 cdev->sub_capture[sub->number] = sub; in activate_substream()
61 spin_unlock(&cdev->spinlock); in activate_substream()
65 deactivate_substream(struct snd_usb_caiaqdev *cdev, in deactivate_substream() argument
69 spin_lock_irqsave(&cdev->spinlock, flags); in deactivate_substream()
72 cdev->sub_playback[sub->number] = NULL; in deactivate_substream()
74 cdev->sub_capture[sub->number] = NULL; in deactivate_substream()
76 spin_unlock_irqrestore(&cdev->spinlock, flags); in deactivate_substream()
89 static int stream_start(struct snd_usb_caiaqdev *cdev) in stream_start() argument
92 struct device *dev = caiaqdev_to_dev(cdev); in stream_start()
94 dev_dbg(dev, "%s(%p)\n", __func__, cdev); in stream_start()
96 if (cdev->streaming) in stream_start()
99 memset(cdev->sub_playback, 0, sizeof(cdev->sub_playback)); in stream_start()
100 memset(cdev->sub_capture, 0, sizeof(cdev->sub_capture)); in stream_start()
101 cdev->input_panic = 0; in stream_start()
102 cdev->output_panic = 0; in stream_start()
103 cdev->first_packet = 4; in stream_start()
104 cdev->streaming = 1; in stream_start()
105 cdev->warned = 0; in stream_start()
108 ret = usb_submit_urb(cdev->data_urbs_in[i], GFP_ATOMIC); in stream_start()
112 cdev->streaming = 0; in stream_start()
120 static void stream_stop(struct snd_usb_caiaqdev *cdev) in stream_stop() argument
123 struct device *dev = caiaqdev_to_dev(cdev); in stream_stop()
125 dev_dbg(dev, "%s(%p)\n", __func__, cdev); in stream_stop()
126 if (!cdev->streaming) in stream_stop()
129 cdev->streaming = 0; in stream_stop()
132 usb_kill_urb(cdev->data_urbs_in[i]); in stream_stop()
134 if (test_bit(i, &cdev->outurb_active_mask)) in stream_stop()
135 usb_kill_urb(cdev->data_urbs_out[i]); in stream_stop()
138 cdev->outurb_active_mask = 0; in stream_stop()
143 struct snd_usb_caiaqdev *cdev = snd_pcm_substream_chip(substream); in snd_usb_caiaq_substream_open() local
144 struct device *dev = caiaqdev_to_dev(cdev); in snd_usb_caiaq_substream_open()
147 substream->runtime->hw = cdev->pcm_info; in snd_usb_caiaq_substream_open()
155 struct snd_usb_caiaqdev *cdev = snd_pcm_substream_chip(substream); in snd_usb_caiaq_substream_close() local
156 struct device *dev = caiaqdev_to_dev(cdev); in snd_usb_caiaq_substream_close()
159 if (all_substreams_zero(cdev->sub_playback) && in snd_usb_caiaq_substream_close()
160 all_substreams_zero(cdev->sub_capture)) { in snd_usb_caiaq_substream_close()
163 stream_stop(cdev); in snd_usb_caiaq_substream_close()
164 cdev->pcm_info.rates = cdev->samplerates; in snd_usb_caiaq_substream_close()
179 struct snd_usb_caiaqdev *cdev = snd_pcm_substream_chip(sub); in snd_usb_caiaq_pcm_hw_free() local
180 deactivate_substream(cdev, sub); in snd_usb_caiaq_pcm_hw_free()
196 struct snd_usb_caiaqdev *cdev = snd_pcm_substream_chip(substream); in snd_usb_caiaq_pcm_prepare() local
198 struct device *dev = caiaqdev_to_dev(cdev); in snd_usb_caiaq_pcm_prepare()
205 switch (cdev->spec.data_alignment) { in snd_usb_caiaq_pcm_prepare()
216 cdev->period_out_count[index] = out_pos; in snd_usb_caiaq_pcm_prepare()
217 cdev->audio_out_buf_pos[index] = out_pos; in snd_usb_caiaq_pcm_prepare()
221 switch (cdev->spec.data_alignment) { in snd_usb_caiaq_pcm_prepare()
234 cdev->period_in_count[index] = in_pos; in snd_usb_caiaq_pcm_prepare()
235 cdev->audio_in_buf_pos[index] = in_pos; in snd_usb_caiaq_pcm_prepare()
238 if (cdev->streaming) in snd_usb_caiaq_pcm_prepare()
245 cdev->pcm_info.rates = 1 << i; in snd_usb_caiaq_pcm_prepare()
250 if (cdev->spec.data_alignment >= 2) in snd_usb_caiaq_pcm_prepare()
254 * bytes_per_sample * CHANNELS_PER_STREAM * cdev->n_streams; in snd_usb_caiaq_pcm_prepare()
259 ret = snd_usb_caiaq_set_audio_params(cdev, runtime->rate, in snd_usb_caiaq_pcm_prepare()
264 ret = stream_start(cdev); in snd_usb_caiaq_pcm_prepare()
268 cdev->output_running = 0; in snd_usb_caiaq_pcm_prepare()
269 wait_event_timeout(cdev->prepare_wait_queue, cdev->output_running, HZ); in snd_usb_caiaq_pcm_prepare()
270 if (!cdev->output_running) { in snd_usb_caiaq_pcm_prepare()
271 stream_stop(cdev); in snd_usb_caiaq_pcm_prepare()
280 struct snd_usb_caiaqdev *cdev = snd_pcm_substream_chip(sub); in snd_usb_caiaq_pcm_trigger() local
281 struct device *dev = caiaqdev_to_dev(cdev); in snd_usb_caiaq_pcm_trigger()
288 activate_substream(cdev, sub); in snd_usb_caiaq_pcm_trigger()
292 deactivate_substream(cdev, sub); in snd_usb_caiaq_pcm_trigger()
305 struct snd_usb_caiaqdev *cdev = snd_pcm_substream_chip(sub); in snd_usb_caiaq_pcm_pointer() local
308 spin_lock(&cdev->spinlock); in snd_usb_caiaq_pcm_pointer()
310 if (cdev->input_panic || cdev->output_panic) { in snd_usb_caiaq_pcm_pointer()
317 cdev->audio_out_buf_pos[index]); in snd_usb_caiaq_pcm_pointer()
320 cdev->audio_in_buf_pos[index]); in snd_usb_caiaq_pcm_pointer()
323 spin_unlock(&cdev->spinlock); in snd_usb_caiaq_pcm_pointer()
340 static void check_for_elapsed_periods(struct snd_usb_caiaqdev *cdev, in check_for_elapsed_periods() argument
346 for (stream = 0; stream < cdev->n_streams; stream++) { in check_for_elapsed_periods()
353 &cdev->period_out_count[stream] : in check_for_elapsed_periods()
354 &cdev->period_in_count[stream]; in check_for_elapsed_periods()
363 static void read_in_urb_mode0(struct snd_usb_caiaqdev *cdev, in read_in_urb_mode0() argument
371 if (all_substreams_zero(cdev->sub_capture)) in read_in_urb_mode0()
375 for (stream = 0; stream < cdev->n_streams; stream++, i++) { in read_in_urb_mode0()
376 sub = cdev->sub_capture[stream]; in read_in_urb_mode0()
381 audio_buf[cdev->audio_in_buf_pos[stream]++] in read_in_urb_mode0()
383 cdev->period_in_count[stream]++; in read_in_urb_mode0()
384 if (cdev->audio_in_buf_pos[stream] == sz) in read_in_urb_mode0()
385 cdev->audio_in_buf_pos[stream] = 0; in read_in_urb_mode0()
391 static void read_in_urb_mode2(struct snd_usb_caiaqdev *cdev, in read_in_urb_mode2() argument
401 if (i % (cdev->n_streams * BYTES_PER_SAMPLE_USB) == 0) { in read_in_urb_mode2()
403 stream < cdev->n_streams; in read_in_urb_mode2()
405 if (cdev->first_packet) in read_in_urb_mode2()
408 check_byte = MAKE_CHECKBYTE(cdev, stream, i); in read_in_urb_mode2()
411 cdev->input_panic = 1; in read_in_urb_mode2()
414 cdev->output_panic = 1; in read_in_urb_mode2()
417 cdev->first_packet = 0; in read_in_urb_mode2()
419 for (stream = 0; stream < cdev->n_streams; stream++, i++) { in read_in_urb_mode2()
420 sub = cdev->sub_capture[stream]; in read_in_urb_mode2()
421 if (cdev->input_panic) in read_in_urb_mode2()
428 audio_buf[cdev->audio_in_buf_pos[stream]++] = in read_in_urb_mode2()
430 cdev->period_in_count[stream]++; in read_in_urb_mode2()
431 if (cdev->audio_in_buf_pos[stream] == sz) in read_in_urb_mode2()
432 cdev->audio_in_buf_pos[stream] = 0; in read_in_urb_mode2()
438 static void read_in_urb_mode3(struct snd_usb_caiaqdev *cdev, in read_in_urb_mode3() argument
443 struct device *dev = caiaqdev_to_dev(cdev); in read_in_urb_mode3()
451 for (stream = 0; stream < cdev->n_streams; stream++) { in read_in_urb_mode3()
452 struct snd_pcm_substream *sub = cdev->sub_capture[stream]; in read_in_urb_mode3()
456 if (sub && !cdev->input_panic) { in read_in_urb_mode3()
466 audio_buf[cdev->audio_in_buf_pos[stream]++] = usb_buf[i+n]; in read_in_urb_mode3()
468 if (cdev->audio_in_buf_pos[stream] == sz) in read_in_urb_mode3()
469 cdev->audio_in_buf_pos[stream] = 0; in read_in_urb_mode3()
472 cdev->period_in_count[stream] += BYTES_PER_SAMPLE; in read_in_urb_mode3()
478 !cdev->first_packet) { in read_in_urb_mode3()
479 if (!cdev->input_panic) in read_in_urb_mode3()
482 cdev->input_panic = 1; in read_in_urb_mode3()
490 if (cdev->first_packet > 0) in read_in_urb_mode3()
491 cdev->first_packet--; in read_in_urb_mode3()
494 static void read_in_urb(struct snd_usb_caiaqdev *cdev, in read_in_urb() argument
498 struct device *dev = caiaqdev_to_dev(cdev); in read_in_urb()
500 if (!cdev->streaming) in read_in_urb()
503 if (iso->actual_length < cdev->bpp) in read_in_urb()
506 switch (cdev->spec.data_alignment) { in read_in_urb()
508 read_in_urb_mode0(cdev, urb, iso); in read_in_urb()
511 read_in_urb_mode2(cdev, urb, iso); in read_in_urb()
514 read_in_urb_mode3(cdev, urb, iso); in read_in_urb()
518 if ((cdev->input_panic || cdev->output_panic) && !cdev->warned) { in read_in_urb()
520 cdev->input_panic ? "(input)" : "", in read_in_urb()
521 cdev->output_panic ? "(output)" : ""); in read_in_urb()
522 cdev->warned = 1; in read_in_urb()
526 static void fill_out_urb_mode_0(struct snd_usb_caiaqdev *cdev, in fill_out_urb_mode_0() argument
535 for (stream = 0; stream < cdev->n_streams; stream++, i++) { in fill_out_urb_mode_0()
536 sub = cdev->sub_playback[stream]; in fill_out_urb_mode_0()
542 audio_buf[cdev->audio_out_buf_pos[stream]]; in fill_out_urb_mode_0()
543 cdev->period_out_count[stream]++; in fill_out_urb_mode_0()
544 cdev->audio_out_buf_pos[stream]++; in fill_out_urb_mode_0()
545 if (cdev->audio_out_buf_pos[stream] == sz) in fill_out_urb_mode_0()
546 cdev->audio_out_buf_pos[stream] = 0; in fill_out_urb_mode_0()
552 if (cdev->spec.data_alignment == 2 && in fill_out_urb_mode_0()
553 i % (cdev->n_streams * BYTES_PER_SAMPLE_USB) == in fill_out_urb_mode_0()
554 (cdev->n_streams * CHANNELS_PER_STREAM)) in fill_out_urb_mode_0()
555 for (stream = 0; stream < cdev->n_streams; stream++, i++) in fill_out_urb_mode_0()
556 usb_buf[i] = MAKE_CHECKBYTE(cdev, stream, i); in fill_out_urb_mode_0()
560 static void fill_out_urb_mode_3(struct snd_usb_caiaqdev *cdev, in fill_out_urb_mode_3() argument
568 for (stream = 0; stream < cdev->n_streams; stream++) { in fill_out_urb_mode_3()
569 struct snd_pcm_substream *sub = cdev->sub_playback[stream]; in fill_out_urb_mode_3()
582 usb_buf[i+n] = audio_buf[cdev->audio_out_buf_pos[stream]++]; in fill_out_urb_mode_3()
584 if (cdev->audio_out_buf_pos[stream] == sz) in fill_out_urb_mode_3()
585 cdev->audio_out_buf_pos[stream] = 0; in fill_out_urb_mode_3()
592 cdev->period_out_count[stream] += BYTES_PER_SAMPLE; in fill_out_urb_mode_3()
603 static inline void fill_out_urb(struct snd_usb_caiaqdev *cdev, in fill_out_urb() argument
607 switch (cdev->spec.data_alignment) { in fill_out_urb()
610 fill_out_urb_mode_0(cdev, urb, iso); in fill_out_urb()
613 fill_out_urb_mode_3(cdev, urb, iso); in fill_out_urb()
621 struct snd_usb_caiaqdev *cdev; in read_completed() local
631 cdev = info->cdev; in read_completed()
632 dev = caiaqdev_to_dev(cdev); in read_completed()
634 if (!cdev->streaming) in read_completed()
639 if (test_and_set_bit(i, &cdev->outurb_active_mask) == 0) { in read_completed()
640 out = cdev->data_urbs_out[i]; in read_completed()
662 spin_lock_irqsave(&cdev->spinlock, flags); in read_completed()
663 fill_out_urb(cdev, out, &out->iso_frame_desc[outframe]); in read_completed()
664 read_in_urb(cdev, urb, &urb->iso_frame_desc[frame]); in read_completed()
665 spin_unlock_irqrestore(&cdev->spinlock, flags); in read_completed()
666 check_for_elapsed_periods(cdev, cdev->sub_playback); in read_completed()
667 check_for_elapsed_periods(cdev, cdev->sub_capture); in read_completed()
679 clear_bit(oinfo->index, &cdev->outurb_active_mask); in read_completed()
697 struct snd_usb_caiaqdev *cdev = info->cdev; in write_completed() local
699 if (!cdev->output_running) { in write_completed()
700 cdev->output_running = 1; in write_completed()
701 wake_up(&cdev->prepare_wait_queue); in write_completed()
704 clear_bit(info->index, &cdev->outurb_active_mask); in write_completed()
707 static struct urb **alloc_urbs(struct snd_usb_caiaqdev *cdev, int dir, int *ret) in alloc_urbs() argument
711 struct usb_device *usb_dev = cdev->chip.dev; in alloc_urbs()
751 urbs[i]->context = &cdev->data_cb_info[i]; in alloc_urbs()
781 int snd_usb_caiaq_audio_init(struct snd_usb_caiaqdev *cdev) in snd_usb_caiaq_audio_init() argument
784 struct device *dev = caiaqdev_to_dev(cdev); in snd_usb_caiaq_audio_init()
786 cdev->n_audio_in = max(cdev->spec.num_analog_audio_in, in snd_usb_caiaq_audio_init()
787 cdev->spec.num_digital_audio_in) / in snd_usb_caiaq_audio_init()
789 cdev->n_audio_out = max(cdev->spec.num_analog_audio_out, in snd_usb_caiaq_audio_init()
790 cdev->spec.num_digital_audio_out) / in snd_usb_caiaq_audio_init()
792 cdev->n_streams = max(cdev->n_audio_in, cdev->n_audio_out); in snd_usb_caiaq_audio_init()
794 dev_dbg(dev, "cdev->n_audio_in = %d\n", cdev->n_audio_in); in snd_usb_caiaq_audio_init()
795 dev_dbg(dev, "cdev->n_audio_out = %d\n", cdev->n_audio_out); in snd_usb_caiaq_audio_init()
796 dev_dbg(dev, "cdev->n_streams = %d\n", cdev->n_streams); in snd_usb_caiaq_audio_init()
798 if (cdev->n_streams > MAX_STREAMS) { in snd_usb_caiaq_audio_init()
803 if (cdev->n_streams < 1) { in snd_usb_caiaq_audio_init()
804 dev_err(dev, "bogus number of streams: %d\n", cdev->n_streams); in snd_usb_caiaq_audio_init()
808 ret = snd_pcm_new(cdev->chip.card, cdev->product_name, 0, in snd_usb_caiaq_audio_init()
809 cdev->n_audio_out, cdev->n_audio_in, &cdev->pcm); in snd_usb_caiaq_audio_init()
816 cdev->pcm->private_data = cdev; in snd_usb_caiaq_audio_init()
817 strlcpy(cdev->pcm->name, cdev->product_name, sizeof(cdev->pcm->name)); in snd_usb_caiaq_audio_init()
819 memset(cdev->sub_playback, 0, sizeof(cdev->sub_playback)); in snd_usb_caiaq_audio_init()
820 memset(cdev->sub_capture, 0, sizeof(cdev->sub_capture)); in snd_usb_caiaq_audio_init()
822 memcpy(&cdev->pcm_info, &snd_usb_caiaq_pcm_hardware, in snd_usb_caiaq_audio_init()
826 cdev->samplerates = cdev->pcm_info.rates; in snd_usb_caiaq_audio_init()
827 switch (cdev->chip.usb_id) { in snd_usb_caiaq_audio_init()
832 cdev->samplerates |= SNDRV_PCM_RATE_192000; in snd_usb_caiaq_audio_init()
838 cdev->samplerates |= SNDRV_PCM_RATE_88200; in snd_usb_caiaq_audio_init()
842 snd_pcm_set_ops(cdev->pcm, SNDRV_PCM_STREAM_PLAYBACK, in snd_usb_caiaq_audio_init()
844 snd_pcm_set_ops(cdev->pcm, SNDRV_PCM_STREAM_CAPTURE, in snd_usb_caiaq_audio_init()
847 cdev->data_cb_info = in snd_usb_caiaq_audio_init()
851 if (!cdev->data_cb_info) in snd_usb_caiaq_audio_init()
854 cdev->outurb_active_mask = 0; in snd_usb_caiaq_audio_init()
855 BUILD_BUG_ON(N_URBS > (sizeof(cdev->outurb_active_mask) * 8)); in snd_usb_caiaq_audio_init()
858 cdev->data_cb_info[i].cdev = cdev; in snd_usb_caiaq_audio_init()
859 cdev->data_cb_info[i].index = i; in snd_usb_caiaq_audio_init()
862 cdev->data_urbs_in = alloc_urbs(cdev, SNDRV_PCM_STREAM_CAPTURE, &ret); in snd_usb_caiaq_audio_init()
864 kfree(cdev->data_cb_info); in snd_usb_caiaq_audio_init()
865 free_urbs(cdev->data_urbs_in); in snd_usb_caiaq_audio_init()
869 cdev->data_urbs_out = alloc_urbs(cdev, SNDRV_PCM_STREAM_PLAYBACK, &ret); in snd_usb_caiaq_audio_init()
871 kfree(cdev->data_cb_info); in snd_usb_caiaq_audio_init()
872 free_urbs(cdev->data_urbs_in); in snd_usb_caiaq_audio_init()
873 free_urbs(cdev->data_urbs_out); in snd_usb_caiaq_audio_init()
880 void snd_usb_caiaq_audio_free(struct snd_usb_caiaqdev *cdev) in snd_usb_caiaq_audio_free() argument
882 struct device *dev = caiaqdev_to_dev(cdev); in snd_usb_caiaq_audio_free()
884 dev_dbg(dev, "%s(%p)\n", __func__, cdev); in snd_usb_caiaq_audio_free()
885 stream_stop(cdev); in snd_usb_caiaq_audio_free()
886 free_urbs(cdev->data_urbs_in); in snd_usb_caiaq_audio_free()
887 free_urbs(cdev->data_urbs_out); in snd_usb_caiaq_audio_free()
888 kfree(cdev->data_cb_info); in snd_usb_caiaq_audio_free()