IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> control设备的注册流程 -> 正文阅读

[C++知识库]control设备的注册流程

我们知道,control设备的创建一般是在ASoC-codec层完成,然后是在注册声卡的时候注册。我们先来找到在声卡注册时执行的函数 snd_soc_add_card_controls() 
int snd_soc_add_card_controls(struct snd_soc_card *soc_card,
        const struct snd_kcontrol_new *controls, int num_controls)
{
        struct snd_card *card = soc_card->snd_card;

        return snd_soc_add_controls(card, soc_card->dev, controls, num_controls,
                        NULL, soc_card);
}

可以看到这个函数主要是执行了snd_soc_add_controls()这个函数

static int snd_soc_add_controls(struct snd_card *card, struct device *dev,
        const struct snd_kcontrol_new *controls, int num_controls,
        const char *prefix, void *data)
{
        int err, i;

        for (i = 0; i < num_controls; i++) {
                const struct snd_kcontrol_new *control = &controls[i];

                err = snd_ctl_add(card, snd_soc_cnew(control, data,
                                                     control->name, prefix));
                if (err < 0) {
                        dev_err(dev, "ASoC: Failed to add %s: %d\n",
                                control->name, err);
                        return err;
                }
        }

        return 0;
}

这里是利用num_controls来进行循环次数判定,循环内容主要是执行了snd_ctl_add(),再经过层层调用,最后来到

/* add/replace a new kcontrol object; call with card->controls_rwsem locked */
static int __snd_ctl_add_replace(struct snd_card *card,
                                 struct snd_kcontrol *kcontrol,
                                 enum snd_ctl_add_mode mode)
{
        struct snd_ctl_elem_id id;
        unsigned int idx;
        unsigned int count;
        struct snd_kcontrol *old;
        int err;

        id = kcontrol->id;
        if (id.index > UINT_MAX - kcontrol->count)
                return -EINVAL;

        old = snd_ctl_find_id(card, &id);
        if (!old) {
                if (mode == CTL_REPLACE)
                        return -EINVAL;
        } else {
                if (mode == CTL_ADD_EXCLUSIVE) {
                        dev_err(card->dev,
                                "control %i:%i:%i:%s:%i is already present\n",
                                id.iface, id.device, id.subdevice, id.name,
                                id.index);
                        return -EBUSY;
                }

                err = snd_ctl_remove(card, old);
                if (err < 0)
                        return err;
        }

        if (snd_ctl_find_hole(card, kcontrol->count) < 0)
                return -ENOMEM;

        list_add_tail(&kcontrol->list, &card->controls);
        card->controls_count += kcontrol->count;
        kcontrol->id.numid = card->last_numid + 1;
        card->last_numid += kcontrol->count;

        id = kcontrol->id;
        count = kcontrol->count;
        for (idx = 0; idx < count; idx++, id.index++, id.numid++)
                snd_ctl_notify(card, SNDRV_CTL_EVENT_MASK_ADD, &id);

        return 0;
}
  1. 找到control,然后判断是代替还是新增,代替则删除旧的control

  2. 将control添加到card的链表,并对card中与control相关的参数进行更新

  3. 设置读取节点时的相关配置

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2022-03-22 20:20:07  更:2022-03-22 20:20:09 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 2:47:27-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码