嵌入式 pcm音频三

原创 2013年12月02日 14:51:36

4.3 层层深入,从应用程序到驱动层pcm


4.3.1 字符设备注册

在sound/core/sound.c中有alsa_sound_init()函数,定义如下:

 

[c-sharp] view plaincopy
  1. static int __init alsa_sound_init(void 
  2.  
  3.     snd_major major;  
  4.     snd_ecards_limit cards_limit;  
  5.     if (register_chrdev(major, "alsa"&snd_fops))  
  6.         snd_printk(KERN_ERR "unable to register native major device number %d/n"major);  
  7.         return -EIO;  
  8.      
  9.     if (snd_info_init() 0)  
  10.         unregister_chrdev(major, "alsa");  
  11.         return -ENOMEM;  
  12.      
  13.     snd_info_minor_register();  
  14.     return 0;  
  15.  

register_chrdev中的参数major与之前创建pcm设备是device_create时的major是同一个,这样的结果是,当应用程序open设备文件/dev/snd/pcmCxDxp时,会进入snd_fops的open回调函数,我们将在下一节中讲述open的过程。

4.3.2 打开pcm设备

从上一节中我们得知,open一个pcm设备时,将会调用snd_fops的open回调函数,我们先看看snd_fops的定义:

 

[c-sharp] view plaincopy
  1. static const struct file_operations snd_fops  
  2.  
  3.     .owner    THIS_MODULE,  
  4.     .open     snd_open  
  5. };  

跟入snd_open函数,它首先从inode中取出此设备号,然后以次设备号为索引,从snd_minors全局数组中取出当初注册pcm设备时填充的snd_minor结构(参看4.1节的内容),然后从snd_minor结构中取出pcm设备的f_ops,并且把file->f_op替换为pcm设备的f_ops,紧接着直接调用pcm设备的f_ops->open(),然后返回。因为file->f_op已经被替换,以后,应用程序的所有read/write/ioctl调用都会进入pcm设备自己的回调函数中,也就是4.2节中提到的snd_pcm_f_ops结构中定义的回调。

 

[c-sharp] view plaincopy
  1. static int snd_open(struct inode *inode, struct file *file)  
  2.  
  3.     unsigned int minor iminor(inode);  
  4.     struct snd_minor *mptr NULL;  
  5.     const struct file_operations *old_fops;  
  6.     int err 0;  
  7.   
  8.     if (minor >= ARRAY_SIZE(snd_minors))  
  9.         return -ENODEV;  
  10.     mutex_lock(&sound_mutex);  
  11.     mptr snd_minors[minor];  
  12.     if (mptr == NULL)  
  13.         mptr autoload_device(minor);  
  14.         if (!mptr)  
  15.             mutex_unlock(&sound_mutex);  
  16.             return -ENODEV;  
  17.          
  18.      
  19.     old_fops file->f_op;  
  20.     file->f_op fops_get(mptr->f_ops);  
  21.     if (file->f_op == NULL)  
  22.         file->f_op old_fops;  
  23.         err -ENODEV;  
  24.      
  25.     mutex_unlock(&sound_mutex);  
  26.     if (err 0)  
  27.         return err;  
  28.   
  29.     if (file->f_op->open)  
  30.         err file->f_op->open(inode, file);  
  31.         if (err)  
  32.             fops_put(file->f_op);  
  33.             file->f_op fops_get(old_fops);  
  34.          
  35.      
  36.     fops_put(old_fops);  
  37.     return err;  
  38.  

 

下面的序列图展示了应用程序如何最终调用到snd_pcm_f_ops结构中的回调函数:

                                                               图4.3.2.1    应用程序操作pcm设备

相关文章推荐

嵌入式 wave文件(*.wav)格式、PCM数据格式收藏

1. 音频简介   经常见到这样的描述: 44100HZ 16bit stereo 或者 22050HZ 8bit mono 等等. 44100HZ 16bit stereo: 每秒钟有 441...
  • skdkjxy
  • skdkjxy
  • 2013年12月02日 14:56
  • 943

嵌入式linux中PCM音频编程实践

嵌入式设备中经常需要用的音频,音频设备最原始的数据格式就是PCM,也就是大家常见的WAV,在linux中,音频编程使用最多的就是alsa框架,下面就来看一下pcm音频的编程实例吧。     首先需要...
  • cjyusha
  • cjyusha
  • 2016年01月11日 11:09
  • 2411

嵌入式音频播放的实现

1.PCM(脉冲编码调制)技术及声波的数字化我们知道声音是一种连续变化的波形,是模拟信号,而我们的计算机或者说MCU存储及使用的都是二进制数字信号,所以我们需要对声音信号进行一些处理,这里便使用到了P...
  • YCM888
  • YCM888
  • 2017年07月15日 10:40
  • 51

嵌入式 hi3518c音频模块相关常识

AUDIO: AUDIO模块包括音频输入、音频输出、音频编码、音频解码四个子模块。音频输入和输出模块通过对Hi35xx芯片SIO接口的控制实现音频输入输出功能。音频编码和解码模块提供对G711、G7...
  • skdkjxy
  • skdkjxy
  • 2014年02月11日 10:04
  • 4201

嵌入式音频播放器

  • 2014年04月23日 21:54
  • 2.89MB
  • 下载

嵌入式音频

  • 2014年06月12日 18:38
  • 411KB
  • 下载

ffmpeg实战教程(三)音频PCM采样为AAC,视频YUV编码为H264/HEVC

音频PCM采样数据编码为压缩码流(MP3,WMA,AAC等)简单介绍一下流程中各个函数的意义:av_register_all():注册FFmpeg所有编解码器。avformat_alloc_outpu...

Linux openwrt 树莓派 香蕉派 嵌入式 usb 声卡 PCM2704 2705 2706 CM108 PCM2704/2705/2706 linux专用声卡 专用usb声卡

Linux openwrt 树莓派 香蕉派 嵌入式 usb 声卡 PCM2704 2705 2706  CM108 PCM2704/2705/2706  最近在鼓捣linux,打算用USB声卡录制监...
  • vbvcde
  • vbvcde
  • 2017年02月20日 15:39
  • 729
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:嵌入式 pcm音频三
举报原因:
原因补充:

(最多只允许输入30个字)