static int pcm_rw_transfer(struct pcm *pcm, void *data, unsigned int frames)
{
int is_playback;
struct snd_xferi transfer;
int res;
is_playback = !(pcm->flags & PCM_IN);
transfer.buf = data;
transfer.frames = frames;
transfer.result = 0;
res = ioctl(pcm->fd, is_playback
? SNDRV_PCM_IOCTL_WRITEI_FRAMES
: SNDRV_PCM_IOCTL_READI_FRAMES, &transfer);
return res == 0 ? (int) transfer.result : -1;
}
"./sound/core/pcm_native.c"
3681 const struct file_operations snd_pcm_f_ops[2] = {
3682 {
3683 .owner = THIS_MODULE,
3684 .write = snd_pcm_write,
3685 .write_iter = snd_pcm_writev,
3686 .open = snd_pcm_playback_open,
3687 .release = snd_pcm_release,
3688 .llseek = no_llseek,
3689 .poll = snd_pcm_playback_poll,
3690 .unlocked_ioctl = snd_pcm_playback_ioctl,
3691 .compat_ioctl = snd_pcm_ioctl_compat,
3692 .mmap = snd_pcm_mmap,
3693 .fasync = snd_pcm_fasync,
3694 .get_unmapped_area = snd_pcm_get_unmapped_area,
3695 },
3696 {
3697 .owner = THIS_MODULE,
3698 .read = snd_pcm_read,
3699 .read_iter = snd_pcm_readv,
3700 .open = snd_pcm_capture_open,
3701 .release = snd_pcm_release,
3702 .llseek = no_llseek,
3703 .poll = snd_pcm_capture_poll,
3704 .unlocked_ioctl = snd_pcm_capture_ioctl,
3705 .compat_ioctl = snd_pcm_ioctl_compat,
3706 .mmap = snd_pcm_mmap,
3707 .fasync = snd_pcm_fasync,
3708 .get_unmapped_area = snd_pcm_get_unmapped_area,
3709 }
3710 };
3010 int snd_pcm_kernel_ioctl(struct snd_pcm_substream *substream,
3011 unsigned int cmd, void *arg)
3012 {
3013 mm_segment_t fs;
3014 int result;
3015
3016 fs = snd_enter_user();
3017 switch (substream->stream) {
3018 case SNDRV_PCM_STREAM_PLAYBACK:
3019
Tinyalsa->ALSA 播放路径解析
最新推荐文章于 2025-09-29 19:06:27 发布
本文深入探讨了ALSA中PCM I/O操作的实现细节,包括pcm_rw_transfer函数的内部逻辑,snd_pcm_f_ops文件操作结构,以及snd_pcm_playback_ioctl和snd_pcm_lib_write等关键函数的工作流程。通过分析源代码,揭示了音频设备读写操作的底层机制。

最低0.47元/天 解锁文章
2916

被折叠的 条评论
为什么被折叠?



