ALSA PCM щелкает / появляется, когда воспроизведение остановлено - PullRequest
1 голос
/ 10 марта 2019

Например, у меня есть простая функция 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));
        }
    }
}
...