• Home
  • Raw
  • Download

Lines Matching +full:diff +full:- +full:channels

7  *  More accurate positioning and full-duplex support:
8 * Copyright (c) Ahmet İnan <ainan at mathematik.uni-freiburg.de>
28 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
53 static int index[SNDRV_CARDS] = SNDRV_DEFAULT_IDX; /* Index 0-MAX */
55 static bool enable[SNDRV_CARDS] = {1, [1 ... (SNDRV_CARDS - 1)] = 0};
56 static int pcm_substreams[SNDRV_CARDS] = {[0 ... (SNDRV_CARDS - 1)] = 8};
66 MODULE_PARM_DESC(pcm_substreams, "PCM substreams # (1-8) for loopback driver.");
68 MODULE_PARM_DESC(pcm_notify, "Break capture when PCM format/rate/channels changes.");
89 unsigned int channels; member
114 unsigned int pcm_salign; /* bytes per sample * channels */
130 if (dpcm->pcm_rate_shift == NO_PITCH) { in byte_pos()
134 HZ * (unsigned long long)dpcm->pcm_rate_shift); in byte_pos()
136 return x - (x % dpcm->pcm_salign); in byte_pos()
141 if (dpcm->pcm_rate_shift == NO_PITCH) { /* no pitch */ in frac_pos()
144 x = div_u64(dpcm->pcm_rate_shift * (unsigned long long)x * HZ, in frac_pos()
152 int device = dpcm->substream->pstr->pcm->device; in get_setup()
154 if (dpcm->substream->stream == SNDRV_PCM_STREAM_PLAYBACK) in get_setup()
156 return &dpcm->loopback->setup[dpcm->substream->number][device]; in get_setup()
161 return get_setup(dpcm)->notify; in get_notify()
166 return get_setup(dpcm)->rate_shift; in get_rate_shift()
169 /* call in cable->lock */
175 if (rate_shift != dpcm->pcm_rate_shift) { in loopback_timer_start()
176 dpcm->pcm_rate_shift = rate_shift; in loopback_timer_start()
177 dpcm->period_size_frac = frac_pos(dpcm, dpcm->pcm_period_size); in loopback_timer_start()
179 if (dpcm->period_size_frac <= dpcm->irq_pos) { in loopback_timer_start()
180 dpcm->irq_pos %= dpcm->period_size_frac; in loopback_timer_start()
181 dpcm->period_update_pending = 1; in loopback_timer_start()
183 tick = dpcm->period_size_frac - dpcm->irq_pos; in loopback_timer_start()
184 tick = (tick + dpcm->pcm_bps - 1) / dpcm->pcm_bps; in loopback_timer_start()
185 mod_timer(&dpcm->timer, jiffies + tick); in loopback_timer_start()
188 /* call in cable->lock */
191 del_timer(&dpcm->timer); in loopback_timer_stop()
192 dpcm->timer.expires = 0; in loopback_timer_stop()
197 del_timer_sync(&dpcm->timer); in loopback_timer_stop_sync()
211 if (cable->valid != CABLE_VALID_BOTH) { in loopback_check_format()
216 runtime = cable->streams[SNDRV_PCM_STREAM_PLAYBACK]-> in loopback_check_format()
217 substream->runtime; in loopback_check_format()
218 cruntime = cable->streams[SNDRV_PCM_STREAM_CAPTURE]-> in loopback_check_format()
219 substream->runtime; in loopback_check_format()
220 check = runtime->format != cruntime->format || in loopback_check_format()
221 runtime->rate != cruntime->rate || in loopback_check_format()
222 runtime->channels != cruntime->channels; in loopback_check_format()
226 return -EIO; in loopback_check_format()
228 snd_pcm_stop(cable->streams[SNDRV_PCM_STREAM_CAPTURE]-> in loopback_check_format()
231 runtime = cable->streams[SNDRV_PCM_STREAM_PLAYBACK]-> in loopback_check_format()
232 substream->runtime; in loopback_check_format()
233 setup = get_setup(cable->streams[SNDRV_PCM_STREAM_PLAYBACK]); in loopback_check_format()
234 card = cable->streams[SNDRV_PCM_STREAM_PLAYBACK]->loopback->card; in loopback_check_format()
235 if (setup->format != runtime->format) { in loopback_check_format()
237 &setup->format_id); in loopback_check_format()
238 setup->format = runtime->format; in loopback_check_format()
240 if (setup->rate != runtime->rate) { in loopback_check_format()
242 &setup->rate_id); in loopback_check_format()
243 setup->rate = runtime->rate; in loopback_check_format()
245 if (setup->channels != runtime->channels) { in loopback_check_format()
247 &setup->channels_id); in loopback_check_format()
248 setup->channels = runtime->channels; in loopback_check_format()
256 snd_ctl_notify(dpcm->loopback->card, in loopback_active_notify()
258 &get_setup(dpcm)->active_id); in loopback_active_notify()
263 struct snd_pcm_runtime *runtime = substream->runtime; in loopback_trigger()
264 struct loopback_pcm *dpcm = runtime->private_data; in loopback_trigger()
265 struct loopback_cable *cable = dpcm->cable; in loopback_trigger()
266 int err, stream = 1 << substream->stream; in loopback_trigger()
270 err = loopback_check_format(cable, substream->stream); in loopback_trigger()
273 dpcm->last_jiffies = jiffies; in loopback_trigger()
274 dpcm->pcm_rate_shift = 0; in loopback_trigger()
275 dpcm->last_drift = 0; in loopback_trigger()
276 spin_lock(&cable->lock); in loopback_trigger()
277 cable->running |= stream; in loopback_trigger()
278 cable->pause &= ~stream; in loopback_trigger()
280 spin_unlock(&cable->lock); in loopback_trigger()
281 if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) in loopback_trigger()
285 spin_lock(&cable->lock); in loopback_trigger()
286 cable->running &= ~stream; in loopback_trigger()
287 cable->pause &= ~stream; in loopback_trigger()
289 spin_unlock(&cable->lock); in loopback_trigger()
290 if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) in loopback_trigger()
295 spin_lock(&cable->lock); in loopback_trigger()
296 cable->pause |= stream; in loopback_trigger()
298 spin_unlock(&cable->lock); in loopback_trigger()
299 if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) in loopback_trigger()
304 spin_lock(&cable->lock); in loopback_trigger()
305 dpcm->last_jiffies = jiffies; in loopback_trigger()
306 cable->pause &= ~stream; in loopback_trigger()
308 spin_unlock(&cable->lock); in loopback_trigger()
309 if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) in loopback_trigger()
313 return -EINVAL; in loopback_trigger()
320 struct snd_pcm_runtime *runtime = substream->runtime; in params_change()
321 struct loopback_pcm *dpcm = runtime->private_data; in params_change()
322 struct loopback_cable *cable = dpcm->cable; in params_change()
324 cable->hw.formats = pcm_format_to_bits(runtime->format); in params_change()
325 cable->hw.rate_min = runtime->rate; in params_change()
326 cable->hw.rate_max = runtime->rate; in params_change()
327 cable->hw.channels_min = runtime->channels; in params_change()
328 cable->hw.channels_max = runtime->channels; in params_change()
333 struct snd_pcm_runtime *runtime = substream->runtime; in loopback_prepare()
334 struct loopback_pcm *dpcm = runtime->private_data; in loopback_prepare()
335 struct loopback_cable *cable = dpcm->cable; in loopback_prepare()
340 salign = (snd_pcm_format_width(runtime->format) * in loopback_prepare()
341 runtime->channels) / 8; in loopback_prepare()
342 bps = salign * runtime->rate; in loopback_prepare()
344 return -EINVAL; in loopback_prepare()
346 dpcm->buf_pos = 0; in loopback_prepare()
347 dpcm->pcm_buffer_size = frames_to_bytes(runtime, runtime->buffer_size); in loopback_prepare()
348 if (substream->stream == SNDRV_PCM_STREAM_CAPTURE) { in loopback_prepare()
350 dpcm->silent_size = dpcm->pcm_buffer_size; in loopback_prepare()
351 snd_pcm_format_set_silence(runtime->format, runtime->dma_area, in loopback_prepare()
352 runtime->buffer_size * runtime->channels); in loopback_prepare()
355 dpcm->irq_pos = 0; in loopback_prepare()
356 dpcm->period_update_pending = 0; in loopback_prepare()
357 dpcm->pcm_bps = bps; in loopback_prepare()
358 dpcm->pcm_salign = salign; in loopback_prepare()
359 dpcm->pcm_period_size = frames_to_bytes(runtime, runtime->period_size); in loopback_prepare()
361 mutex_lock(&dpcm->loopback->cable_lock); in loopback_prepare()
362 if (!(cable->valid & ~(1 << substream->stream)) || in loopback_prepare()
363 (get_setup(dpcm)->notify && in loopback_prepare()
364 substream->stream == SNDRV_PCM_STREAM_PLAYBACK)) in loopback_prepare()
366 cable->valid |= 1 << substream->stream; in loopback_prepare()
367 mutex_unlock(&dpcm->loopback->cable_lock); in loopback_prepare()
374 struct snd_pcm_runtime *runtime = dpcm->substream->runtime; in clear_capture_buf()
375 char *dst = runtime->dma_area; in clear_capture_buf()
376 unsigned int dst_off = dpcm->buf_pos; in clear_capture_buf()
378 if (dpcm->silent_size >= dpcm->pcm_buffer_size) in clear_capture_buf()
380 if (dpcm->silent_size + bytes > dpcm->pcm_buffer_size) in clear_capture_buf()
381 bytes = dpcm->pcm_buffer_size - dpcm->silent_size; in clear_capture_buf()
385 if (dst_off + size > dpcm->pcm_buffer_size) in clear_capture_buf()
386 size = dpcm->pcm_buffer_size - dst_off; in clear_capture_buf()
387 snd_pcm_format_set_silence(runtime->format, dst + dst_off, in clear_capture_buf()
389 runtime->channels); in clear_capture_buf()
390 dpcm->silent_size += size; in clear_capture_buf()
391 bytes -= size; in clear_capture_buf()
402 struct snd_pcm_runtime *runtime = play->substream->runtime; in copy_play_buf()
403 char *src = runtime->dma_area; in copy_play_buf()
404 char *dst = capt->substream->runtime->dma_area; in copy_play_buf()
405 unsigned int src_off = play->buf_pos; in copy_play_buf()
406 unsigned int dst_off = capt->buf_pos; in copy_play_buf()
411 if (runtime->status->state == SNDRV_PCM_STATE_DRAINING && in copy_play_buf()
412 snd_pcm_playback_hw_avail(runtime) < runtime->buffer_size) { in copy_play_buf()
413 snd_pcm_uframes_t appl_ptr, appl_ptr1, diff; in copy_play_buf() local
414 appl_ptr = appl_ptr1 = runtime->control->appl_ptr; in copy_play_buf()
415 appl_ptr1 -= appl_ptr1 % runtime->buffer_size; in copy_play_buf()
416 appl_ptr1 += play->buf_pos / play->pcm_salign; in copy_play_buf()
418 appl_ptr1 -= runtime->buffer_size; in copy_play_buf()
419 diff = (appl_ptr - appl_ptr1) * play->pcm_salign; in copy_play_buf()
420 if (diff < bytes) { in copy_play_buf()
421 clear_bytes = bytes - diff; in copy_play_buf()
422 bytes = diff; in copy_play_buf()
428 if (src_off + size > play->pcm_buffer_size) in copy_play_buf()
429 size = play->pcm_buffer_size - src_off; in copy_play_buf()
430 if (dst_off + size > capt->pcm_buffer_size) in copy_play_buf()
431 size = capt->pcm_buffer_size - dst_off; in copy_play_buf()
433 capt->silent_size = 0; in copy_play_buf()
434 bytes -= size; in copy_play_buf()
437 src_off = (src_off + size) % play->pcm_buffer_size; in copy_play_buf()
438 dst_off = (dst_off + size) % capt->pcm_buffer_size; in copy_play_buf()
443 capt->silent_size = 0; in copy_play_buf()
453 last_pos = byte_pos(dpcm, dpcm->irq_pos); in bytepos_delta()
454 dpcm->irq_pos += jiffies_delta * dpcm->pcm_bps; in bytepos_delta()
455 delta = byte_pos(dpcm, dpcm->irq_pos) - last_pos; in bytepos_delta()
456 if (delta >= dpcm->last_drift) in bytepos_delta()
457 delta -= dpcm->last_drift; in bytepos_delta()
458 dpcm->last_drift = 0; in bytepos_delta()
459 if (dpcm->irq_pos >= dpcm->period_size_frac) { in bytepos_delta()
460 dpcm->irq_pos %= dpcm->period_size_frac; in bytepos_delta()
461 dpcm->period_update_pending = 1; in bytepos_delta()
469 dpcm->buf_pos += delta; in bytepos_finish()
470 dpcm->buf_pos %= dpcm->pcm_buffer_size; in bytepos_finish()
473 /* call in cable->lock */
477 cable->streams[SNDRV_PCM_STREAM_PLAYBACK]; in loopback_pos_update()
479 cable->streams[SNDRV_PCM_STREAM_CAPTURE]; in loopback_pos_update()
483 running = cable->running ^ cable->pause; in loopback_pos_update()
485 delta_play = jiffies - dpcm_play->last_jiffies; in loopback_pos_update()
486 dpcm_play->last_jiffies += delta_play; in loopback_pos_update()
490 delta_capt = jiffies - dpcm_capt->last_jiffies; in loopback_pos_update()
491 dpcm_capt->last_jiffies += delta_capt; in loopback_pos_update()
498 count1 = bytepos_delta(dpcm_play, delta_play - delta_capt); in loopback_pos_update()
502 count1 = bytepos_delta(dpcm_capt, delta_capt - delta_play); in loopback_pos_update()
515 dpcm_capt->last_drift = count2 - count1; in loopback_pos_update()
518 dpcm_play->last_drift = count1 - count2; in loopback_pos_update()
532 spin_lock_irqsave(&dpcm->cable->lock, flags); in loopback_timer_function()
533 if (loopback_pos_update(dpcm->cable) & (1 << dpcm->substream->stream)) { in loopback_timer_function()
535 if (dpcm->period_update_pending) { in loopback_timer_function()
536 dpcm->period_update_pending = 0; in loopback_timer_function()
537 spin_unlock_irqrestore(&dpcm->cable->lock, flags); in loopback_timer_function()
539 snd_pcm_period_elapsed(dpcm->substream); in loopback_timer_function()
543 spin_unlock_irqrestore(&dpcm->cable->lock, flags); in loopback_timer_function()
548 struct snd_pcm_runtime *runtime = substream->runtime; in loopback_pointer()
549 struct loopback_pcm *dpcm = runtime->private_data; in loopback_pointer()
552 spin_lock(&dpcm->cable->lock); in loopback_pointer()
553 loopback_pos_update(dpcm->cable); in loopback_pointer()
554 pos = dpcm->buf_pos; in loopback_pointer()
555 spin_unlock(&dpcm->cable->lock); in loopback_pointer()
584 struct loopback_pcm *dpcm = runtime->private_data; in loopback_runtime_free()
597 struct snd_pcm_runtime *runtime = substream->runtime; in loopback_hw_free()
598 struct loopback_pcm *dpcm = runtime->private_data; in loopback_hw_free()
599 struct loopback_cable *cable = dpcm->cable; in loopback_hw_free()
601 mutex_lock(&dpcm->loopback->cable_lock); in loopback_hw_free()
602 cable->valid &= ~(1 << substream->stream); in loopback_hw_free()
603 mutex_unlock(&dpcm->loopback->cable_lock); in loopback_hw_free()
609 if (!substream->pcm->device) in get_cable_index()
610 return substream->stream; in get_cable_index()
612 return !substream->stream; in get_cable_index()
618 struct loopback_pcm *dpcm = rule->private; in rule_format()
619 struct loopback_cable *cable = dpcm->cable; in rule_format()
623 mutex_lock(&dpcm->loopback->cable_lock); in rule_format()
624 m.bits[0] = (u_int32_t)cable->hw.formats; in rule_format()
625 m.bits[1] = (u_int32_t)(cable->hw.formats >> 32); in rule_format()
626 mutex_unlock(&dpcm->loopback->cable_lock); in rule_format()
627 return snd_mask_refine(hw_param_mask(params, rule->var), &m); in rule_format()
633 struct loopback_pcm *dpcm = rule->private; in rule_rate()
634 struct loopback_cable *cable = dpcm->cable; in rule_rate()
637 mutex_lock(&dpcm->loopback->cable_lock); in rule_rate()
638 t.min = cable->hw.rate_min; in rule_rate()
639 t.max = cable->hw.rate_max; in rule_rate()
640 mutex_unlock(&dpcm->loopback->cable_lock); in rule_rate()
643 return snd_interval_refine(hw_param_interval(params, rule->var), &t); in rule_rate()
649 struct loopback_pcm *dpcm = rule->private; in rule_channels()
650 struct loopback_cable *cable = dpcm->cable; in rule_channels()
653 mutex_lock(&dpcm->loopback->cable_lock); in rule_channels()
654 t.min = cable->hw.channels_min; in rule_channels()
655 t.max = cable->hw.channels_max; in rule_channels()
656 mutex_unlock(&dpcm->loopback->cable_lock); in rule_channels()
659 return snd_interval_refine(hw_param_interval(params, rule->var), &t); in rule_channels()
664 struct loopback *loopback = substream->private_data; in free_cable()
668 cable = loopback->cables[substream->number][dev]; in free_cable()
671 if (cable->streams[!substream->stream]) { in free_cable()
673 spin_lock_irq(&cable->lock); in free_cable()
674 cable->streams[substream->stream] = NULL; in free_cable()
675 spin_unlock_irq(&cable->lock); in free_cable()
678 loopback->cables[substream->number][dev] = NULL; in free_cable()
685 struct snd_pcm_runtime *runtime = substream->runtime; in loopback_open()
686 struct loopback *loopback = substream->private_data; in loopback_open()
692 mutex_lock(&loopback->cable_lock); in loopback_open()
695 err = -ENOMEM; in loopback_open()
698 dpcm->loopback = loopback; in loopback_open()
699 dpcm->substream = substream; in loopback_open()
700 timer_setup(&dpcm->timer, loopback_timer_function, 0); in loopback_open()
702 cable = loopback->cables[substream->number][dev]; in loopback_open()
706 err = -ENOMEM; in loopback_open()
709 spin_lock_init(&cable->lock); in loopback_open()
710 cable->hw = loopback_pcm_hardware; in loopback_open()
711 loopback->cables[substream->number][dev] = cable; in loopback_open()
713 dpcm->cable = cable; in loopback_open()
717 /* use dynamic rules based on actual runtime->hw values */ in loopback_open()
719 /* are cached -> they do not reflect the actual state */ in loopback_open()
723 SNDRV_PCM_HW_PARAM_FORMAT, -1); in loopback_open()
729 SNDRV_PCM_HW_PARAM_RATE, -1); in loopback_open()
735 SNDRV_PCM_HW_PARAM_CHANNELS, -1); in loopback_open()
739 runtime->private_data = dpcm; in loopback_open()
740 runtime->private_free = loopback_runtime_free; in loopback_open()
742 runtime->hw = loopback_pcm_hardware; in loopback_open()
744 runtime->hw = cable->hw; in loopback_open()
746 spin_lock_irq(&cable->lock); in loopback_open()
747 cable->streams[substream->stream] = dpcm; in loopback_open()
748 spin_unlock_irq(&cable->lock); in loopback_open()
755 mutex_unlock(&loopback->cable_lock); in loopback_open()
761 struct loopback *loopback = substream->private_data; in loopback_close()
762 struct loopback_pcm *dpcm = substream->runtime->private_data; in loopback_close()
765 mutex_lock(&loopback->cable_lock); in loopback_close()
767 mutex_unlock(&loopback->cable_lock); in loopback_close()
789 err = snd_pcm_new(loopback->card, "Loopback PCM", device, in loopback_pcm_new()
796 pcm->private_data = loopback; in loopback_pcm_new()
797 pcm->info_flags = 0; in loopback_pcm_new()
798 strcpy(pcm->name, "Loopback PCM"); in loopback_pcm_new()
800 loopback->pcm[device] = pcm; in loopback_pcm_new()
807 uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER; in loopback_rate_shift_info()
808 uinfo->count = 1; in loopback_rate_shift_info()
809 uinfo->value.integer.min = 80000; in loopback_rate_shift_info()
810 uinfo->value.integer.max = 120000; in loopback_rate_shift_info()
811 uinfo->value.integer.step = 1; in loopback_rate_shift_info()
820 mutex_lock(&loopback->cable_lock); in loopback_rate_shift_get()
821 ucontrol->value.integer.value[0] = in loopback_rate_shift_get()
822 loopback->setup[kcontrol->id.subdevice] in loopback_rate_shift_get()
823 [kcontrol->id.device].rate_shift; in loopback_rate_shift_get()
824 mutex_unlock(&loopback->cable_lock); in loopback_rate_shift_get()
835 val = ucontrol->value.integer.value[0]; in loopback_rate_shift_put()
840 mutex_lock(&loopback->cable_lock); in loopback_rate_shift_put()
841 if (val != loopback->setup[kcontrol->id.subdevice] in loopback_rate_shift_put()
842 [kcontrol->id.device].rate_shift) { in loopback_rate_shift_put()
843 loopback->setup[kcontrol->id.subdevice] in loopback_rate_shift_put()
844 [kcontrol->id.device].rate_shift = val; in loopback_rate_shift_put()
847 mutex_unlock(&loopback->cable_lock); in loopback_rate_shift_put()
856 mutex_lock(&loopback->cable_lock); in loopback_notify_get()
857 ucontrol->value.integer.value[0] = in loopback_notify_get()
858 loopback->setup[kcontrol->id.subdevice] in loopback_notify_get()
859 [kcontrol->id.device].notify; in loopback_notify_get()
860 mutex_unlock(&loopback->cable_lock); in loopback_notify_get()
871 val = ucontrol->value.integer.value[0] ? 1 : 0; in loopback_notify_put()
872 mutex_lock(&loopback->cable_lock); in loopback_notify_put()
873 if (val != loopback->setup[kcontrol->id.subdevice] in loopback_notify_put()
874 [kcontrol->id.device].notify) { in loopback_notify_put()
875 loopback->setup[kcontrol->id.subdevice] in loopback_notify_put()
876 [kcontrol->id.device].notify = val; in loopback_notify_put()
879 mutex_unlock(&loopback->cable_lock); in loopback_notify_put()
891 mutex_lock(&loopback->cable_lock); in loopback_active_get()
892 cable = loopback->cables[kcontrol->id.subdevice][kcontrol->id.device ^ 1]; in loopback_active_get()
894 unsigned int running = cable->running ^ cable->pause; in loopback_active_get()
898 mutex_unlock(&loopback->cable_lock); in loopback_active_get()
899 ucontrol->value.integer.value[0] = val; in loopback_active_get()
906 uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER; in loopback_format_info()
907 uinfo->count = 1; in loopback_format_info()
908 uinfo->value.integer.min = 0; in loopback_format_info()
909 uinfo->value.integer.max = SNDRV_PCM_FORMAT_LAST; in loopback_format_info()
910 uinfo->value.integer.step = 1; in loopback_format_info()
919 ucontrol->value.integer.value[0] = in loopback_format_get()
920 loopback->setup[kcontrol->id.subdevice] in loopback_format_get()
921 [kcontrol->id.device].format; in loopback_format_get()
928 uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER; in loopback_rate_info()
929 uinfo->count = 1; in loopback_rate_info()
930 uinfo->value.integer.min = 0; in loopback_rate_info()
931 uinfo->value.integer.max = 192000; in loopback_rate_info()
932 uinfo->value.integer.step = 1; in loopback_rate_info()
941 mutex_lock(&loopback->cable_lock); in loopback_rate_get()
942 ucontrol->value.integer.value[0] = in loopback_rate_get()
943 loopback->setup[kcontrol->id.subdevice] in loopback_rate_get()
944 [kcontrol->id.device].rate; in loopback_rate_get()
945 mutex_unlock(&loopback->cable_lock); in loopback_rate_get()
952 uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER; in loopback_channels_info()
953 uinfo->count = 1; in loopback_channels_info()
954 uinfo->value.integer.min = 1; in loopback_channels_info()
955 uinfo->value.integer.max = 1024; in loopback_channels_info()
956 uinfo->value.integer.step = 1; in loopback_channels_info()
965 mutex_lock(&loopback->cable_lock); in loopback_channels_get()
966 ucontrol->value.integer.value[0] = in loopback_channels_get()
967 loopback->setup[kcontrol->id.subdevice] in loopback_channels_get()
968 [kcontrol->id.device].channels; in loopback_channels_get()
969 mutex_unlock(&loopback->cable_lock); in loopback_channels_get()
1016 .name = "PCM Slave Channels",
1024 struct snd_card *card = loopback->card; in loopback_mixer_new()
1030 strcpy(card->mixername, "Loopback Mixer"); in loopback_mixer_new()
1032 pcm = loopback->pcm[dev]; in loopback_mixer_new()
1034 pcm->streams[SNDRV_PCM_STREAM_CAPTURE].substream_count; in loopback_mixer_new()
1036 setup = &loopback->setup[substr][dev]; in loopback_mixer_new()
1037 setup->notify = notify; in loopback_mixer_new()
1038 setup->rate_shift = NO_PITCH; in loopback_mixer_new()
1039 setup->format = SNDRV_PCM_FORMAT_S16_LE; in loopback_mixer_new()
1040 setup->rate = 48000; in loopback_mixer_new()
1041 setup->channels = 2; in loopback_mixer_new()
1047 return -ENOMEM; in loopback_mixer_new()
1048 kctl->id.device = dev; in loopback_mixer_new()
1049 kctl->id.subdevice = substr; in loopback_mixer_new()
1052 setup->active_id = kctl->id; in loopback_mixer_new()
1055 setup->format_id = kctl->id; in loopback_mixer_new()
1058 setup->rate_id = kctl->id; in loopback_mixer_new()
1061 setup->channels_id = kctl->id; in loopback_mixer_new()
1084 snd_iprintf(buffer, " buffer_size:\t%u\n", dpcm->pcm_buffer_size); in print_dpcm_info()
1085 snd_iprintf(buffer, " buffer_pos:\t\t%u\n", dpcm->buf_pos); in print_dpcm_info()
1086 snd_iprintf(buffer, " silent_size:\t%u\n", dpcm->silent_size); in print_dpcm_info()
1087 snd_iprintf(buffer, " period_size:\t%u\n", dpcm->pcm_period_size); in print_dpcm_info()
1088 snd_iprintf(buffer, " bytes_per_sec:\t%u\n", dpcm->pcm_bps); in print_dpcm_info()
1089 snd_iprintf(buffer, " sample_align:\t%u\n", dpcm->pcm_salign); in print_dpcm_info()
1090 snd_iprintf(buffer, " rate_shift:\t\t%u\n", dpcm->pcm_rate_shift); in print_dpcm_info()
1092 dpcm->period_update_pending); in print_dpcm_info()
1093 snd_iprintf(buffer, " irq_pos:\t\t%u\n", dpcm->irq_pos); in print_dpcm_info()
1094 snd_iprintf(buffer, " period_frac:\t%u\n", dpcm->period_size_frac); in print_dpcm_info()
1096 dpcm->last_jiffies, jiffies); in print_dpcm_info()
1097 snd_iprintf(buffer, " timer_expires:\t%lu\n", dpcm->timer.expires); in print_dpcm_info()
1105 struct loopback_cable *cable = loopback->cables[sub][num]; in print_substream_info()
1112 snd_iprintf(buffer, " valid: %u\n", cable->valid); in print_substream_info()
1113 snd_iprintf(buffer, " running: %u\n", cable->running); in print_substream_info()
1114 snd_iprintf(buffer, " pause: %u\n", cable->pause); in print_substream_info()
1115 print_dpcm_info(buffer, cable->streams[0], "Playback"); in print_substream_info()
1116 print_dpcm_info(buffer, cable->streams[1], "Capture"); in print_substream_info()
1122 struct loopback *loopback = entry->private_data; in print_cable_info()
1125 mutex_lock(&loopback->cable_lock); in print_cable_info()
1126 num = entry->name[strlen(entry->name)-1]; in print_cable_info()
1130 mutex_unlock(&loopback->cable_lock); in print_cable_info()
1140 err = snd_card_proc_new(loopback->card, name, &entry); in loopback_proc_new()
1152 int dev = devptr->id; in loopback_probe()
1155 err = snd_card_new(&devptr->dev, index[dev], id[dev], THIS_MODULE, in loopback_probe()
1159 loopback = card->private_data; in loopback_probe()
1166 loopback->card = card; in loopback_probe()
1167 mutex_init(&loopback->cable_lock); in loopback_probe()
1180 strcpy(card->driver, "Loopback"); in loopback_probe()
1181 strcpy(card->shortname, "Loopback"); in loopback_probe()
1182 sprintf(card->longname, "Loopback %i", dev + 1); in loopback_probe()
1203 struct loopback *loopback = card->private_data; in loopback_suspend()
1207 snd_pcm_suspend_all(loopback->pcm[0]); in loopback_suspend()
1208 snd_pcm_suspend_all(loopback->pcm[1]); in loopback_suspend()
1276 return -ENODEV; in alsa_card_loopback_init()