Lines Matching refs:dpcm
72 int (*open)(struct loopback_pcm *dpcm);
76 int (*start)(struct loopback_pcm *dpcm);
80 int (*stop)(struct loopback_pcm *dpcm);
82 int (*stop_sync)(struct loopback_pcm *dpcm);
84 int (*close_substream)(struct loopback_pcm *dpcm);
88 int (*close_cable)(struct loopback_pcm *dpcm);
94 void (*dpcm_info)(struct loopback_pcm *dpcm,
165 static inline unsigned int byte_pos(struct loopback_pcm *dpcm, unsigned int x)
167 if (dpcm->pcm_rate_shift == NO_PITCH) {
171 HZ * (unsigned long long)dpcm->pcm_rate_shift);
173 return x - (x % dpcm->pcm_salign);
176 static inline unsigned int frac_pos(struct loopback_pcm *dpcm, unsigned int x)
178 if (dpcm->pcm_rate_shift == NO_PITCH) { /* no pitch */
181 x = div_u64(dpcm->pcm_rate_shift * (unsigned long long)x * HZ,
187 static inline struct loopback_setup *get_setup(struct loopback_pcm *dpcm)
189 int device = dpcm->substream->pstr->pcm->device;
191 if (dpcm->substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
193 return &dpcm->loopback->setup[dpcm->substream->number][device];
196 static inline unsigned int get_notify(struct loopback_pcm *dpcm)
198 return get_setup(dpcm)->notify;
201 static inline unsigned int get_rate_shift(struct loopback_pcm *dpcm)
203 return get_setup(dpcm)->rate_shift;
207 static int loopback_jiffies_timer_start(struct loopback_pcm *dpcm)
210 unsigned int rate_shift = get_rate_shift(dpcm);
212 if (rate_shift != dpcm->pcm_rate_shift) {
213 dpcm->pcm_rate_shift = rate_shift;
214 dpcm->period_size_frac = frac_pos(dpcm, dpcm->pcm_period_size);
216 if (dpcm->period_size_frac <= dpcm->irq_pos) {
217 dpcm->irq_pos %= dpcm->period_size_frac;
218 dpcm->period_update_pending = 1;
220 tick = dpcm->period_size_frac - dpcm->irq_pos;
221 tick = DIV_ROUND_UP(tick, dpcm->pcm_bps);
222 mod_timer(&dpcm->timer, jiffies + tick);
228 static int loopback_snd_timer_start(struct loopback_pcm *dpcm)
230 struct loopback_cable *cable = dpcm->cable;
245 pcm_err(dpcm->substream->pcm,
257 static inline int loopback_jiffies_timer_stop(struct loopback_pcm *dpcm)
259 del_timer(&dpcm->timer);
260 dpcm->timer.expires = 0;
266 static int loopback_snd_timer_stop(struct loopback_pcm *dpcm)
268 struct loopback_cable *cable = dpcm->cable;
277 pcm_err(dpcm->substream->pcm,
288 static inline int loopback_jiffies_timer_stop_sync(struct loopback_pcm *dpcm)
290 del_timer_sync(&dpcm->timer);
296 static int loopback_snd_timer_close_cable(struct loopback_pcm *dpcm)
298 struct loopback_cable *cable = dpcm->cable;
370 static void loopback_active_notify(struct loopback_pcm *dpcm)
372 snd_ctl_notify(dpcm->loopback->card,
374 &get_setup(dpcm)->active_id);
380 struct loopback_pcm *dpcm = runtime->private_data;
381 struct loopback_cable *cable = dpcm->cable;
389 dpcm->last_jiffies = jiffies;
390 dpcm->pcm_rate_shift = 0;
391 dpcm->last_drift = 0;
395 err = cable->ops->start(dpcm);
398 loopback_active_notify(dpcm);
404 err = cable->ops->stop(dpcm);
407 loopback_active_notify(dpcm);
413 err = cable->ops->stop(dpcm);
416 loopback_active_notify(dpcm);
421 dpcm->last_jiffies = jiffies;
423 err = cable->ops->start(dpcm);
426 loopback_active_notify(dpcm);
437 struct loopback_pcm *dpcm = runtime->private_data;
438 struct loopback_cable *cable = dpcm->cable;
457 struct loopback_pcm *dpcm = runtime->private_data;
458 struct loopback_cable *cable = dpcm->cable;
462 err = cable->ops->stop_sync(dpcm);
473 dpcm->buf_pos = 0;
474 dpcm->pcm_buffer_size = frames_to_bytes(runtime, runtime->buffer_size);
477 dpcm->silent_size = dpcm->pcm_buffer_size;
482 dpcm->irq_pos = 0;
483 dpcm->period_update_pending = 0;
484 dpcm->pcm_bps = bps;
485 dpcm->pcm_salign = salign;
486 dpcm->pcm_period_size = frames_to_bytes(runtime, runtime->period_size);
488 mutex_lock(&dpcm->loopback->cable_lock);
490 (get_setup(dpcm)->notify &&
494 mutex_unlock(&dpcm->loopback->cable_lock);
499 static void clear_capture_buf(struct loopback_pcm *dpcm, unsigned int bytes)
501 struct snd_pcm_runtime *runtime = dpcm->substream->runtime;
503 unsigned int dst_off = dpcm->buf_pos;
505 if (dpcm->silent_size >= dpcm->pcm_buffer_size)
507 if (dpcm->silent_size + bytes > dpcm->pcm_buffer_size)
508 bytes = dpcm->pcm_buffer_size - dpcm->silent_size;
512 if (dst_off + size > dpcm->pcm_buffer_size)
513 size = dpcm->pcm_buffer_size - dst_off;
517 dpcm->silent_size += size;
574 static inline unsigned int bytepos_delta(struct loopback_pcm *dpcm,
580 last_pos = byte_pos(dpcm, dpcm->irq_pos);
581 dpcm->irq_pos += jiffies_delta * dpcm->pcm_bps;
582 delta = byte_pos(dpcm, dpcm->irq_pos) - last_pos;
583 if (delta >= dpcm->last_drift)
584 delta -= dpcm->last_drift;
585 dpcm->last_drift = 0;
586 if (dpcm->irq_pos >= dpcm->period_size_frac) {
587 dpcm->irq_pos %= dpcm->period_size_frac;
588 dpcm->period_update_pending = 1;
593 static inline void bytepos_finish(struct loopback_pcm *dpcm,
596 dpcm->buf_pos += delta;
597 dpcm->buf_pos %= dpcm->pcm_buffer_size;
658 struct loopback_pcm *dpcm = from_timer(dpcm, t, timer);
661 spin_lock_irqsave(&dpcm->cable->lock, flags);
662 if (loopback_jiffies_timer_pos_update(dpcm->cable) &
663 (1 << dpcm->substream->stream)) {
664 loopback_jiffies_timer_start(dpcm);
665 if (dpcm->period_update_pending) {
666 dpcm->period_update_pending = 0;
667 spin_unlock_irqrestore(&dpcm->cable->lock, flags);
669 snd_pcm_period_elapsed(dpcm->substream);
673 spin_unlock_irqrestore(&dpcm->cable->lock, flags);
681 struct loopback_pcm *dpcm = runtime->private_data;
682 struct loopback_cable *cable = dpcm->cable;
698 pcm_err(dpcm->substream->pcm,
837 static void loopback_jiffies_timer_dpcm_info(struct loopback_pcm *dpcm,
841 dpcm->period_update_pending);
842 snd_iprintf(buffer, " irq_pos:\t\t%u\n", dpcm->irq_pos);
843 snd_iprintf(buffer, " period_frac:\t%u\n", dpcm->period_size_frac);
845 dpcm->last_jiffies, jiffies);
846 snd_iprintf(buffer, " timer_expires:\t%lu\n", dpcm->timer.expires);
849 static void loopback_snd_timer_dpcm_info(struct loopback_pcm *dpcm,
852 struct loopback_cable *cable = dpcm->cable;
866 struct loopback_pcm *dpcm = runtime->private_data;
869 spin_lock(&dpcm->cable->lock);
870 if (dpcm->cable->ops->pos_update)
871 dpcm->cable->ops->pos_update(dpcm->cable);
872 pos = dpcm->buf_pos;
873 spin_unlock(&dpcm->cable->lock);
904 struct loopback_pcm *dpcm = runtime->private_data;
905 kfree(dpcm);
911 struct loopback_pcm *dpcm = runtime->private_data;
912 struct loopback_cable *cable = dpcm->cable;
914 mutex_lock(&dpcm->loopback->cable_lock);
916 mutex_unlock(&dpcm->loopback->cable_lock);
931 struct loopback_pcm *dpcm = rule->private;
932 struct loopback_cable *cable = dpcm->cable;
936 mutex_lock(&dpcm->loopback->cable_lock);
939 mutex_unlock(&dpcm->loopback->cable_lock);
946 struct loopback_pcm *dpcm = rule->private;
947 struct loopback_cable *cable = dpcm->cable;
950 mutex_lock(&dpcm->loopback->cable_lock);
953 mutex_unlock(&dpcm->loopback->cable_lock);
962 struct loopback_pcm *dpcm = rule->private;
963 struct loopback_cable *cable = dpcm->cable;
966 mutex_lock(&dpcm->loopback->cable_lock);
969 mutex_unlock(&dpcm->loopback->cable_lock);
978 struct loopback_pcm *dpcm = rule->private;
979 struct loopback_cable *cable = dpcm->cable;
982 mutex_lock(&dpcm->loopback->cable_lock);
985 mutex_unlock(&dpcm->loopback->cable_lock);
1007 struct loopback_pcm *dpcm = substream->runtime->private_data;
1009 if (cable->ops && cable->ops->close_cable && dpcm)
1010 cable->ops->close_cable(dpcm);
1017 static int loopback_jiffies_timer_open(struct loopback_pcm *dpcm)
1019 timer_setup(&dpcm->timer, loopback_jiffies_timer_function, 0);
1095 static int loopback_snd_timer_open(struct loopback_pcm *dpcm)
1103 struct loopback_cable *cable = dpcm->cable;
1111 err = loopback_parse_timer_id(dpcm->loopback->timer_source, &tid);
1113 pcm_err(dpcm->substream->pcm,
1115 dpcm->loopback->timer_source, err);
1119 cable->snd_timer.stream = dpcm->substream->stream;
1122 timeri = snd_timer_instance_new(dpcm->loopback->card->id);
1156 pcm_err(dpcm->substream->pcm,
1187 struct loopback_pcm *dpcm;
1193 dpcm = kzalloc(sizeof(*dpcm), GFP_KERNEL);
1194 if (!dpcm) {
1198 dpcm->loopback = loopback;
1199 dpcm->substream = substream;
1216 dpcm->cable = cable;
1217 runtime->private_data = dpcm;
1220 err = cable->ops->open(dpcm);
1232 rule_format, dpcm,
1238 rule_rate, dpcm,
1244 rule_channels, dpcm,
1256 rule_period_bytes, dpcm,
1262 /* loopback_runtime_free() has not to be called if kfree(dpcm) was
1266 if (get_notify(dpcm))
1272 cable->streams[substream->stream] = dpcm;
1278 kfree(dpcm);
1287 struct loopback_pcm *dpcm = substream->runtime->private_data;
1290 if (dpcm->cable->ops->close_substream)
1291 err = dpcm->cable->ops->close_substream(dpcm);
1606 struct loopback_pcm *dpcm,
1610 if (dpcm == NULL) {
1614 snd_iprintf(buffer, " buffer_size:\t%u\n", dpcm->pcm_buffer_size);
1615 snd_iprintf(buffer, " buffer_pos:\t\t%u\n", dpcm->buf_pos);
1616 snd_iprintf(buffer, " silent_size:\t%u\n", dpcm->silent_size);
1617 snd_iprintf(buffer, " period_size:\t%u\n", dpcm->pcm_period_size);
1618 snd_iprintf(buffer, " bytes_per_sec:\t%u\n", dpcm->pcm_bps);
1619 snd_iprintf(buffer, " sample_align:\t%u\n", dpcm->pcm_salign);
1620 snd_iprintf(buffer, " rate_shift:\t\t%u\n", dpcm->pcm_rate_shift);
1621 if (dpcm->cable->ops->dpcm_info)
1622 dpcm->cable->ops->dpcm_info(dpcm, buffer);