Tinyalsa->ALSA 播放路径解析

本文深入探讨了ALSA中PCM I/O操作的实现细节,包括pcm_rw_transfer函数的内部逻辑,snd_pcm_f_ops文件操作结构,以及snd_pcm_playback_ioctl和snd_pcm_lib_write等关键函数的工作流程。通过分析源代码,揭示了音频设备读写操作的底层机制。

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 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值