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);
 4.创建声卡功能部件,如PCM,mixer, MIDI
.每一种部件的创建最终会调用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相关推荐

  1. MT6737 Android N 平台 Audio系统学习----ALSA Driver

    1.ALSA简述   ALSA是Advanced Linux Sound Architecture 的缩写,目前已经成为了linux的主流音频体系结构,在内核设备驱动层,ALSA提供了alsa-dri ...

  2. mt6735 ALSA Driver内部功放如何切到CLASSD

    [DESCRIPTION] MT6735 ALSA Driver内部功放如何切到CLASSD [SOLUTION] 请直接修改mTK_soc_codec_63xx.c static int Speak ...

  3. Writing an ALSA Driver(二)

    前言 本文档介绍了如何编写ALSA(高级Linux声音体系结构)驱动程序.该文档主要关注PCI声卡.对于其他设备类型,API也可能不同.但是,至少ALSA内核API是一致的,因此编写它们仍然会有所帮助 ...

  4. Linux ALSA 之八:ALSA ASOC Platform Driver

    ALSA ASOC Platform Driver 一.Platform 驱动作用 二.ASOC Platform Driver 代码分析 2.1 Linux Platform Driver & ...

  5. ALSA ASOC

    1       ALSA 1.1    架构简述 ALSA是Advanced Linux Sound Architecture 的缩写, 官网 : http://www.alsa-project.or ...

  6. Linux ALSA 之二:ALSA 声卡与设备

    ALSA 声卡与设备 一.ALSA Sound 初始化 1.alsa_sound_init() 入口函数 2.init_soundcore() 入口函数 二.声卡结构体与创建.注册 1.struct ...

  7. Android中使用ALSA声卡

    Android中使用ALSA声卡 首先,cd到Android源码树根目录下: cd /home/figo/android/Android-2.0 从Android主页下载ALSA声卡的相关源码: gi ...

  8. Linux ALSA 之五:ALSA Proc Info

    ALSA Proc Info 一.概述 二.Proc Files of Alsa Driver 1./proc/asound/xxx 简述 2.创建 /proc/asound 目录树 2.1 /pro ...

  9. Linux ALSA声卡驱动之八:ASoC架构中的Platform

    1.  Platform驱动在ASoC中的作用 前面几章内容已经说过,ASoC被分为Machine,Platform和Codec三大部件,Platform驱动的主要作用是完成音频数据的管理,最终通过C ...

  10. alsa与PulseAudio

    alsa包括alsa driver, alsa lib等 pulse audio可以使用alsa driver或者其他驱动接口,实现的一个比alsa lib更加强大的音频服务程序. 如果做语音,回声消 ...

最新文章

  1. 深入理解Spring系列之三:BeanFactory解析
  2. 白帽渗透测试的36条军规
  3. Python基础教程:列表字典的键值修改
  4. 美国计算机科学发展,美国计算机工程发展现状
  5. python实现数字时钟_Python 写的全屏数字时钟软件,看看还有什么改进的地方
  6. 大锅菜机器人_炒菜机或者炒菜机器人有好用的吗 - 玩主论坛
  7. 用AutoML找到更小、更快、更好的模型,谷歌开源Model Search
  8. javabean反射改字段内容_JSP第三篇「JavaBean的介绍、JSP的行为--JavaBean」(修订版)...
  9. 转载】JQuery中如何传递参数如click(),change()等具体实现
  10. lodash源码分析之baseFindIndex中的运算符优先级
  11. @RequestBody 接收数组、List 参数、@Deprecated 标记废弃方法
  12. 深入理解原型和原型链
  13. 前端开发工具Axure——Axure原型图查看
  14. 计算机策略组怎么设置,怎么设置win7系统中的组策略
  15. C++ 求100的阶乘
  16. 写大论文的一些注意事项(续):我是如何找到创新点的?
  17. 强大好用的python绘图
  18. 关于程序状态字寄存器PSW(Program Status Word)与多核多线程
  19. VAULT高可用集群部署
  20. 关于solarwinds的一些介绍

热门文章

  1. Hibernate HQL查询(2)
  2. Ubuntu 10不能通过改source.list装JDK 1.6
  3. linux之vi,vim命令
  4. 在线正则表达式可视化工具
  5. timestamp和recycle同时开启,导致连接成功率降低
  6. Codeforces Round #360 (Div. 2) C. NP-Hard Problem 水题
  7. 关于JDK中的集合总结(二)
  8. Needle in a haystack: efficient storage of billions of photos 【转】
  9. windows加域后的问题
  10. Android中文API(134) —— Account