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

问题描述:

我正在运行Debian OS的ARM PC上以“C”语言开发linux alsa(高级linux声音体系结构)库。我正在尝试录制和播放声音。我的目的示例项目(一个用于录制,另一个用于播放)在for循环内完成作业。我的意思是,读或写缓冲区。这个for循环用法的目的是什么?为什么ALSA示例使用循环播放/捕获?

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

播放示例播放相同的缓冲十六倍,让你得到噪声五秒钟,而不是只有三分之一秒。

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

+0

这是非常有意义的。谢谢你们的编辑和回答。 –