Platform: Rockchip
OS: Android 6.0
Kernel: 3.10.92
snd_pcm_hw_constraints_init():
OS: Android 6.0
Kernel: 3.10.92
这部分内容比较繁琐,,先从初始化开始了解里面参数意义,以period size
这个参数为线索来追终代码流程.
snd_pcm_hw_constraints_init():
int snd_pcm_hw_constraints_init(struct snd_pcm_substream *substream)
{
struct snd_pcm_runtime *runtime = substream->runtime;
//ASOC对应hw params有参数大小限制,一定要在它的范围内,否则设置无效.
//相关信息都保存在hw_constraints中.
struct snd_pcm_hw_constraints *constrs = &runtime->hw_constraints;
int k, err;
......
//每个hw参数规则都会被添加进去来作追踪.
err = snd_pcm_hw_rule_add(runtime, 0, SNDRV_PCM_HW_PARAM_PERIOD_SIZE,
snd_pcm_hw_rule_mulkdiv, (void*) 8,
SNDRV_PCM_HW_PARAM_PERIOD_BYTES, SNDRV_PCM_HW_PARAM_FRAME_BITS, -1);
......
}
struct snd_pcm_hw_constraints {
//mask用来表示后面的intervals是否能访问,没有设置是不行的.
struct snd_mask masks[SNDRV_PCM_HW_PARAM_LAST_MASK -
SNDRV_PCM_HW_PARAM_FIRST_MASK + 1];
//保存所有hw param值.
struct snd_interval intervals[SNDRV_PCM_HW_PARAM_LAST_INTERVAL -
SNDRV_PCM_HW_PARAM_FIRST_INTERVAL + 1];
//目前已有规则总数
unsigned int rules_num;
//存规则势必要分配空间,当rules_num达到rules_all的时候,
//会每次分配16个存储空间,而不是一次分配一个,这样可以提高效率,
//因此rules_all总是>=rules_num.
unsigned int rules_all;
//所有规则用此结构表示.
struct snd_pcm_hw_rule *rules;
};
snd_pcm_hw_rule_add():
int snd_pcm_hw_rule_add(struct snd_pcm_runtime *runtime, unsigned int cond,
int var,
snd_pcm_hw_rule_func_t func, void *private,
int dep, ...)
{
struct snd_pcm_hw_constraints *constrs = &runtime->hw_constraints;
struct snd_pcm_hw_rule *c;
......
//每添加一个interval,constrs->rules_num就会随着增加,
//当超过constrs->rules_all,就需要分配新空间用于存储interval.
if (constrs->rules_num >= constrs->rules_all) {
struct snd_pcm_hw_rule *new;
//基于效率,每次直接分配16个.
unsigned int n