linux ALSA & ASOC (3) — widget 、route

2023-11-15

上一篇文章中,我们介绍了音频驱动中对基本控制单元的封装:kcontrol。利用kcontrol,我们可以完成对音频系统中的mixer,mux,音量控制,音效控制,以及各种开关量的控制,通过对各种kcontrol的控制,使得音频硬件能够按照我们预想的结果进行工作。同时我们可以看到,kcontrol还是有以下几点不足:

  • 只能描述自身,无法描述各个kcontrol之间的连接关系;
  • 没有相应的电源管理机制;
  • 没有相应的时间处理机制来响应播放、停止、上电、下电等音频事件;
  • 为了防止pop-pop声,需要用户程序关注各个kcontrol上电和下电的顺序;
  • 当一个音频路径不再有效时,不能自动关闭该路径上的所有的kcontrol;

/*****************************************************************************************************/
声明:本博内容均由http://blog.csdn.net/droidphone原创,转载请注明出处,谢谢!
/*****************************************************************************************************/

为此,DAPM框架正是为了要解决以上这些问题而诞生的,DAPM目前已经是ASoc中的重要组成部分,让我们先从DAPM的数据结构开始,了解它的设计思想和工作原理。

DAPM的基本单元:widget


文章的开头,我们说明了一下目前kcontrol的一些不足,而DAPM框架为了解决这些问题,引入了widget这一概念,所谓widget,其实可以理解为是kcontrol的进一步升级和封装,她同样是指音频系统中的某个部件,比如mixer,mux,输入输出引脚,电源供应器等等,甚至,我们可以定义虚拟的widget,例如playback stream widget。widget把kcontrol和动态电源管理进行了有机的结合,同时还具备音频路径的连结功能,一个widget可以与它相邻的widget有某种动态的连结关系。在DAPM框架中,widget用结构体snd_soc_dapm_widget来描述:

  1. struct snd_soc_dapm_widget {  
  2.         enum snd_soc_dapm_type id;  
  3.         const char *name;               /* widget name */  
  4.   
  5.         ......  
  6.         /* dapm control */  
  7.         int reg;                                /* negative reg = no direct dapm */  
  8.         unsigned char shift;                    /* bits to shift */  
  9.         unsigned int value;                             /* widget current value */  
  10.         unsigned int mask;                      /* non-shifted mask */  
  11.         ......  
  12.   
  13.         int (*power_check)(struct snd_soc_dapm_widget *w);  
  14.   
  15.         int (*event)(struct snd_soc_dapm_widget*, struct snd_kcontrol *, int);  
  16.   
  17.         /* kcontrols that relate to this widget */  
  18.         int num_kcontrols;  
  19.         const struct snd_kcontrol_new *kcontrol_news;  
  20.         struct snd_kcontrol **kcontrols;  
  21.   
  22.         /* widget input and outputs */  
  23.         struct list_head sources;  
  24.         struct list_head sinks;  
  25.         ......  
  26. };  
struct snd_soc_dapm_widget {
        enum snd_soc_dapm_type id;
        const char *name;               /* widget name */

        ......
        /* dapm control */
        int reg;                                /* negative reg = no direct dapm */
        unsigned char shift;                    /* bits to shift */
        unsigned int value;                             /* widget current value */
        unsigned int mask;                      /* non-shifted mask */
        ......

        int (*power_check)(struct snd_soc_dapm_widget *w);

        int (*event)(struct snd_soc_dapm_widget*, struct snd_kcontrol *, int);

        /* kcontrols that relate to this widget */
        int num_kcontrols;
        const struct snd_kcontrol_new *kcontrol_news;
        struct snd_kcontrol **kcontrols;

        /* widget input and outputs */
        struct list_head sources;
        struct list_head sinks;
        ......
};
snd_soc_dapm_widget结构比较大,为了简洁一些,这里我没有列出该结构体的完整字段,不过不用担心,下面我会说明每个字段的意义:

