当前位置: 首页 > news >正文

网站开发介绍ppt建设一个电影网站需要多少钱

网站开发介绍ppt,建设一个电影网站需要多少钱,大型网站开发语言框架工具,wordpress 详情页【ASOC全解析#xff08;三#xff09;】machine原理和实战 一、machine概述与原理1.1 machine的主要职责1.2 本文的主要内容 二、machine程序示例完整的machine驱动代码示例扩展知识#xff1a;SND_SOC_DAILINK_DEFS使用方法说明总结与其它说明 /*************************… 【ASOC全解析三】machine原理和实战 一、machine概述与原理1.1 machine的主要职责1.2 本文的主要内容 二、machine程序示例完整的machine驱动代码示例扩展知识SND_SOC_DAILINK_DEFS使用方法说明总结与其它说明 /*****************************************************************************************************************/ 声明: 本博客内容均由https://blog.csdn.net/weixin_47702410原创转载or引用请注明出处谢谢! 创作不易如果文章对你有帮助麻烦点赞 收藏支持~感谢 /*****************************************************************************************************************/ 一、machine概述与原理 在ASOC中Machine层也称为“机器层”或“板级层”是ASoC架构中负责将Codec和Platform层连接起来的部分。它是ASoC中与硬件平台相关的部分通常包含了特定于机器如开发板或产品的音频路由和控制逻辑。 1.1 machine的主要职责 Machine层的主要职责包括 定义音频路径Machine层定义了音频数据在系统中的流动路径。这包括输入如麦克风和输出如扬声器设备的连接方式以及它们如何与Codec设备进行交互。 控制音频接口Machine层负责管理和配置音频接口例如I2S、PCM、AC97等这些接口用于在Codec和SoC之间传输音频数据。 音频路由和混音Machine层定义了音频信号的路由例如将哪个音频输入路由到哪个输出以及如何混合不同的音频源。 DAPMDynamic Audio Power Management配置Machine层配置DAPM策略以便在不使用某些音频组件时关闭它们的电源从而节省能源。 板级初始化代码Machine层包含了特定于机器的初始化代码这些代码在系统启动时执行用于初始化音频硬件和ASoC组件。 提供用户空间接口Machine层通过ALSA提供了用户空间接口允许应用程序控制音频硬件例如调整音量、改变音频路由等。 Machine层通常是由设备制造商或社区开发者针对特定硬件平台编写的因为它需要详细了解硬件的音频架构和功能。在Linux内核源代码中Machine层的代码通常位于sound/soc/目录下的与特定板相关的子目录中。 Machine层的实现通常涉及到编写一个Machine驱动这个驱动会注册一个snd_soc_card结构该结构描述了音频卡的各种属性包括DAIDigital Audio Interface链接、Codec信息、平台信息以及DAPM路由等。这个驱动还会处理与音频相关的平台特定事件比如耳机插入检测或按钮控制等。 1.2 本文的主要内容 本文针对DAI的连接为主进行相关的实践。即将所有组件驱动程序例如Codec端、platform端和 DAI粘合在一起的代码。 其它功能会关联ALSA Core层或者DAPM或者指定硬件相关的知识后续有时间再另作文章介绍。 二、machine程序示例 针对DAI的连接主要是有三个步骤 1、定义DAI_Link连接codec和platform2、定义声卡需要定义snd_soc_card3、注册声卡 上面的这三点主要是调用API函数snd_soc_register_card完成这个函数很重要但内容较多后续有时间再出一版文章详细说明 完整的machine驱动代码示例 #include linux/init.h #include linux/module.h #include linux/platform_device.h #include sound/pcm.h #include sound/pcm_params.h #include sound/soc.hSND_SOC_DAILINK_DEFS(mycodec,DAILINK_COMP_ARRAY(COMP_CPU(myplat.0)),DAILINK_COMP_ARRAY(COMP_CODEC(my_codec.0, my_codec_dai)),DAILINK_COMP_ARRAY(COMP_PLATFORM(myplat.0)));static int my_card_init(struct snd_soc_pcm_runtime *rtd) {printk(%s,line:%d\n,__func__,__LINE__);return 0; }static int my_card_hw_params(struct snd_pcm_substream *substream,struct snd_pcm_hw_params *params) {struct snd_soc_pcm_runtime *rtd substream-private_data;//struct snd_soc_dai *codec_dai rtd-codec_dai;struct snd_soc_card *card rtd-card;unsigned int freq;//int ret;int stream_flag;printk(%s,line:%d\n,__func__,__LINE__);switch (params_rate(params)) {case 8000:case 12000:case 16000:case 24000:case 32000:case 48000:case 96000:case 192000:freq 24576000;break;case 11025:case 22050:case 44100:freq 22579200;break;default:dev_err(card-dev, invalid rate setting\n);return -EINVAL;}/* the substream type: 0-playback, 1-capture */stream_flag substream-stream;return 0; }static struct snd_soc_ops my_card_ops {.hw_params my_card_hw_params, };static struct snd_soc_dai_link my_card_dai_link[] {{.name my-codec,.stream_name MY-CODEC,SND_SOC_DAILINK_REG(mycodec), /*SND_SOC_DAILINK_REG(mycodec)等效于.codec_name my_codec.0,.codec_dai_name my_codec_dai,.cpu_dai_name myplat.0,.platform_name myplat.0, */.init my_card_init,.ops my_card_ops,}, };static struct snd_soc_card snd_soc_my_card {.name my-codec,.owner THIS_MODULE,.dai_link my_card_dai_link,.num_links ARRAY_SIZE(my_card_dai_link), };static int mymachine_probe(struct platform_device *pdev) {int ret 0;struct snd_soc_card *card snd_soc_my_card;printk(-----%s----\n,__func__);/* register the soc card */card-dev pdev-dev;ret snd_soc_register_card(card);if (ret 0) {dev_err(pdev-dev, snd_soc_register_card failed %d\n, ret);return -1;}return ret; }static int mymachine_remove(struct platform_device *pdev){printk(-----%s----\n,__func__);return 0; }static void mymachine_pdev_release(struct device *dev){printk(-----%s----\n,__func__); }static struct platform_device mymachine_pdev {.name mymachine,.dev.release mymachine_pdev_release, };static struct platform_driver mymachine_pdrv {.probe mymachine_probe,.remove mymachine_remove,.driver {.name mymachine,}, };static int __init mymachine_init(void) {int ret;ret platform_device_register(mymachine_pdev);if (ret)return ret;ret platform_driver_register(mymachine_pdrv);if (ret)platform_device_unregister(mymachine_pdev);return ret; }static void __exit mymachine_exit(void) {platform_driver_unregister(mymachine_pdrv);platform_device_unregister(mymachine_pdev); }module_init(mymachine_init); module_exit(mymachine_exit); MODULE_LICENSE(GPL); 扩展知识SND_SOC_DAILINK_DEFS 从Linux 5.x开始Linux使用宏SND_SOC_DAILINK_REG快捷定义DAI_LINK中的有关codec和platform连接关系。 其本质和5.x之前的版本并无实质的变化仅是在形式上采用了一种更加便捷的定义方法。相关源码主要参考“linux/v5.10.177/source/include/sound/soc.h“ 本小节主要扩展解释一下下面的语句 SND_SOC_DAILINK_DEFS(mycodec,DAILINK_COMP_ARRAY(COMP_CPU(myplat.0)),DAILINK_COMP_ARRAY(COMP_CODEC(my_codec.0, my_codec_dai)),DAILINK_COMP_ARRAY(COMP_PLATFORM(myplat.0)));SND_SOC_DAILINK_REG(mycodec),SND_SOC_DAILINK_DEFS的定义如下 #define SND_SOC_DAILINK_DEFS(name, cpu, codec, platform...) \SND_SOC_DAILINK_DEF(name##_cpus, cpu); \SND_SOC_DAILINK_DEF(name##_codecs, codec); \SND_SOC_DAILINK_DEF(name##_platforms, platform)代入得到 #define SND_SOC_DAILINK_DEFS(mycodec, COMP_CPU(myplat.0), COMP_CODEC(my_codec.0, my_codec_dai), COMP_PLATFORM(myplat.0)) \ //...再展开上面的三个宏可以得到 #define SND_SOC_DAILINK_DEFS(mycodec, { .dai_name myplat.0, }, { .name my_codec.0, .dai_name my_codec_dai, }, { .name myplat.0 }) \ //...将上面的结果完整代入SND_SOC_DAILINK_DEF即可以得到完整的SND_SOC_DAILINK_DEFS展开结果 SND_SOC_DAILINK_DEF(mycodec_cpus, { .dai_name myplat.0, }); \SND_SOC_DAILINK_DEF(mycodec_codecs, { .name my_codec.0, .dai_name my_codec_dai, }); \SND_SOC_DAILINK_DEF(mycodec_platforms, { .name myplat.0 })进一步代入SND_SOC_DAILINK_DEF可以得到 static struct snd_soc_dai_link_component mycodec_cpus[] { .dai_name myplat.0, };static struct snd_soc_dai_link_component mycodec_codecs[] {.name my_codec.0, .dai_name my_codec_dai, };static struct snd_soc_dai_link_component mycodec_platforms[] {.name myplat.0 };使用方法说明 使用方法 SND_SOC_DAILINK_REG(name),这个宏展开后如下 .cpus mycodec_cpus,.num_cpus ARRAY_SIZE(mycoded_cpus),.codecs mycodec_codecs,.num_codecs ARRAY_SIZE(mycodec_codecs),.platforms mycodec_platforms,.num_platforms ARRAY_SIZE(mycodec_platforms),总结与其它说明 SND_SOC_DAILINK_DEFS(mycodec,DAILINK_COMP_ARRAY(COMP_CPU(myplat.0)),DAILINK_COMP_ARRAY(COMP_CODEC(my_codec.0, my_codec_dai)),DAILINK_COMP_ARRAY(COMP_PLATFORM(myplat.0)));static struct snd_soc_dai_link my_card_dai_link[] {{.name my-codec,.stream_name MY-CODEC,SND_SOC_DAILINK_REG(mycodec),.init my_card_init,.ops my_card_ops,}, };//*************************************************************** //最终展开是 static struct snd_soc_dai_link_component mycodec_cpus[] { .dai_name myplat.0, };static struct snd_soc_dai_link_component mycodec_codecs[] {.name my_codec.0, .dai_name my_codec_dai, };static struct snd_soc_dai_link_component mycodec_platforms[] {.name myplat.0 };static struct snd_soc_dai_link my_card_dai_link[] {{.name my-codec,.stream_name MY-CODEC,.cpus mycodec_cpus,.num_cpus ARRAY_SIZE(mycodec_cpus),.codecs mycodec_codecs,.num_codecs ARRAY_SIZE(mycodec_codecs),.platforms mycodec_platforms,.num_platforms ARRAY_SIZE(mycodec_platforms),.init my_card_init,.ops my_card_ops,}, };其它说明 Linux源码中也另外提供了三种DAI_Link的定义方式下面直接分析其内容的含义,先看Linux官方的说明 //include/sound/soc.h /** Sample 1 : Single CPU/Codec/Platform** SND_SOC_DAILINK_DEFS(test,* DAILINK_COMP_ARRAY(COMP_CPU(cpu_dai)),* DAILINK_COMP_ARRAY(COMP_CODEC(codec, codec_dai)),* DAILINK_COMP_ARRAY(COMP_PLATFORM(platform)));** struct snd_soc_dai_link link {* ...* SND_SOC_DAILINK_REG(test),* };** Sample 2 : Multi CPU/Codec, no Platform** SND_SOC_DAILINK_DEFS(test,* DAILINK_COMP_ARRAY(COMP_CPU(cpu_dai1),* COMP_CPU(cpu_dai2)),* DAILINK_COMP_ARRAY(COMP_CODEC(codec1, codec_dai1),* COMP_CODEC(codec2, codec_dai2)));** struct snd_soc_dai_link link {* ...* SND_SOC_DAILINK_REG(test),* };** Sample 3 : Define each CPU/Codec/Platform manually** SND_SOC_DAILINK_DEF(test_cpu,* DAILINK_COMP_ARRAY(COMP_CPU(cpu_dai1),* COMP_CPU(cpu_dai2)));* SND_SOC_DAILINK_DEF(test_codec,* DAILINK_COMP_ARRAY(COMP_CODEC(codec1, codec_dai1),* COMP_CODEC(codec2, codec_dai2)));* SND_SOC_DAILINK_DEF(test_platform,* DAILINK_COMP_ARRAY(COMP_PLATFORM(platform)));** struct snd_soc_dai_link link {* ...* SND_SOC_DAILINK_REG(test_cpu,* test_codec,* test_platform),* };** Sample 4 : Sample3 without platform** struct snd_soc_dai_link link {* ...* SND_SOC_DAILINK_REG(test_cpu,* test_codec);* };*/这段注释提供了几个示例来说明如何使用SND_SOC_DAILINK_DEFS和SND_SOC_DAILINK_REG宏来定义和注册SoC音频dailink。一个dailink通常包含一个CPUDMA引擎一个或多个编解码器以及一个平台音频控制器硬件。 下面是每个示例的解释 示例 1单个CPU/Codec/Platform SND_SOC_DAILINK_DEFS(test,DAILINK_COMP_ARRAY(COMP_CPU(cpu_dai)),DAILINK_COMP_ARRAY(COMP_CODEC(codec, codec_dai)),DAILINK_COMP_ARRAY(COMP_PLATFORM(platform)));这个示例展示了如何定义一个包含单个CPU、Codec和Platform的dailink。SND_SOC_DAILINK_DEFS宏用于创建三个数组test_cpus、test_codecs和test_platforms每个数组包含一个组件。 struct snd_soc_dai_link link {...SND_SOC_DAILINK_REG(test), };然后SND_SOC_DAILINK_REG宏用于在snd_soc_dai_link结构体中注册这些组件。 示例 2多个CPU/Codec没有Platform SND_SOC_DAILINK_DEFS(test,DAILINK_COMP_ARRAY(COMP_CPU(cpu_dai1),COMP_CPU(cpu_dai2)),DAILINK_COMP_ARRAY(COMP_CODEC(codec1, codec_dai1),COMP_CODEC(codec2, codec_dai2)));这个示例展示了如何定义一个包含多个CPU和Codec但没有Platform的dailink。SND_SOC_DAILINK_DEFS宏创建了两个数组test_cpus和test_codecs每个数组包含两个组件。 struct snd_soc_dai_link link {...SND_SOC_DAILINK_REG(test), };SND_SOC_DAILINK_REG宏在这里假定Platform是空的并在snd_soc_dai_link结构体中注册CPU和Codec组件。 示例 3手动定义每个CPU/Codec/Platform SND_SOC_DAILINK_DEF(test_cpu,DAILINK_COMP_ARRAY(COMP_CPU(cpu_dai1),COMP_CPU(cpu_dai2))); SND_SOC_DAILINK_DEF(test_codec,DAILINK_COMP_ARRAY(COMP_CODEC(codec1, codec_dai1),COMP_CODEC(codec2, codec_dai2))); SND_SOC_DAILINK_DEF(test_platform,DAILINK_COMP_ARRAY(COMP_PLATFORM(platform)));这个示例展示了如何手动定义每个CPU、Codec和Platform组件。SND_SOC_DAILINK_DEF宏用于创建三个独立的数组。 struct snd_soc_dai_link link {...SND_SOC_DAILINK_REG(test_cpu,test_codec,test_platform), };然后SND_SOC_DAILINK_REG宏用于在snd_soc_dai_link结构体中注册这些组件。 示例 4没有Platform的示例3 struct snd_soc_dai_link link {...SND_SOC_DAILINK_REG(test_cpu,test_codec); };这个示例与示例3类似但它省略了Platform组件。SND_SOC_DAILINK_REG宏在这里只注册CPU和Codec组件。 这些示例展示了如何灵活地使用宏来定义和注册不同配置的dailinks这对于SoC音频驱动的开发非常重要。
http://www.hkea.cn/news/14430422/

