声卡的操作实质剖析1


看看snd_soc_new_pcms(socdev, SNDRV_DEFAULT_IDX1, SNDRV_DEFAULT_STR1);

对于每个声卡都得调用这个函数,并且参数都是如此,所以这个函数式共性的。

这个函数第一个函数ret = snd_card_create(idx, xid, codec->owner, 0, &codec->card);

1、分配:struct snd_card *card;         card = kzalloc(sizeof(*card) + extra_size, GFP_KERNEL);

2、申请该卡snd_card的id号:if (!slots[idx2] || !*slots[idx2])  idx = idx2;

3、锁住申请的id号:snd_cards_lock |= 1 << idx; 

4、设置snd_card结构体:card->number = idx;card->module = module;

INIT_LIST_HEAD(&card->devices);

INIT_LIST_HEAD(&card->controls);

INIT_LIST_HEAD(&card->ctl_files);

5、把该snd_card当成设备放入链表:

err = snd_ctl_create(card);

         static struct snd_device_ops ops = {....}

         snd_device_new(card, SNDRV_DEV_CONTROL, card, &ops);//类型SNDRV_DEV_CONTROL

                 struct snd_device *dev;

                 dev = kzalloc(sizeof(*dev), GFP_KERNEL);

                  dev->card = card;

                   dev->type = type;  //SNDRV_DEV_CONTROL

                  dev->device_data = device_data;//snd_card

                  dev->ops = ops;//该设备的操作函数,也就是snd_card

                   list_add(&dev->list, &card->devices);//放入链表

6、创建proc文件:err = snd_info_card_create(card);

7、使得codec->card指向我们设置好的snd_card:*card_ret = card;

8、最终将通过某个函数吧链表的设备都会注册到内核: snd_ctl_dev_register(struct snd_device *device)

在/dev将生成controlC0设备节点:

snd_register_device(SNDRV_DEVICE_TYPE_CONTROL, card, -1,&snd_ctl_f_ops, card, name);



第二个函数 soc_new_pcm(socdev, &card->dai_link[i], i);

这个要用到定义好的snd_soc_card:

static


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部