Lines Matching full:dpcm
73 int (*open)(struct loopback_pcm *dpcm);
77 int (*start)(struct loopback_pcm *dpcm);
81 int (*stop)(struct loopback_pcm *dpcm);
83 int (*stop_sync)(struct loopback_pcm *dpcm);
85 int (*close_substream)(struct loopback_pcm *dpcm);
89 int (*close_cable)(struct loopback_pcm *dpcm);
95 void (*dpcm_info)(struct loopback_pcm *dpcm,
171 static inline unsigned int byte_pos(struct loopback_pcm *dpcm, unsigned int x)
173 if (dpcm->pcm_rate_shift == NO_PITCH) {
177 HZ * (unsigned long long)dpcm->pcm_rate_shift);
179 return x - (x % dpcm->pcm_salign);
182 static inline unsigned int frac_pos(struct loopback_pcm *dpcm, unsigned int x)
184 if (dpcm->pcm_rate_shift == NO_PITCH) { /* no pitch */
187 x = div_u64(dpcm->pcm_rate_shift * (unsigned long long)x * HZ,
193 static inline struct loopback_setup *get_setup(struct loopback_pcm *dpcm)
195 int device = dpcm->substream->pstr->pcm->device;
197 if (dpcm->substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
199 return &dpcm->loopback->setup[dpcm->substream->number][device];
202 static inline unsigned int get_notify(struct loopback_pcm *dpcm)
204 return get_setup(dpcm)->notify;
207 static inline unsigned int get_rate_shift(struct loopback_pcm *dpcm)
209 return get_setup(dpcm)->rate_shift;
213 static int loopback_jiffies_timer_start(struct loopback_pcm *dpcm)
216 unsigned int rate_shift = get_rate_shift(dpcm);
218 if (rate_shift != dpcm->pcm_rate_shift) {
219 dpcm->pcm_rate_shift = rate_shift;
220 dpcm->period_size_frac = frac_pos(dpcm, dpcm->pcm_period_size);
222 if (dpcm->period_size_frac <= dpcm->irq_pos) {
223 dpcm->irq_pos %= dpcm->period_size_frac;
224 dpcm->period_update_pending = 1;
226 tick = dpcm->period_size_frac - dpcm->irq_pos;
227 tick = DIV_ROUND_UP(tick, dpcm->pcm_bps);
228 mod_timer(&dpcm->timer, jiffies + tick);
234 static int loopback_snd_timer_start(struct loopback_pcm *dpcm)
236 struct loopback_cable *cable = dpcm->cable;
251 pcm_err(dpcm->substream->pcm,
263 static inline int loopback_jiffies_timer_stop(struct loopback_pcm *dpcm)
265 timer_delete(&dpcm->timer);
266 dpcm->timer.expires = 0;
272 static int loopback_snd_timer_stop(struct loopback_pcm *dpcm)
274 struct loopback_cable *cable = dpcm->cable;
283 pcm_err(dpcm->substream->pcm,
294 static inline int loopback_jiffies_timer_stop_sync(struct loopback_pcm *dpcm)
296 timer_delete_sync(&dpcm->timer);
302 static int loopback_snd_timer_close_cable(struct loopback_pcm *dpcm)
304 struct loopback_cable *cable = dpcm->cable;
395 static void loopback_active_notify(struct loopback_pcm *dpcm)
397 snd_ctl_notify(dpcm->loopback->card,
399 &get_setup(dpcm)->active_id);
405 struct loopback_pcm *dpcm = runtime->private_data;
406 struct loopback_cable *cable = dpcm->cable;
414 dpcm->last_jiffies = jiffies;
415 dpcm->pcm_rate_shift = 0;
416 dpcm->last_drift = 0;
420 err = cable->ops->start(dpcm);
423 loopback_active_notify(dpcm);
429 err = cable->ops->stop(dpcm);
432 loopback_active_notify(dpcm);
438 err = cable->ops->stop(dpcm);
441 loopback_active_notify(dpcm);
446 dpcm->last_jiffies = jiffies;
448 err = cable->ops->start(dpcm);
451 loopback_active_notify(dpcm);
462 struct loopback_pcm *dpcm = runtime->private_data;
463 struct loopback_cable *cable = dpcm->cable;
482 struct loopback_pcm *dpcm = runtime->private_data;
483 struct loopback_cable *cable = dpcm->cable;
487 err = cable->ops->stop_sync(dpcm);
498 dpcm->buf_pos = 0;
499 dpcm->pcm_buffer_size = frames_to_bytes(runtime, runtime->buffer_size);
500 dpcm->channel_buf_n = dpcm->pcm_buffer_size / runtime->channels;
503 dpcm->silent_size = dpcm->pcm_buffer_size;
508 dpcm->irq_pos = 0;
509 dpcm->period_update_pending = 0;
510 dpcm->pcm_bps = bps;
511 dpcm->pcm_salign = salign;
512 dpcm->pcm_period_size = frames_to_bytes(runtime, runtime->period_size);
514 guard(mutex)(&dpcm->loopback->cable_lock);
516 (get_setup(dpcm)->notify &&
524 static void clear_capture_buf(struct loopback_pcm *dpcm, unsigned int bytes)
526 struct snd_pcm_runtime *runtime = dpcm->substream->runtime;
528 unsigned int dst_off = dpcm->buf_pos;
530 if (dpcm->silent_size >= dpcm->pcm_buffer_size)
532 if (dpcm->silent_size + bytes > dpcm->pcm_buffer_size)
533 bytes = dpcm->pcm_buffer_size - dpcm->silent_size;
537 if (dst_off + size > dpcm->pcm_buffer_size)
538 size = dpcm->pcm_buffer_size - dst_off;
542 dpcm->silent_size += size;
618 static inline unsigned int bytepos_delta(struct loopback_pcm *dpcm,
624 last_pos = byte_pos(dpcm, dpcm->irq_pos);
625 dpcm->irq_pos += jiffies_delta * dpcm->pcm_bps;
626 delta = byte_pos(dpcm, dpcm->irq_pos) - last_pos;
627 if (delta >= dpcm->last_drift)
628 delta -= dpcm->last_drift;
629 dpcm->last_drift = 0;
630 if (dpcm->irq_pos >= dpcm->period_size_frac) {
631 dpcm->irq_pos %= dpcm->period_size_frac;
632 dpcm->period_update_pending = 1;
637 static inline void bytepos_finish(struct loopback_pcm *dpcm,
640 dpcm->buf_pos += delta;
641 dpcm->buf_pos %= dpcm->pcm_buffer_size;
702 struct loopback_pcm *dpcm = timer_container_of(dpcm, t, timer);
705 scoped_guard(spinlock_irqsave, &dpcm->cable->lock) {
706 if (loopback_jiffies_timer_pos_update(dpcm->cable) &
707 (1 << dpcm->substream->stream)) {
708 loopback_jiffies_timer_start(dpcm);
709 if (dpcm->period_update_pending) {
710 dpcm->period_update_pending = 0;
718 snd_pcm_period_elapsed(dpcm->substream);
726 struct loopback_pcm *dpcm = runtime->private_data;
727 struct loopback_cable *cable = dpcm->cable;
743 pcm_err(dpcm->substream->pcm,
882 static void loopback_jiffies_timer_dpcm_info(struct loopback_pcm *dpcm,
886 dpcm->period_update_pending);
887 snd_iprintf(buffer, " irq_pos:\t\t%u\n", dpcm->irq_pos);
888 snd_iprintf(buffer, " period_frac:\t%u\n", dpcm->period_size_frac);
890 dpcm->last_jiffies, jiffies);
891 snd_iprintf(buffer, " timer_expires:\t%lu\n", dpcm->timer.expires);
894 static void loopback_snd_timer_dpcm_info(struct loopback_pcm *dpcm,
897 struct loopback_cable *cable = dpcm->cable;
910 struct loopback_pcm *dpcm = runtime->private_data;
913 guard(spinlock)(&dpcm->cable->lock);
914 if (dpcm->cable->ops->pos_update)
915 dpcm->cable->ops->pos_update(dpcm->cable);
916 pos = dpcm->buf_pos;
950 struct loopback_pcm *dpcm = runtime->private_data;
951 kfree(dpcm);
957 struct loopback_pcm *dpcm = runtime->private_data;
958 struct loopback_cable *cable = dpcm->cable;
960 guard(mutex)(&dpcm->loopback->cable_lock);
976 struct loopback_pcm *dpcm = rule->private;
977 struct loopback_cable *cable = dpcm->cable;
981 scoped_guard(mutex, &dpcm->loopback->cable_lock) {
991 struct loopback_pcm *dpcm = rule->private;
992 struct loopback_cable *cable = dpcm->cable;
995 scoped_guard(mutex, &dpcm->loopback->cable_lock) {
1007 struct loopback_pcm *dpcm = rule->private;
1008 struct loopback_cable *cable = dpcm->cable;
1011 scoped_guard(mutex, &dpcm->loopback->cable_lock) {
1023 struct loopback_pcm *dpcm = rule->private;
1024 struct loopback_cable *cable = dpcm->cable;
1027 scoped_guard(mutex, &dpcm->loopback->cable_lock) {
1051 struct loopback_pcm *dpcm = substream->runtime->private_data;
1053 if (cable->ops && cable->ops->close_cable && dpcm)
1054 cable->ops->close_cable(dpcm);
1061 static int loopback_jiffies_timer_open(struct loopback_pcm *dpcm)
1063 timer_setup(&dpcm->timer, loopback_jiffies_timer_function, 0);
1141 static int loopback_snd_timer_open(struct loopback_pcm *dpcm)
1149 struct loopback_cable *cable = dpcm->cable;
1157 err = loopback_parse_timer_id(dpcm->loopback->timer_source, &tid);
1159 pcm_err(dpcm->substream->pcm,
1161 dpcm->loopback->timer_source, err);
1165 cable->snd_timer.stream = dpcm->substream->stream;
1168 timeri = snd_timer_instance_new(dpcm->loopback->card->id);
1202 pcm_err(dpcm->substream->pcm,
1233 struct loopback_pcm *dpcm;
1239 dpcm = kzalloc(sizeof(*dpcm), GFP_KERNEL);
1240 if (!dpcm)
1242 dpcm->loopback = loopback;
1243 dpcm->substream = substream;
1260 dpcm->cable = cable;
1261 runtime->private_data = dpcm;
1264 err = cable->ops->open(dpcm);
1276 rule_format, dpcm,
1282 rule_rate, dpcm,
1288 rule_channels, dpcm,
1300 rule_period_bytes, dpcm,
1306 /* loopback_runtime_free() has not to be called if kfree(dpcm) was
1310 if (get_notify(dpcm))
1316 cable->streams[substream->stream] = dpcm;
1322 kfree(dpcm);
1330 struct loopback_pcm *dpcm = substream->runtime->private_data;
1333 if (dpcm->cable->ops->close_substream)
1334 err = dpcm->cable->ops->close_substream(dpcm);
1675 struct loopback_pcm *dpcm,
1679 if (dpcm == NULL) {
1683 snd_iprintf(buffer, " buffer_size:\t%u\n", dpcm->pcm_buffer_size);
1684 snd_iprintf(buffer, " buffer_pos:\t\t%u\n", dpcm->buf_pos);
1685 snd_iprintf(buffer, " silent_size:\t%u\n", dpcm->silent_size);
1686 snd_iprintf(buffer, " period_size:\t%u\n", dpcm->pcm_period_size);
1687 snd_iprintf(buffer, " bytes_per_sec:\t%u\n", dpcm->pcm_bps);
1688 snd_iprintf(buffer, " sample_align:\t%u\n", dpcm->pcm_salign);
1689 snd_iprintf(buffer, " rate_shift:\t\t%u\n", dpcm->pcm_rate_shift);
1690 if (dpcm->cable->ops->dpcm_info)
1691 dpcm->cable->ops->dpcm_info(dpcm, buffer);