in most_snd.c [179:213]
static bool copy_data(struct channel *channel, struct mbo *mbo)
{
struct snd_pcm_runtime *const runtime = channel->substream->runtime;
unsigned int const frame_bytes = channel->cfg->subbuffer_size;
unsigned int const buffer_size = runtime->buffer_size;
unsigned int frames;
unsigned int fr0;
if (channel->cfg->direction & MOST_CH_RX)
frames = mbo->processed_length / frame_bytes;
else
frames = mbo->buffer_length / frame_bytes;
fr0 = min(buffer_size - channel->buffer_pos, frames);
channel->copy_fn(runtime->dma_area + channel->buffer_pos * frame_bytes,
mbo->virt_address,
fr0 * frame_bytes);
if (frames > fr0) {
/* wrap around at end of ring buffer */
channel->copy_fn(runtime->dma_area,
mbo->virt_address + fr0 * frame_bytes,
(frames - fr0) * frame_bytes);
}
channel->buffer_pos += frames;
if (channel->buffer_pos >= buffer_size)
channel->buffer_pos -= buffer_size;
channel->period_pos += frames;
if (channel->period_pos >= runtime->period_size) {
channel->period_pos -= runtime->period_size;
return true;
}
return false;
}