日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

android dummy codec

發布時間:2023/12/18 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 android dummy codec 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

dummy codec

1. 什么情況下需要用到虛擬codec

一般在linux 或者 android 系統中,沒有外掛codec,主控上也沒內置codec,但是外掛了一個i2s、spdif的接口的芯片;
比如說lt9611 ,芯片內置i2s 接口,用于接收主控的i2s 音頻信號,等案例
這個時候就需要一個dummy codec ,掛到平臺上,注冊聲卡出來。

當播放音頻時:主控播放*.wav ----平臺i2s rx ------設備lt9611 i2s —>輸出

2. 虛擬codec 的注冊到平臺的原理

實際上,就是模擬出一個codec,只有codec驅動的框架,在框架里添加codec DAI
codec dai 和平臺dai 在machine 注冊匹配的時候,能夠link上,就會注冊聲卡出來。

3.參考代碼

#include <linux/module.h> #include <linux/platform_device.h> #include <linux/slab.h> #include <sound/core.h> #include <sound/tlv.h> #include <sound/soc.h> #include <sound/soc-dapm.h> #include <sound/initval.h> #include <linux/of.h> #include <sound/soc.h>struct dummy_codec_private {struct platform_device *dummy_codec; };#define DUMMY_CODEC_RATES (SNDRV_PCM_RATE_8000_192000) #define DUMMY_CODEC_FORMATS (SNDRV_PCM_FMTBIT_S16_LE |\SNDRV_PCM_FMTBIT_S24_LE | SNDRV_PCM_FMTBIT_S32_LE)static int dummy_codec_pcm_hw_params(struct snd_pcm_substream *substream,struct snd_pcm_hw_params *params,struct snd_soc_dai *dai) {return 0; }static int dummy_codec_set_dai_fmt(struct snd_soc_dai *codec_dai,unsigned int fmt) {return 0; }static int dummy_codec_mute(struct snd_soc_dai *dai, int mute) {return 0; }#ifdef DUMMY_CODEC_ZYY static const struct snd_soc_dapm_widget dummy_codec_dapm_widgets[] = {/* Output Side *//* DACs */SND_SOC_DAPM_DAC("Left DAC", "HIFI Playback",SND_SOC_NOPM, 0, 0),SND_SOC_DAPM_DAC("Right DAC", "HIFI Playback",SND_SOC_NOPM, 7, 0),/* Output Lines */SND_SOC_DAPM_OUTPUT("LOUTL"),SND_SOC_DAPM_OUTPUT("LOUTR"),};static const struct snd_soc_dapm_route dummy_codec_dapm_routes[] = {{"LOUTL", NULL, "Left DAC"},{"LOUTR", NULL, "Right DAC"}, }; #endifstatic struct snd_soc_dai_ops dummy_codec_ops = {.hw_params = dummy_codec_pcm_hw_params,.set_fmt = dummy_codec_set_dai_fmt,.digital_mute = dummy_codec_mute, };struct snd_soc_dai_driver dummy_codec_dai = {.name = "dummy",//.id = 1,.playback = {.stream_name = "HIFI Playback",.channels_min = 1,.channels_max = 8,.rates = DUMMY_CODEC_RATES,.formats = DUMMY_CODEC_FORMATS,},.capture = {.stream_name = "HIFI Capture",.channels_min = 1,.channels_max = 2,.rates = DUMMY_CODEC_RATES,.formats = DUMMY_CODEC_FORMATS,},.ops = &dummy_codec_ops, };static int dummy_codec_probe(struct snd_soc_component *component) {struct dummy_codec_private *dummy_codec;dummy_codec = snd_soc_component_get_drvdata(component);if(dummy_codec == NULL){pr_err("%s, codec is not registered\n", __func__);printk("zyy.........................%s..................%d",__func__,__LINE__);return 0;}return 0; }static void dummy_codec_remove(struct snd_soc_component *component) { if(component == NULL)printk("zyy.........................%s..................%d",__func__,__LINE__);return; };struct snd_soc_component_driver soc_codec_dev_dummy_codec = {.probe = dummy_codec_probe,.remove = dummy_codec_remove, #ifdef DUMMY_CODEC_ZYY.dapm_widgets = dummy_codec_dapm_widgets,.num_dapm_widgets = ARRAY_SIZE(dummy_codec_dapm_widgets),.dapm_routes = dummy_codec_dapm_routes,.num_dapm_routes = ARRAY_SIZE(dummy_codec_dapm_routes), #endif };static const struct of_device_id dummy_codec_dt_match[] = {{.compatible = "dummy_codec",},{}, };static int dummy_codec_platform_probe(struct platform_device *pdev) {struct dummy_codec_private *dummy_codec;int ret;printk("zyy.........................%s..................%d",__func__,__LINE__);dummy_codec = kzalloc(sizeof(struct dummy_codec_private), GFP_KERNEL);if (dummy_codec == NULL)return -ENOMEM;ret = devm_snd_soc_register_component(&pdev->dev, &soc_codec_dev_dummy_codec,&dummy_codec_dai, 1);if (ret < 0)printk("zyy.........................%s..................%d",__func__,__LINE__);return ret; }static int dummy_codec_platform_remove(struct platform_device *pdev) {snd_soc_unregister_component(&pdev->dev);return 0; }static struct platform_driver dummy_codec_platform_driver = {.driver = {.name = "dummy",.owner = THIS_MODULE,.of_match_table = dummy_codec_dt_match,},.probe = dummy_codec_platform_probe,.remove = dummy_codec_platform_remove, };static int __init dummy_codec_init(void) {return platform_driver_register(&dummy_codec_platform_driver); }static void __exit dummy_codec_exit(void) {platform_driver_unregister(&dummy_codec_platform_driver); }module_init(dummy_codec_init); module_exit(dummy_codec_exit);MODULE_AUTHOR("ZYY, Inc."); MODULE_DESCRIPTION("ASoC dummy_codec driver"); MODULE_LICENSE("GPL");

