Lines Matching refs: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,
166 static inline unsigned int byte_pos(struct loopback_pcm *dpcm, unsigned int x)
168 if (dpcm->pcm_rate_shift == NO_PITCH) {
172 HZ * (unsigned long long)dpcm->pcm_rate_shift);
174 return x - (x % dpcm->pcm_salign);
177 static inline unsigned int frac_pos(struct loopback_pcm *dpcm, unsigned int x)
179 if (dpcm->pcm_rate_shift == NO_PITCH) { /* no pitch */
182 x = div_u64(dpcm->pcm_rate_shift * (unsigned long long)x * HZ,
188 static inline struct loopback_setup *get_setup(struct loopback_pcm *dpcm)
190 int device = dpcm->substream->pstr->pcm->device;
192 if (dpcm->substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
194 return &dpcm->loopback->setup[dpcm->substream->number][device];
197 static inline unsigned int get_notify(struct loopback_pcm *dpcm)
199 return get_setup(dpcm)->notify;
202 static inline unsigned int get_rate_shift(struct loopback_pcm *dpcm)
204 return get_setup(dpcm)->rate_shift;
208 static int loopback_jiffies_timer_start(struct loopback_pcm *dpcm)
211 unsigned int rate_shift = get_rate_shift(dpcm);
213 if (rate_shift != dpcm->pcm_rate_shift) {
214 dpcm->pcm_rate_shift = rate_shift;
215 dpcm->period_size_frac = frac_pos(dpcm, dpcm->pcm_period_size);
217 if (dpcm->period_size_frac <= dpcm->irq_pos) {
218 dpcm->irq_pos %= dpcm->period_size_frac;
219 dpcm->period_update_pending = 1;
221 tick = dpcm->period_size_frac - dpcm->irq_pos;
222 tick = (tick + dpcm->pcm_bps - 1) / dpcm->pcm_bps;
223 mod_timer(&dpcm->timer, jiffies + tick);
229 static int loopback_snd_timer_start(struct loopback_pcm *dpcm)
231 struct loopback_cable *cable = dpcm->cable;
246 pcm_err(dpcm->substream->pcm,
258 static inline int loopback_jiffies_timer_stop(struct loopback_pcm *dpcm)
260 del_timer(&dpcm->timer);
261 dpcm->timer.expires = 0;
267 static int loopback_snd_timer_stop(struct loopback_pcm *dpcm)
269 struct loopback_cable *cable = dpcm->cable;
278 pcm_err(dpcm->substream->pcm,
289 static inline int loopback_jiffies_timer_stop_sync(struct loopback_pcm *dpcm)
291 del_timer_sync(&dpcm->timer);
297 static int loopback_snd_timer_close_cable(struct loopback_pcm *dpcm)
299 struct loopback_cable *cable = dpcm->cable;
371 static void loopback_active_notify(struct loopback_pcm *dpcm)
373 snd_ctl_notify(dpcm->loopback->card,
375 &get_setup(dpcm)->active_id);
381 struct loopback_pcm *dpcm = runtime->private_data;
382 struct loopback_cable *cable = dpcm->cable;
390 dpcm->last_jiffies = jiffies;
391 dpcm->pcm_rate_shift = 0;
392 dpcm->last_drift = 0;
396 err = cable->ops->start(dpcm);
399 loopback_active_notify(dpcm);
405 err = cable->ops->stop(dpcm);
408 loopback_active_notify(dpcm);
414 err = cable->ops->stop(dpcm);
417 loopback_active_notify(dpcm);
422 dpcm->last_jiffies = jiffies;
424 err = cable->ops->start(dpcm);
427 loopback_active_notify(dpcm);
438 struct loopback_pcm *dpcm = runtime->private_data;
439 struct loopback_cable *cable = dpcm->cable;
458 struct loopback_pcm *dpcm = runtime->private_data;
459 struct loopback_cable *cable = dpcm->cable;
463 err = cable->ops->stop_sync(dpcm);
474 dpcm->buf_pos = 0;
475 dpcm->pcm_buffer_size = frames_to_bytes(runtime, runtime->buffer_size);
478 dpcm->silent_size = dpcm->pcm_buffer_size;
483 dpcm->irq_pos = 0;
484 dpcm->period_update_pending = 0;
485 dpcm->pcm_bps = bps;
486 dpcm->pcm_salign = salign;
487 dpcm->pcm_period_size = frames_to_bytes(runtime, runtime->period_size);
489 mutex_lock(&dpcm->loopback->cable_lock);
491 (get_setup(dpcm)->notify &&
495 mutex_unlock(&dpcm->loopback->cable_lock);
500 static void clear_capture_buf(struct loopback_pcm *dpcm, unsigned int bytes)
502 struct snd_pcm_runtime *runtime = dpcm->substream->runtime;
504 unsigned int dst_off = dpcm->buf_pos;
506 if (dpcm->silent_size >= dpcm->pcm_buffer_size)
508 if (dpcm->silent_size + bytes > dpcm->pcm_buffer_size)
509 bytes = dpcm->pcm_buffer_size - dpcm->silent_size;
513 if (dst_off + size > dpcm->pcm_buffer_size)
514 size = dpcm->pcm_buffer_size - dst_off;
518 dpcm->silent_size += size;
575 static inline unsigned int bytepos_delta(struct loopback_pcm *dpcm,
581 last_pos = byte_pos(dpcm, dpcm->irq_pos);
582 dpcm->irq_pos += jiffies_delta * dpcm->pcm_bps;
583 delta = byte_pos(dpcm, dpcm->irq_pos) - last_pos;
584 if (delta >= dpcm->last_drift)
585 delta -= dpcm->last_drift;
586 dpcm->last_drift = 0;
587 if (dpcm->irq_pos >= dpcm->period_size_frac) {
588 dpcm->irq_pos %= dpcm->period_size_frac;
589 dpcm->period_update_pending = 1;
594 static inline void bytepos_finish(struct loopback_pcm *dpcm,
597 dpcm->buf_pos += delta;
598 dpcm->buf_pos %= dpcm->pcm_buffer_size;
659 struct loopback_pcm *dpcm = from_timer(dpcm, t, timer);
662 spin_lock_irqsave(&dpcm->cable->lock, flags);
663 if (loopback_jiffies_timer_pos_update(dpcm->cable) &
664 (1 << dpcm->substream->stream)) {
665 loopback_jiffies_timer_start(dpcm);
666 if (dpcm->period_update_pending) {
667 dpcm->period_update_pending = 0;
668 spin_unlock_irqrestore(&dpcm->cable->lock, flags);
670 snd_pcm_period_elapsed(dpcm->substream);
674 spin_unlock_irqrestore(&dpcm->cable->lock, flags);
682 struct loopback_pcm *dpcm = runtime->private_data;
683 struct loopback_cable *cable = dpcm->cable;
699 pcm_err(dpcm->substream->pcm,
838 static void loopback_jiffies_timer_dpcm_info(struct loopback_pcm *dpcm,
842 dpcm->period_update_pending);
843 snd_iprintf(buffer, " irq_pos:\t\t%u\n", dpcm->irq_pos);
844 snd_iprintf(buffer, " period_frac:\t%u\n", dpcm->period_size_frac);
846 dpcm->last_jiffies, jiffies);
847 snd_iprintf(buffer, " timer_expires:\t%lu\n", dpcm->timer.expires);
850 static void loopback_snd_timer_dpcm_info(struct loopback_pcm *dpcm,
853 struct loopback_cable *cable = dpcm->cable;
867 struct loopback_pcm *dpcm = runtime->private_data;
870 spin_lock(&dpcm->cable->lock);
871 if (dpcm->cable->ops->pos_update)
872 dpcm->cable->ops->pos_update(dpcm->cable);
873 pos = dpcm->buf_pos;
874 spin_unlock(&dpcm->cable->lock);
905 struct loopback_pcm *dpcm = runtime->private_data;
906 kfree(dpcm);
912 struct loopback_pcm *dpcm = runtime->private_data;
913 struct loopback_cable *cable = dpcm->cable;
915 mutex_lock(&dpcm->loopback->cable_lock);
917 mutex_unlock(&dpcm->loopback->cable_lock);
932 struct loopback_pcm *dpcm = rule->private;
933 struct loopback_cable *cable = dpcm->cable;
937 mutex_lock(&dpcm->loopback->cable_lock);
940 mutex_unlock(&dpcm->loopback->cable_lock);
947 struct loopback_pcm *dpcm = rule->private;
948 struct loopback_cable *cable = dpcm->cable;
951 mutex_lock(&dpcm->loopback->cable_lock);
954 mutex_unlock(&dpcm->loopback->cable_lock);
963 struct loopback_pcm *dpcm = rule->private;
964 struct loopback_cable *cable = dpcm->cable;
967 mutex_lock(&dpcm->loopback->cable_lock);
970 mutex_unlock(&dpcm->loopback->cable_lock);
979 struct loopback_pcm *dpcm = rule->private;
980 struct loopback_cable *cable = dpcm->cable;
983 mutex_lock(&dpcm->loopback->cable_lock);
986 mutex_unlock(&dpcm->loopback->cable_lock);
1008 struct loopback_pcm *dpcm = substream->runtime->private_data;
1010 if (cable->ops && cable->ops->close_cable && dpcm)
1011 cable->ops->close_cable(dpcm);
1018 static int loopback_jiffies_timer_open(struct loopback_pcm *dpcm)
1020 timer_setup(&dpcm->timer, loopback_jiffies_timer_function, 0);
1096 static int loopback_snd_timer_open(struct loopback_pcm *dpcm)
1104 struct loopback_cable *cable = dpcm->cable;
1112 err = loopback_parse_timer_id(dpcm->loopback->timer_source, &tid);
1114 pcm_err(dpcm->substream->pcm,
1116 dpcm->loopback->timer_source, err);
1120 cable->snd_timer.stream = dpcm->substream->stream;
1123 timeri = snd_timer_instance_new(dpcm->loopback->card->id);
1157 pcm_err(dpcm->substream->pcm,
1188 struct loopback_pcm *dpcm;
1194 dpcm = kzalloc(sizeof(*dpcm), GFP_KERNEL);
1195 if (!dpcm) {
1199 dpcm->loopback = loopback;
1200 dpcm->substream = substream;
1217 dpcm->cable = cable;
1218 runtime->private_data = dpcm;
1221 err = cable->ops->open(dpcm);
1233 rule_format, dpcm,
1239 rule_rate, dpcm,
1245 rule_channels, dpcm,
1257 rule_period_bytes, dpcm,
1263 /* loopback_runtime_free() has not to be called if kfree(dpcm) was
1267 if (get_notify(dpcm))
1273 cable->streams[substream->stream] = dpcm;
1279 kfree(dpcm);
1288 struct loopback_pcm *dpcm = substream->runtime->private_data;
1291 if (dpcm->cable->ops->close_substream)
1292 err = dpcm->cable->ops->close_substream(dpcm);
1607 struct loopback_pcm *dpcm,
1611 if (dpcm == NULL) {
1615 snd_iprintf(buffer, " buffer_size:\t%u\n", dpcm->pcm_buffer_size);
1616 snd_iprintf(buffer, " buffer_pos:\t\t%u\n", dpcm->buf_pos);
1617 snd_iprintf(buffer, " silent_size:\t%u\n", dpcm->silent_size);
1618 snd_iprintf(buffer, " period_size:\t%u\n", dpcm->pcm_period_size);
1619 snd_iprintf(buffer, " bytes_per_sec:\t%u\n", dpcm->pcm_bps);
1620 snd_iprintf(buffer, " sample_align:\t%u\n", dpcm->pcm_salign);
1621 snd_iprintf(buffer, " rate_shift:\t\t%u\n", dpcm->pcm_rate_shift);
1622 if (dpcm->cable->ops->dpcm_info)
1623 dpcm->cable->ops->dpcm_info(dpcm, buffer);