C 添加新代码时,程序停止工作

C 添加新代码时,程序停止工作,c,audio,capture,alsa,C,Audio,Capture,Alsa,我正在尝试使用以下c代码通过ALSA API捕获数据: #define ALSA_PCM_NEW_HW_PARAMS_API #include <alsa/asoundlib.h> int main() { long loops; int rc; int size; snd_pcm_t *handle; snd_pcm_hw_params_t *params; unsigned int val; int dir; snd_pcm_uframes_t frames; char *b

我正在尝试使用以下c代码通过ALSA API捕获数据:

#define ALSA_PCM_NEW_HW_PARAMS_API

#include <alsa/asoundlib.h>

int main() {
long loops;
int rc;
int size;
snd_pcm_t *handle;
snd_pcm_hw_params_t *params;
unsigned int val;
int dir;
snd_pcm_uframes_t frames;
char *buffer;

/* Open PCM device for recording (capture). */
rc = snd_pcm_open(&handle, "default",
                SND_PCM_STREAM_CAPTURE, 0);
if (rc < 0) {
fprintf(stderr,
        "unable to open pcm device: %s\n",
        snd_strerror(rc));
exit(1);
}

/* Allocate a hardware parameters object. */
snd_pcm_hw_params_alloca(&params);

/* Fill it in with default values. */
snd_pcm_hw_params_any(handle, params);

/* Set the desired hardware parameters. */

/* Interleaved mode */
snd_pcm_hw_params_set_access(handle, params,
                  SND_PCM_ACCESS_RW_INTERLEAVED);

/* Signed 16-bit little-endian format */
snd_pcm_hw_params_set_format(handle, params,
                          SND_PCM_FORMAT_S16_LE);

/* Two channels (stereo) */
snd_pcm_hw_params_set_channels(handle, params, 2);

/* 44100 bits/second sampling rate (CD quality) */
val = 44100;
snd_pcm_hw_params_set_rate_near(handle, params,
                              &val, &dir);

/* Set period size to 32 frames. */
frames = 32;
snd_pcm_hw_params_set_period_size_near(handle,
                          params, &frames, &dir);

/* Write the parameters to the driver */
rc = snd_pcm_hw_params(handle, params);
if (rc < 0) {
fprintf(stderr,
        "unable to set hw parameters: %s\n",
        snd_strerror(rc));
  exit(1);
}

/* Use a buffer large enough to hold one period */
snd_pcm_hw_params_get_period_size(params,
                                  &frames, &dir);
size = frames * 4; /* 2 bytes/sample, 2 channels */
buffer = (char *) malloc(size);

/* We want to loop for 5 seconds */
snd_pcm_hw_params_get_period_time(params,
                                     &val, &dir);
loops = 5000000 / val;

while (loops > 0) {
loops--;
rc = snd_pcm_readi(handle, buffer, frames);
if (rc == -EPIPE) {
  /* EPIPE means overrun */
  fprintf(stderr, "overrun occurred\n");
  snd_pcm_prepare(handle);
} else if (rc < 0) {
  fprintf(stderr,
          "error from read: %s\n",
          snd_strerror(rc));
} else if (rc != (int)frames) {
  fprintf(stderr, "short read, read %d frames\n", rc);
}
rc = write(1, buffer, size);
if (rc != size)
  fprintf(stderr,
          "short write: wrote %d bytes\n", rc);
}

snd_pcm_drain(handle);
snd_pcm_close(handle);
free(buffer);

return 0;
}
我真的不明白最后一个简单的循环如何影响一个开始的程序?有人知道如何修复/防止该错误吗? 非常感谢

错误无法设置硬件参数:无效参数不是由于您的附加代码段造成的。 错误的实际原因是未初始化
dir
变量。
为了解决这个问题,你必须正确地初始化<代码> dir <代码>,或者通过<代码> 0 < /C> >或<代码> null >代码>代替<代码>和dir < /> > .< /p>所以你给我们展示工作的代码,而不是那些不起作用的代码?这看起来像C.添加C++标签的原因吗?C++是一种不同的语言,一般编译C代码作为C++是一个坏主意。相同的语法并不意味着相同的语义!“如果用G++编译代码,GCC没有问题,那么同样的错误就出现了。”一个C++编译器拒绝(可能)有效的C代码并不意外。感谢StyytLeor为您的输入,但是编译器根本不拒绝代码,编译后的程序不工作。该
dir
未初始化,并且包含一个随机值。正确初始化它,您的问题就会消失。
int i;
for(i=0;i<128;i++){
printf("I: %i \n", i);
}
unable to set hw parameters: Invalid argument