Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

No pop sounds #523

Open
wants to merge 14 commits into
base: master
Choose a base branch
from
Open

No pop sounds #523

wants to merge 14 commits into from

Conversation

RomanLut
Copy link
Contributor

@RomanLut RomanLut commented May 8, 2022

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:
#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:
#520

@MatersM
Copy link

MatersM commented Mar 3, 2024

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

@polygontwist
Copy link

My solution so far has been to raise the GAIN after starting and lower it when the sound stops.

@CobaltEcho
Copy link

My solution so far has been to raise the GAIN after starting and lower it when the sound stops.

So you're basically cutting the gain after each file, then raising it again before the next one?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

4 participants