例如,我有一个简单的 play() 函数,可以很好地播放任意音调。问题是,一旦我决定停止播放音调,ALSA 就会产生咔嗒声/弹出声。我已经尝试过使用 snd_pcm_drain(),当它完成周期时停止音调,在有限循环的情况下甚至尝试逐渐使音调静音。有没有办法避免这种弹出?
void play()
{
int err;
while (1) {
for (unsigned i = 0; i < buffer_size; i++)
{
buffer[i] = (AMP - 1) * gen_sine(time) + AMP;
time += time_step;
}
err = snd_pcm_writei(handle, buffer, buffer_size);
if (err == -EPIPE) {
fprintf(stderr, "underrun occurred\n");
snd_pcm_prepare(handle);
}
else if (err == -EBADFD) {
fprintf(stderr, "PCM is not in the right state\n");
}
else if (err < 0) {
fprintf(stderr, "error from writei: %s\n", snd_strerror(err));
}
}
}