id    该widget的类型值,比如snd_soc_dapm_output,snd_soc_dapm_mixer等等。

*name    该widget的名字

*sname    代表该widget所在stream的名字,比如对于snd_soc_dapm_dai_in类型的widget,会使用该字段。

*codec *platform    指向该widget所属的codec和platform。

list    所有注册到系统中的widget都会通过该list,链接到代表声卡的snd_soc_card结构的widgets链表头字段中。

*dapm    snd_soc_dapm_context结构指针,ASoc把系统划分为多个dapm域,每个widget属于某个dapm域,同一个域代表着同样的偏置电压供电策略,比如,同一个codec中的widget通常位于同一个dapm域,而平台上的widget可能又会位于另外一个platform域中。

*priv    有些widget可能需要一些专有的数据,可以使用该字段来保存,像snd_soc_dapm_dai_in类型的widget,会使用该字段来记住与之相关联的snd_soc_dai结构指针。

*regulator    对于snd_soc_dapm_regulator_supply类型的widget,该字段指向与之相关的regulator结构指针。

*params    目前对于snd_soc_dapm_dai_link类型的widget,指向该dai的配置信息的snd_soc_pcm_stream结构。

reg shift mask     这3个字段用来控制该widget的电源状态,分别对应控制信息所在的寄存器地址,位移值和屏蔽值。

value  on_val  off_val    电源状态的当前只,开启时和关闭时所对应的值。

power invert    用于指示该widget当前是否处于上电状态,invert则用于表明power字段是否需要逻辑反转。

active connected    分别表示该widget是否处于激活状态和连接状态,当和相邻的widget有连接关系时,connected位会被置1,否则置0。

new   我们定义好的widget(snd_soc_dapm_widget结构),在注册到声卡中时需要进行实例化,该字段用来表示该widget是否已经被实例化。

ext    表示该widget当前是否有外部连接,比如连接mic,耳机,喇叭等等。

force    该位被设置后,将会不管widget当前的状态,强制更新至新的电源状态。

ignore_suspend new_power power_checked    这些电源管理相关的字段。

subseq    该widget目前在上电或下电队列中的排序编号,为了防止在上下电的过程中出现pop-pop声,DAPM会给每个widget分配合理的上下电顺序。

*power_check    用于检查该widget是否应该上电或下电的回调函数指针。
event_flags    该字段是一个位或字段,每个位代表该widget会关注某个DAPM事件通知。只有被关注的通知事件会被发送到widget的事件处理回调函数中。

*event    DAPM事件处理回调函数指针。

num_kcontrols *kcontrol_news **kcontrols    这3个字段用来描述与该widget所包含的kcontrol控件,例如一个mixer控件或者是一个mux控件。

sources sinks    两个链表字段,两个widget如果有连接关系,会通过一个snd_soc_dapm_path结构进行连接,sources链表用于链接所有的输入path,sinks链表用于链接所有的输出path。

power_list    每次更新整个dapm的电源状态时,会根据一定的算法扫描所有的widget,然后把需要变更电源状态的widget利用该字段链接到一个上电或下电的链表中,扫描完毕后,dapm系统会遍历这两个链表执行相应的上电或下电操作。

dirty    链表字段,widget的状态变更后,dapm系统会利用该字段,把该widget加入到一个dirty链表中,稍后会对dirty链表进行扫描,以执行整个路径的更新。

inputs    该widget的所有有效路径中,连接到输入端的路径数量。

outputs    该widget的所有有效路径中,连接到输出端的路径数量。

*clk    对于snd_soc_dapm_clock_supply类型的widget,指向相关联的clk结构指针。

以上我们对snd_soc_dapm_widget结构的各个字段所代表的意义一一做出了说明,这里只是让大家现有个概念,至于每个字段的详细作用,我们会在以后相关的章节中提及。

widget的种类


