九色国产,午夜在线视频,新黄色网址,九九色综合,天天做夜夜做久久做狠狠,天天躁夜夜躁狠狠躁2021a,久久不卡一区二区三区

打開APP
userphoto
未登錄

開通VIP,暢享免費電子書等14項超值服

開通VIP
Linux音頻驅(qū)動之二:聲卡的創(chuàng)建
2012-01-17 21:38:45|  分類:Linux_2410 |字號
1. struct snd_card
1.1. snd_card是什么
snd_card可以說是整個ALSA音頻驅(qū)動最頂層的一個結(jié)構(gòu),整個聲卡的軟件邏輯結(jié)構(gòu)開始于該結(jié)構(gòu),幾乎所有與聲音相關的邏輯設備都是在snd_card的管理之下,聲卡驅(qū)動的第一個動作通常就是創(chuàng)建一個snd_card結(jié)構(gòu)體。正因為如此,本節(jié)中,我們也從 struct cnd_card開始吧。
1.2. snd_card的定義
snd_card的定義位于改頭文件中:include/sound/core.h
[c-sharp] view plaincopy
/* main structure for soundcard */
struct snd_card {
int number;         /* number of soundcard (index to
snd_cards) */
char id[16];            /* id string of this card */
char driver[16];        /* driver name */
char shortname[32];     /* short name of this soundcard */
char longname[80];      /* name of this soundcard */
char mixername[80];     /* mixer name */
char components[128];       /* card components delimited with
space */
struct module *module;      /* top-level module */
void *private_data;     /* private data for soundcard */
void (*private_free) (struct snd_card *card); /* callback for freeing of
private data */
struct list_head devices;   /* devices */
unsigned int last_numid;    /* last used numeric ID */
struct rw_semaphore controls_rwsem; /* controls list lock */
rwlock_t ctl_files_rwlock;  /* ctl_files list lock */
int controls_count;     /* count of all controls */
int user_ctl_count;     /* count of all user controls */
struct list_head controls;  /* all controls for this card */
struct list_head ctl_files; /* active control files */
struct snd_info_entry *proc_root;   /* root for soundcard specific files */
struct snd_info_entry *proc_id; /* the card id */
struct proc_dir_entry *proc_root_link;  /* number link to real id */
struct list_head files_list;    /* all files associated to this card */
struct snd_shutdown_f_ops *s_f_ops; /* file operations in the shutdown
state */
spinlock_t files_lock;      /* lock the files for this card */
int shutdown;           /* this card is going down */
int free_on_last_close;     /* free in context of file_release */
wait_queue_head_t shutdown_sleep;
struct device *dev;     /* device assigned to this card */
#ifndef CONFIG_SYSFS_DEPRECATED
struct device *card_dev;    /* cardX object for sysfs */
#endif
#ifdef CONFIG_PM
unsigned int power_state;   /* power state */
struct mutex power_lock;    /* power lock */
wait_queue_head_t power_sleep;
#endif
#if defined(CONFIG_SND_MIXER_OSS) || defined(CONFIG_SND_MIXER_OSS_MODULE)
struct snd_mixer_oss *mixer_oss;
int mixer_oss_change_count;
#endif
};
struct list_head devices     記錄該聲卡下所有邏輯設備的鏈表
struct list_head controls    記錄該聲卡下所有的控制單元的鏈表
void *private_data            聲卡的私有數(shù)據(jù),可以在創(chuàng)建聲卡時通過參數(shù)指定數(shù)據(jù)的大小
2. 聲卡的建立流程
2.1.1. 第一步,創(chuàng)建snd_card的一個實例
[c-sharp] view plaincopy
struct snd_card *card;
int err;
....
err = snd_card_create(index, id, THIS_MODULE, 0, &card);
index           一個整數(shù)值,該聲卡的編號
id                字符串,聲卡的標識符
第四個參數(shù)    該參數(shù)決定在創(chuàng)建snd_card實例時,需要同時額外分配的私有數(shù)據(jù)的大小,該數(shù)據(jù)的指針最終會賦值給snd_card的private_data數(shù)據(jù)成員
card             返回所創(chuàng)建的snd_card實例的指針
2.1.2. 第二步,創(chuàng)建聲卡的芯片專用數(shù)據(jù)
聲卡的專用數(shù)據(jù)主要用于存放該聲卡的一些資源信息,例如中斷資源、io資源、dma資源等??梢杂袃煞N創(chuàng)建方法:
通過上一步中snd_card_create()中的第四個參數(shù),讓snd_card_create自己創(chuàng)建
[c-sharp] view plaincopy
// struct mychip 用于保存專用數(shù)據(jù)
err = snd_card_create(index, id, THIS_MODULE,
sizeof(struct mychip), &card);
// 從private_data中取出
struct mychip *chip = card->private_data;
自己創(chuàng)建:
[c-sharp] view plaincopy
struct mychip {
struct snd_card *card;
....
};
struct snd_card *card;
struct mychip *chip;
err = snd_card_create(index[dev], id[dev], THIS_MODULE, 0, &card);
// 專用數(shù)據(jù)記錄snd_card實例
chip->card = card;
.....
chip = kzalloc(sizeof(*chip), GFP_KERNEL);
然后,把芯片的專有數(shù)據(jù)注冊為聲卡的一個低階設備:
[c-sharp] view plaincopy
static int snd_mychip_dev_free(struct snd_device *device)
{
return snd_mychip_free(device->device_data);
}
static struct snd_device_ops ops = {
.dev_free = snd_mychip_dev_free,
};
....
snd_device_new(card, SNDRV_DEV_LOWLEVEL, chip, &ops);
2.1.3. 第三步,設置Driver的ID和名字
[c-sharp] view plaincopy
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_card的driver字段保存著芯片的ID字符串,user空間的alsa-lib會使用到該字符串,所以必須要保證該ID的唯一性。shortname字段更多地用于打印信息,longname字段則會出現(xiàn)在/proc/asound/cards中。
2.1.4. 第四步,創(chuàng)建聲卡的功能部件(邏輯設備),例如PCM,Mixer,MIDI等
這時候可以創(chuàng)建聲卡的各種功能部件了,還記得開頭的snd_card結(jié)構(gòu)體的devices字段嗎?每一種部件的創(chuàng)建最終會調(diào)用snd_device_new()來生成一個snd_device實例,并把該實例鏈接到snd_card的devices鏈表中。
通常,alsa-driver的已經(jīng)提供了一些常用的部件的創(chuàng)建函數(shù),而不必直接調(diào)用snd_device_new(),比如:
PCM  ----        snd_pcm_new()
RAWMIDI --    snd_rawmidi_new()
CONTROL --   snd_ctl_create()
TIMER   --       snd_timer_new()
INFO    --        snd_card_proc_new()
JACK    --        snd_jack_new()
2.1.5. 第五步,注冊聲卡
[c-sharp] view plaincopy
err = snd_card_register(card);
if (err < 0) {
snd_card_free(card);
return err;
}
本站僅提供存儲服務,所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權內(nèi)容,請點擊舉報
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
淺析linux 2.6.30.4內(nèi)核中uda134x聲卡驅(qū)動源碼 - audio和bluetooth - gliethttp
Linux ALSA聲卡驅(qū)動之三:PCM設備的創(chuàng)建
Qualcomm Audio HAL 音頻通路設置
Linux 音頻設備驅(qū)動
Android中使用ALSA聲卡
《Linux內(nèi)核編程》第二章:ALSA驅(qū)動
更多類似文章 >>
生活服務
熱點新聞
分享 收藏 導長圖 關注 下載文章
綁定賬號成功
后續(xù)可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點擊這里聯(lián)系客服!

聯(lián)系客服