相关文章:

  • 鞍山企业做网站wordpress插件推挤
  • 网站做优化效果怎样一个人0资金怎么创业
  • 莞城微信网站建设处网站的建设
  • 2017最新网站设计风格工作室主题网站
  • 如何与知名网站做友情链接东莞人才网智通
  • 临沂做网站推广的公司哪家好怎么搭建购物网站
  • 国内net开发的网站建设企业网站的宣传功能体现在哪里
  • 兼职网站开发需求北京网站建设技术
  • 61制作工厂网站郑州seo技术代理
  • 动易企业网站私人做网站需要多少钱
  • 网站开发费用国家标准建设品牌公司网站
  • html5响应式网站源码安庆市住房和建设厅网站首页
  • 有的域名怎样做网站wordpress修改底部联系QQ
  • 怎么建网站青州问枫网站改版 理论
  • 刚做网站和搜出来的不一样注册网站邮箱格式怎么写
  • 手机可以搭建网站吗wordpress酒店
  • 如何查找网站的死链接建手机网站一年费用
  • 行业协会网站建设方案网站设计与建设的
  • 深圳企业做网站公司有哪些建筑工程造价网
  • 网站做标签阿里云建站售前咨询
  • 效果图网站模板123网页浏览器
  • 做网站项目的心得网站建设插件代码大全
  • 郑州企业网站如何建设红河优才网站建设
  • 网站百度收录秒收方法seo实战培训课程
  • 网站建设有什么优势网站优化的论文
  • 2023年php凉透了关键词优化推广排名
  • 营销网站占用多少m空间个人网站建设法律规定
  • 短视频网站的动画是怎么做的北京赛车网站开发多少钱
  • 网站的更新与维护wordpress阿里云建站
  • 可以做图的网站跑腿网站建设