在DAPM框架中,把各种不同的widget划分为不同的种类,snd_soc_dapm_widget结构中的id字段用来表示该widget的种类,可选的种类都定义在一个枚举中:

  1. /* dapm widget types */  
  2. enum snd_soc_dapm_type {......}  
/* dapm widget types */
enum snd_soc_dapm_type {......}
下面我们逐个解释一下这些widget的种类:

  • snd_soc_dapm_input     该widget对应一个输入引脚。
  • snd_soc_dapm_output    该widget对应一个输出引脚。
  • snd_soc_dapm_mux    该widget对应一个mux控件。
  • snd_soc_dapm_virt_mux    该widget对应一个虚拟的mux控件。
  • snd_soc_dapm_value_mux    该widget对应一个value类型的mux控件。
  • snd_soc_dapm_mixer    该widget对应一个mixer控件。
  • snd_soc_dapm_mixer_named_ctl    该widget对应一个mixer控件,但是对应的kcontrol的名字不会加入widget的名字作为前缀。
  • snd_soc_dapm_pga    该widget对应一个pga控件(可编程增益控件)。
  • snd_soc_dapm_out_drv    该widget对应一个输出驱动控件
  • snd_soc_dapm_adc    该widget对应一个ADC 
  • snd_soc_dapm_dac    该widget对应一个DAC 
  • snd_soc_dapm_micbias    该widget对应一个麦克风偏置电压控件
  • snd_soc_dapm_mic    该widget对应一个麦克风。
  • snd_soc_dapm_hp    该widget对应一个耳机。
  • snd_soc_dapm_spk    该widget对应一个扬声器。
  • snd_soc_dapm_line     该widget对应一个线路输入。
  • snd_soc_dapm_switch       该widget对应一个模拟开关。
  • snd_soc_dapm_vmid      该widget对应一个codec的vmid偏置电压。
  • snd_soc_dapm_pre      machine级别的专用widget,会先于其它widget执行检查操作。
  • snd_soc_dapm_post    machine级别的专用widget,会后于其它widget执行检查操作。
  • snd_soc_dapm_supply           对应一个电源或是时钟源。
  • snd_soc_dapm_regulator_supply  对应一个外部regulator稳压器。
  • snd_soc_dapm_clock_supply      对应一个外部时钟源。
  • snd_soc_dapm_aif_in            对应一个数字音频输入接口,比如I2S接口的输入端。
  • snd_soc_dapm_aif_out          对应一个数字音频输出接口,比如I2S接口的输出端。
  • snd_soc_dapm_siggen            对应一个信号发生器。
  • snd_soc_dapm_dai_in           对应一个platform或codec域的输入DAI结构。
  • snd_soc_dapm_dai_out        对应一个platform或codec域的输出DAI结构。
  • snd_soc_dapm_dai_link         用于链接一对输入/输出DAI结构。

widget之间的连接器:path


之前已经提到,一个widget是有输入和输出的,而且widget之间是可以动态地进行连接的,那它们是用什么来连接两个widget的呢?DAPM为我们提出了path这一概念,path相当于电路中的一根跳线,它把一个widget的输出端和另一个widget的输入端连接在一起,path用snd_soc_dapm_path结构来描述:

  1. struct snd_soc_dapm_path {  
  2.         const char *name;  
  3.   
  4.         /* source (input) and sink (output) widgets */  
  5.         struct snd_soc_dapm_widget *source;  
  6.         struct snd_soc_dapm_widget *sink;  
  7.         struct snd_kcontrol *kcontrol;  
  8.   
  9.         /* status */  
  10.         u32 connect:1;  /* source and sink widgets are connected */  
  11.         u32 walked:1;   /* path has been walked */  
  12.         u32 walking:1;  /* path is in the process of being walked */  
  13.         u32 weak:1;     /* path ignored for power management */  
  14.   
  15.         int (*connected)(struct snd_soc_dapm_widget *source,  
  16.                          struct snd_soc_dapm_widget *sink);  
  17.   
  18.         struct list_head list_source;  
  19.         struct list_head list_sink;  
  20.         struct list_head list;  
  21. };  
