hw->mmap_control->avail_min = 1; } snd_pcm_set_appl_ptr(pcm, &hw->mmap_control->appl_ptr, hw->fd, SNDRV_PCM_MMAP_OFFSET_CONTROL); return 0; } snd_pcm_mmap switch (i->type) { case SND_PCM_AREA_MMAP: //表示为数据区分配驱动内存,在snd_pcm_hw_channel_info中设置了type ptr =...
hw->mmap_control->avail_min = 1; } snd_pcm_set_appl_ptr(pcm, &hw->mmap_control->appl_ptr, hw->fd, SNDRV_PCM_MMAP_OFFSET_CONTROL); return 0; } snd_pcm_mmap switch (i->type) { case SND_PCM_AREA_MMAP: //表示为数据区分配驱动内存,在snd_pcm_hw_channel_info中设置了type ptr =...
snd_pcm_hw_t *hw = pcm->private_data; void *ptr; int err; if (hw->sync_ptr == NULL) { // 如果还没有mmap,那么执行mmap映射内核空间驱动使用的声音缓冲区 ptr = mmap(NULL, page_align(sizeof(struct sndrv_pcm_mmap_control)), PROT_READ|PROT_WRITE, MAP_FILE|MAP_SHARED, hw->fd, SN...
③platform调用的函数是rockchip_pcm_hw_params主要是拿到②中的关于dma的设置,完成剩余的dma设置和启动工作。 static int soc_pcm_hw_free(struct snd_pcm_substream *substream) { if (!codec-active) snd_soc_dai_digital_mute(codec_dai, 1); if (rtd-dai_link-ops rtd-dai_link-ops-hw_free) rtd...
pat_ioctl= snd_pcm_ioctl_compat, .mmap= snd_pcm_mmap, .fasync= snd_pcm_fasync, .get_unmapped_area= snd_pcm_get_unmapped_area, } }; snd_pcm_f_ops会通过一些处理后最终会调用我们的structsnd_pcm_ops结构体所指的函数,因为/sound/core/pcm_native.c的代码比较繁琐和复杂而且大部分都是不需要进行...
hw->mmap_control->avail_min = 1; } snd_pcm_set_appl_ptr(pcm, &hw->mmap_control->appl_ptr, hw->fd, SNDRV_PCM_MMAP_OFFSET_CONTROL); return 0; } snd_pcm_mmap switch (i->type) { case SND_PCM_AREA_MMAP: //表示为数据区分配驱动内存,在snd_pcm_hw_channel_info中设置了type ptr =...