0

例如,我有一个简单的 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));
        }
    }
}
4

0 回答 0