23,223
社区成员
发帖
与我相关
我的任务
分享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(¶ms);
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
我遇到同样的问题,原因是没有设置缓冲区大小和周期,按如下设置解决:
// 设置缓冲区大小
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");
我遇到同样的问题,原因是没有设置缓冲区大小和周期,按如下设置解决:
dir=0;
ret = snd_pcm_hw_params_set_rate_near(pcm_handle,params, &val, &dir);
看看你的设备支不支持现在的采样率
楼主调好了吗?
请问楼主解决了吗
SND_PCM_FORMAT_S16_LE这个参数错了
参数设置错了,或者是位数、period size ,buffer size或者其他的
解决了嘛,我先是-22 然后按楼上的修改变成-12
请问楼主解决了吗 ,我也遇到了
不知道是不是这个原因,你可以试一下 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 的参数 ,不知道是个什么含义,出参还是入参,这个改下应该可以的。

跪求解答