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