首页 文章

为什么 ALSA 示例使用 playing/capturing 循环?

提问于
浏览
3

我正在运行 Debian OS 的 ARM PC 上使用“C”语言编写 linux alsa(高级 Linux 声音架构)库。我正在尝试录制和播放声音。我的目的示例项目(一个用于录制,一个用于播放)在for循环中完成工作。我的意思是,读取或写入缓冲区。循环使用的目的是什么?

例如,在http://www.alsa-project.org/alsa-doc/alsa-lib/_2test_2pcm_min_8c-example.html中,播放声音的官方示例。它们为声音数据创建缓冲区并随机填充。这是 okey,但他们将这个缓冲区数组写入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);
}

录音样本相同:

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);
}

1 回答

  • 2

    播放示例播放相同的缓冲区十六次,以便您获得五秒的噪音,而不是仅三分之一秒。

    同样,录制示例使用循环来显示您将如何录制更长时间。 (在实际程序中,您可以对录制的样本执行某些操作,而不仅仅是打印“read x done”.)

相关问题