alsa driver--card
1.创建声卡
snd_card是对声卡硬件抽象出来的结构体,几乎所有与声音相关的逻辑设备都是在snd_card的管理之下,声卡驱动的第一个动作通常就是创建一个snd_card结构体。
我们可以通过调用snd_card_new来创建一个snd_card结构体。
struct snd_card *card; int err; err = snd_card_new(&pci->dev, index, id, module, extra_size, &card);
/**
* snd_card_new - create and initialize a soundcard structure
* @parent: the parent device object
* @idx: card index (address) [0 ... (SNDRV_CARDS-1)]
* @xid: card identification (ASCII string)
* @module: top level module for locking
* @extra_size: allocate this extra size after the main soundcard structure
* @card_ret: the pointer to store the created card instance
*/
int snd_card_new(struct device *parent, int idx, const char *xid, struct module *module, int extra_size, struct snd_card **card_ret)
这里extra_size是为card->private_data分配的内存大小。通常private_data保存chip-specifc data.
2.创建声卡的芯片专用数据
chip-specific data包含I/O port address, its resource pointer, or the irq number等信息。
有两种方法可以来分配chip specific data.
1).通过snd_card_new实现:
struct mychip {struct snd_card *card;....};
err = snd_card_new(&pci->dev, index[dev], id[dev], THIS_MODULE,sizeof(struct mychip), &card);
struct mychip *chip = card->private_data;
chip->card = card;
在snd_card_new中分配chip。并将chip和card关联起来。card结构中的private_data就是chip,chip中又包含card。
2).通过snd_device_new来将chip作为一个低阶device注册到card上。
在snd_device_new中指定extra_size为0.
struct snd_card *card;struct mychip *chip;err = snd_card_new(&pci->dev, index[dev], id[dev], THIS_MODULE,0, &card);.....chip = kzalloc(sizeof(*chip), GFP_KERNEL);
chip->card = card;
static struct snd_device_ops ops = {.dev_free = snd_mychip_dev_free,};....snd_device_new(card, SNDRV_DEV_LOWLEVEL, chip, &ops);
static int snd_mychip_dev_free(struct snd_device *device){return snd_mychip_free(device->device_data);}
/**
* snd_device_new - create an ALSA device component
* @card: the card instance
* @type: the device type, SNDRV_DEV_XXX
* @device_data: the data pointer of this device
* @ops: the operator table
*/
int snd_device_new(struct snd_card *card, enum snd_device_type type,
void *device_data, struct snd_device_ops *ops)
snd_device_new不为芯片专用数据device_data分配空间,因此在调用之前,必须为芯片专用分配空间,在ops的dev_free中定义析构函数对芯片专用数据进行析构。dev_free会在调用snd_card_free时自动调用。对于用户自定义的 device, type可以使用SNDRV_DEV_LOWLEVEL。
snd_mychip_dev_free()
是用来free前面kzmalloc的空间。
3.设置声卡驱动名字和声卡名字。
strcpy(card->driver, "My Chip"); strcpy(card->shortname, "My Own Chip 123"); sprintf(card->longname, "%s at 0x%lx irq %i",card->shortname, chip->ioport, chip->irq);
.每一种部件的创建最终会调用snd_device_new()来生成一个snd_device实例,并把该实例链接到snd_card的devices链表中。
通常,alsa-driver的已经提供了一些常用的部件的创建函数,而不必直接调用snd_device_new(),比如: snd_pcm_new()
5.注册声卡
err = snd_card_register(card);if (err < 0) {snd_card_free(card);return err;}
具体声卡创建的例子可参考sound/sparc/amd9730.c
转载于:https://www.cnblogs.com/fellow1988/p/6198770.html
alsa driver--card相关推荐
- MT6737 Android N 平台 Audio系统学习----ALSA Driver
1.ALSA简述 ALSA是Advanced Linux Sound Architecture 的缩写,目前已经成为了linux的主流音频体系结构,在内核设备驱动层,ALSA提供了alsa-dri ...
- mt6735 ALSA Driver内部功放如何切到CLASSD
[DESCRIPTION] MT6735 ALSA Driver内部功放如何切到CLASSD [SOLUTION] 请直接修改mTK_soc_codec_63xx.c static int Speak ...
- Writing an ALSA Driver(二)
前言 本文档介绍了如何编写ALSA(高级Linux声音体系结构)驱动程序.该文档主要关注PCI声卡.对于其他设备类型,API也可能不同.但是,至少ALSA内核API是一致的,因此编写它们仍然会有所帮助 ...
- Linux ALSA 之八:ALSA ASOC Platform Driver
ALSA ASOC Platform Driver 一.Platform 驱动作用 二.ASOC Platform Driver 代码分析 2.1 Linux Platform Driver & ...
- ALSA ASOC
1 ALSA 1.1 架构简述 ALSA是Advanced Linux Sound Architecture 的缩写, 官网 : http://www.alsa-project.or ...
- Linux ALSA 之二:ALSA 声卡与设备
ALSA 声卡与设备 一.ALSA Sound 初始化 1.alsa_sound_init() 入口函数 2.init_soundcore() 入口函数 二.声卡结构体与创建.注册 1.struct ...
- Android中使用ALSA声卡
Android中使用ALSA声卡 首先,cd到Android源码树根目录下: cd /home/figo/android/Android-2.0 从Android主页下载ALSA声卡的相关源码: gi ...
- Linux ALSA 之五:ALSA Proc Info
ALSA Proc Info 一.概述 二.Proc Files of Alsa Driver 1./proc/asound/xxx 简述 2.创建 /proc/asound 目录树 2.1 /pro ...
- Linux ALSA声卡驱动之八:ASoC架构中的Platform
1. Platform驱动在ASoC中的作用 前面几章内容已经说过,ASoC被分为Machine,Platform和Codec三大部件,Platform驱动的主要作用是完成音频数据的管理,最终通过C ...
- alsa与PulseAudio
alsa包括alsa driver, alsa lib等 pulse audio可以使用alsa driver或者其他驱动接口,实现的一个比alsa lib更加强大的音频服务程序. 如果做语音,回声消 ...
最新文章
- 深入理解Spring系列之三:BeanFactory解析
- 白帽渗透测试的36条军规
- Python基础教程:列表字典的键值修改
- 美国计算机科学发展,美国计算机工程发展现状
- python实现数字时钟_Python 写的全屏数字时钟软件,看看还有什么改进的地方
- 大锅菜机器人_炒菜机或者炒菜机器人有好用的吗 - 玩主论坛
- 用AutoML找到更小、更快、更好的模型,谷歌开源Model Search
- javabean反射改字段内容_JSP第三篇「JavaBean的介绍、JSP的行为--JavaBean」(修订版)...
- 转载】JQuery中如何传递参数如click(),change()等具体实现
- lodash源码分析之baseFindIndex中的运算符优先级
- @RequestBody 接收数组、List 参数、@Deprecated 标记废弃方法
- 深入理解原型和原型链
- 前端开发工具Axure——Axure原型图查看
- 计算机策略组怎么设置,怎么设置win7系统中的组策略
- C++ 求100的阶乘
- 写大论文的一些注意事项(续):我是如何找到创新点的?
- 强大好用的python绘图
- 关于程序状态字寄存器PSW(Program Status Word)与多核多线程
- VAULT高可用集群部署
- 关于solarwinds的一些介绍
热门文章
- Hibernate HQL查询(2)
- Ubuntu 10不能通过改source.list装JDK 1.6
- linux之vi,vim命令
- 在线正则表达式可视化工具
- timestamp和recycle同时开启,导致连接成功率降低
- Codeforces Round #360 (Div. 2) C. NP-Hard Problem 水题
- 关于JDK中的集合总结(二)
- Needle in a haystack: efficient storage of billions of photos 【转】
- windows加域后的问题
- Android中文API(134) —— Account