Lines Matching +full:min +full:- +full:sample +full:- +full:time +full:- +full:nsecs
17 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
26 #include <linux/time.h>
61 static int index[SNDRV_CARDS] = SNDRV_DEFAULT_IDX; /* Index 0-MAX */
63 static bool enable[SNDRV_CARDS] = {1, [1 ... (SNDRV_CARDS - 1)] = 0};
64 static char *model[SNDRV_CARDS] = {[0 ... (SNDRV_CARDS - 1)] = NULL};
65 static int pcm_devs[SNDRV_CARDS] = {[0 ... (SNDRV_CARDS - 1)] = 1};
66 static int pcm_substreams[SNDRV_CARDS] = {[0 ... (SNDRV_CARDS - 1)] = 8};
67 //static int midi_devs[SNDRV_CARDS] = {[0 ... (SNDRV_CARDS - 1)] = 2};
82 MODULE_PARM_DESC(pcm_devs, "PCM devices # (0-4) for dummy driver.");
84 MODULE_PARM_DESC(pcm_substreams, "PCM substreams # (1-128) for dummy driver.");
86 //MODULE_PARM_DESC(midi_devs, "MIDI devices # (0-2) for dummy driver.");
113 (*(const struct dummy_timer_ops **)(substream)->runtime->private_data)
210 .buffer_bytes_max = ((65536-64)*8),
211 .period_bytes_max = (65536-64),
241 unsigned int frac_pos; /* fractional sample position (based HZ) */
252 mod_timer(&dpcm->timer, jiffies + in dummy_systimer_rearm()
253 (dpcm->frac_period_rest + dpcm->rate - 1) / dpcm->rate); in dummy_systimer_rearm()
260 delta = jiffies - dpcm->base_time; in dummy_systimer_update()
263 dpcm->base_time += delta; in dummy_systimer_update()
264 delta *= dpcm->rate; in dummy_systimer_update()
265 dpcm->frac_pos += delta; in dummy_systimer_update()
266 while (dpcm->frac_pos >= dpcm->frac_buffer_size) in dummy_systimer_update()
267 dpcm->frac_pos -= dpcm->frac_buffer_size; in dummy_systimer_update()
268 while (dpcm->frac_period_rest <= delta) { in dummy_systimer_update()
269 dpcm->elapsed++; in dummy_systimer_update()
270 dpcm->frac_period_rest += dpcm->frac_period_size; in dummy_systimer_update()
272 dpcm->frac_period_rest -= delta; in dummy_systimer_update()
277 struct dummy_systimer_pcm *dpcm = substream->runtime->private_data; in dummy_systimer_start()
278 spin_lock(&dpcm->lock); in dummy_systimer_start()
279 dpcm->base_time = jiffies; in dummy_systimer_start()
281 spin_unlock(&dpcm->lock); in dummy_systimer_start()
287 struct dummy_systimer_pcm *dpcm = substream->runtime->private_data; in dummy_systimer_stop()
288 spin_lock(&dpcm->lock); in dummy_systimer_stop()
289 del_timer(&dpcm->timer); in dummy_systimer_stop()
290 spin_unlock(&dpcm->lock); in dummy_systimer_stop()
296 struct snd_pcm_runtime *runtime = substream->runtime; in dummy_systimer_prepare()
297 struct dummy_systimer_pcm *dpcm = runtime->private_data; in dummy_systimer_prepare()
299 dpcm->frac_pos = 0; in dummy_systimer_prepare()
300 dpcm->rate = runtime->rate; in dummy_systimer_prepare()
301 dpcm->frac_buffer_size = runtime->buffer_size * HZ; in dummy_systimer_prepare()
302 dpcm->frac_period_size = runtime->period_size * HZ; in dummy_systimer_prepare()
303 dpcm->frac_period_rest = dpcm->frac_period_size; in dummy_systimer_prepare()
304 dpcm->elapsed = 0; in dummy_systimer_prepare()
315 spin_lock_irqsave(&dpcm->lock, flags); in dummy_systimer_callback()
318 elapsed = dpcm->elapsed; in dummy_systimer_callback()
319 dpcm->elapsed = 0; in dummy_systimer_callback()
320 spin_unlock_irqrestore(&dpcm->lock, flags); in dummy_systimer_callback()
322 snd_pcm_period_elapsed(dpcm->substream); in dummy_systimer_callback()
328 struct dummy_systimer_pcm *dpcm = substream->runtime->private_data; in dummy_systimer_pointer()
331 spin_lock(&dpcm->lock); in dummy_systimer_pointer()
333 pos = dpcm->frac_pos / HZ; in dummy_systimer_pointer()
334 spin_unlock(&dpcm->lock); in dummy_systimer_pointer()
344 return -ENOMEM; in dummy_systimer_create()
345 substream->runtime->private_data = dpcm; in dummy_systimer_create()
346 timer_setup(&dpcm->timer, dummy_systimer_callback, 0); in dummy_systimer_create()
347 spin_lock_init(&dpcm->lock); in dummy_systimer_create()
348 dpcm->substream = substream; in dummy_systimer_create()
354 kfree(substream->runtime->private_data); in dummy_systimer_free()
386 if (!atomic_read(&dpcm->running)) in dummy_hrtimer_callback()
392 snd_pcm_period_elapsed(dpcm->substream); in dummy_hrtimer_callback()
393 if (!atomic_read(&dpcm->running)) in dummy_hrtimer_callback()
396 hrtimer_forward_now(timer, dpcm->period_time); in dummy_hrtimer_callback()
402 struct dummy_hrtimer_pcm *dpcm = substream->runtime->private_data; in dummy_hrtimer_start()
404 dpcm->base_time = hrtimer_cb_get_time(&dpcm->timer); in dummy_hrtimer_start()
405 hrtimer_start(&dpcm->timer, dpcm->period_time, HRTIMER_MODE_REL_SOFT); in dummy_hrtimer_start()
406 atomic_set(&dpcm->running, 1); in dummy_hrtimer_start()
412 struct dummy_hrtimer_pcm *dpcm = substream->runtime->private_data; in dummy_hrtimer_stop()
414 atomic_set(&dpcm->running, 0); in dummy_hrtimer_stop()
415 if (!hrtimer_callback_running(&dpcm->timer)) in dummy_hrtimer_stop()
416 hrtimer_cancel(&dpcm->timer); in dummy_hrtimer_stop()
422 hrtimer_cancel(&dpcm->timer); in dummy_hrtimer_sync()
428 struct snd_pcm_runtime *runtime = substream->runtime; in dummy_hrtimer_pointer()
429 struct dummy_hrtimer_pcm *dpcm = runtime->private_data; in dummy_hrtimer_pointer()
433 delta = ktime_us_delta(hrtimer_cb_get_time(&dpcm->timer), in dummy_hrtimer_pointer()
434 dpcm->base_time); in dummy_hrtimer_pointer()
435 delta = div_u64(delta * runtime->rate + 999999, 1000000); in dummy_hrtimer_pointer()
436 div_u64_rem(delta, runtime->buffer_size, &pos); in dummy_hrtimer_pointer()
442 struct snd_pcm_runtime *runtime = substream->runtime; in dummy_hrtimer_prepare()
443 struct dummy_hrtimer_pcm *dpcm = runtime->private_data; in dummy_hrtimer_prepare()
446 unsigned long nsecs; in dummy_hrtimer_prepare() local
449 period = runtime->period_size; in dummy_hrtimer_prepare()
450 rate = runtime->rate; in dummy_hrtimer_prepare()
453 nsecs = div_u64((u64)period * 1000000000UL + rate - 1, rate); in dummy_hrtimer_prepare()
454 dpcm->period_time = ktime_set(sec, nsecs); in dummy_hrtimer_prepare()
465 return -ENOMEM; in dummy_hrtimer_create()
466 substream->runtime->private_data = dpcm; in dummy_hrtimer_create()
467 hrtimer_init(&dpcm->timer, CLOCK_MONOTONIC, HRTIMER_MODE_REL_SOFT); in dummy_hrtimer_create()
468 dpcm->timer.function = dummy_hrtimer_callback; in dummy_hrtimer_create()
469 dpcm->substream = substream; in dummy_hrtimer_create()
470 atomic_set(&dpcm->running, 0); in dummy_hrtimer_create()
476 struct dummy_hrtimer_pcm *dpcm = substream->runtime->private_data; in dummy_hrtimer_free()
501 return get_dummy_ops(substream)->start(substream); in dummy_pcm_trigger()
504 return get_dummy_ops(substream)->stop(substream); in dummy_pcm_trigger()
506 return -EINVAL; in dummy_pcm_trigger()
511 return get_dummy_ops(substream)->prepare(substream); in dummy_pcm_prepare()
516 return get_dummy_ops(substream)->pointer(substream); in dummy_pcm_pointer()
542 /* runtime->dma_bytes has to be set manually to allow mmap */ in dummy_pcm_hw_params()
543 substream->runtime->dma_bytes = params_buffer_bytes(hw_params); in dummy_pcm_hw_params()
560 struct dummy_model *model = dummy->model; in dummy_pcm_open()
561 struct snd_pcm_runtime *runtime = substream->runtime; in dummy_pcm_open()
571 err = ops->create(substream); in dummy_pcm_open()
576 runtime->hw = dummy->pcm_hw; in dummy_pcm_open()
577 if (substream->pcm->device & 1) { in dummy_pcm_open()
578 runtime->hw.info &= ~SNDRV_PCM_INFO_INTERLEAVED; in dummy_pcm_open()
579 runtime->hw.info |= SNDRV_PCM_INFO_NONINTERLEAVED; in dummy_pcm_open()
581 if (substream->pcm->device & 2) in dummy_pcm_open()
582 runtime->hw.info &= ~(SNDRV_PCM_INFO_MMAP | in dummy_pcm_open()
588 if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) { in dummy_pcm_open()
589 if (model->playback_constraints) in dummy_pcm_open()
590 err = model->playback_constraints(substream->runtime); in dummy_pcm_open()
592 if (model->capture_constraints) in dummy_pcm_open()
593 err = model->capture_constraints(substream->runtime); in dummy_pcm_open()
596 get_dummy_ops(substream)->free(substream); in dummy_pcm_open()
604 get_dummy_ops(substream)->free(substream); in dummy_pcm_close()
636 return -ENOMEM; in alloc_fake_buffer()
666 return virt_to_page(dummy_page[substream->stream]); /* the same page */ in dummy_pcm_page()
702 err = snd_pcm_new(dummy->card, "Dummy PCM", device, in snd_card_dummy_pcm()
706 dummy->pcm = pcm; in snd_card_dummy_pcm()
713 pcm->private_data = dummy; in snd_card_dummy_pcm()
714 pcm->info_flags = 0; in snd_card_dummy_pcm()
715 strcpy(pcm->name, "Dummy PCM"); in snd_card_dummy_pcm()
741 uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER; in snd_dummy_volume_info()
742 uinfo->count = 2; in snd_dummy_volume_info()
743 uinfo->value.integer.min = -50; in snd_dummy_volume_info()
744 uinfo->value.integer.max = 100; in snd_dummy_volume_info()
752 int addr = kcontrol->private_value; in snd_dummy_volume_get()
754 spin_lock_irq(&dummy->mixer_lock); in snd_dummy_volume_get()
755 ucontrol->value.integer.value[0] = dummy->mixer_volume[addr][0]; in snd_dummy_volume_get()
756 ucontrol->value.integer.value[1] = dummy->mixer_volume[addr][1]; in snd_dummy_volume_get()
757 spin_unlock_irq(&dummy->mixer_lock); in snd_dummy_volume_get()
765 int change, addr = kcontrol->private_value; in snd_dummy_volume_put()
768 left = ucontrol->value.integer.value[0]; in snd_dummy_volume_put()
769 if (left < -50) in snd_dummy_volume_put()
770 left = -50; in snd_dummy_volume_put()
773 right = ucontrol->value.integer.value[1]; in snd_dummy_volume_put()
774 if (right < -50) in snd_dummy_volume_put()
775 right = -50; in snd_dummy_volume_put()
778 spin_lock_irq(&dummy->mixer_lock); in snd_dummy_volume_put()
779 change = dummy->mixer_volume[addr][0] != left || in snd_dummy_volume_put()
780 dummy->mixer_volume[addr][1] != right; in snd_dummy_volume_put()
781 dummy->mixer_volume[addr][0] = left; in snd_dummy_volume_put()
782 dummy->mixer_volume[addr][1] = right; in snd_dummy_volume_put()
783 spin_unlock_irq(&dummy->mixer_lock); in snd_dummy_volume_put()
787 static const DECLARE_TLV_DB_SCALE(db_scale_dummy, -4500, 30, 0);
801 int addr = kcontrol->private_value; in snd_dummy_capsrc_get()
803 spin_lock_irq(&dummy->mixer_lock); in snd_dummy_capsrc_get()
804 ucontrol->value.integer.value[0] = dummy->capture_source[addr][0]; in snd_dummy_capsrc_get()
805 ucontrol->value.integer.value[1] = dummy->capture_source[addr][1]; in snd_dummy_capsrc_get()
806 spin_unlock_irq(&dummy->mixer_lock); in snd_dummy_capsrc_get()
813 int change, addr = kcontrol->private_value; in snd_dummy_capsrc_put()
816 left = ucontrol->value.integer.value[0] & 1; in snd_dummy_capsrc_put()
817 right = ucontrol->value.integer.value[1] & 1; in snd_dummy_capsrc_put()
818 spin_lock_irq(&dummy->mixer_lock); in snd_dummy_capsrc_put()
819 change = dummy->capture_source[addr][0] != left && in snd_dummy_capsrc_put()
820 dummy->capture_source[addr][1] != right; in snd_dummy_capsrc_put()
821 dummy->capture_source[addr][0] = left; in snd_dummy_capsrc_put()
822 dummy->capture_source[addr][1] = right; in snd_dummy_capsrc_put()
823 spin_unlock_irq(&dummy->mixer_lock); in snd_dummy_capsrc_put()
840 value->value.enumerated.item[0] = dummy->iobox; in snd_dummy_iobox_get()
850 if (value->value.enumerated.item[0] > 1) in snd_dummy_iobox_put()
851 return -EINVAL; in snd_dummy_iobox_put()
853 changed = value->value.enumerated.item[0] != dummy->iobox; in snd_dummy_iobox_put()
855 dummy->iobox = value->value.enumerated.item[0]; in snd_dummy_iobox_put()
857 if (dummy->iobox) { in snd_dummy_iobox_put()
858 dummy->cd_volume_ctl->vd[0].access &= in snd_dummy_iobox_put()
860 dummy->cd_switch_ctl->vd[0].access &= in snd_dummy_iobox_put()
863 dummy->cd_volume_ctl->vd[0].access |= in snd_dummy_iobox_put()
865 dummy->cd_switch_ctl->vd[0].access |= in snd_dummy_iobox_put()
869 snd_ctl_notify(dummy->card, SNDRV_CTL_EVENT_MASK_INFO, in snd_dummy_iobox_put()
870 &dummy->cd_volume_ctl->id); in snd_dummy_iobox_put()
871 snd_ctl_notify(dummy->card, SNDRV_CTL_EVENT_MASK_INFO, in snd_dummy_iobox_put()
872 &dummy->cd_switch_ctl->id); in snd_dummy_iobox_put()
900 struct snd_card *card = dummy->card; in snd_card_dummy_new_mixer()
905 spin_lock_init(&dummy->mixer_lock); in snd_card_dummy_new_mixer()
906 strcpy(card->mixername, "Dummy Mixer"); in snd_card_dummy_new_mixer()
907 dummy->iobox = 1; in snd_card_dummy_new_mixer()
914 if (!strcmp(kcontrol->id.name, "CD Volume")) in snd_card_dummy_new_mixer()
915 dummy->cd_volume_ctl = kcontrol; in snd_card_dummy_new_mixer()
916 else if (!strcmp(kcontrol->id.name, "CD Capture Switch")) in snd_card_dummy_new_mixer()
917 dummy->cd_switch_ctl = kcontrol; in snd_card_dummy_new_mixer()
933 if (dummy->pcm_hw.formats & (1ULL << i)) in print_formats()
947 if (dummy->pcm_hw.rates & SNDRV_PCM_RATE_CONTINUOUS) in print_rates()
949 if (dummy->pcm_hw.rates & SNDRV_PCM_RATE_KNOT) in print_rates()
952 if (dummy->pcm_hw.rates & (1 << i)) in print_rates()
957 (unsigned int *)((char *)&((dummy)->pcm_hw) + (ofs))
959 (unsigned long long *)((char *)&((dummy)->pcm_hw) + (ofs))
990 struct snd_dummy *dummy = entry->private_data; in dummy_proc_read()
1012 struct snd_dummy *dummy = entry->private_data; in dummy_proc_write()
1042 if (!snd_card_proc_new(chip->card, "dummy_pcm", &entry)) { in dummy_proc_init()
1044 entry->c.text.write = dummy_proc_write; in dummy_proc_init()
1045 entry->mode |= 0200; in dummy_proc_init()
1046 entry->private_data = chip; in dummy_proc_init()
1059 int dev = devptr->id; in snd_dummy_probe()
1061 err = snd_card_new(&devptr->dev, index[dev], id[dev], THIS_MODULE, in snd_dummy_probe()
1065 dummy = card->private_data; in snd_dummy_probe()
1066 dummy->card = card; in snd_dummy_probe()
1068 if (strcmp(model[dev], (*mdl)->name) == 0) { in snd_dummy_probe()
1070 "snd-dummy: Using model '%s' for card %i\n", in snd_dummy_probe()
1071 (*mdl)->name, card->number); in snd_dummy_probe()
1072 m = dummy->model = *mdl; in snd_dummy_probe()
1086 dummy->pcm_hw = dummy_pcm_hardware; in snd_dummy_probe()
1088 if (m->formats) in snd_dummy_probe()
1089 dummy->pcm_hw.formats = m->formats; in snd_dummy_probe()
1090 if (m->buffer_bytes_max) in snd_dummy_probe()
1091 dummy->pcm_hw.buffer_bytes_max = m->buffer_bytes_max; in snd_dummy_probe()
1092 if (m->period_bytes_min) in snd_dummy_probe()
1093 dummy->pcm_hw.period_bytes_min = m->period_bytes_min; in snd_dummy_probe()
1094 if (m->period_bytes_max) in snd_dummy_probe()
1095 dummy->pcm_hw.period_bytes_max = m->period_bytes_max; in snd_dummy_probe()
1096 if (m->periods_min) in snd_dummy_probe()
1097 dummy->pcm_hw.periods_min = m->periods_min; in snd_dummy_probe()
1098 if (m->periods_max) in snd_dummy_probe()
1099 dummy->pcm_hw.periods_max = m->periods_max; in snd_dummy_probe()
1100 if (m->rates) in snd_dummy_probe()
1101 dummy->pcm_hw.rates = m->rates; in snd_dummy_probe()
1102 if (m->rate_min) in snd_dummy_probe()
1103 dummy->pcm_hw.rate_min = m->rate_min; in snd_dummy_probe()
1104 if (m->rate_max) in snd_dummy_probe()
1105 dummy->pcm_hw.rate_max = m->rate_max; in snd_dummy_probe()
1106 if (m->channels_min) in snd_dummy_probe()
1107 dummy->pcm_hw.channels_min = m->channels_min; in snd_dummy_probe()
1108 if (m->channels_max) in snd_dummy_probe()
1109 dummy->pcm_hw.channels_max = m->channels_max; in snd_dummy_probe()
1115 strcpy(card->driver, "Dummy"); in snd_dummy_probe()
1116 strcpy(card->shortname, "Dummy"); in snd_dummy_probe()
1117 sprintf(card->longname, "Dummy %i", dev + 1); in snd_dummy_probe()
1141 struct snd_dummy *dummy = card->private_data; in snd_dummy_suspend()
1144 snd_pcm_suspend_all(dummy->pcm); in snd_dummy_suspend()
1218 return -ENODEV; in alsa_card_dummy_init()