Lines Matching refs:cdev

30 #define MAKE_CHECKBYTE(cdev,stream,i) \
31 (stream << 1) | (~(i / (cdev->n_streams * BYTES_PER_SAMPLE_USB)) & 1)
51 activate_substream(struct snd_usb_caiaqdev *cdev,
54 spin_lock(&cdev->spinlock);
57 cdev->sub_playback[sub->number] = sub;
59 cdev->sub_capture[sub->number] = sub;
61 spin_unlock(&cdev->spinlock);
65 deactivate_substream(struct snd_usb_caiaqdev *cdev,
69 spin_lock_irqsave(&cdev->spinlock, flags);
72 cdev->sub_playback[sub->number] = NULL;
74 cdev->sub_capture[sub->number] = NULL;
76 spin_unlock_irqrestore(&cdev->spinlock, flags);
89 static int stream_start(struct snd_usb_caiaqdev *cdev)
92 struct device *dev = caiaqdev_to_dev(cdev);
94 dev_dbg(dev, "%s(%p)\n", __func__, cdev);
96 if (cdev->streaming)
99 memset(cdev->sub_playback, 0, sizeof(cdev->sub_playback));
100 memset(cdev->sub_capture, 0, sizeof(cdev->sub_capture));
101 cdev->input_panic = 0;
102 cdev->output_panic = 0;
103 cdev->first_packet = 4;
104 cdev->streaming = 1;
105 cdev->warned = 0;
108 ret = usb_submit_urb(cdev->data_urbs_in[i], GFP_ATOMIC);
112 cdev->streaming = 0;
120 static void stream_stop(struct snd_usb_caiaqdev *cdev)
123 struct device *dev = caiaqdev_to_dev(cdev);
125 dev_dbg(dev, "%s(%p)\n", __func__, cdev);
126 if (!cdev->streaming)
129 cdev->streaming = 0;
132 usb_kill_urb(cdev->data_urbs_in[i]);
134 if (test_bit(i, &cdev->outurb_active_mask))
135 usb_kill_urb(cdev->data_urbs_out[i]);
138 cdev->outurb_active_mask = 0;
143 struct snd_usb_caiaqdev *cdev = snd_pcm_substream_chip(substream);
144 struct device *dev = caiaqdev_to_dev(cdev);
147 substream->runtime->hw = cdev->pcm_info;
155 struct snd_usb_caiaqdev *cdev = snd_pcm_substream_chip(substream);
156 struct device *dev = caiaqdev_to_dev(cdev);
159 if (all_substreams_zero(cdev->sub_playback) &&
160 all_substreams_zero(cdev->sub_capture)) {
163 stream_stop(cdev);
164 cdev->pcm_info.rates = cdev->samplerates;
172 struct snd_usb_caiaqdev *cdev = snd_pcm_substream_chip(sub);
173 deactivate_substream(cdev, sub);
189 struct snd_usb_caiaqdev *cdev = snd_pcm_substream_chip(substream);
191 struct device *dev = caiaqdev_to_dev(cdev);
198 switch (cdev->spec.data_alignment) {
209 cdev->period_out_count[index] = out_pos;
210 cdev->audio_out_buf_pos[index] = out_pos;
214 switch (cdev->spec.data_alignment) {
227 cdev->period_in_count[index] = in_pos;
228 cdev->audio_in_buf_pos[index] = in_pos;
231 if (cdev->streaming)
238 cdev->pcm_info.rates = 1 << i;
243 if (cdev->spec.data_alignment >= 2)
247 * bytes_per_sample * CHANNELS_PER_STREAM * cdev->n_streams;
252 ret = snd_usb_caiaq_set_audio_params(cdev, runtime->rate,
257 ret = stream_start(cdev);
261 cdev->output_running = 0;
262 wait_event_timeout(cdev->prepare_wait_queue, cdev->output_running, HZ);
263 if (!cdev->output_running) {
264 stream_stop(cdev);
273 struct snd_usb_caiaqdev *cdev = snd_pcm_substream_chip(sub);
274 struct device *dev = caiaqdev_to_dev(cdev);
281 activate_substream(cdev, sub);
285 deactivate_substream(cdev, sub);
298 struct snd_usb_caiaqdev *cdev = snd_pcm_substream_chip(sub);
301 spin_lock(&cdev->spinlock);
303 if (cdev->input_panic || cdev->output_panic) {
310 cdev->audio_out_buf_pos[index]);
313 cdev->audio_in_buf_pos[index]);
316 spin_unlock(&cdev->spinlock);
330 static void check_for_elapsed_periods(struct snd_usb_caiaqdev *cdev,
336 for (stream = 0; stream < cdev->n_streams; stream++) {
343 &cdev->period_out_count[stream] :
344 &cdev->period_in_count[stream];
353 static void read_in_urb_mode0(struct snd_usb_caiaqdev *cdev,
361 if (all_substreams_zero(cdev->sub_capture))
365 for (stream = 0; stream < cdev->n_streams; stream++, i++) {
366 sub = cdev->sub_capture[stream];
371 audio_buf[cdev->audio_in_buf_pos[stream]++]
373 cdev->period_in_count[stream]++;
374 if (cdev->audio_in_buf_pos[stream] == sz)
375 cdev->audio_in_buf_pos[stream] = 0;
381 static void read_in_urb_mode2(struct snd_usb_caiaqdev *cdev,
391 if (i % (cdev->n_streams * BYTES_PER_SAMPLE_USB) == 0) {
393 stream < cdev->n_streams;
395 if (cdev->first_packet)
398 check_byte = MAKE_CHECKBYTE(cdev, stream, i);
401 cdev->input_panic = 1;
404 cdev->output_panic = 1;
407 cdev->first_packet = 0;
409 for (stream = 0; stream < cdev->n_streams; stream++, i++) {
410 sub = cdev->sub_capture[stream];
411 if (cdev->input_panic)
418 audio_buf[cdev->audio_in_buf_pos[stream]++] =
420 cdev->period_in_count[stream]++;
421 if (cdev->audio_in_buf_pos[stream] == sz)
422 cdev->audio_in_buf_pos[stream] = 0;
428 static void read_in_urb_mode3(struct snd_usb_caiaqdev *cdev,
433 struct device *dev = caiaqdev_to_dev(cdev);
441 for (stream = 0; stream < cdev->n_streams; stream++) {
442 struct snd_pcm_substream *sub = cdev->sub_capture[stream];
446 if (sub && !cdev->input_panic) {
456 audio_buf[cdev->audio_in_buf_pos[stream]++] = usb_buf[i+n];
458 if (cdev->audio_in_buf_pos[stream] == sz)
459 cdev->audio_in_buf_pos[stream] = 0;
462 cdev->period_in_count[stream] += BYTES_PER_SAMPLE;
468 !cdev->first_packet) {
469 if (!cdev->input_panic)
472 cdev->input_panic = 1;
480 if (cdev->first_packet > 0)
481 cdev->first_packet--;
484 static void read_in_urb(struct snd_usb_caiaqdev *cdev,
488 struct device *dev = caiaqdev_to_dev(cdev);
490 if (!cdev->streaming)
493 if (iso->actual_length < cdev->bpp)
496 switch (cdev->spec.data_alignment) {
498 read_in_urb_mode0(cdev, urb, iso);
501 read_in_urb_mode2(cdev, urb, iso);
504 read_in_urb_mode3(cdev, urb, iso);
508 if ((cdev->input_panic || cdev->output_panic) && !cdev->warned) {
510 cdev->input_panic ? "(input)" : "",
511 cdev->output_panic ? "(output)" : "");
512 cdev->warned = 1;
516 static void fill_out_urb_mode_0(struct snd_usb_caiaqdev *cdev,
525 for (stream = 0; stream < cdev->n_streams; stream++, i++) {
526 sub = cdev->sub_playback[stream];
532 audio_buf[cdev->audio_out_buf_pos[stream]];
533 cdev->period_out_count[stream]++;
534 cdev->audio_out_buf_pos[stream]++;
535 if (cdev->audio_out_buf_pos[stream] == sz)
536 cdev->audio_out_buf_pos[stream] = 0;
542 if (cdev->spec.data_alignment == 2 &&
543 i % (cdev->n_streams * BYTES_PER_SAMPLE_USB) ==
544 (cdev->n_streams * CHANNELS_PER_STREAM))
545 for (stream = 0; stream < cdev->n_streams; stream++, i++)
546 usb_buf[i] = MAKE_CHECKBYTE(cdev, stream, i);
550 static void fill_out_urb_mode_3(struct snd_usb_caiaqdev *cdev,
558 for (stream = 0; stream < cdev->n_streams; stream++) {
559 struct snd_pcm_substream *sub = cdev->sub_playback[stream];
572 usb_buf[i+n] = audio_buf[cdev->audio_out_buf_pos[stream]++];
574 if (cdev->audio_out_buf_pos[stream] == sz)
575 cdev->audio_out_buf_pos[stream] = 0;
582 cdev->period_out_count[stream] += BYTES_PER_SAMPLE;
593 static inline void fill_out_urb(struct snd_usb_caiaqdev *cdev,
597 switch (cdev->spec.data_alignment) {
600 fill_out_urb_mode_0(cdev, urb, iso);
603 fill_out_urb_mode_3(cdev, urb, iso);
611 struct snd_usb_caiaqdev *cdev;
621 cdev = info->cdev;
622 dev = caiaqdev_to_dev(cdev);
624 if (!cdev->streaming)
629 if (test_and_set_bit(i, &cdev->outurb_active_mask) == 0) {
630 out = cdev->data_urbs_out[i];
652 spin_lock_irqsave(&cdev->spinlock, flags);
653 fill_out_urb(cdev, out, &out->iso_frame_desc[outframe]);
654 read_in_urb(cdev, urb, &urb->iso_frame_desc[frame]);
655 spin_unlock_irqrestore(&cdev->spinlock, flags);
656 check_for_elapsed_periods(cdev, cdev->sub_playback);
657 check_for_elapsed_periods(cdev, cdev->sub_capture);
669 clear_bit(oinfo->index, &cdev->outurb_active_mask);
687 struct snd_usb_caiaqdev *cdev = info->cdev;
689 if (!cdev->output_running) {
690 cdev->output_running = 1;
691 wake_up(&cdev->prepare_wait_queue);
694 clear_bit(info->index, &cdev->outurb_active_mask);
697 static struct urb **alloc_urbs(struct snd_usb_caiaqdev *cdev, int dir, int *ret)
701 struct usb_device *usb_dev = cdev->chip.dev;
741 urbs[i]->context = &cdev->data_cb_info[i];
771 int snd_usb_caiaq_audio_init(struct snd_usb_caiaqdev *cdev)
774 struct device *dev = caiaqdev_to_dev(cdev);
776 cdev->n_audio_in = max(cdev->spec.num_analog_audio_in,
777 cdev->spec.num_digital_audio_in) /
779 cdev->n_audio_out = max(cdev->spec.num_analog_audio_out,
780 cdev->spec.num_digital_audio_out) /
782 cdev->n_streams = max(cdev->n_audio_in, cdev->n_audio_out);
784 dev_dbg(dev, "cdev->n_audio_in = %d\n", cdev->n_audio_in);
785 dev_dbg(dev, "cdev->n_audio_out = %d\n", cdev->n_audio_out);
786 dev_dbg(dev, "cdev->n_streams = %d\n", cdev->n_streams);
788 if (cdev->n_streams > MAX_STREAMS) {
793 if (cdev->n_streams < 1) {
794 dev_err(dev, "bogus number of streams: %d\n", cdev->n_streams);
798 ret = snd_pcm_new(cdev->chip.card, cdev->product_name, 0,
799 cdev->n_audio_out, cdev->n_audio_in, &cdev->pcm);
806 cdev->pcm->private_data = cdev;
807 strscpy(cdev->pcm->name, cdev->product_name, sizeof(cdev->pcm->name));
809 memset(cdev->sub_playback, 0, sizeof(cdev->sub_playback));
810 memset(cdev->sub_capture, 0, sizeof(cdev->sub_capture));
812 memcpy(&cdev->pcm_info, &snd_usb_caiaq_pcm_hardware,
816 cdev->samplerates = cdev->pcm_info.rates;
817 switch (cdev->chip.usb_id) {
822 cdev->samplerates |= SNDRV_PCM_RATE_192000;
828 cdev->samplerates |= SNDRV_PCM_RATE_88200;
832 snd_pcm_set_ops(cdev->pcm, SNDRV_PCM_STREAM_PLAYBACK,
834 snd_pcm_set_ops(cdev->pcm, SNDRV_PCM_STREAM_CAPTURE,
836 snd_pcm_set_managed_buffer_all(cdev->pcm, SNDRV_DMA_TYPE_VMALLOC,
839 cdev->data_cb_info =
843 if (!cdev->data_cb_info)
846 cdev->outurb_active_mask = 0;
847 BUILD_BUG_ON(N_URBS > (sizeof(cdev->outurb_active_mask) * 8));
850 cdev->data_cb_info[i].cdev = cdev;
851 cdev->data_cb_info[i].index = i;
854 cdev->data_urbs_in = alloc_urbs(cdev, SNDRV_PCM_STREAM_CAPTURE, &ret);
856 kfree(cdev->data_cb_info);
857 free_urbs(cdev->data_urbs_in);
861 cdev->data_urbs_out = alloc_urbs(cdev, SNDRV_PCM_STREAM_PLAYBACK, &ret);
863 kfree(cdev->data_cb_info);
864 free_urbs(cdev->data_urbs_in);
865 free_urbs(cdev->data_urbs_out);
872 void snd_usb_caiaq_audio_free(struct snd_usb_caiaqdev *cdev)
874 struct device *dev = caiaqdev_to_dev(cdev);
876 dev_dbg(dev, "%s(%p)\n", __func__, cdev);
877 stream_stop(cdev);
878 free_urbs(cdev->data_urbs_in);
879 free_urbs(cdev->data_urbs_out);
880 kfree(cdev->data_cb_info);