alsa snd_pcm_hw_params 调用出错

猫的思维方式 2022-05-12 18:04:38

snd_pcm_hw_params函数调用报错,返回值-22,请问有人遇到过这个问题吗?原因是什么??

 

int main()
{
    int ret = 0;
    snd_pcm_t* pcm_handle;
    snd_pcm_hw_params_t *params = NULL;
    unsigned int val;
    int dir;
    
    ret = snd_pcm_open(&pcm_handle,"hw:0,0",SND_PCM_STREAM_CAPTURE,0);
    printf("snd_pcm_open  %s  ret = %d\n",snd_strerror(ret),ret);

    printf("before alloca params = %p\n",params);
    snd_pcm_hw_params_alloca(&params);
    printf("after alloca params = %p\n",params);

    ret = snd_pcm_hw_params_any(pcm_handle, params);
    printf("snd_pcm_hw_params_any %s  ret = %d\n",snd_strerror(ret),ret);
    
    ret = snd_pcm_hw_params_set_access(pcm_handle, params,SND_PCM_ACCESS_RW_INTERLEAVED);
    printf("snd_pcm_hw_params_set_access %s  ret = %d\n",snd_strerror(ret),ret);

    ret = snd_pcm_hw_params_set_format(pcm_handle, params,SND_PCM_FORMAT_S16_LE);
    printf("snd_pcm_hw_params_set_format %s  ret = %d\n",snd_strerror(ret),ret);

    ret = snd_pcm_hw_params_set_channels(pcm_handle, params, 2);
    printf("snd_pcm_hw_params_set_channels %s  ret = %d\n",snd_strerror(ret),ret);

    val = 44100;

    ret = snd_pcm_hw_params_set_rate_near(pcm_handle,params, &val, &dir);
    printf("snd_pcm_hw_params_set_rate_near %s  ret = %d\n",snd_strerror(ret),ret);

    ret = snd_pcm_hw_params(pcm_handle, params);
    printf("snd_pcm_hw_params %s  ret = %d\n",snd_strerror(ret),ret);


    snd_pcm_close(pcm_handle);

}

 

程序运行输出如下:

snd_pcm_open  Success  ret = 0
before alloca params = (nil)
after alloca params = 0xbe9c49a0
snd_pcm_hw_params_any Success  ret = 0
snd_pcm_hw_params_set_access Success  ret = 0
snd_pcm_hw_params_set_format Success  ret = 0
snd_pcm_hw_params_set_channels Success  ret = 0
snd_pcm_hw_params_set_rate_near Success  ret = 0
snd_pcm_hw_params Invalid argument  ret = -22

 

...全文
1583 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复

我遇到同样的问题,原因是没有设置缓冲区大小和周期,按如下设置解决:
// 设置缓冲区大小
snd_pcm_uframes_t buffer_size = 1024;
if ((err = snd_pcm_hw_params_set_buffer_size(capture_handle, hw_params, buffer_size)) < 0) {
printf(stderr, "无法设置缓冲区大小 (%s)\n", snd_strerror(err));
exit(1);
}
printf("设置缓冲区大小成功\n");

// 设置周期大小
snd_pcm_uframes_t period_size = 512;
if ((err = snd_pcm_hw_params_set_period_size(capture_handle, hw_params, period_size, 0)) < 0) {
printf(stderr, "无法设置周期大小 (%s)\n", snd_strerror(err));
exit(1);
}
printf("设置周期大小成功\n");

  • 打赏
  • 举报
回复

我遇到同样的问题,原因是没有设置缓冲区大小和周期,按如下设置解决:

Sunnixi-Me 2023-11-21
  • 打赏
  • 举报
回复

dir=0;
ret = snd_pcm_hw_params_set_rate_near(pcm_handle,params, &val, &dir);

weixin_51394072 2023-04-08
  • 打赏
  • 举报
回复

看看你的设备支不支持现在的采样率

jiushizhuno1 2023-01-04
  • 打赏
  • 举报
回复

楼主调好了吗?

社会边角料儿 2022-10-29
  • 打赏
  • 举报
回复

请问楼主解决了吗

m0_57995224 2022-10-27
  • 打赏
  • 举报
回复 1

SND_PCM_FORMAT_S16_LE这个参数错了

社会边角料儿 2022-10-27
  • 举报
回复
@m0_57995224 请问改成什么是正确的啊?
m0_57995224 2022-10-27
  • 打赏
  • 举报
回复 1

参数设置错了,或者是位数、period size ,buffer size或者其他的

hanjoy123456 2022-09-22
  • 打赏
  • 举报
回复

解决了嘛,我先是-22 然后按楼上的修改变成-12

liuyu进阶 2022-09-08
  • 打赏
  • 举报
回复

请问楼主解决了吗 ,我也遇到了

swjtueducn2 2022-07-05
  • 打赏
  • 举报
回复 1

不知道是不是这个原因,你可以试一下 ret = snd_pcm_hw_params_set_rate_near(pcm_handle,params, &val, &dir); 这个修改
ret = snd_pcm_hw_params_set_rate_near(pcm_handle,params, &val, 0); // 这个dir 的参数 ,不知道是个什么含义,出参还是入参,这个改下应该可以的。

weixin_38361896 2023-02-03
  • 举报
回复
@swjtueducn2
猫的思维方式 2022-05-12
  • 打赏
  • 举报
回复

跪求解答

23,223

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