三論音效卡值controls:
首先我們操作control
裝置節點檔案時候要先開啟,看看開啟函式做了什麼?
snd_ctl_open(struct inode *inode, struct file *file)
err = nonseekable_open(inode, file);//設定filp->f_mode,這樣核心就不會讓lseek
呼叫成功
card = snd_lookup_minor_data(iminor(inode), sndrv_device_type_control); //得到snd_card結構體
err = snd_card_file_add(card, file);//設定snd_monitor_file結構體,並放到card->files_list鍊錶
/*申請並初始化snd_ctl_file結構體*/
ctl = kzalloc(sizeof(*ctl), gfp_kernel);
init_list_head(&ctl->events);
init_waitqueue_head(&ctl->change_sleep);
spin_lock_init(&ctl->read_lock);
ctl->card = card;
ctl->prefer_pcm_subdevice = -1;
ctl->prefer_rawmidi_subdevice = -1;
ctl->pid = get_pid(task_pid(current));
file->private_data = ctl; //把設定好的snd_ctl_file結構體放到上面申請的file->private_data
list_add_tail(&ctl->list, &card->ctl_files); //吧snd_ctl_file結構體放到card->ctl_files鍊錶
總結:這個開啟函式:申請和初始化snd_monitor_file結構體、snd_ctl_file結構體,並放到card的對應鍊錶成員。
操作該control
裝置節點,主要通過呼叫snd_ctl_ioctl來實現多種設定.
例如使用者空間設定某個control:
snd_ctl_elem_write_user(ctl, argp)
control = memdup_user(_control, sizeof(*control)); //從使用者空間獲得snd_ctl_elem_value設定好的結構體
result = snd_ctl_elem_write(card, file, control);
kctl = snd_ctl_find_id(card, &control->id); //獲取
card
裡對應的
control
裡的snd_kcontrol結構體
result = kctl->put(kctl, control); //呼叫上面獲取的snd_kcontrol結構體的put函式,傳入的引數為
card
裡對應的
control
裡的snd_kcontrol結構體和從使用者空間獲得snd_ctl_elem_value設定好的結構體,所以可以推測就是用後乙個引數來設定前乙個引數。
加入這個control是soc_double_tlv("headphone playback volume", ac97_headphone, 8, 0, 31, 1,out_tlv),那麼對應的put函式為snd_soc_put_volsw:
int snd_soc_put_volsw(struct snd_kcontrol *kcontrol,truct snd_ctl_elem_value *ucontrol)
/*處理從使用者空間傳入的值*/
val = (ucontrol->value.integer.value[0] & mask);
..........
unsigned int reg = mc->reg; // 這裡對應ac97_headphone暫存器
snd_soc_update_bits_locked(codec, reg, val_mask, val);
change = snd_soc_update_bits(codec, reg, mask, value);
snd_soc_write(codec, reg, new); //new就是上面的val,設定暫存器,這樣使用者空間就能實現對音效卡的靈活性設定了。(像設定聲音)
細探顏色值
transparent ie8及更早的版本不支援,顯示為black color name 包括16各基本顏色關鍵字,28各系統顏色,多個svg顏色關鍵字 hex 16進製制型顏色值,rrggbb或 rgb,每個引數值取值範圍00 ff rgb,rgb r g b r指red,g指green,b指bl...
再探MFC 三 選單
使用頂層選單 建立選單資源 並在應用程式執行時載入生成的選單.建立選單資源 建立選單資源 命名選單資源id 編輯選單項id 載入並顯示選單 主對話方塊屬性的 menu 項設定為選單 id.或者主對話方塊的 oninitdialog 函式新增如下 塊.cmenu menu menu.loadmenuw...
引數化(三) 引數嗅探
在之前的隨筆中我提到過引數嗅探,這是非常重要的概念。下面我們深入的研究一下引數嗅探 首先我們知道批處理可以是引數化的或者非引數化。引數化的批處理計畫有兩種型別 prepared 或者 proc 前者對應帶有至少乙個引數的sys.sp executesql的執行,並且從t sql批處理,或者應用程式通...