總結

以上是生活随笔為你收集整理的android dummy codec的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 懂色av一区二区三区四区五区 | 女女爱爱视频 | 麻豆av一区二区三区 | 亚洲精品久久久蜜桃 | 精品一区二区在线免费观看 | 波多野结衣1区2区3区 | 日韩一级黄色 | 久久亚洲精品无码va白人极品 | 亚洲精品97久久中文字幕 | 幸福宝在线观看 | 日韩www| 免费视频91蜜桃 | 99在线小视频 | 在线免费91 | 麻豆视频二区 | 一区二区三区日韩在线 | 在线成人毛片 | 男人喷出精子视频 | 一级少妇精品久久久久久久 | 久久av喷吹av高潮av萌白 | 熟妇五十路六十路息与子 | 999国产| 免费观看的黄色网址 | 亚洲精品国产a | 进去里视频在线观看 | 羞羞的视频网站 | 91视频国产免费 | 不卡视频在线观看免费 | 久久国产露脸精品国产 | 亚洲欧洲视频在线观看 | av网址在线免费观看 | 国产精品你懂得 | 香蕉久久久 | 婷婷视频一区二区三区 | 91制服诱惑 | 国产素人在线观看 | 性色欲情网站iwww九文堂 | 国产精品国产三级国产普通话蜜臀 | 爱爱视频网 | 日韩精品一二三区 | 中文av网站| 一级在线 | 国产麻豆一精品一av一免费 | 一区二区三区视频播放 | 欧美色图中文字幕 | 九九热视频免费 | 日韩黄色大片 | 偷偷操网站 | 国产一区二区在线播放 | www中文字幕在线观看 | 黑色丝袜吻戏亲胸摸腿 | 91精品一区二区三区综合在线爱 | 久草综合网 | 最新在线视频 | 麻豆人妻少妇精品无码专区 | 亚洲宅男天堂 | av在线免费观看网站 | 殴美黄色大片 | 日韩一区av在线 | 99亚洲天堂 | 日本美女日批视频 | 小说肉肉视频 | 国产一级二级视频 | 午夜在线观看影院 | 男女瑟瑟网站 | 日本高清免费视频 | 午夜激情在线视频 | 日韩大片一区 | 大肉大捧一进一出好爽 | 久久婷婷av| 福利在线影院 | 一级片99| jizz在线播放 | av在线网页 | 国产一区二区在线观看免费 | 免费观看日批视频 | 日韩激情视频网站 | 另类国产 | zoo性欧美| 男人的天堂avav | 午夜偷拍福利 | 成人免费视频大全 | 丰满熟妇乱又伦 | 中文字幕一区二区免费 | 亚洲人视频在线观看 | 精品国产高清在线观看 | 欧美成年人视频在线观看 | 三区在线 | 尤物一区 | 性——交——性——乱免费的 | 北条麻妃一区二区三区 | 艳母在线视频 | 日韩高清av在线 | 91手机在线观看 | 正在播放adn156松下纱荣子 | 91草视频| 欧美性xxxxx极品少妇 | avxx| 五月开心激情 |