android alsa分析之二

 

        配置树获取

allsa-lib将它的配置文件(asound.conf/alsa-lib.conf)构建成树的结构.
在创建PCM或者CTL时会不断地用到这个配置树,所以时刻了解这个配置树的状态,可以使我们方便地理解程序。
树如何获取呢?我们可以打印LOG,用先序或中序或后序显示出树的状态。
的确可以这样, 我也是这样做的。可是由于我们的树太大了,用LOGCAT显示时,只能显示树的一部分结构。所以为了使我们更容易地理解程序流程
需要时刻关注配置树状态。
既然LOGCAT不行。后来编写了C函数,将配置树信息输出到文件系统中,然后就可以打开文件进行分析,使我们时刻了解配置树动态信息。
代码如下:
int  show_hl(snd_config_t *config)
{ assert(config);
 switch (config->type) {
 case SND_CONFIG_TYPE_COMPOUND:
 {
  int err;
  struct list_head *i;
  i = config->u.compound.fields.next;
  loghl("Start Compound---> node id =%s\n",config->id?config->id:"null");
  while (i != &config->u.compound.fields) {
   struct list_head *nexti = i->next;
   snd_config_t *leaf = snd_config_iterator_entry(i);
   err = show_hl(leaf);
   if (err < 0)
    return err;
   i = nexti;
  }
  loghl("End Compound---> ---> node id =%s\n",config->id?config->id:"null");
  break;
 }
 case SND_CONFIG_TYPE_STRING:

  loghl("SND_CONFIG_TYPE_STRING---> leaf id=%s,str=%s\n",config->id?config->id:"null",config->u.string?config->u.string:"null");
  break;
 case SND_CONFIG_TYPE_INTEGER:
  loghl("SND_CONFIG_TYPE_ INTGER --->leaf id=%s,num=%ld\n",config->id?config->id:"null",config->u.integer); 
  break;
  case SND_CONFIG_TYPE_REAL:
  loghl("SND_CONFIG_TYPE_ REAL--->leaf id=%s,num=%f\n",config->id?config->id:"null",config->u.real);  
   break;
  case   SND_CONFIG_TYPE_INTEGER64:
  loghl("SND_CONFIG_TYPE_INTEGER64--->leaf id=%s,num=%ld\n",config->id?config->id:"null",config->u.integer64); 
    break;
  case SND_CONFIG_TYPE_POINTER:
  loghl("SND_CONFIG_TYPE_POINTER--->leaf id=%s,num=%p\n",config->id?config->id:"null",config->u.ptr); 
    break;
 default:
  break;
 }
 return 0;
}
 类先序遍历树。
 其中loghl是我书写的一个变参函数,意思是将后面的数据以指定格式输出到文件中。代码如下:
char pathhelun[]="/data/helun";
FILE * open_start_once();
void loghl(char *fmt,...)
{
 
 FILE *fp=NULL;
   va_list arg;
 fp=open_start_once();
 if(!fp)
  {
  printf("create %s error \n",pathhelun);
   return ;
  }
    
     va_start(arg, fmt); 
 vfprintf(fp, fmt,arg);
     va_end(arg);
 fclose(fp); //每次输入日志后必需关闭,因为无法在终端关掉它。这样会影响速度,但是必需这样做。


}
FILE * open_start_once()
{
 FILE *fp=NULL;
 /*
 if(once==0)
  {
  fp=fopen(pathhelun,"w+");
  once++;
 }
 else
  {
   fp=fopen(pathhelun,"a+");

 }*/
 fp=fopen(pathhelun,"a+"); 
 return fp;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值