in most_snd.c [322:356]
static int pcm_prepare(struct snd_pcm_substream *substream)
{
struct channel *channel = substream->private_data;
struct snd_pcm_runtime *runtime = substream->runtime;
struct most_channel_config *cfg = channel->cfg;
int width = snd_pcm_format_physical_width(runtime->format);
channel->copy_fn = NULL;
if (cfg->direction == MOST_CH_TX) {
if (snd_pcm_format_big_endian(runtime->format) || width == 8)
channel->copy_fn = alsa_to_most_memcpy;
else if (width == 16)
channel->copy_fn = alsa_to_most_copy16;
else if (width == 24)
channel->copy_fn = alsa_to_most_copy24;
else if (width == 32)
channel->copy_fn = alsa_to_most_copy32;
} else {
if (snd_pcm_format_big_endian(runtime->format) || width == 8)
channel->copy_fn = most_to_alsa_memcpy;
else if (width == 16)
channel->copy_fn = most_to_alsa_copy16;
else if (width == 24)
channel->copy_fn = most_to_alsa_copy24;
else if (width == 32)
channel->copy_fn = most_to_alsa_copy32;
}
if (!channel->copy_fn)
return -EINVAL;
channel->period_pos = 0;
channel->buffer_pos = 0;
return 0;
}