struct snd_soc_dapm_path {
        const char *name;

        /* source (input) and sink (output) widgets */
        struct snd_soc_dapm_widget *source;
        struct snd_soc_dapm_widget *sink;
        struct snd_kcontrol *kcontrol;

        /* status */
        u32 connect:1;  /* source and sink widgets are connected */
        u32 walked:1;   /* path has been walked */
        u32 walking:1;  /* path is in the process of being walked */
        u32 weak:1;     /* path ignored for power management */

        int (*connected)(struct snd_soc_dapm_widget *source,
                         struct snd_soc_dapm_widget *sink);

        struct list_head list_source;
        struct list_head list_sink;
        struct list_head list;
};
当widget之间发生连接关系时,snd_soc_dapm_path作为连接者,它的source字段会指向该连接的起始端widget,而它的sink字段会指向该连接的到达端widget,还记得前面snd_soc_dapm_widget结构中的两个链表头字段:sources和sinks么?widget的输入端和输出端可能连接着多个path,所有输入端的snd_soc_dapm_path结构通过list_sink字段挂在widget的souces链表中,同样,所有输出端的snd_soc_dapm_path结构通过list_source字段挂在widget的sinks链表中。这里可能大家会被搞得晕呼呼的,一会source,一会sink,不要紧,只要记住,连接的路径是这样的:起始端widget的输出-->path的输入-->path的输出-->到达端widget输入。



                                                                                   图1    widget通过path进行连接

另外,snd_soc_dapm_path结构的list字段用于把所有的path注册到声卡中,其实就是挂在snd_soc_card结构的paths链表头字段中。如果你要自己定义方法来检查path的当前连接状态,你可以提供自己的connected回调函数指针。

connect,walked,walking,weak是几个辅助字段,用于帮助所有path的遍历。

widget的连接关系:route


通过上一节的内容,我们知道,一个路径的连接至少包含以下几个元素:起始端widget,跳线path,到达端widget,在DAPM中,用snd_soc_dapm_route结构来描述这样一个连接关系:

  1. struct snd_soc_dapm_route {  
  2.         const char *sink;  
  3.         const char *control;  
  4.         const char *source;  
  5.         int (*connected)(struct snd_soc_dapm_widget *source,  
  6.                          struct snd_soc_dapm_widget *sink);  
  7. };  
struct snd_soc_dapm_route {
        const char *sink;
        const char *control;
        const char *source;
        int (*connected)(struct snd_soc_dapm_widget *source,
                         struct snd_soc_dapm_widget *sink);
};
sink指向到达端widget的名字字符串,source指向起始端widget的名字字符串,control指向负责控制该连接所对应的kcontrol名字字符串,connected回调则定义了上一节所提到的自定义连接检查回调函数。该结构的意义很明显就是:source通过一个kcontrol,和sink连接在一起,现在是否处于连接状态,请调用connected回调函数检查。

这里直接使用名字字符串来描述连接关系,所有定义好的route,最后都要注册到dapm系统中,dapm会根据这些名字找出相应的widget,并动态地生成所需要的snd_soc_dapm_path结构,正确地处理各个链表和指针的关系,实现两个widget之间的连接,具体的连接代码分析,我们留到以后的章节中讨论。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

