[嵌入式linux] 看看 这段代码的BUG在哪里,有时候真的不注意就出错,

[复制链接]
 楼主| ROSHEN_007 发表于 2022-8-25 15:02 | 显示全部楼层 |阅读模式
这是我做ALSA开发的时候编写的一段代码,初始化pcm设备,发现总是打开失败,从头到尾看了好几遍才发现问题!
  1. static int snd_pcm_init(snd_para_t *snd_para,snd_pcm_t *pcm)
  2. {
  3.     snd_pcm_hw_params_t *hwparams = NULL;
  4.     int ret;
  5.     if(snd_para->alsa_pcm_dev_name!=NULL)
  6.         // ret = snd_pcm_open(&(pcm), snd_para->alsa_pcm_dev_name, snd_para->stream, 0);
  7.         ret = snd_pcm_open(&(pcm), ALSA_PCM_PLAYBACK_DEV, snd_para->stream, 0);
  8.     else{
  9.         puts(" pcm dev name is null\n");
  10.         return -1;
  11.     }
  12.     if (0 != ret) {
  13.         fprintf(stderr, "snd_pcm_open error: %s: %s\n",
  14.         snd_para->alsa_pcm_dev_name, snd_strerror(ret));
  15.         return -1;
  16.     }
  17.     snd_pcm_hw_params_malloc(&hwparams);
  18.     ret = snd_pcm_hw_params_any(pcm, hwparams);
  19.     if (0 != ret) {
  20.         fprintf(stderr, "snd_pcm_hw_params_any error: %s\n", snd_strerror(ret));
  21.         goto err2;
  22.     }
  23.     ret = snd_pcm_hw_params_set_access(pcm, hwparams, snd_para->_access);
  24.     if (0 !=  ret) {
  25.         fprintf(stderr, "snd_pcm_hw_params_set_access error: %s\n", snd_strerror(ret));
  26.         goto err2;
  27.     }
  28.     ret = snd_pcm_hw_params_set_format(pcm, hwparams, snd_para->fmt);
  29.     if (0 !=  ret) {
  30.         fprintf(stderr, "snd_pcm_hw_params_set_format error: %s\n", snd_strerror(ret));
  31.         goto err2;
  32.     }
  33.     ret = snd_pcm_hw_params_set_rate(pcm, hwparams, snd_para->sample_rate, 0);
  34.     if (0 !=  ret) {
  35.         fprintf(stderr, "snd_pcm_hw_params_set_rate error: %s\n", snd_strerror(ret));
  36.         goto err2;
  37.     }
  38.     ret = snd_pcm_hw_params_set_channels(pcm, hwparams, snd_para->channels);
  39.     if (0!=  ret) {
  40.         fprintf(stderr, "snd_pcm_hw_params_set_channels error: %s\n", snd_strerror(ret));
  41.         goto err2;
  42.     }

  43.     ret = snd_pcm_hw_params_set_period_size(pcm, hwparams, snd_para->period_size, 0);
  44.     if (0 !=  ret) {
  45.         fprintf(stderr, "snd_pcm_hw_params_set_period_size error: %s\n", snd_strerror(ret));
  46.         goto err2;
  47.     }

  48.     ret = snd_pcm_hw_params_set_periods(pcm, hwparams, snd_para->periods, 0);
  49.     if (0!=  ret) {
  50.         fprintf(stderr, "snd_pcm_hw_params_set_periods error: %s\n", snd_strerror(ret));
  51.         goto err2;
  52.     }

  53.     ret = snd_pcm_hw_params(pcm, hwparams);
  54.     snd_pcm_hw_params_free(hwparams);
  55.     if (0 !=  ret) {
  56.         fprintf(stderr, "snd_pcm_hw_params error: %s\n", snd_strerror(ret));
  57.         goto err1;
  58.     }

  59.     return 0;
  60.     err2:
  61.     snd_pcm_hw_params_free(hwparams); //释放内存
  62.     err1:
  63.     snd_pcm_close(pcm); //关闭 pcm 设备
  64.     return -1;
  65. }
您需要登录后才可以回帖 登录 | 注册

本版积分规则

9

主题

282

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部