rstamps[k] 当前rule被最后一次更新对应的时间戳[luther.gliethttp]
vstamps[r->var] 当前var被最后一次更新对应的时间戳[luther.gliethttp]
stamp 时间戳,每次都会执行stamp++递增时间戳,让时间跳动[luther.gliethttp]
int snd_pcm_hw_refine(struct snd_pcm_substream *substream,
struct snd_pcm_hw_params *params)
{
unsigned int k;
struct snd_pcm_hardware *hw;
struct snd_interval *i = NULL;
struct snd_mask *m = NULL;
struct snd_pcm_hw_constraints *constrs = &substream->runtime->hw_constraints;
unsigned int rstamps[constrs->rules_num];
unsigned int vstamps[SNDRV_PCM_HW_PARAM_LAST_INTERVAL + 1];
unsigned int stamp = 2;
int changed, again;
params->info = 0;
params->fifo_size = 0;
if (params->rmask & (1 << SNDRV_PCM_HW_PARAM_SAMPLE_BITS))
params->msbits = 0;
if (params->rmask & (1 << SNDRV_PCM_HW_PARAM_RATE)) {
params->rate_num = 0;
params->rate_den = 0;
}
对于rules的log输出详见后面的附录[luther.gliethttp]
for (k = SNDRV_PCM_HW_PARAM_FIRST_MASK; k <= SNDRV_PCM_HW_PARAM_LAST_MASK; k++) {
m = hw_param_mask(params, k);
if (snd_mask_empty(m)) // 每个var即k参数对应的mask->bits[]都绝对不能没有设置bit参数信息
return -EINVAL; // 否则false异常返回[luther.gliethttp]
if (!(params->rmask & (1 << k))) // 查看此次设置的var,是否为该k,因为在_snd_pcm_hw_param_mask
continue; // 中有如下设置:params->rmask |= 1 << var;
#ifdef RULES_DEBUG
printk(KERN_DEBUG "%s = ", snd_pcm_hw_param_names[k]);
printk("%04x%04x%04x%04x -> ", m->bits[3], m->bits[2], m->bits[1], m->bits[0]);
#endif
// ok,就是该k对应的var发生了改变,那么我们与substream->runtime->hw_constraints硬件参数
// 进行交集计算,只有substream->runtime->hw_constraints支持的相应bit才能设置有效.
changed = snd_mask_refine(m, constrs_mask(constrs, k));
#ifdef RULES_DEBUG
printk("%04x%04x%04x%04x\n", m->bits[3], m->bits[2], m->bits[1], m->bits[0]);
#endif
if (changed)
params->cmask |= 1 << k; // ok, hw_constraints参数提供支持,确认该k位发生改变,标记cmask
if (changed < 0)
return changed; // 此次设置bit,hw_constraints参数没有提供支持,那么直接返回
}
for (k = SNDRV_PCM_HW_PARAM_FIRST_INTERVAL; k <= SNDRV_PCM_HW_PARAM_LAST_INTERVAL; k++) {
i = hw_param_interval(params, k);
if (snd_interval_empty(i)) // 每个var即k参数对应的i都绝对不能没有设置参数[min,max]范围信息
return -EINVAL;
if (!(params->rmask & (1 << k))) // 查看此次设置的var,是否为该k,因为在_snd_pcm_hw_param_mask
continue; // 中有如下设置:params->rmask |= 1 << var;
#ifdef RULES_DEBUG
printk(KERN_DEBUG "%s = ", snd_pcm_hw_param_names[k]);
if (i->empty)
printk("empty");
else
printk("%c%u %u%c",
i->openmin ? '(' : '[', i->min,
i->max, i->openmax ? ')' : ']');
printk(" -> ");
#endif
// ok,就是该k对应的var发生了改变,那么我们与substream->runtime->hw_constraints硬件参数
// 进行交集计算,只有substream->runtime->hw_constraints支持的相应范围内才能设置有效.
// changed一般为1或者0,很少出现负数[luther.gliethttp]
changed = snd_interval_refine(i, constrs_interval(constrs, k));
#ifdef RULES_DEBUG
if (i->empty)
printk("empty\n");
else
printk("%c%u %u%c\n",
i->openmin ? '(' : '[', i->min,
i->max, i->openmax ? ')' : ']');
#endif
if (changed) // changed可能为0,但是_snd_pcm_hw_param_mask中已经对cmask的k位进行了设置
params->cmask |= 1 << k;
if (changed < 0) // changed一般为1或者0,很少出现负数[luther.gliethttp]
return changed;
}
for (k = 0; k < constrs->rules_num; k++)
rstamps[k] = 0; // 全部清0
for (k = 0; k <= SNDRV_PCM_HW_PARAM_LAST_INTERVAL; k++)
vstamps[k] = (params->rmask & (1 << k)) ? 1 : 0; // 快速建立究竟哪一个PCM_HW_PARAM参数
do {// 有变动的数组表,以参数值为索引号[luther.gliethttp]
again = 0;
// 使用snd_pcm_hw_constraints_init中或其他地方为substream->runtime建立的constrs->rules
// 硬件参数hw约束规则rule[luther.gliethttp]
for (k = 0; k < constrs->rules_num; k++) {
struct snd_pcm_hw_rule *r = &constrs->rules[k];
unsigned int d;
int doit = 0;
if (r->cond && !(r->cond & params->flags)) // 如果condition条件不符合,那么continue
continue;
for (d = 0; r->deps[d] >= 0; d++) { // 检查depend变量
// r->deps[d]取出相应的depend关联变量索引值
// rstamps[k]第1次进入时值为0
if (vstamps[r->deps[d]] > rstamps[k]) {
// stamps[r->deps[d]]中的数值有可能在后面执行的rule中,因为后面的rule对应的var仍然是当前k对应的var,导致vstamps[r->var] = stamp;更新时间戳(stamp可以理解为时间戳;stamp++表示时间戳被更新)
// 被填入大于rstamps[k](可能是2,3,4了)的stamp,所以这样虽然k在前面已经更新过了,还会因为需要k被再次重复执行,这样很巧妙[luther.gliethttp]可以对照snd_pcm_hw_constraints_init函数观察snd_pcm_hw_rule_add添加rule的关系,详细分析见下面.
// 检查r->deps[d]索引对应的变量对应的参数是否发生了改变,因为一旦相应位发生改变,
// vstamps[r->deps[d]]中的数值就已经在上面设置为1了[luther.gliethttp].
// 即:只要当前rule的dep[]关联量在此次vstamps[]发生了变化,那么本rule才需要更新.
doit = 1;
break;
}
}
if (!doit) // stamp因为等于2,3,...表示当前k已经执行了1遍,所以这里应该继续执行k+1对应的rule
continue; // 如果当前rule约束规则的dep依赖没有在此次改变的vstamps[]数组中,
#ifdef RULES_DEBUG // 那么continue,继续下一个rule规则检查尝试[luther.gliethttp].
printk(KERN_DEBUG "Rule %d [%p]: ", k, r->func);
if (r->var >= 0) {
printk("%s = ", snd_pcm_hw_param_names[r->var]);
if (hw_is_mask(r->var)) {
m = hw_param_mask(params, r->var);
printk("%x", *m->bits);
} else {
i = hw_param_interval(params, r->var);
if (i->empty)
printk("empty");
else
printk("%c%u %u%c",
i->openmin ? '(' : '[', i->min,
i->max, i->openmax ? ')' : ']');
}
}
#endif
changed = r->func(params, r); // 执行snd_pcm_hw_constraints_init中或其他地方建立的
#ifdef RULES_DEBUG // snd_pcm_hw_rule_add规则回掉处理函数[luther.gliethttp]
if (r->var >= 0) { // 比如执行snd_pcm_hw_rule_format
printk(" -> ");
if (hw_is_mask(r->var))
printk("%x", *m->bits);
else {
if (i->empty)
printk("empty");
else
printk("%c%u %u%c",
i->openmin ? '(' : '[', i->min,
i->max, i->openmax ? ')' : ']');
}
}
printk("\n");
#endif
// 当前rule,因为depend依赖已经改变,所以这里rule被执行了,
// 那么标记这个'已执行'动作[luther.gliethttp]
// 这里保证当前k不会被重复执行,因为k对应的rule下的所有r->deps[d]的数值当前最大均小于
// stamp,所以这样保证k在上面的for (d = 0; r->deps[d] >= 0; d++)循环中退出,
// 进而执行k+1对应的rule[luther.gliethttp]
rstamps[k] = stamp; // 等于2,3,4,...刷新该rule对应的时间戳rstamps[k]为最新时间戳stamp
if (changed && r->var >= 0) {
params->cmask |= (1 << r->var); // 该rule已经发生改变,因为该rule的deps[]发生了改变
// 刷新r->var变量时间戳,因为此次r->func(params, r);就是改变了var对应的变量值.
vstamps[r->var] = stamp; // 当前k对应着rule,当前rule对应的var对应的状态值置为stamp最新时间戳
again = 1; // 表示vstamps[r->var]已经执行了1次[luther.gliethttp]
} // 同时因为rstamps[k]和vstamps[r->var]相等,也就保证
if (changed < 0) // k对应的rule只执行1次[luther.gliethttp]
return changed;
stamp++; // 这里stamp++时间戳更新很重要,这样可以保证vstamps[r->var]中的数值,即r->var是否在后面又被更新了.
}
} while (again);
if (!params->msbits) {
i = hw_param_interval(params, SNDRV_PCM_HW_PARAM_SAMPLE_BITS);
if (snd_interval_single(i))
params->msbits = snd_interval_value(i);
}
if (!params->rate_den) {
i = hw_param_interval(params, SNDRV_PCM_HW_PARAM_RATE);
if (snd_interval_single(i)) {
params->rate_num = snd_interval_value(i);
params->rate_den = 1;
}
}
hw = &substream->runtime->hw;
if (!params->info)
params->info = hw->info & ~SNDRV_PCM_INFO_FIFO_IN_FRAMES;
if (!params->fifo_size) {
if (snd_mask_min(¶ms->masks[SNDRV_PCM_HW_PARAM_FORMAT]) ==
snd_mask_max(¶ms->masks[SNDRV_PCM_HW_PARAM_FORMAT]) &&
snd_mask_min(¶ms->masks[SNDRV_PCM_HW_PARAM_CHANNELS]) ==
snd_mask_max(¶ms->masks[SNDRV_PCM_HW_PARAM_CHANNELS])) {
changed = substream->ops->ioctl(substream,
// 调用soc_pcm_ops的ioctl,也就是soc_new_pcm时[luther.gliethttp]
// soc_pcm_ops.ioctl = platform->pcm_ops->ioctl;
// 即:s3c24xx_soc_platform.s3c24xx_pcm_ops.snd_pcm_lib_ioctl
// 所以这里最终将执行
// snd_pcm_lib_ioctl
// ==> snd_pcm_lib_ioctl_fifo_size
SNDRV_PCM_IOCTL1_FIFO_SIZE, params);
if (changed < 0)
return changed;
}
}
params->rmask = 0;
return 0;
}
我们来看看在snd_pcm_hw_constraints_init中snd_pcm_hw_rule_add()函数添加的rules们[luther.gliethttp].
其实整个原理就像是一个大蒸笼,一个蒸笼是有var界定,同一个var下面的rule,都在一个蒸笼里,每个rule就相当于一个蒸屉,不同的var对应一个独立的蒸笼.
// 建立蒸笼第1屉-最底层的那个屉
err = snd_pcm_hw_rule_add(runtime, 0, SNDRV_PCM_HW_PARAM_FRAME_BITS,
snd_pcm_hw_rule_mul, NULL,
SNDRV_PCM_HW_PARAM_SAMPLE_BITS, SNDRV_PCM_HW_PARAM_CHANNELS, -1);
if (err < 0)
return err;
// 建立蒸笼第2屉
err = snd_pcm_hw_rule_add(runtime, 0, SNDRV_PCM_HW_PARAM_FRAME_BITS,
snd_pcm_hw_rule_mulkdiv, (void*) 8,
SNDRV_PCM_HW_PARAM_PERIOD_BYTES, SNDRV_PCM_HW_PARAM_PERIOD_SIZE, -1);
if (err < 0)
return err;
// 建立蒸笼第3屉
err = snd_pcm_hw_rule_add(runtime, 0, SNDRV_PCM_HW_PARAM_FRAME_BITS,
snd_pcm_hw_rule_mulkdiv, (void*) 8,
SNDRV_PCM_HW_PARAM_BUFFER_BYTES, SNDRV_PCM_HW_PARAM_BUFFER_SIZE, -1);
上面的vstamps[r->deps[d]] > rstamps[k]的工作原理是这样的,
如果向蒸笼的第2屉倒水,那么蒸笼的第2屉会首先执行r->func(params, r);先有水,接下来就是
蒸笼的第1屉会因为水的渗漏而随后执行r->func(params, r);所以只要望蒸笼的某一屉倒水,那么该屉下的所有屉都将接到水[luther.gliethttp]
从纯程序来理解的话,var就是此次func操作最终会改变的变量,所以当执行该rule的r->func(params, r);回调函数之后,var将会被改变,如果var被改变,那么当然以该var为deps[]依赖参数的所有k对应的rule,当然需要再次更新依赖该var的k了,对于vstamps[r->var] = stamp;这样一个赋值就是表征当前r->var得到了最新的修改,stamp可以理解为时间戳,stamp++表示对时间戳进行更新操作,rstamps[k]中当前没有比vstamps[r->var]还要大的rule,因为它的时间戳是当前最新的,所以这也就保证了,以r->var为deps[]依赖的其他rule因为(vstamps[r->deps[d]] > rstamps[k])一定成立而能够绝对安全的得到更新[luther.gliethttp]
附录:
[17701.684025] intel8x0_measure_ac97_clock: measured 54694 usecs (2635 samples)
[17701.684031] intel8x0: clocking to 48000
[17709.739333] ACCESS = 00000000ffffffffffffffff -> 0000000000000009
[17709.739350] FORMAT = 00000000ffffffffffffffff -> 0000000000000404
[17709.739360] SUBFORMAT = 00000000ffffffffffffffff -> 0000000000000001
[17709.739369] SAMPLE_BITS = [0 4294967295] -> [0 4294967295]
[17709.739381] FRAME_BITS = [0 4294967295] -> [0 4294967295]
[17709.739391] CHANNELS = [0 4294967295] -> [2 6]
[17709.739399] RATE = [0 4294967295] -> [48000 48000]
[17709.739406] PERIOD_TIME = [0 4294967295] -> [0 4294967295]
[17709.739413] PERIOD_SIZE = [0 4294967295] -> [0 4294967295]
[17709.739420] PERIOD_BYTES = [0 4294967295] -> [32 131072]
[17709.739427] PERIODS = [0 4294967295] -> [1 1024]
[17709.739433] BUFFER_TIME = [0 4294967295] -> [0 4294967295]
[17709.739440] BUFFER_SIZE = [0 4294967295] -> [0 4294967295]
[17709.739447] BUFFER_BYTES = [0 4294967295] -> [32 131072]
[17709.739454] TICK_TIME = [0 4294967295] -> [0 4294967295]
[17709.739463] Rule 0 [f8eb2920]: FORMAT = 404 -> 404
[17709.739473] Rule 1 [f8eb1b00]: SAMPLE_BITS = [0 4294967295] -> [16 32]
[17709.739483] Rule 2 [f8eb1cc0]: SAMPLE_BITS = [16 32] -> [16 32]
[17709.739493] Rule 3 [f8eb1c60]: FRAME_BITS = [0 4294967295] -> [32 192]
[17709.739502] Rule 4 [f8eb1c00]: FRAME_BITS = [32 192] -> [32 192]
[17709.739511] Rule 5 [f8eb1c00]: FRAME_BITS = [32 192] -> [32 192]
[17709.739520] Rule 6 [f8eb1cc0]: CHANNELS = [2 6] -> [2 6]
[17709.739529] Rule 7 [f8eb1c00]: RATE = [48000 48000] -> [48000 48000]
[17709.739538] Rule 8 [f8eb1c00]: RATE = [48000 48000] -> [48000 48000]
[17709.739547] Rule 9 [f8eb1cc0]: PERIODS = [1 1024] -> [1 1024]
[17709.739556] Rule 10 [f8eb1cc0]: PERIOD_SIZE = [0 4294967295] -> [0 4294967295]
[17709.739566] Rule 11 [f8eb1c00]: PERIOD_SIZE = [0 4294967295] -> [2 32768]
[17709.739575] Rule 12 [f8eb1ba0]: PERIOD_SIZE = [2 32768] -> [2 32768]
[17709.739585] Rule 13 [f8eb1c60]: BUFFER_SIZE = [0 4294967295] -> [2 33554432]
[17709.739594] Rule 14 [f8eb1c00]: BUFFER_SIZE = [2 33554432] -> [2 32768]
[17709.739603] Rule 15 [f8eb1ba0]: BUFFER_SIZE = [2 32768] -> [2 32768]
[17709.739612] Rule 16 [f8eb1ba0]: PERIOD_BYTES = [32 131072] -> [32 131072]
[17709.739622] Rule 17 [f8eb1ba0]: BUFFER_BYTES = [32 131072] -> [32 131072]
[17709.739631] Rule 18 [f8eb1c00]: PERIOD_TIME = [0 4294967295] -> (41 682667)
[17709.739641] Rule 19 [f8eb1c00]: BUFFER_TIME = [0 4294967295] -> (41 682667)
[17709.739650] Rule 20 [f8eb5790]: CHANNELS = [2 6] -> [2 6]
[17709.739660] Rule 21 [f8eb57c0]:
[17709.739664] Rule 22 [f8eb1ab0]: BUFFER_BYTES = [32 131072] -> [32 65536]
[17709.739673] Rule 23 [f8eb1a80]: RATE = [48000 48000] -> [48000 48000]
[17709.739682] Rule 0 [f8eb2920]: FORMAT = 404 -> 404
[17709.739691] Rule 2 [f8eb1cc0]: SAMPLE_BITS = [16 32] -> [16 32]
[17709.739700] Rule 4 [f8eb1c00]: FRAME_BITS = [32 192] -> [32 192]
[17709.739709] Rule 5 [f8eb1c00]: FRAME_BITS = [32 192] -> [32 192]
[17709.739718] Rule 7 [f8eb1c00]: RATE = [48000 48000] -> [48000 48000]
[17709.739727] Rule 8 [f8eb1c00]: RATE = [48000 48000] -> [48000 48000]
[17709.739736] Rule 9 [f8eb1cc0]: PERIODS = [1 1024] -> [1 1024]
[17709.739745] Rule 10 [f8eb1cc0]: PERIOD_SIZE = [2 32768] -> [2 32768]
[17709.739754] Rule 12 [f8eb1ba0]: PERIOD_SIZE = [2 32768] -> [2 32768]
[17709.739763] Rule 14 [f8eb1c00]: BUFFER_SIZE = [2 32768] -> [2 16384]
[17709.739772] Rule 15 [f8eb1ba0]: BUFFER_SIZE = [2 16384] -> [2 16384]
[17709.739781] Rule 17 [f8eb1ba0]: BUFFER_BYTES = [32 65536] -> [32 65536]
[17709.739790] Rule 19 [f8eb1c00]: BUFFER_TIME = (41 682667) -> (41 341334)
[17709.739800] Rule 5 [f8eb1c00]: FRAME_BITS = [32 192] -> [32 192]
[17709.739809] Rule 8 [f8eb1c00]: RATE = [48000 48000] -> [48000 48000]
[17709.739818] Rule 9 [f8eb1cc0]: PERIODS = [1 1024] -> [1 1024]
[17709.739831] Rule 10 [f8eb1cc0]: PERIOD_SIZE = [2 32768] -> [2 16384]
[17709.739844] Rule 13 [f8eb1c60]: BUFFER_SIZE = [2 16384] -> [2 16384]
[17709.739857] Rule 15 [f8eb1ba0]: BUFFER_SIZE = [2 16384] -> [2 16384]
[17709.739871] Rule 16 [f8eb1ba0]: PERIOD_BYTES = [32 131072] -> [32 131072]
[17709.739885] Rule 18 [f8eb1c00]: PERIOD_TIME = (41 682667) -> (41 341334)
[17709.739899] Rule 4 [f8eb1c00]: FRAME_BITS = [32 192] -> [32 192]
[17709.739912] Rule 7 [f8eb1c00]: RATE = [48000 48000] -> [48000 48000]
[17709.739926] Rule 9 [f8eb1cc0]: PERIODS = [1 1024] -> [1 1024]
[17709.739939] Rule 12 [f8eb1ba0]: PERIOD_SIZE = [2 16384] -> [2 16384]
[17709.739966] ACCESS = 0000000000000001 -> 0000000000000001
[17709.739985] FORMAT = 0000000000000400 -> 0000000000000400
[17709.739995] Rule 1 [f8eb1b00]: SAMPLE_BITS = [16 32] -> [32 32]
[17709.740008] Rule 3 [f8eb1c60]: FRAME_BITS = [32 192] -> [64 192]
[17709.740020] Rule 6 [f8eb1cc0]: CHANNELS = [2 6] -> [2 6]
[17709.740033] Rule 11 [f8eb1c00]: PERIOD_SIZE = [2 16384] -> [2 16384]
[17709.740046] Rule 14 [f8eb1c00]: BUFFER_SIZE = [2 16384] -> [2 8192]
[17709.740061] Rule 16 [f8eb1ba0]: PERIOD_BYTES = [32 131072] -> [32 131072]
[17709.740075] Rule 17 [f8eb1ba0]: BUFFER_BYTES = [32 65536] -> [32 65536]
[17709.740090] Rule 19 [f8eb1c00]: BUFFER_TIME = (41 341334) -> (41 170667)
[17709.740104] Rule 21 [f8eb57c0]:
[17709.740110] Rule 0 [f8eb2920]: FORMAT = 400 -> 400
[17709.740125] Rule 2 [f8eb1cc0]: SAMPLE_BITS = [32 32] -> [32 32]
[17709.740138] Rule 5 [f8eb1c00]: FRAME_BITS = [64 192] -> [64 192]
[17709.740151] Rule 8 [f8eb1c00]: RATE = [48000 48000] -> [48000 48000]
[17709.740164] Rule 9 [f8eb1cc0]: PERIODS = [1 1024] -> [1 1024]
[17709.740178] Rule 10 [f8eb1cc0]: PERIOD_SIZE = [2 16384] -> [2 8192]
[17709.740192] Rule 13 [f8eb1c60]: BUFFER_SIZE = [2 8192] -> [2 8192]
[17709.740206] Rule 15 [f8eb1ba0]: BUFFER_SIZE = [2 8192] -> [2 8192]
[17709.740220] Rule 16 [f8eb1ba0]: PERIOD_BYTES = [32 131072] -> [32 131072]
[17709.740234] Rule 18 [f8eb1c00]: PERIOD_TIME = (41 341334) -> (41 170667)
[17709.740248] Rule 4 [f8eb1c00]: FRAME_BITS = [64 192] -> [64 192]
[17709.740262] Rule 7 [f8eb1c00]: RATE = [48000 48000] -> [48000 48000]
[17709.740276] Rule 9 [f8eb1cc0]: PERIODS = [1 1024] -> [1 1024]
[17709.740289] Rule 12 [f8eb1ba0]: PERIOD_SIZE = [2 8192] -> [2 8192]
[17709.740321] CHANNELS = [2 2] -> [2 2]
[17709.740331] Rule 2 [f8eb1cc0]: SAMPLE_BITS = [32 32] -> [32 32]
[17709.740340] Rule 3 [f8eb1c60]: FRAME_BITS = [64 192] -> [64 64]
[17709.740349] Rule 6 [f8eb1cc0]: CHANNELS = [2 2] -> [2 2]
[17709.740358] Rule 11 [f8eb1c00]: PERIOD_SIZE = [2 8192] -> [4 8192]
[17709.740367] Rule 13 [f8eb1c60]: BUFFER_SIZE = [2 8192] -> [4 8192]
[17709.740375] Rule 14 [f8eb1c00]: BUFFER_SIZE = [4 8192] -> [4 8192]
[17709.740384] Rule 16 [f8eb1ba0]: PERIOD_BYTES = [32 131072] -> [32 65536]
[17709.740393] Rule 17 [f8eb1ba0]: BUFFER_BYTES = [32 65536] -> [32 65536]
[17709.740402] Rule 18 [f8eb1c00]: PERIOD_TIME = (41 170667) -> (83 170667)
[17709.740411] Rule 19 [f8eb1c00]: BUFFER_TIME = (41 170667) -> (83 170667)
[17709.740420] Rule 20 [f8eb5790]: CHANNELS = [2 2] -> [2 2]
[17709.740429] Rule 2 [f8eb1cc0]: SAMPLE_BITS = [32 32] -> [32 32]
[17709.740438] Rule 4 [f8eb1c00]: FRAME_BITS = [64 64] -> [64 64]
[17709.740447] Rule 5 [f8eb1c00]: FRAME_BITS = [64 64] -> [64 64]
[17709.740455] Rule 7 [f8eb1c00]: RATE = [48000 48000] -> [48000 48000]
[17709.740464] Rule 8 [f8eb1c00]: RATE = [48000 48000] -> [48000 48000]
[17709.740472] Rule 9 [f8eb1cc0]: PERIODS = [1 1024] -> [1 1024]
[17709.740481] Rule 10 [f8eb1cc0]: PERIOD_SIZE = [4 8192] -> [4 8192]
[17709.740490] Rule 11 [f8eb1c00]: PERIOD_SIZE = [4 8192] -> [4 8192]
[17709.740565] Rule 12 [f8eb1ba0]: PERIOD_SIZE = [4 8192] -> [4 8192]
[17709.740642] Rule 15 [f8eb1ba0]: BUFFER_SIZE = [4 8192] -> [4 8192]
[17709.740737] PERIOD_SIZE = [1024 8192] -> [1024 8192]
[17709.740750] Rule 4 [f8eb1c00]: FRAME_BITS = [64 64] -> [64 64]
[17709.740765] Rule 7 [f8eb1c00]: RATE = [48000 48000] -> [48000 48000]
[17709.740779] Rule 9 [f8eb1cc0]: PERIODS = [1 1024] -> [1 8]
[17709.740824] Rule 10 [f8eb1cc0]: PERIOD_SIZE = [1024 8192] -> [1024 8192]
[17709.740838] Rule 13 [f8eb1c60]: BUFFER_SIZE = [4 8192] -> [1024 8192]
[17709.740883] Rule 16 [f8eb1ba0]: PERIOD_BYTES = [32 65536] -> [8192 65536]
[17709.740898] Rule 17 [f8eb1ba0]: BUFFER_BYTES = [32 65536] -> [8192 65536]
[17709.740912] Rule 18 [f8eb1c00]: PERIOD_TIME = (83 170667) -> (21333 170667)
[17709.740927] Rule 19 [f8eb1c00]: BUFFER_TIME = (83 170667) -> (21333 170667)
[17709.740942] Rule 22 [f8eb1ab0]: BUFFER_BYTES = [8192 65536] -> [8192 65536]
[17709.740957] Rule 4 [f8eb1c00]: FRAME_BITS = [64 64] -> [64 64]
[17709.741002] Rule 5 [f8eb1c00]: FRAME_BITS = [64 64] -> [64 64]
[17709.741016] Rule 7 [f8eb1c00]: RATE = [48000 48000] -> [48000 48000]
[17709.741030] Rule 8 [f8eb1c00]: RATE = [48000 48000] -> [48000 48000]
[17709.741075] Rule 9 [f8eb1cc0]: PERIODS = [1 8] -> [1 8]
[17709.741119] Rule 10 [f8eb1cc0]: PERIOD_SIZE = [1024 8192] -> [1024 8192]
[17709.741134] Rule 11 [f8eb1c00]: PERIOD_SIZE = [1024 8192] -> [1024 8192]
[17709.741209] Rule 12 [f8eb1ba0]: PERIOD_SIZE = [1024 8192] -> [1024 8192]
[17709.741224] Rule 14 [f8eb1c00]: BUFFER_SIZE = [1024 8192] -> [1024 8192]
[17709.741238] Rule 15 [f8eb1ba0]: BUFFER_SIZE = [1024 8192] -> [1024 8192]
[17709.741257] PERIOD_SIZE = [1024 1024] -> [1024 1024]
[17709.741270] Rule 4 [f8eb1c00]: FRAME_BITS = [64 64] -> [64 64]
[17709.741315] Rule 7 [f8eb1c00]: RATE = [48000 48000] -> [48000 48000]
[17709.741360] Rule 9 [f8eb1cc0]: PERIODS = [1 8] -> [1 8]
[17709.741373] Rule 13 [f8eb1c60]: BUFFER_SIZE = [1024 8192] -> [1024 8192]
[17709.741388] Rule 16 [f8eb1ba0]: PERIOD_BYTES = [8192 65536] -> [8192 8192]
[17709.741464] Rule 18 [f8eb1c00]: PERIOD_TIME = (21333 170667) -> (21333 21334)
[17709.741509] Rule 4 [f8eb1c00]: FRAME_BITS = [64 64] -> [64 64]
[17709.741584] Rule 7 [f8eb1c00]: RATE = [48000 48000] -> [48000 48000]
[17709.741660] Rule 11 [f8eb1c00]: PERIOD_SIZE = [1024 1024] -> [1024 1024]
[17709.741736] Rule 12 [f8eb1ba0]: PERIOD_SIZE = [1024 1024] -> [1024 1024]
[17709.741790] PERIODS = [8 8] -> [8 8]
[17709.741801] Rule 10 [f8eb1cc0]: PERIOD_SIZE = [1024 1024] -> [1024 1024]
[17709.741846] Rule 13 [f8eb1c60]: BUFFER_SIZE = [1024 8192] -> [8192 8192]
[17709.741861] Rule 17 [f8eb1ba0]: BUFFER_BYTES = [8192 65536] -> [65536 65536]
[17709.741875] Rule 19 [f8eb1c00]: BUFFER_TIME = (21333 170667) -> (170666 170667)
[17709.741890] Rule 22 [f8eb1ab0]: BUFFER_BYTES = [65536 65536] -> [65536 65536]
[17709.741905] Rule 5 [f8eb1c00]: FRAME_BITS = [64 64] -> [64 64]
[17709.741919] Rule 8 [f8eb1c00]: RATE = [48000 48000] -> [48000 48000]
[17709.741933] Rule 9 [f8eb1cc0]: PERIODS = [8 8] -> [8 8]
[17709.741977] Rule 10 [f8eb1cc0]: PERIOD_SIZE = [1024 1024] -> [1024 1024]
[17709.742023] Rule 14 [f8eb1c00]: BUFFER_SIZE = [8192 8192] -> [8192 8192]
[17709.742037] Rule 15 [f8eb1ba0]: BUFFER_SIZE = [8192 8192] -> [8192 8192]
[17709.742066] TICK_TIME = [0 0] -> [0 0]
[17709.742081] ACCESS = 0000000000000001 -> 0000000000000001
[17709.742091] FORMAT = 0000000000000400 -> 0000000000000400
[17709.742101] SUBFORMAT = 0000000000000001 -> 0000000000000001
[17709.742110] SAMPLE_BITS = [32 32] -> [32 32]
[17709.742181] FRAME_BITS = [64 64] -> [64 64]
[17709.742191] CHANNELS = [2 2] -> [2 2]
[17709.742201] RATE = [48000 48000] -> [48000 48000]
[17709.742211] PERIOD_TIME = (21333 21334) -> (21333 21334)
[17709.742252] PERIOD_SIZE = [1024 1024] -> [1024 1024]
[17709.742293] PERIOD_BYTES = [8192 8192] -> [8192 8192]
[17709.742303] PERIODS = [8 8] -> [8 8]
[17709.742313] BUFFER_TIME = (170666 170667) -> (170666 170667)
[17709.742354] BUFFER_SIZE = [8192 8192] -> [8192 8192]
[17709.742364] BUFFER_BYTES = [65536 65536] -> [65536 65536]
[17709.742404] TICK_TIME = [0 0] -> [0 0]
[17709.742415] Rule 0 [f8eb2920]: FORMAT = 400 -> 400
[17709.742428] Rule 1 [f8eb1b00]: SAMPLE_BITS = [32 32] -> [32 32]
[17709.742444] Rule 2 [f8eb1cc0]: SAMPLE_BITS = [32 32] -> [32 32]
[17709.742457] Rule 3 [f8eb1c60]: FRAME_BITS = [64 64] -> [64 64]
[17709.742502] Rule 4 [f8eb1c00]: FRAME_BITS = [64 64] -> [64 64]
[17709.742516] Rule 5 [f8eb1c00]: FRAME_BITS = [64 64] -> [64 64]
[17709.742530] Rule 6 [f8eb1cc0]: CHANNELS = [2 2] -> [2 2]
[17709.742605] Rule 7 [f8eb1c00]: RATE = [48000 48000] -> [48000 48000]
[17709.742651] Rule 8 [f8eb1c00]: RATE = [48000 48000] -> [48000 48000]
[17709.742665] Rule 9 [f8eb1cc0]: PERIODS = [8 8] -> [8 8]
[17709.742709] Rule 10 [f8eb1cc0]: PERIOD_SIZE = [1024 1024] -> [1024 1024]
[17709.742754] Rule 11 [f8eb1c00]: PERIOD_SIZE = [1024 1024] -> [1024 1024]
[17709.742769] Rule 12 [f8eb1ba0]: PERIOD_SIZE = [1024 1024] -> [1024 1024]
[17709.742783] Rule 13 [f8eb1c60]: BUFFER_SIZE = [8192 8192] -> [8192 8192]
[17709.742828] Rule 14 [f8eb1c00]: BUFFER_SIZE = [8192 8192] -> [8192 8192]
[17709.742842] Rule 15 [f8eb1ba0]: BUFFER_SIZE = [8192 8192] -> [8192 8192]
[17709.742857] Rule 16 [f8eb1ba0]: PERIOD_BYTES = [8192 8192] -> [8192 8192]
[17709.742871] Rule 17 [f8eb1ba0]: BUFFER_BYTES = [65536 65536] -> [65536 65536]
[17709.742948] Rule 18 [f8eb1c00]: PERIOD_TIME = (21333 21334) -> (21333 21334)
[17709.742962] Rule 19 [f8eb1c00]: BUFFER_TIME = (170666 170667) -> (170666 170667)
[17709.743008] Rule 20 [f8eb5790]: CHANNELS = [2 2] -> [2 2]
[17709.743054] Rule 21 [f8eb57c0]:
[17709.743060] Rule 22 [f8eb1ab0]: BUFFER_BYTES = [65536 65536] -> [65536 65536]
[17709.743105] Rule 23 [f8eb1a80]: RATE = [48000 48000] -> [48000 48000]
阅读(9577) | 评论(0) | 转发(0) |