C ALSA get hw parameters函数上不允许操作

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,

我正在尝试播放从服务器接收的pcm音频缓冲区。我下载了一个示例alsa回放文件,该文件将记录的文件作为输入,其工作正常,但我在SIP客户端应用程序中添加的代码与操作不允许的错误相同。打开设备并设置设备的配置正常,但尝试获取我配置的参数时出现
操作不允许错误
。 有人能告诉我为什么我会犯这个错误吗

/* 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(&params);

    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)