asoc widget path route(audio_map)

2023-11-19

上一篇文章中,我们介绍了音频驱动中对基本控制单元的封装: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(使用前将#替换为@)

asoc widget path route(audio_map) 的相关文章

  • 继续在 Matlab 中一遍又一遍地播放声音?

    我正在尝试创建一个 MATLAB 程序来每隔几分钟一遍又一遍地播放声音 现在我将其设置为每隔几秒播放一次 只是为了消除系统中的一些错误 但是 当我的程序尝试重播声音时 我收到此错误 Error using gt audioplayer au
  • 在 Android 媒体播放器上播放 MediaStore 中的音频

    有没有办法通过使用 MediaPLayer 播放从 MediaStore 获得的音频 或者我走的方向完全错误 到目前为止 我已经查看了 MediaStore Audio 但没有什么能真正帮助我 我只需要知道我是否走在正确的轨道上 首先 我假
  • FFT 的功率谱密度

    我有一段代码可以获取部分信号的 FFT 现在我正在尝试获取 PSD Fs 44100 cj sqrt 1 T 6 dt 1 Fs left test 1 right test 2 time 45 interval 636 w range t
  • ffmpeg 命令行,用于使用 Windows 7 从 Decklink 卡捕获(和录制)720p 音频和视频

    我正在尝试使用 Windows 7 720p 从 blackmagic Decklink 捕获卡捕获音频和视频 但我似乎无法正确获取 ffmpeg 命令行设置 ffmpeg list devices true f dshow i 虚拟 ds
  • 如何将 G.726 ADPCM 信号转换为 PCM 信号?

    我通常会使用 SoX 或 Windows 内置的音频库来获取这些内容 但似乎两者都没有 G 726 编解码器 因此 我有一个字节序列 我知道它被编码为 G 726 尽管目前尚不知道比特率以及它是 mu law 还是 A law 实验将确定这
  • 颤振:音频服务。如何播放本地文件?

    我想播放本地文件的播放列表 在android上 没有问题 我可以在Mediaitem id 中添加本地文件并且它可以正常播放 但在 iOS 上它不起作用 我收到这个错误 VERBOSE 2 ui dart state cc 186 Unha
  • 在Java中一个接一个地播放WAV文件

    我正在尝试玩几个WAV http en wikipedia org wiki WAV文件一个接一个 我尝试了这个方法 for String file audioFiles new AePlayWave file start 但这会同时播放它
  • C# 从mp4文件中提取mp3文件

    有没有简单的方法从 mp4 文件中提取 mp3 文件 我已经尝试过更改文件扩展名 但这不允许我编辑 mp3 描述 谢谢你 Use Xabe FFmpeg https xabe net product xabe ffmpeg 它是免费的 非商
  • 如何在 sqlite3 数据库中存储音频文件并在 iphone 中播放它们?

    我想在数据库中存储音频文件 任何支持 mp3 wav 和 iphone 的格式 并在 iPhone 上播放它们 知道如何做到这一点吗 我不知道为什么你想将音频文件存储在 SQL 数据库中 但 sqlite3 支持 BLOB 因此 将它们存储
  • 如何在声音输入时触发振动?

    我正在尝试创建一个 Android 应用程序 在其中过滤蜂鸣声的一个特定频率并使手机振动 我正在从移动设备的 MIC 获取输入并使用 MediaRecorder 类 通过使用该类 我可以录制 保存和播放输入 现在我需要我的手机在发出蜂鸣声
  • 使用 UIImage 和 caf 创建视频文件的问题

    我已经阅读了在互联网上可以找到的所有关于此功能的帖子 并且我在创建视频文件方面取得了一些成功 但我还剩下 3 个问题 而且似乎没有人提到过这一点 我有 3 个问题 视频在某些播放器上无法正常播放 quicktime window 视频只播放
  • 从相机录制视频、叠加位图、添加音频、保存到设备,所有这些都在 as3/AIR mobile 中进行

    我的任务是在移动设备上录制来自摄像头的实时视频流 然后覆盖随时间变化的位图 并将音频 mp3 轨道添加到视频文件中 然后将其保存到设备上的某个位置 例如相机胶卷 我看到了一些有用的帖子 主要是这个 AS3 Flash AIR 使用网络摄像头
  • C# 音频库 [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • AVAudioPlayer 无法从网站播放 m4a 或 mp3 文件类型

    我试图在我的应用程序中找到一个仅纯 m4a 声音的 URL 我有音频的 URL 理论上可以下载它 然后 使用下载的文件URL到声音 我尝试使用AVAudioPlayer播放它 但它不播放任何声音 这是我的代码 在 URL 检索函数中 我调用
  • AUGraphInitialize添加kAudioUnitSubType_Reverb2到AUGraph时出现错误代码-10868

    我正在尝试添加 AudioUnit 类型kAudioUnitSubType Reverb2 to an AUGraph我得到了 10868 kAudioUnitErr FormatNotSupported 支持的错误AUGraphIniti
  • 在网站上不间断地播放 mp3?

    客户请求在整个网站上播放单个曲目 一般来说 我建议不要这样做 但他们坚持这样做 那么 将 Flash 播放器嵌入到网站中并且当用户转到另一个页面时不会出现间隙 中断的最直接方法是什么 我认为需要一个 iframe 我正在使用具有自动恢复功能
  • 在 VB2010 Windows 窗体开始时播放 .wav/.mp3 文件?

    制作 VB2010 已经大约一年了 最近开始突破我可以将哪种媒体合并到我的表单中的界限 但我无法播放 wav 或 mp3 文件 我尝试按照微软和其他编码网站上的教程进行操作 但没有成功 任何帮助 将不胜感激 要播放波形文件 您可以简单地使用
  • Xcode 8.1 beta 3 - AQDefaultDevice 消息 [重复]

    这个问题在这里已经有答案了 从 beta2 开始 在创建音频输出单元后 我每两秒就会收到一条消息 2016 10 14 11 31 21 572479 MyProduct 94063 8294923 aqme 254 AQDefaultDe
  • 在javascript中将.wav文件转换为.ogg

    我正在尝试从浏览器捕获用户的音频输入 我已经用WAV 完成了 但是文件很大 我的一个朋友告诉我 OGG 文件要小得多 有谁知道如何将WAV转换为OGG 我也有原始数据缓冲区 我真的不需要转换 但我只需要 OGG 编码器 这是来自的 WAV
  • 使用 ffmpeg 在一个音频文件中实现多个淡入/淡出效果

    我在向一个音频文件添加多种淡入淡出效果时遇到一些问题 当我尝试使用这样的命令时 ffmpeg y i home user video test sound mp3 af afade t in ss 0 d 3 afade t out st

随机推荐

  • 憨批的语义分割重制版8——Keras 搭建自己的DeeplabV3+语义分割平台

    憨批的语义分割重制版8 Keras 搭建自己的DeeplabV3 语义分割平台 注意事项 学习前言 什么是DeeplabV3 模型 代码下载 DeeplabV3 实现思路 一 预测部分 1 主干网络介绍 2 加强特征提取结构 3 利用特征获
  • 对象数组题目 Student类

    package object oriented02 对象数组题目 定义类的Student 包含三个属性 学号为number 年级为state int 成绩为score int 创建20个学生对象 学号为1到20 年级和成绩都是随机产生 问题
  • 3.Mybatis 注解方式的基本用法

    Mybatis 也可以使用注解开发方式 这样我们就可以减少编写 Mapper映射文件了 下面介绍用户的增删改查 3 1 修改全局配置文件 在mybatis 全局文件中 通过package标签或者mapper标签的class属性加载mappe
  • 安装gcc-arm-none-eabi-10-2020-q4-major-win32工具(NRF52编译ECC加密文件用)

    gcc arm none eabi 10 2020 q4 major win32安装包下载 链接 https pan baidu com s 1NbpyI fQoKvMUuct0hruxA 提取码 ikeu 安装后环境变量配置 C Prog
  • Linux Capabilities

    Linux Capabilities 入门教程 基础实战篇 为了对 root 权限进行更细粒度的控制 实现按需授权 Linux 引入了另一种机制叫capabilities Capabilites 作为线程 Linux 并不真正区分进程和线程
  • Python创建excel,并写入数据

    usr bin env python coding utf 8 from base import pub param import os import xlrd xlwt from openpyxl reader excel import
  • python_matplotlib分别使用plot()和scatter()画散点图,以及如何改变点的大小

    1 使用plot 画散点图 根据关于matplotlip pyplot的官方文档 pyplot 其plot部分的解释plot 的作用是画出线条和线条上的标记 根据pyplot的官方教学文档 Pyplot tutorial 如果不改变其默认设
  • 基于SpringBoot的图书管理系统

    基于SpringBoot的图书管理系统 里面整合了比较全的内容 可以说是麻雀虽小五脏俱全 如果看懂了所有的内容可以说是已经非常精通SpringBoot了 一 引言 由于近期看了SpringBoot 一站式开发特别方便 情不自禁用Spring
  • Java:函数式编程

    函数式编程的意义 复用原有代码快速产出新的功能 面对对象编程抽象数据 而函数式编程抽象行为 Java8 0里通过Lamda表达式和方法应用来支持函数式编程 但是java底层都是以产生匿名对象的方式来完成这样的功能 这个对象有且只有一个方法
  • HTML详解连载(4)

    HTML详解连载 4 专栏链接 link http t csdn cn xF0H3 下面进行专栏介绍 开始喽 CSS定义 书写位置 示例 注意 CSS引入方式 内部样式表 学习使用 外部演示表 开发使用 代码示例 行内样式 代码示例 选择器
  • Qt4----子例化QDialog(可扩展对话框的使用)

    1 linux下安装Qt4请参考如下博文 Qt4在linux下的安装 2 Qt4工程的创建请参考如下博文 Qt4创建工程的几种方法 linux系统 3 可扩展对话框 通过纯代码的形式 建立工程 点击 Detail 按钮 显示扩展对话框 包括
  • 再见,百度网盘!新 60MB/s!

    点击上方卡片 关注回复 青春网盘 即可获得下载链接 近些年 大家苦百度网盘久矣 非会员的限速导致下载速度大多停留再KB为单位 这个问题一直被人吐槽 有关部门规定网盘不许无底线限速 因此百度给出的整改措施是 推出百度网盘青春版 免费用户将享受
  • 【问答21】C语言:位域和字节序

    1 粉丝问题 自己编写的一个协议相关代码 位域的值解析和自己想象的有出入 结构体的头 解析代码和测试结果 就是说通过函数hexdump 解析出的内存是十六进制是 81 83 20 3B 从数据帧解析出的 opcode 0x8 该粉丝不明白为
  • SMB/CIFS--NetBOIS/Browser/NBNS 协议

    在NetBIOS出现之后 Microsoft就使用NetBIOS实现了 一个网络文件 打印服务系统 这个系统基于NetBIOS设定了一套文件共享协议 Microsoft称之为SMB Server Message Block 协议 这个协议被
  • Windows下编译FFmpeg详解

    Windows下编译FFmpeg 2 6 1详解 在诸多网友帮助下终于搞定了FFmpeg V2 6 1 由于编译环境和程序版本的不同 造成了很多不必要的时间浪费 特在此将编译过程和遇到的问题解决方法写出来 以便方便大家 编译环境 PC Wi
  • 文件操作中出现system.notsupportedexception异常

    偶然的用了如下代码 string sourceDoc lt 文件全路径 gt bool isExists File Exists sourceDoc 此时isExists变量得到的值为false 仔细查看了变量sourceDoc的值 确定路
  • springBoot:方法上配置produces = {"application/json;charset=UTF-8"} 参数

    方法上有 produces application json charset UTF 8 去掉方法上面的 produces application json charset UTF 8 之后 定义了返回格式
  • Django笔记

    文章目录 Django笔记 1 Django项目 2 学习笔记 3 仅供参考 第一天 1 项目环境搭建 1 1 cmd 创建项目虚拟环境和指定Django版本 1 2 pycharm 创建项目 虚拟环境文件夹
  • 分析系统 - 使用Python爬虫

    在竞争激烈的市场环境中 了解和分析竞争对手的销售策略和市场表现对于企业的成功至关重要 本文将介绍如何利用Python爬虫建立低成本的销售竞争对手分析系统 探索其方法 工具和好处 并同时解决可能出现的问题 销售竞争对手分析的目标是获取有关竞争
  • asoc widget path route(audio_map)

    上一篇文章中 我们介绍了音频驱动中对基本控制单元的封装 kcontrol 利用kcontrol 我们可以完成对音频系统中的mixer mux 音量控制 音效控制 以及各种开关量的控制 通过对各种kcontrol的控制 使得音频硬件能够按照我