Skip to content

Commit f890acf

Browse files
committed
fix i2s race condition error
1 parent a4fe4d8 commit f890acf

12 files changed

+41
-1
lines changed

main/audio/codecs/box_audio_codec.cc

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -184,6 +184,7 @@ void BoxAudioCodec::SetOutputVolume(int volume) {
184184
}
185185

186186
void BoxAudioCodec::EnableInput(bool enable) {
187+
std::lock_guard<std::mutex> lock(data_if_mutex_);
187188
if (enable == input_enabled_) {
188189
return;
189190
}
@@ -207,6 +208,7 @@ void BoxAudioCodec::EnableInput(bool enable) {
207208
}
208209

209210
void BoxAudioCodec::EnableOutput(bool enable) {
211+
std::lock_guard<std::mutex> lock(data_if_mutex_);
210212
if (enable == output_enabled_) {
211213
return;
212214
}
@@ -228,13 +230,15 @@ void BoxAudioCodec::EnableOutput(bool enable) {
228230
}
229231

230232
int BoxAudioCodec::Read(int16_t* dest, int samples) {
233+
std::lock_guard<std::mutex> lock(data_if_mutex_);
231234
if (input_enabled_) {
232235
ESP_ERROR_CHECK_WITHOUT_ABORT(esp_codec_dev_read(input_dev_, (void*)dest, samples * sizeof(int16_t)));
233236
}
234237
return samples;
235238
}
236239

237240
int BoxAudioCodec::Write(const int16_t* data, int samples) {
241+
std::lock_guard<std::mutex> lock(data_if_mutex_);
238242
if (output_enabled_) {
239243
ESP_ERROR_CHECK_WITHOUT_ABORT(esp_codec_dev_write(output_dev_, (void*)data, samples * sizeof(int16_t)));
240244
}

main/audio/codecs/box_audio_codec.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@
55

66
#include <esp_codec_dev.h>
77
#include <esp_codec_dev_defaults.h>
8+
#include <mutex>
9+
810

911
class BoxAudioCodec : public AudioCodec {
1012
private:
@@ -17,6 +19,7 @@ class BoxAudioCodec : public AudioCodec {
1719

1820
esp_codec_dev_handle_t output_dev_ = nullptr;
1921
esp_codec_dev_handle_t input_dev_ = nullptr;
22+
std::mutex data_if_mutex_;
2023

2124
void CreateDuplexChannels(gpio_num_t mclk, gpio_num_t bclk, gpio_num_t ws, gpio_num_t dout, gpio_num_t din);
2225

main/audio/codecs/es8311_audio_codec.cc

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -155,6 +155,7 @@ void Es8311AudioCodec::SetOutputVolume(int volume) {
155155
}
156156

157157
void Es8311AudioCodec::EnableInput(bool enable) {
158+
std::lock_guard<std::mutex> lock(data_if_mutex_);
158159
if (enable == input_enabled_) {
159160
return;
160161
}
@@ -163,6 +164,7 @@ void Es8311AudioCodec::EnableInput(bool enable) {
163164
}
164165

165166
void Es8311AudioCodec::EnableOutput(bool enable) {
167+
std::lock_guard<std::mutex> lock(data_if_mutex_);
166168
if (enable == output_enabled_) {
167169
return;
168170
}
@@ -171,13 +173,15 @@ void Es8311AudioCodec::EnableOutput(bool enable) {
171173
}
172174

173175
int Es8311AudioCodec::Read(int16_t* dest, int samples) {
176+
std::lock_guard<std::mutex> lock(data_if_mutex_);
174177
if (input_enabled_) {
175178
ESP_ERROR_CHECK_WITHOUT_ABORT(esp_codec_dev_read(dev_, (void*)dest, samples * sizeof(int16_t)));
176179
}
177180
return samples;
178181
}
179182

180183
int Es8311AudioCodec::Write(const int16_t* data, int samples) {
184+
std::lock_guard<std::mutex> lock(data_if_mutex_);
181185
if (output_enabled_) {
182186
ESP_ERROR_CHECK_WITHOUT_ABORT(esp_codec_dev_write(dev_, (void*)data, samples * sizeof(int16_t)));
183187
}

main/audio/codecs/es8311_audio_codec.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@
77
#include <driver/gpio.h>
88
#include <esp_codec_dev.h>
99
#include <esp_codec_dev_defaults.h>
10+
#include <mutex>
11+
1012

1113
class Es8311AudioCodec : public AudioCodec {
1214
private:
@@ -18,6 +20,7 @@ class Es8311AudioCodec : public AudioCodec {
1820
esp_codec_dev_handle_t dev_ = nullptr;
1921
gpio_num_t pa_pin_ = GPIO_NUM_NC;
2022
bool pa_inverted_ = false;
23+
std::mutex data_if_mutex_;
2124

2225
void CreateDuplexChannels(gpio_num_t mclk, gpio_num_t bclk, gpio_num_t ws, gpio_num_t dout, gpio_num_t din);
2326
void UpdateDeviceState();

main/audio/codecs/es8374_audio_codec.cc

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -133,6 +133,7 @@ void Es8374AudioCodec::SetOutputVolume(int volume) {
133133
}
134134

135135
void Es8374AudioCodec::EnableInput(bool enable) {
136+
std::lock_guard<std::mutex> lock(data_if_mutex_);
136137
if (enable == input_enabled_) {
137138
return;
138139
}
@@ -153,6 +154,7 @@ void Es8374AudioCodec::EnableInput(bool enable) {
153154
}
154155

155156
void Es8374AudioCodec::EnableOutput(bool enable) {
157+
std::lock_guard<std::mutex> lock(data_if_mutex_);
156158
if (enable == output_enabled_) {
157159
return;
158160
}
@@ -180,13 +182,15 @@ void Es8374AudioCodec::EnableOutput(bool enable) {
180182
}
181183

182184
int Es8374AudioCodec::Read(int16_t* dest, int samples) {
185+
std::lock_guard<std::mutex> lock(data_if_mutex_);
183186
if (input_enabled_) {
184187
ESP_ERROR_CHECK_WITHOUT_ABORT(esp_codec_dev_read(input_dev_, (void*)dest, samples * sizeof(int16_t)));
185188
}
186189
return samples;
187190
}
188191

189192
int Es8374AudioCodec::Write(const int16_t* data, int samples) {
193+
std::lock_guard<std::mutex> lock(data_if_mutex_);
190194
if (output_enabled_) {
191195
ESP_ERROR_CHECK_WITHOUT_ABORT(esp_codec_dev_write(output_dev_, (void*)data, samples * sizeof(int16_t)));
192196
}

main/audio/codecs/es8374_audio_codec.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@
77
#include <driver/gpio.h>
88
#include <esp_codec_dev.h>
99
#include <esp_codec_dev_defaults.h>
10+
#include <mutex>
11+
1012

1113
class Es8374AudioCodec : public AudioCodec {
1214
private:
@@ -18,6 +20,7 @@ class Es8374AudioCodec : public AudioCodec {
1820
esp_codec_dev_handle_t output_dev_ = nullptr;
1921
esp_codec_dev_handle_t input_dev_ = nullptr;
2022
gpio_num_t pa_pin_ = GPIO_NUM_NC;
23+
std::mutex data_if_mutex_;
2124

2225
void CreateDuplexChannels(gpio_num_t mclk, gpio_num_t bclk, gpio_num_t ws, gpio_num_t dout, gpio_num_t din);
2326

main/audio/codecs/es8388_audio_codec.cc

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -137,6 +137,7 @@ void Es8388AudioCodec::SetOutputVolume(int volume) {
137137
}
138138

139139
void Es8388AudioCodec::EnableInput(bool enable) {
140+
std::lock_guard<std::mutex> lock(data_if_mutex_);
140141
if (enable == input_enabled_) {
141142
return;
142143
}
@@ -157,6 +158,7 @@ void Es8388AudioCodec::EnableInput(bool enable) {
157158
}
158159

159160
void Es8388AudioCodec::EnableOutput(bool enable) {
161+
std::lock_guard<std::mutex> lock(data_if_mutex_);
160162
if (enable == output_enabled_) {
161163
return;
162164
}
@@ -191,13 +193,15 @@ void Es8388AudioCodec::EnableOutput(bool enable) {
191193
}
192194

193195
int Es8388AudioCodec::Read(int16_t* dest, int samples) {
196+
std::lock_guard<std::mutex> lock(data_if_mutex_);
194197
if (input_enabled_) {
195198
ESP_ERROR_CHECK_WITHOUT_ABORT(esp_codec_dev_read(input_dev_, (void*)dest, samples * sizeof(int16_t)));
196199
}
197200
return samples;
198201
}
199202

200203
int Es8388AudioCodec::Write(const int16_t* data, int samples) {
204+
std::lock_guard<std::mutex> lock(data_if_mutex_);
201205
if (output_enabled_) {
202206
ESP_ERROR_CHECK_WITHOUT_ABORT(esp_codec_dev_write(output_dev_, (void*)data, samples * sizeof(int16_t)));
203207
}

main/audio/codecs/es8388_audio_codec.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@
66
#include <driver/i2c_master.h>
77
#include <esp_codec_dev.h>
88
#include <esp_codec_dev_defaults.h>
9+
#include <mutex>
10+
911

1012
class Es8388AudioCodec : public AudioCodec {
1113
private:
@@ -17,6 +19,7 @@ class Es8388AudioCodec : public AudioCodec {
1719
esp_codec_dev_handle_t output_dev_ = nullptr;
1820
esp_codec_dev_handle_t input_dev_ = nullptr;
1921
gpio_num_t pa_pin_ = GPIO_NUM_NC;
22+
std::mutex data_if_mutex_;
2023

2124
void CreateDuplexChannels(gpio_num_t mclk, gpio_num_t bclk, gpio_num_t ws, gpio_num_t dout, gpio_num_t din);
2225

main/audio/codecs/es8389_audio_codec.cc

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -140,6 +140,7 @@ void Es8389AudioCodec::SetOutputVolume(int volume) {
140140
}
141141

142142
void Es8389AudioCodec::EnableInput(bool enable) {
143+
std::lock_guard<std::mutex> lock(data_if_mutex_);
143144
if (enable == input_enabled_) {
144145
return;
145146
}
@@ -160,6 +161,7 @@ void Es8389AudioCodec::EnableInput(bool enable) {
160161
}
161162

162163
void Es8389AudioCodec::EnableOutput(bool enable) {
164+
std::lock_guard<std::mutex> lock(data_if_mutex_);
163165
if (enable == output_enabled_) {
164166
return;
165167
}
@@ -187,13 +189,15 @@ void Es8389AudioCodec::EnableOutput(bool enable) {
187189
}
188190

189191
int Es8389AudioCodec::Read(int16_t* dest, int samples) {
192+
std::lock_guard<std::mutex> lock(data_if_mutex_);
190193
if (input_enabled_) {
191194
ESP_ERROR_CHECK_WITHOUT_ABORT(esp_codec_dev_read(input_dev_, (void*)dest, samples * sizeof(int16_t)));
192195
}
193196
return samples;
194197
}
195198

196199
int Es8389AudioCodec::Write(const int16_t* data, int samples) {
200+
std::lock_guard<std::mutex> lock(data_if_mutex_);
197201
if (output_enabled_) {
198202
ESP_ERROR_CHECK_WITHOUT_ABORT(esp_codec_dev_write(output_dev_, (void*)data, samples * sizeof(int16_t)));
199203
}

main/audio/codecs/es8389_audio_codec.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
#include <driver/gpio.h>
88
#include <esp_codec_dev.h>
99
#include <esp_codec_dev_defaults.h>
10+
#include <mutex>
1011

1112
class Es8389AudioCodec : public AudioCodec {
1213
private:
@@ -18,6 +19,7 @@ class Es8389AudioCodec : public AudioCodec {
1819
esp_codec_dev_handle_t output_dev_ = nullptr;
1920
esp_codec_dev_handle_t input_dev_ = nullptr;
2021
gpio_num_t pa_pin_ = GPIO_NUM_NC;
22+
std::mutex data_if_mutex_;
2123

2224
void CreateDuplexChannels(gpio_num_t mclk, gpio_num_t bclk, gpio_num_t ws, gpio_num_t dout, gpio_num_t din);
2325

0 commit comments

Comments
 (0)