Lines Matching refs:dpcm
128 static inline unsigned int byte_pos(struct loopback_pcm *dpcm, unsigned int x) in byte_pos() argument
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()
139 static inline unsigned int frac_pos(struct loopback_pcm *dpcm, unsigned int x) in frac_pos() argument
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()
150 static inline struct loopback_setup *get_setup(struct loopback_pcm *dpcm) in get_setup() argument
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()
159 static inline unsigned int get_notify(struct loopback_pcm *dpcm) in get_notify() argument
161 return get_setup(dpcm)->notify; in get_notify()
164 static inline unsigned int get_rate_shift(struct loopback_pcm *dpcm) in get_rate_shift() argument
166 return get_setup(dpcm)->rate_shift; in get_rate_shift()
170 static void loopback_timer_start(struct loopback_pcm *dpcm) in loopback_timer_start() argument
173 unsigned int rate_shift = get_rate_shift(dpcm); in loopback_timer_start()
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 dpcm->timer.expires = jiffies + tick; in loopback_timer_start()
186 add_timer(&dpcm->timer); in loopback_timer_start()
190 static inline void loopback_timer_stop(struct loopback_pcm *dpcm) in loopback_timer_stop() argument
192 del_timer(&dpcm->timer); in loopback_timer_stop()
193 dpcm->timer.expires = 0; in loopback_timer_stop()
250 static void loopback_active_notify(struct loopback_pcm *dpcm) in loopback_active_notify() argument
252 snd_ctl_notify(dpcm->loopback->card, in loopback_active_notify()
254 &get_setup(dpcm)->active_id); in loopback_active_notify()
260 struct loopback_pcm *dpcm = runtime->private_data; in loopback_trigger() local
261 struct loopback_cable *cable = dpcm->cable; in loopback_trigger()
269 dpcm->last_jiffies = jiffies; in loopback_trigger()
270 dpcm->pcm_rate_shift = 0; in loopback_trigger()
271 dpcm->last_drift = 0; in loopback_trigger()
275 loopback_timer_start(dpcm); in loopback_trigger()
278 loopback_active_notify(dpcm); in loopback_trigger()
284 loopback_timer_stop(dpcm); in loopback_trigger()
287 loopback_active_notify(dpcm); in loopback_trigger()
293 loopback_timer_stop(dpcm); in loopback_trigger()
299 dpcm->last_jiffies = jiffies; in loopback_trigger()
301 loopback_timer_start(dpcm); in loopback_trigger()
313 struct loopback_pcm *dpcm = runtime->private_data; in params_change() local
314 struct loopback_cable *cable = dpcm->cable; in params_change()
326 struct loopback_pcm *dpcm = runtime->private_data; in loopback_prepare() local
327 struct loopback_cable *cable = dpcm->cable; in loopback_prepare()
336 dpcm->buf_pos = 0; in loopback_prepare()
337 dpcm->pcm_buffer_size = frames_to_bytes(runtime, runtime->buffer_size); in loopback_prepare()
340 dpcm->silent_size = dpcm->pcm_buffer_size; in loopback_prepare()
345 dpcm->irq_pos = 0; in loopback_prepare()
346 dpcm->period_update_pending = 0; in loopback_prepare()
347 dpcm->pcm_bps = bps; in loopback_prepare()
348 dpcm->pcm_salign = salign; in loopback_prepare()
349 dpcm->pcm_period_size = frames_to_bytes(runtime, runtime->period_size); in loopback_prepare()
351 mutex_lock(&dpcm->loopback->cable_lock); in loopback_prepare()
353 (get_setup(dpcm)->notify && in loopback_prepare()
357 mutex_unlock(&dpcm->loopback->cable_lock); in loopback_prepare()
362 static void clear_capture_buf(struct loopback_pcm *dpcm, unsigned int bytes) in clear_capture_buf() argument
364 struct snd_pcm_runtime *runtime = dpcm->substream->runtime; in clear_capture_buf()
366 unsigned int dst_off = dpcm->buf_pos; in clear_capture_buf()
368 if (dpcm->silent_size >= dpcm->pcm_buffer_size) in clear_capture_buf()
370 if (dpcm->silent_size + bytes > dpcm->pcm_buffer_size) in clear_capture_buf()
371 bytes = dpcm->pcm_buffer_size - dpcm->silent_size; in clear_capture_buf()
375 if (dst_off + size > dpcm->pcm_buffer_size) in clear_capture_buf()
376 size = dpcm->pcm_buffer_size - dst_off; in clear_capture_buf()
380 dpcm->silent_size += size; in clear_capture_buf()
437 static inline unsigned int bytepos_delta(struct loopback_pcm *dpcm, in bytepos_delta() argument
443 last_pos = byte_pos(dpcm, dpcm->irq_pos); in bytepos_delta()
444 dpcm->irq_pos += jiffies_delta * dpcm->pcm_bps; in bytepos_delta()
445 delta = byte_pos(dpcm, dpcm->irq_pos) - last_pos; in bytepos_delta()
446 if (delta >= dpcm->last_drift) in bytepos_delta()
447 delta -= dpcm->last_drift; in bytepos_delta()
448 dpcm->last_drift = 0; in bytepos_delta()
449 if (dpcm->irq_pos >= dpcm->period_size_frac) { in bytepos_delta()
450 dpcm->irq_pos %= dpcm->period_size_frac; in bytepos_delta()
451 dpcm->period_update_pending = 1; in bytepos_delta()
456 static inline void bytepos_finish(struct loopback_pcm *dpcm, in bytepos_finish() argument
459 dpcm->buf_pos += delta; in bytepos_finish()
460 dpcm->buf_pos %= dpcm->pcm_buffer_size; in bytepos_finish()
519 struct loopback_pcm *dpcm = (struct loopback_pcm *)data; in loopback_timer_function() local
522 spin_lock_irqsave(&dpcm->cable->lock, flags); in loopback_timer_function()
523 if (loopback_pos_update(dpcm->cable) & (1 << dpcm->substream->stream)) { in loopback_timer_function()
524 loopback_timer_start(dpcm); in loopback_timer_function()
525 if (dpcm->period_update_pending) { in loopback_timer_function()
526 dpcm->period_update_pending = 0; in loopback_timer_function()
527 spin_unlock_irqrestore(&dpcm->cable->lock, flags); in loopback_timer_function()
529 snd_pcm_period_elapsed(dpcm->substream); in loopback_timer_function()
533 spin_unlock_irqrestore(&dpcm->cable->lock, flags); in loopback_timer_function()
539 struct loopback_pcm *dpcm = runtime->private_data; in loopback_pointer() local
542 spin_lock(&dpcm->cable->lock); in loopback_pointer()
543 loopback_pos_update(dpcm->cable); in loopback_pointer()
544 pos = dpcm->buf_pos; in loopback_pointer()
545 spin_unlock(&dpcm->cable->lock); in loopback_pointer()
574 struct loopback_pcm *dpcm = runtime->private_data; in loopback_runtime_free() local
575 kfree(dpcm); in loopback_runtime_free()
588 struct loopback_pcm *dpcm = runtime->private_data; in loopback_hw_free() local
589 struct loopback_cable *cable = dpcm->cable; in loopback_hw_free()
591 mutex_lock(&dpcm->loopback->cable_lock); in loopback_hw_free()
593 mutex_unlock(&dpcm->loopback->cable_lock); in loopback_hw_free()
608 struct loopback_pcm *dpcm = rule->private; in rule_format() local
609 struct loopback_cable *cable = dpcm->cable; in rule_format()
613 mutex_lock(&dpcm->loopback->cable_lock); in rule_format()
616 mutex_unlock(&dpcm->loopback->cable_lock); in rule_format()
623 struct loopback_pcm *dpcm = rule->private; in rule_rate() local
624 struct loopback_cable *cable = dpcm->cable; in rule_rate()
627 mutex_lock(&dpcm->loopback->cable_lock); in rule_rate()
630 mutex_unlock(&dpcm->loopback->cable_lock); in rule_rate()
639 struct loopback_pcm *dpcm = rule->private; in rule_channels() local
640 struct loopback_cable *cable = dpcm->cable; in rule_channels()
643 mutex_lock(&dpcm->loopback->cable_lock); in rule_channels()
646 mutex_unlock(&dpcm->loopback->cable_lock); in rule_channels()
675 struct loopback_pcm *dpcm; in loopback_open() local
681 dpcm = kzalloc(sizeof(*dpcm), GFP_KERNEL); in loopback_open()
682 if (!dpcm) { in loopback_open()
686 dpcm->loopback = loopback; in loopback_open()
687 dpcm->substream = substream; in loopback_open()
688 setup_timer(&dpcm->timer, loopback_timer_function, in loopback_open()
689 (unsigned long)dpcm); in loopback_open()
702 dpcm->cable = cable; in loopback_open()
703 cable->streams[substream->stream] = dpcm; in loopback_open()
712 rule_format, dpcm, in loopback_open()
718 rule_rate, dpcm, in loopback_open()
724 rule_channels, dpcm, in loopback_open()
729 runtime->private_data = dpcm; in loopback_open()
731 if (get_notify(dpcm)) in loopback_open()
738 kfree(dpcm); in loopback_open()
747 struct loopback_pcm *dpcm = substream->runtime->private_data; in loopback_close() local
749 loopback_timer_stop(dpcm); in loopback_close()
1062 struct loopback_pcm *dpcm, in print_dpcm_info() argument
1066 if (dpcm == NULL) { in print_dpcm_info()
1070 snd_iprintf(buffer, " buffer_size:\t%u\n", dpcm->pcm_buffer_size); in print_dpcm_info()
1071 snd_iprintf(buffer, " buffer_pos:\t\t%u\n", dpcm->buf_pos); in print_dpcm_info()
1072 snd_iprintf(buffer, " silent_size:\t%u\n", dpcm->silent_size); in print_dpcm_info()
1073 snd_iprintf(buffer, " period_size:\t%u\n", dpcm->pcm_period_size); in print_dpcm_info()
1074 snd_iprintf(buffer, " bytes_per_sec:\t%u\n", dpcm->pcm_bps); in print_dpcm_info()
1075 snd_iprintf(buffer, " sample_align:\t%u\n", dpcm->pcm_salign); in print_dpcm_info()
1076 snd_iprintf(buffer, " rate_shift:\t\t%u\n", dpcm->pcm_rate_shift); in print_dpcm_info()
1078 dpcm->period_update_pending); in print_dpcm_info()
1079 snd_iprintf(buffer, " irq_pos:\t\t%u\n", dpcm->irq_pos); in print_dpcm_info()
1080 snd_iprintf(buffer, " period_frac:\t%u\n", dpcm->period_size_frac); in print_dpcm_info()
1082 dpcm->last_jiffies, jiffies); in print_dpcm_info()
1083 snd_iprintf(buffer, " timer_expires:\t%lu\n", dpcm->timer.expires); in print_dpcm_info()