alsa音频架构1 (六)

2014-11-24 02:34:44 · 作者: · 浏览: 22
lass, card->dev,MKDEV(0, 0), card,"card%i", card->number);
if (IS_ERR(card->card_dev))
card->card_dev = NULL;
}

if ((err = snd_device_register_all(card)) < 0) //-->1.1.注册所有的声卡设备
return err;
mutex_lock(&snd_card_mutex);
if (snd_cards[card->number]) { //判断对应数组项是否已给占用"/sound/core/init.c" struct snd_card *snd_cards[SNDRV_CARDS];
mutex_unlock(&snd_card_mutex);
return 0;
}
snd_card_set_id_no_lock(card, card->id[0] == '\0' NULL : card->id);
snd_cards[card->number] = card; //填充全局snd_cards数组
mutex_unlock(&snd_card_mutex);
init_info_for_card(card); //proc接口
#if defined(CONFIG_SND_MIXER_OSS) || defined(CONFIG_SND_MIXER_OSS_MODULE)
if (snd_mixer_oss_notify_callback)
snd_mixer_oss_notify_callback(card, SND_MIXER_OSS_NOTIFY_REGISTER);
#endif
if (card->card_dev) { //创建属性文件
err = device_create_file(card->card_dev, &card_id_attrs);
if (err < 0)
return err;
err = device_create_file(card->card_dev, &card_number_attrs);
if (err < 0)
return err;
}

return 0;
}
EXPORT_SYMBOL(snd_card_register);

int snd_card_register(struct snd_card *card)
{
int err;
if (snd_BUG_ON(!card))
return -EINVAL;
if (!card->card_dev) {
//创建设备文件"/sys/class/sound/cardX"
card->card_dev = device_create(sound_class, card->dev,MKDEV(0, 0), card,"card%i", card->number);
if (IS_ERR(card->card_dev))
card->card_dev = NULL;
}

if ((err = snd_device_register_all(card)) < 0) //-->1.1.注册所有的声卡设备
return err;
mutex_lock(&snd_card_mutex);
if (snd_cards[card->number]) { //判断对应数组项是否已给占用"/sound/core/init.c" struct snd_card *snd_cards[SNDRV_CARDS];
mutex_unlock(&snd_card_mutex);
return 0;
}
snd_card_set_id_no_lock(card, card->id[0] == '\0' NULL : card->id);
snd_cards[card->number] = card; //填充全局snd_cards数组
mutex_unlock(&snd_card_mutex);
init_info_for_card(card); //proc接口
#if defined(CONFIG_SND_MIXER_OSS) || defined(CONFIG_SND_MIXER_OSS_MODULE)
if (snd_mixer_oss_notify_callback)
snd_mixer_oss_notify_callback(card, SND_MIXER_OSS_NOTIFY_REGISTER);
#endif
if (card->card_dev) { //创建属性文件
err = device_create_file(card->card_dev, &card_id_attrs);
if (err < 0)
return err;
err = device_create_file(card->card_dev, &card_number_attrs);
if (err < 0)
return err;
}

return 0;
}
EXPORT_SYMBOL(snd_card_register);主要是调用snd_device_register_all函数注册所有声卡设备,其次是填充了全局snd_cards数组对应的数组项
1.1注册挂在该声卡下面的所有声卡设备

[cpp]
int snd_device_register_all(struct snd_card *card)
{
struct snd_device *dev;
int err;

if (snd_BUG_ON(!card))
return -ENXIO;
list_for_each_entry(dev, &card->devices, list) { //遍历声卡的设备devices链表
if (dev->state == SNDRV_DEV_BUILD && dev->ops->dev_register) {//状态为已建立且存在dev_register方法
if ((err = dev->ops->dev_register(dev)) < 0) //调用声卡设备的dev_register方法
return err;
dev->state = SNDRV_DEV_REGISTERED; //修改状态为已注册
}
}
return 0;
}

int snd_device_register_all(struct snd_card *card)
{
struct snd_device *dev;
int err;

if (snd_BUG_ON(!card))
return -ENXIO;
list_for_each_entry(dev, &card->devices, list) { //遍历声卡的设备devices链表
if (dev->state == SNDRV_DEV_BUILD && dev->ops->dev_register) {//状态为已建立且存在dev_register方法
if