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

Don't SetRate() if hz already matches, fixes noisy click #656

Open
wants to merge 4 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
13 changes: 13 additions & 0 deletions src/AudioOutputI2S.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@ AudioOutputI2S::AudioOutputI2S(int port, int output_mode, int dma_buf_count, int
{
this->portNo = port;
this->i2sOn = false;
this->i2sRateSet = false;
this->dma_buf_count = dma_buf_count;
if (output_mode != EXTERNAL_I2S && output_mode != INTERNAL_DAC && output_mode != INTERNAL_PDM) {
output_mode = EXTERNAL_I2S;
Expand All @@ -56,6 +57,7 @@ AudioOutputI2S::AudioOutputI2S(int port, int output_mode, int dma_buf_count, int
#elif defined(ARDUINO_ARCH_RP2040)
AudioOutputI2S::AudioOutputI2S(long sampleRate, pin_size_t sck, pin_size_t data) {
i2sOn = false;
i2sRateSet = false;
mono = false;
bps = 16;
channels = 2;
Expand Down Expand Up @@ -129,7 +131,13 @@ bool AudioOutputI2S::SetPinout(int bclk, int wclk, int dout, int mclk)
bool AudioOutputI2S::SetRate(int hz)
{
// TODO - have a list of allowable rates from constructor, check them

if(this->hertz == hz && this->i2sRateSet){ // hz already set to this
return true;
}

this->hertz = hz;

if (i2sOn)
{
#ifdef ESP32
Expand All @@ -140,6 +148,10 @@ bool AudioOutputI2S::SetRate(int hz)
i2s.setFrequency(hz);
#endif
}

if(!this->i2sRateSet){
this->i2sRateSet = true;
}
return true;
}

Expand Down Expand Up @@ -407,5 +419,6 @@ bool AudioOutputI2S::stop()
i2s.end();
#endif
i2sOn = false;
i2sRateSet = false;
return true;
}
2 changes: 2 additions & 0 deletions src/AudioOutputI2S.h
Original file line number Diff line number Diff line change
Expand Up @@ -62,10 +62,12 @@ class AudioOutputI2S : public AudioOutput
bool mono;
int lsb_justified;
bool i2sOn;
bool i2sRateSet;
int dma_buf_count;
int use_apll;
bool use_mclk;
bool swap_clocks;

// We can restore the old values and free up these pins when in NoDAC mode
uint32_t orig_bck;
uint32_t orig_ws;
Expand Down