Chinaunix首页 | 论坛 | 博客
  • 博客访问: 15532037
  • 博文数量: 2005
  • 博客积分: 11986
  • 博客等级: 上将
  • 技术积分: 22535
  • 用 户 组: 普通用户
  • 注册时间: 2007-05-17 13:56
文章分类

全部博文(2005)

文章存档

2014年(2)

2013年(2)

2012年(16)

2011年(66)

2010年(368)

2009年(743)

2008年(491)

2007年(317)

分类: LINUX

2009-11-16 16:40:48

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]

阅读(9663) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~