ALSA中变量值衩莫名改变

发布于 2022-10-15 09:25:45 字数 15005 浏览 22 评论 0

平台信息:arm/android中alsa-lib

下面是我分析alsa-lib时pcm_plug.c中的一个函数,在这里如下红色部分代码,打印出来的LOG如下信息。
chang channels:tt_ssize=2,tt_cused=1,tt_sused=2,float=4
rpolicy=3,clt->channels=1,slv->channels=2,
v=-0.000000
srcs=2,sc=2,cc=1
v=0.000000,srcs=4
v=0.000000
srcs=2,sc=2,cc=1
v=0.000000,srcs=4
change_channel:format=2,channels=2,t[0]=0.000000,t[1]=0.000000,tt_ssize=0,tt_cused=15,tt_sused=8
这个函数没有被其它线程调 用,开始我用LOGCAT打印结果一样,后来又写了一个loghl函数将它打印到文件中,结果也是一样的。但是为什么nsrcs的值会改变呢?还有tt_ssize值也会改变,
请高手指点一下。

  1. static int snd_pcm_plug_change_channels(snd_pcm_t *pcm, snd_pcm_t **new, snd_pcm_plug_params_t *clt, snd_pcm_plug_params_t *slv)
  2. {
  3.         snd_pcm_plug_t *plug = pcm->private_data;
  4.         unsigned int tt_ssize, tt_cused, tt_sused;
  5.         snd_pcm_route_ttable_entry_t *ttable;
  6.         int err;
  7.         //10-01 22:48:32.117 I/        (  683): client->format=2,client->channels=1,client->rate=8000,client->access=3
  8.         //10-01 22:48:32.117 I/        (  683): slave->format=2,slave->channel=2,slave->rate=48000,slave->access=0
  9.        
  10.         if (clt->channels == slv->channels &&
  11.             (!plug->ttable || !plug->ttable_last))
  12.                 return 0;
  13.         if (clt->rate != slv->rate &&
  14.             clt->channels > slv->channels)
  15.                 return 0;
  16.         assert(snd_pcm_format_linear(slv->format));
  17.         tt_ssize = slv->channels;
  18.         tt_cused = clt->channels;
  19.         tt_sused = slv->channels;
  20.         ttable = alloca(tt_cused * tt_sused * sizeof(*ttable));
  21.         loghl("chang channels:tt_ssize=%d,tt_cused=%d,tt_sused=%d,float=%d\n",tt_ssize,tt_cused,tt_sused,sizeof(*ttable));
  22.         if (plug->ttable) {        /* expand or shrink table */
  23.                 unsigned int c = 0, s = 0;
  24.                 for (c = 0; c < tt_cused; c++) {
  25.                         for (s = 0; s < tt_sused; s++) {
  26.                                 snd_pcm_route_ttable_entry_t v;
  27.                                 if (c >= plug->tt_cused)
  28.                                         v = 0;
  29.                                 else if (s >= plug->tt_sused)
  30.                                         v = 0;
  31.                                 else
  32.                                         v = plug->ttable[c * plug->tt_ssize + s];
  33.                                 ttable[c * tt_ssize + s] = v;
  34.                         }
  35.                 }
  36.                 plug->ttable_ok = 1;
  37.         } else {
  38.                 unsigned int k;
  39.                 unsigned int c = 0, s = 0;
  40.                 enum snd_pcm_plug_route_policy rpolicy = plug->route_policy;
  41.                 int n;
  42.                 for (k = 0; k < tt_cused * tt_sused; ++k)
  43.                         ttable[k] = 0;
  44.                 if (rpolicy == PLUG_ROUTE_POLICY_DEFAULT) {
  45.                         rpolicy = PLUG_ROUTE_POLICY_COPY;
  46.                         /* it's hack for mono conversion */
  47.                         if (clt->channels == 1 || slv->channels == 1)
  48.                                 rpolicy = PLUG_ROUTE_POLICY_AVERAGE;
  49.                 }
  50.                 switch (rpolicy) {
  51.                 case PLUG_ROUTE_POLICY_AVERAGE:
  52.                 case PLUG_ROUTE_POLICY_DUP:
  53.                         if (clt->channels > slv->channels) {
  54.                                 n = clt->channels;
  55.                         } else {
  56.                                 n = slv->channels;
  57.                         }
  58.                         loghl("rpolicy=%d,clt->channels=%d,slv->channels=%d,\n",rpolicy,clt->channels,slv->channels);
  59.                         while (n-- > 0) {
  60.                                 snd_pcm_route_ttable_entry_t v = SND_PCM_PLUGIN_ROUTE_FULL;
  61.                                 loghl("v=%f\n",v);
  62.                                 if (rpolicy == PLUG_ROUTE_POLICY_AVERAGE) {
  63.                                         if (pcm->stream == SND_PCM_STREAM_PLAYBACK &&
  64.                                             clt->channels > slv->channels) {
  65.                                                 int srcs = clt->channels / slv->channels;
  66.                                                 if (s < clt->channels % slv->channels)
  67.                                                         srcs++;
  68.                                                 v /= srcs;
  69.                                         } else if (pcm->stream == SND_PCM_STREAM_CAPTURE &&
  70.                                                    slv->channels > clt->channels) {
  71.                                                         int srcs = slv->channels / clt->channels;
  72.                                                         [color=Red]loghl("srcs=%d,sc=%d,cc=%d\n",srcs,slv->channels,clt->channels);[/color]                                                if (s < slv->channels % clt->channels)
  73.                                                         {srcs++;
  74.                                                         loghl("src add before src=%d,now src=%d\n",srcs-1,srcs);
  75.                                                         }
  76.                                                 [color=Red]loghl("v=%f,srcs=%d\n",v,srcs);[/color]                                                v /= srcs;
  77.                                         }
  78.                                 }
  79.                                 ttable[c * tt_ssize + s] = v;
  80.                                 if (++c == clt->channels)
  81.                                         c = 0;
  82.                                 if (++s == slv->channels)
  83.                                         s = 0;
  84.        
  85.                         }
  86.                         break;
  87.                 case PLUG_ROUTE_POLICY_COPY:
  88.                         if (clt->channels < slv->channels) {
  89.                                 n = clt->channels;
  90.                         } else {
  91.                                 n = slv->channels;
  92.                         }
  93.                         for (c = 0; (int)c < n; c++)
  94.                                 ttable[c * tt_ssize + c] = SND_PCM_PLUGIN_ROUTE_FULL;
  95.                         break;
  96.                 default:
  97.                         SNDERR("Invalid route policy");
  98.                         break;
  99.                 }
  100.         }
  101.         loghl("change_channel:format=%d,channels=%d,t[0]=%f,t[1]=%f,tt_ssize=%d,tt_cused=%d,tt_sused=%d\n",slv->format,slv->channels,ttable[0],ttable[1],
  102.                 tt_ssize,tt_cused,tt_sused);
  103.         err = snd_pcm_route_open(new, NULL, slv->format, (int) slv->channels, ttable, tt_ssize, tt_cused, tt_sused, plug->gen.slave, plug->gen.slave != plug->req_slave);
  104.         if (err < 0)
  105.                 return err;
  106.         slv->channels = clt->channels;
  107.         slv->access = clt->access;
  108.         if (snd_pcm_format_linear(clt->format))
  109.                 slv->format = clt->format;
  110.         return 1;
  111. }

复制代码

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文