Open RomanLut opened 2 years ago
Hi Roman,
I see that your pull requests are open for almost 2 years. I need to fix the pop's as well for a small project. Problem is, I'm not entirely into this git stuff. What would be my best approach.
Thanks in advance.
Kind regards,
Martin
My solution so far has been to raise the GAIN after starting and lower it when the sound stops.
Audio wave is centered at the middle level voltage. To output silence, DAC has to output middle voltage (0x8000 sample for 16-bit DAC). PDM or PWM have to output pulses with 50% fill. When sound is not played, pin outputs zero voltage. Thus playback start and stop can cause pop (click) sounds due to instant voltage change from zero to middle (3.3V/2 average). It might not be a problem with external DAC which continue generating middle voltage when I2S is stopped. There is a problem with internal DAC, PDM on ESP32 and software Delta-sigma. Even if we let I2S to run continuously (which is waste of resources), there would be clicks on each sampling rate adjustments. To remove pop sounds, AudioGeneratorI2S and AudioGeneratorI2SNoDac can ramp voltage level from zero voltage to actial sound amplitude on playback start and opposite on stop.
Attached archive contains two sounds with and without clicks. There is no ramp by default. Ramp should be enabled with call: AudioOutputI2SNoDAC->SetRamp(100);
no_pop_sound.zip
(there is a digital noise from Sigma-delta 32).
Implementation: Implementation contains and depends on my other pull request,s especially: https://github.com/earlephilhower/ESP8266Audio/pull/520
On sound start, ramp will start with sound start. More precisely, ramp starts each time sampling rate is set,because sampling rate is changed few samples after mp3 playback start(!). Ideally we should ramp down when sound ends. As we do not know when AutdioGenerator will stop feeding AudioOutput, we have no other option to add a silence period after playback and ramp it down.
Feature is implemented for AudioGeneratorMP3 and AudioGeneratorWAV,sorry. Other generators have to be modified to support playback of bufered samples: https://github.com/earlephilhower/ESP8266Audio/pull/520