alsa-lib之snd_pcm_open

目录

版本获取

  • 前言
  • snd_pcm_open时序图
  • 代码流程

版本获取
使用版本
alsa 1.2.5.1 release | Changes v1.2.5 v1.2.5.1

https://www.alsa-project.org/wiki/Main_Page

https://github.com/alsa-project

前言

我们都知道alsa-lib包含开发人员编译 ALSA 应用程序的用户空间库, 提供接口给应用调用的。前面我们了解过ALSA框架 ,本节我们主要介绍一下alsa-lib中snd_pcm_open流程。

snd_pcm_open时序图

alsa-lib之snd_pcm_open_第1张图片
在snd_pcm_open中主要做了两件事。

1、调用snd_config_update_ref函数以在asla.conf中获得snd_config_t结构的配置树到snd_config全局变量中。
2、调用snd_pcm_open_noupdate函数创建pcm设备。

下面让我们一起看下具体代码流程~

代码流程

alsa-lib最为重要的一个接口是snd_pcm_open函数,下面我们以播放为例,具体来看一下上层应用是怎么打开设备,下面我们分析一下代码流程。
1、在alsa-utils的main函数中调用snd_pcm_open打开pcm设备。

int snd_pcm_open(snd_pcm_t **pcmp, const char *name,
                snd_pcm_stream_t stream, int mode)
        snd_config_t *top;
        int err;
{
   
        assert(pcmp && name);
        if (_snd_is_ucm_device(name)) {
   
                name = uc_mgr_alibcfg_by_device(&top, name);
                if (name == NULL)
                        return -ENODEV;
        } else {
   
                err = snd_config_update_ref(&top);  //从alsa.conf配置中,获得snd_config_t结构的配置树到snd_config全局变量中
                if (err < 0)
                        return err;
        }
        err = snd_pcm_open_noupdate(pcmp, top, name, stream, mode, 0);
        snd_config_unref(top);
        return err;
}

pcmp 打开的pcm句柄
name 要打开的pcm设备名字,默认default, 播放的话name就是PCM
stream SND_PCM_STREAM_PLAYBACK 或 SND_PCM_STREAM_CAPTURE,分别表示播放和录音的PCM流
mode 打开pcm句柄时的一些附加参数 SND_PCM_NONBLOCK 非阻塞打开(默认阻塞打开), SND_PCM_ASYNC 异步模式打开
返回值 0 表示打开成功,负数表示失败,对应错误码

使用snd_config_update_ref函数加载alsa.conf文件的内容到snd_config_t结构中。而alsa-lib-1.2.5.1/src/conf.c就是来完成load这个文件的。

//alsa.conf在板子中的路径如下 /usr/share/alsa/alsa.conf

2、接下来看一下snd_pcm_open_noupdate函数,在这个函数中才是真正构建配置树的函数。
snd_pcm_open_noupdate参数和snd_pcm_open参数一致,多了root和 hop,root参数就是传入snd_config_t结构配置树, hop 这个参数暂时不清楚是做什么用的。函数如下:

static int snd_pcm_open_noupdate(snd_pcm_t **pcmp, snd_config_t *root,
                                 const char *name, snd_pcm_stream_t stream,
                                 int mode, int hop)
{
   
        int err;
        snd_config_t *pcm_conf;
        const char *str;

        //在root中查找PCM interface
        err = 

你可能感兴趣的:(ALSA源码,asla,audio)