static void loopback_bytepos_update(struct loopback_pcm *dpcm, unsigned int delta, unsigned int cmd) { unsigned int count; unsigned long last_pos; last_pos = byte_pos(dpcm, dpcm->irq_pos); dpcm->irq_pos += delta * dpcm->pcm_bps; count = byte_pos(dpcm, dpcm->irq_pos) - last_pos; if (!count) return; if (cmd == BYTEPOS_UPDATE_CLEAR) clear_capture_buf(dpcm, count); else if (cmd == BYTEPOS_UPDATE_COPY) copy_play_buf(dpcm->cable->streams[SNDRV_PCM_STREAM_PLAYBACK], dpcm->cable->streams[SNDRV_PCM_STREAM_CAPTURE], count); dpcm->buf_pos += count; dpcm->buf_pos %= dpcm->pcm_buffer_size; if (dpcm->irq_pos >= dpcm->period_size_frac) { dpcm->irq_pos %= dpcm->period_size_frac; dpcm->period_update_pending = 1; } }
static inline unsigned int bytepos_delta(struct loopback_pcm *dpcm, unsigned int jiffies_delta) { unsigned long last_pos; unsigned int delta; last_pos = byte_pos(dpcm, dpcm->irq_pos); dpcm->irq_pos += jiffies_delta * dpcm->pcm_bps; delta = byte_pos(dpcm, dpcm->irq_pos) - last_pos; if (delta >= dpcm->last_drift) delta -= dpcm->last_drift; dpcm->last_drift = 0; if (dpcm->irq_pos >= dpcm->period_size_frac) { dpcm->irq_pos %= dpcm->period_size_frac; dpcm->period_update_pending = 1; } return delta; }
static void minivosc_pos_update(struct minivosc_device *mydev) { unsigned int last_pos, count; unsigned long delta; if (!mydev->running) return; dbg2("*minivosc_pos_update: running "); delta = jiffies - mydev->last_jiffies; dbg2("* : jiffies %lu, ->last_jiffies %lu, delta %lu", jiffies, mydev->last_jiffies, delta); if (!delta) return; mydev->last_jiffies += delta; last_pos = byte_pos(mydev->irq_pos); mydev->irq_pos += delta * mydev->pcm_bps; count = byte_pos(mydev->irq_pos) - last_pos; dbg2("* : last_pos %d, c->irq_pos %d, count %d", last_pos, mydev->irq_pos, count); if (!count) return; // FILL BUFFER HERE minivosc_xfer_buf(mydev, count); if (mydev->irq_pos >= mydev->period_size_frac) { dbg2("* : mydev->irq_pos >= mydev->period_size_frac %d", mydev->period_size_frac); mydev->irq_pos %= mydev->period_size_frac; mydev->period_update_pending = 1; } }