C ALSA get hw parameters函数上不允许操作
我正在尝试播放从服务器接收的pcm音频缓冲区。我下载了一个示例alsa回放文件,该文件将记录的文件作为输入,其工作正常,但我在SIP客户端应用程序中添加的代码与操作不允许的错误相同。打开设备并设置设备的配置正常,但尝试获取我配置的参数时出现C ALSA get hw parameters函数上不允许操作,c,alsa,C,Alsa,我正在尝试播放从服务器接收的pcm音频缓冲区。我下载了一个示例alsa回放文件,该文件将记录的文件作为输入,其工作正常,但我在SIP客户端应用程序中添加的代码与操作不允许的错误相同。打开设备并设置设备的配置正常,但尝试获取我配置的参数时出现操作不允许错误。 有人能告诉我为什么我会犯这个错误吗 /* Open the PCM device in playback mode */ if (pcm = snd_pcm_open(&pcm_handle, PCM_DEVICE,
操作不允许错误
。
有人能告诉我为什么我会犯这个错误吗
/* Open the PCM device in playback mode */
if (pcm = snd_pcm_open(&pcm_handle, PCM_DEVICE,
SND_PCM_STREAM_PLAYBACK, 0) < 0)
printf("ERROR: Can't open \"%s\" PCM device. %s\n",
PCM_DEVICE, snd_strerror(pcm));
/* Allocate parameters object and fill it with default values*/
snd_pcm_hw_params_alloca(¶ms);
snd_pcm_hw_params_any(pcm_handle, params);
/* Set parameters */
if (pcm = snd_pcm_hw_params_set_access(pcm_handle, params,
SND_PCM_ACCESS_RW_INTERLEAVED) < 0)
printf("ERROR: Can't set interleaved mode. %s\n", snd_strerror(pcm));
if (pcm = snd_pcm_hw_params_set_format(pcm_handle, params,
//SND_PCM_FORMAT_S16_LE) < 0)
SND_PCM_FORMAT_MU_LAW) < 0)
printf("ERROR: Can't set format. %s\n", snd_strerror(pcm));
if (pcm = snd_pcm_hw_params_set_channels(pcm_handle, params, channels) < 0)
printf("ERROR: Can't set channels number. %s\n", snd_strerror(pcm));
if (pcm = snd_pcm_hw_params_set_rate_near(pcm_handle, params, &rate, 0) < 0)
printf("ERROR: Can't set rate. %s\n", snd_strerror(pcm));
/* Write parameters */
if (pcm = snd_pcm_hw_params(pcm_handle, params) < 0)
printf("ERROR: Can't set harware parameters. %s\n", snd_strerror(pcm));
/* Resume information */
printf("PCM name: '%s'\n", snd_pcm_name(pcm_handle));
printf("PCM state: %s\n", snd_pcm_state_name(snd_pcm_state(pcm_handle)));
pcm = snd_pcm_hw_params_get_channels(params, &tmp);
printf("channels: %i %d", tmp, pcm);
if (tmp == 1)
printf("(mono)\n");
else if (tmp == 2)
printf("(stereo)\n");
snd_pcm_hw_params_get_rate(params, &tmp, 0);
printf("rate: %d bps\n", tmp);
printf("seconds: %d\n", seconds);
/* Allocate buffer to hold single period */
snd_pcm_hw_params_get_period_size(params, &frames, 0);
buff_size = frames * channels * 2 /* 2 -> sample size */;
buff = (char *) malloc(buff_size);
printf("buffsize: %d\n", buff_size);
snd_pcm_hw_params_get_period_time(params, &tmp, NULL);
/*在播放模式下打开PCM设备*/
如果(pcm=snd\U pcm\U打开(&pcm\U手柄、pcm\U装置、,
SND_PCM_流_播放,0)<0)
printf(“错误:无法打开\%s\”PCM设备。%s\n”,
PCM_设备,snd_strerror(PCM));
/*分配参数对象并用默认值填充它*/
snd_pcm_hw_params_alloca(¶ms);
snd_pcm_hw_params_any(pcm_handle,params);
/*设置参数*/
如果(pcm=snd_pcm_hw_params_set_access(pcm_handle,params,
SND_PCM_访问_RW_交织)<0)
printf(“错误:无法设置交织模式。%s\n”,snd_strerror(pcm));
如果(pcm=snd_pcm_硬件_参数_设置_格式)(pcm_句柄,参数,
//SND_PCM_格式_S16_LE)<0)
SND_PCM_格式_MU_法则)<0)
printf(“错误:无法设置格式。%s\n”,snd_strerror(pcm));
如果(pcm=snd_pcm_硬件_参数_设置_通道(pcm_手柄、参数、通道)<0)
printf(“错误:无法设置通道号。%s\n”,snd_strerror(pcm));
如果(pcm=snd_pcm_硬件_参数_设置_速率_近(pcm_句柄、参数和速率,0)<0)
printf(“错误:无法设置速率。%s\n”,snd_strerror(pcm));
/*写入参数*/
如果(pcm=snd_pcm_hw_参数(pcm_句柄,参数)<0)
printf(“错误:无法设置硬件参数。%s\n”,snd_strerror(pcm));
/*简历信息*/
printf(“PCM名称:'%s'\n',snd_PCM_名称(PCM_句柄));
printf(“PCM状态:%s\n”,snd_PCM_状态名称(snd_PCM_状态(PCM_句柄));
pcm=snd_pcm_硬件_参数_获取_通道(参数和tmp);
printf(“通道:%i%d”,tmp,pcm);
如果(tmp==1)
printf(“(mono)\n”);
else if(tmp==2)
printf(“(立体声)\n”);
snd_pcm_hw_params_get_rate(参数和tmp,0);
printf(“速率:%d bps\n”,tmp);
printf(“秒:%d\n”,秒);
/*分配缓冲区以保存单个周期*/
snd_pcm_hw_params_get_period_size(参数和帧,0);
buff_size=frames*channels*2/*2->sample size*/;
buff=(字符*)malloc(buff_大小);
printf(“buff大小:%d\n”,buff\u大小);
snd_pcm_hw_params_get_period_time(参数和tmp,NULL);
您所有的错误检查都是错误的
应该检查所有函数调用的返回值。不管怎样,哪个函数失败了?感谢回复snd_pcm_hw_params_get_通道、snd_pcm_hw_params_get_rate和snd_pcm_hw_params_get_period_大小以上所有函数都不允许执行get_操作,返回值为0snd_pcm_hw_params_get_通道(params,&tmp)snd_pcm_hw_params_get_get_通道(params,&tmp,0);返回成功(0)和参数必须获得我必须设置的值,即8000和1,但函数值设置为1和操作不允许错误“操作不允许”是代码为1的错误。我解释了为什么这不是真正的错误代码。当我将其作为单独的代码运行时,我得到了配置的参数(采样率和通道)。当sip客户端中包含相同的代码时,我在alsa设备上写入音频缓冲区时,会发现此问题,并且没有声音。你能告诉我我做错了什么吗?你真的读过并理解我的答案了吗?如果您做了这些更改,您将得到正确的错误代码。我按照您所说的修改了我的代码,得到了返回值1。有什么解决方案可以克服这个问题吗。?
if (err = snd_something(...) < 0)
if ((err = snd_something(...)) < 0)
err = snd_something(...);
if (err < 0)