c - 为什么 ALSA 示例使用循环播放/捕获?

标签 c linux audio alsa

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

例如,在 http://www.alsa-project.org/alsa-doc/alsa-lib/_2test_2pcm_min_8c-example.html 中,播放声音的官方示例。他们为声音数据创建一个缓冲区并随机填充它。没关系,但是他们在循环 16 次的 for 循环中将此缓冲区数组写入声音设备的缓冲区。循环内的循环计数器 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);
}

recording sample相同:

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

最佳答案

播放示例将同一个缓冲区播放 16 次,这样您会得到 5 秒的噪音,而不是只有 1/3 秒。

同样,录音示例使用循环来显示您将如何录制更长的时间。 (在实际程序中,您将对记录的样本做一些事情,而不是仅仅打印“read x done”。)

关于c - 为什么 ALSA 示例使用循环播放/捕获?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41931126/

相关文章:

在 Linux 中使用命令行编译 F# 程序

java - Rabbitmq 连接被拒绝,在 Linux 服务器上的 docker 容器内运行

audio - FFMPEG 和 MP3。如何解码

Python - 音频文件未关闭 -> os.remove()

C程序设计语言

c - '#' 在 C 中到底做什么?

linux - 在 bash 中的 ssh 上在本地计算机上运行命令

linux - 根据目标名称创建对象文件

linux - udpsink 似乎不流任何东西,但 filesink 工作

c++ - 关于范围的最佳变量声明