linux ALSA & ASOC (3) — widget 、route 的相关文章

  • 如何在 iOS 中使用 AVPlayer 缓冲音频?

    我想播放来自互联网的流音频 我编写了播放流的代码 但它没有任何缓冲区 因此如果信号较弱 应用程序将停止播放音频 这是我的代码 import UIKit import AVFoundation import MediaPlayer impor
  • Android 在通话期间播放音频文件[重复]

    这个问题在这里已经有答案了 对于我的 Android 应用程序 我想在从应用程序接听电话后播放音频文件 应用程序将发起电话呼叫 一旦接收者接听电话 应用程序应开始播放录制的音频文件 通过在谷歌上进行大量搜索 我发现这对于未root的设备来说
  • 如何在 iPad 上使用 HTML5/Javascript 合成音频

    有没有人有工作示例代码 可以在 iPad 上的 Mobile Safari 上使用 HTML5 Javascript 合成 并播放 音频 我在网上找到了一些基于 javascript 的声音合成示例 但它们似乎都只能在 Firefox 中使
  • “初始化 MCI 时出现问题”播放声音问题

    我正在尝试使用 Playsound 播放代码文件夹中的文件 但是每次运行代码时 它似乎都能够调用该文件 但我总是收到以下输出 playsound PlaysoundException Error 277 for command open p
  • Mediaplayer 播放几次后停止播放

    我有一个按钮 按下它会播放一个随机声音剪辑 然后播放另一个声音剪辑 然后通过一个媒体播放器播放另一个声音剪辑 但是多次按下该按钮 15 20 次 后 所有音频都会停止 我在播放最后一个音频剪辑后释放媒体播放器 所以我不认为这是原因 有什么指
  • 使用 C 创建立体声正弦波

    我正在尝试用 C 创建立体声正弦 WAV 并且可能有不同的 可能是空白的 左声道和右声道 使用此函数为每个通道生成一个音调 int16 t create tone float frequency float amplitude float
  • 在 Qt 中播放通知(频率 x)声音 - 最简单的方法?

    Qt 5 1 或更高版本 我需要播放频率为 x 的通知声音 n 毫秒 如果我能像这样组合音调那就太好了 1000Hz 持续 2 秒 然后 3000Hz 持续 1 秒 最简单的方法是使用文件 WAV MP3 例如如此处所述 如何用Qt播放声音
  • 在随机位置启动 HTML5

    我有一个大约 2 小时长的音轨 我想在我的网站上使用它 我希望它在页面加载时在随机位置开始播放曲目 使用 HTML5 可以吗 我知道您可以使用 element currentTime 函数来获取当前位置 但是如何在完全下载之前获取曲目的总时
  • Javascript 播放声音性能重吗?

    我正在用 Javascript 制作一个简单的游戏 当一个物体与墙壁碰撞时 它会发出 砰 的声音 声音的响度取决于物体的速度 速度越高 gt 声音越大 播放功能 playSound function id vol ID of the sou
  • 使用到达时间差对信号进行三边测量

    我在寻找或实现寻找信号源的算法时遇到一些麻烦 我的工作目标是找到声音发射器的位置 为了实现这一点 我使用了三个麦克风 我正在使用的技术是多点定位这是基于到达时间差 The 到达时间差使用发现每个麦克风之间互相关接收到的信号 我已经实现了算法
  • Java - 无缝改变循环剪辑的音量?

    我有一个循环剪辑 我像这样改变音量 clip stop clip flush FloatControl fc FloatControl clip getControl FloatControl Type MASTER GAIN fc set
  • 如何将 MP3 音频文件读入 numpy 数组/将 numpy 数组保存到 MP3?

    有没有办法从 MP3 音频文件中读取 写入 MP3 音频文件numpy具有类似 API 的数组scipy io wavfile read https docs scipy org doc scipy 0 14 0 reference gen
  • 捕获当前正在播放的声音

    是否可以捕获计算机上当前播放的声音 如果能够将其保存为 mp3 就好了 但我认为这样做会存在一些法律问题 所以 wav 也可以 我环顾四周 有人建议使用虚拟音频线之类的东西 在 C 中捕获声音输出 https stackoverflow c
  • 如何使用 Soundcloud api 将流传输到 html5 音频播放器中?

    我刚刚开始学习 javascript 作为我的第一次尝试 我想创建自定义音频播放器 它使用 soundcloud 的 api 作为音乐源 到目前为止 这就是我的设置
  • 如何将背景音乐添加到我的 spritekit 文件中

    有人可以给我一个快速简单的步骤 以便在我的应用程序加载后添加背景 m4a 音乐 它是一个精灵套件Xcode文件 音乐是m4a格式 谢谢 尝试用这个 import AVFoundation AVAudioPlayer backgroundMu
  • 如何在 Android 上的 PhoneGap 中设置音频播放速率?

    有谁能够让音频播放速率在 Android 上工作吗 媒体播放器似乎覆盖 忽略音频标签的播放速率属性 None
  • Python 声音(“铃声”)

    我想让一个 python 程序在完成任务时通过发出嘟嘟声来提醒我 目前 我使用import os然后使用命令行语音程序说 进程完成 我更愿意它是一个简单的 铃 我知道有一个函数可以用于Cocoa apps NSBeep 但我认为这与此没有太
  • Javascript 制作音频 blob

    我正在测试 html 音频标签 我想制作音频 blob url 就像 youtube 或 vimeo 那样 并将其添加到 src 开始播放音频 我一直在测试new Blob and URL createObjectURL 但我不知道如何使用
  • 如何在电话铃声、收到短信等时暂停音乐?

    我正在尝试检测 Android 声音并在它们发出噪音时暂停我的应用程序的音乐 暂时或永久 这段代码似乎什么也没做 stop暂停音乐并p写入日志 它永远不会被调用 public class PollyPrissyPants extends A
  • FFMPEG Seeking 带来音频伪影

    我正在使用 ffmpeg 实现音频解码器 在读取音频甚至搜索已经可以工作时 我无法找到一种在搜索后清除缓冲区的方法 因此当应用程序在搜索后立即开始读取音频时 我没有任何工件 avcodec flush buffers似乎对内部缓冲区没有任何

