Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 为什么ALSA示例使用循环进行播放/捕获?_C_Linux_Audio_Alsa - Fatal编程技术网

C 为什么ALSA示例使用循环进行播放/捕获?

C 为什么ALSA示例使用循环进行播放/捕获?,c,linux,audio,alsa,C,Linux,Audio,Alsa,我正在运行Debian操作系统的ARM pc上用“C”语言编写linux alsa(高级linux声音体系结构)库。我正在试着录音和播放声音。我使用的示例项目(一个用于录制,一个用于播放)在for循环中完成工作。我是说,读写缓冲区。这个循环使用的目的是什么 例如,在中,播放声音的官方示例。它们为声音数据创建缓冲区,并随机填充。这是可以的,但是他们将这个缓冲区数组写入声音设备的缓冲区,在中循环16次。循环内的循环计数器i没有任何作用: for (i = 0; i < 16; i++) {

我正在运行Debian操作系统的ARM pc上用“C”语言编写linux alsa(高级linux声音体系结构)库。我正在试着录音和播放声音。我使用的示例项目(一个用于录制,一个用于播放)在
for
循环中完成工作。我是说,读写缓冲区。这个循环使用的目的是什么

例如,在中,播放声音的官方示例。它们为声音数据创建缓冲区,并随机填充。这是可以的,但是他们将这个缓冲区数组写入声音设备的缓冲区,在
中循环16次。循环内的循环计数器
i
没有任何作用:

for (i = 0; i < 16; i++) {
    frames = snd_pcm_writei(handle, buffer, sizeof(buffer));
    if (frames < 0)
        frames = snd_pcm_recover(handle, frames, 0);
    if (frames < 0) {
        printf("snd_pcm_writei failed: %s\n", snd_strerror(frames));
        break;
    }
    if (frames > 0 && frames < (long)sizeof(buffer))
        printf("Short write (expected %li, wrote %li)\n", (long)sizeof(buffer), frames);
}
(i=0;i<16;i++)的
{
frames=sndu pcmu writei(句柄、缓冲区、大小(缓冲区));
如果(帧<0)
帧=snd_pcm_recover(句柄,帧,0);
如果(帧<0){
printf(“snd_pcm_写入失败:%s\n”,snd_strerror(帧));
打破
}
如果(帧>0和帧<(长)大小(缓冲区))
printf(“短写(应为%li,写为%li)\n),(长)大小(缓冲区),帧);
}
同:

(i=0;i<10;++i)的
{
if((err=snd\u pcm\u readi(捕获句柄、缓冲区、缓冲区帧))!=buffer\u帧){
fprintf(标准,“从音频接口读取失败(%s)\n”,
呃,snd_strerror(呃),;
出口(1);
}
fprintf(标准输出,“读取%d完成\n”,i);
}

播放示例将同一个缓冲区播放16次,这样可以获得5秒的噪声,而不是仅三分之一秒


类似地,录制示例使用循环来显示如何录制更长的时间。(在真实的程序中,您可以对记录的样本执行某些操作,而不只是打印“read x done”。

这完全有道理。谢谢您的编辑和回答。要获取程序的运行时间,run
time./pcm_min
将输出约5秒。
for (i = 0; i < 10; ++i) {
   if ((err = snd_pcm_readi (capture_handle, buffer, buffer_frames)) != buffer_frames) {
      fprintf (stderr, "read from audio interface failed (%s)\n",
               err, snd_strerror (err));
      exit (1);
   }
   fprintf(stdout, "read %d done\n", i);
}