随机推荐

  • 5.7及以上版本的MySQL下载、安装及配置教程

    对版本的说明 之所以说是MySQL5 7及以上版本 是因为从MySQL5 7版本之后 其安全机制有所改变 在安装完成后 登陆MySQL时 需要输入一个密码 这个密码其实是在配置MySQL的过程中生成的一个随机密码 而我们必须找到这个随机密码
  • Eclipse中启动Tomcat无任何反应

    推动了软件业不断发展的可以说有3个方面的东西 过程 方法 技术 方法附会到哲学上应该就是方法论了 做很多事情都是需要方法的 比如写一篇案例 随心随意写也可以写出来 但是别人能否理解 如何检测自己描述清晰都是没有参考的 如果有个模板的 这样按
  • 韩顺平_java 学习路线

    链接 目录 阶段一 Java基础 阶段二 Java高级 阶段三 Java Web 阶段四 主流框架 项目管理相关的技术 阶段五 分布式 微服务 并行架构 阶段六 DevOps 开发运维一体化 自动部署项目管理 解决 CI CD 阶段七 大数
  • 【目标检测】单阶段算法--YOLOv3详解

    论文题目 YOLOv3 An Incremental Improvement 论文地址 https pjreddie com media files papers YOLOv3 pdf 一文读懂YOLOv1 YOLOv1 一文读懂YOLOv
  • 链表(详解)

    一 链表 1 1 什么是链表 1 链表是物理存储单元上非连续的 非顺序的存储结构 数据元素的逻辑顺序是通过链表的指针地址实现 有一系列结点 地址 组成 结点可动态的生成 2 结点包括两个部分 1 存储数据元素的数据域 内存空间 2 存储指向
  • gitee最详细使用教程,汇总了全网,看这一篇就够了

    1 gitee是什么 基于git的代码托管协助平台 2 git网站上的注册登录 打开gitee官网Gitee 基于 Git 的代码托管和研发协作平台打开注册登录即可 邮箱注册最好 非邮箱在个人 设置里添加自己的邮箱 新手请公开自己的邮箱 如
  • 《Vision Transformer (ViT)》论文精度,并解析ViT模型结构以及代码实现

    AN IMAGE IS WORTH 16X16 WORDS TRANSFORMERS FOR IMAGE RECOGNITION AT SCALE 论文共有22页 表格和图像很多 网络模型结构解释的很清楚 并且用四个公式展示了模型的计算过程
  • springboot枚举反序列化,@JsonCreator注解各种报错解决方案

    你多努力一点 获得的打击就多一点 今天使用枚举传参就出现了各种报错 比如这样的 org springframework http converter HttpMessageNotReadableException JSON parse er
  • Android Fragment之间跳转

    1 创建一个接口 public interface ChangeFragment void changge int postion 2 设置一个全局变量 public class GlobalParms private static Hom
  • OpenCV在图片中输出中文乱码解决方案

    转自 http www jeepxie net article 789204 html 一 缘起 在一个项目中需要把中文字符输出到图片上 也就是输出到Mat上 OpenCV 的putText函数不能输出中文 通过搜索 网上普遍的解决方案是使
  • C++不定参数函数实现方式

    文章目录 define 函数定义 VA LIST栈 c 11初始化列表 c 11 变长参数模板template
  • java使用jsch连接ssh服务并远程执行命令、上传、下载操作

    java使用jsch连接ssh服务并远程执行命令 上传 下载操作 关键依赖 jsch 0 1 54 jar 第一 使用用户名和密码连接 使用用户名和密码连接 Test public void test1 throws JSchExcepti
  • php开发俄罗斯方块,动手打造html5俄罗斯方块的(图文)

    在正文开始之前还要啰嗦一下 标题中所谓自给自足 是在没有参考任何设计思路的前提下去开发这游戏的 你可能会不解 如果参考优秀的思路 岂不是事半功倍 当然 参考与不参考都有利 我只说不参考的利 当我煞费苦心 历经数十个BUG修改 终于完成一件作
  • 组件化开发——组件生命周期

    最近刚刚换了工作 原来一直用angular系列 本来一直看好react的 结果facebook自己非要作死 结果就让vue直飞冲天了 现在工作中也用到vue 熟悉之余顺便记下一笔 后续可能会有weex先关的 暂且记录一下 今天看了一下vue
  • C零基础课程-13-关系运算符与关系表达式

    文章目录 C语言中的关系运算符 与 gt 与 lt gt 与 lt 关系表达式的值 初学者常见bug 错写 为 视频地址 https www bilibili com video av73897727 C语言中的关系运算符 C语言中的关系运
  • 不要再用简单的加权平均了 用回归做融合吧

  • 「总结」最全2万字长文解读7大方向人脸数据集v2.0版

    人脸图像是计算机视觉领域中研究历史最久 也是应用最广泛的图像 从人脸检测 人脸识别 人脸的年龄表情等属性识别 到人脸的三维重建等 都有非常多的数据集被不断整理提出 极大地促进了该领域的发展 本次 我们从人脸检测 关键点检测 人脸识别 人脸属
  • 【多模态】22、UniDetector

    文章目录 一 背景 二 方法 2 1 UniDetector 框架结构 2 2 Heterogeneous Label Space Training 2 3 open world inference 三 效果 3 1 数据集 3 2 Obj
  • cmake:target属性POSITION_INDEPENDENT_CODE和INTERFACE_POSITION_INDEPENDENT_CODE的区别

    cmake定义的target有两个名字类似的属性 POSITION INDEPENDENT CODE和INTERFACE POSITION INDEPENDENT CODE 本文说明它们的含义和区别 fPIC 介绍POSITION INDE
  • linux ALSA & ASOC (3) — widget 、route

    目录 DAPM的基本单元widget widget的种类 widget之间的连接器path widget的连接关系route 上一篇文章中 我们介绍了音频驱动中对基本控制单元的封装 kcontrol 利用kcontrol 我们可以完成对音频