Skip to content

Commit 358506d

Browse files
committed
2 parents a916c1d + da07d70 commit 358506d

File tree

17 files changed

+873
-341
lines changed

17 files changed

+873
-341
lines changed

README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@ And it supports the following boards:
4545
- LyratMini
4646
- LyratV42 
4747
- LyratV43 
48+
- ESP32S3AISmartSpeaker (ES8311 & ES7210)
4849
- NoBoard 
4950

5051

src/AudioBoard.h

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -133,9 +133,4 @@ static AudioBoard GenericWM8960{AudioDriverWM8960, NoPins};
133133
static AudioBoard GenericCS43l22{AudioDriverCS43l22, NoPins};
134134

135135

136-
#if defined(ARDUINO_GENERIC_F411VETX)
137-
/// @ingroup audio_driver
138-
static AudioBoard STM32F411Disco{AudioDriverCS43l22, PinsSTM32F411Disco};
139-
#endif
140-
141136
}

src/Driver.h

Lines changed: 107 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
#include "Driver/wm8994/wm8994.h"
2020
#include "DriverCommon.h"
2121
#include "DriverPins.h"
22+
#include "Platforms/API_GPIO.h"
2223

2324
namespace audio_driver {
2425

@@ -183,7 +184,8 @@ class CodecConfig : public codec_config_t {
183184
return CODEC_MODE_NONE;
184185
}
185186
// if sd active we setup SPI for the SD
186-
bool sd_active = true;
187+
bool sd_active = false;
188+
bool sdmmc_active = false;
187189
};
188190

189191
/**
@@ -195,15 +197,20 @@ class CodecConfig : public codec_config_t {
195197
class AudioDriver {
196198
public:
197199
/// Starts the processing
198-
virtual bool begin(CodecConfig codecCfg, DriverPins &pins) {
200+
virtual bool begin(CodecConfig codecCfg, DriverPins& pins) {
199201
AD_LOGI("AudioDriver::begin");
200202
p_pins = &pins;
201203

204+
// start GPIO
205+
getGPIO().begin(pins);
206+
202207
// Store default i2c address to pins
203208
setupI2CAddress();
204209

205210
AD_LOGI("sd_active: %d", codecCfg.sd_active);
206211
p_pins->setSPIActiveForSD(codecCfg.sd_active);
212+
AD_LOGI("sdmmc_active: %d", codecCfg.sdmmc_active);
213+
p_pins->setSDMMCActive(codecCfg.sdmmc_active);
207214
if (!p_pins->begin()) {
208215
AD_LOGE("AudioBoard::pins::begin failed");
209216
return false;
@@ -218,6 +225,7 @@ class AudioDriver {
218225
setVolume(DRIVER_DEFAULT_VOLUME);
219226
return true;
220227
}
228+
221229
/// changes the configuration
222230
virtual bool setConfig(CodecConfig codecCfg) {
223231
AD_LOGI("AudioDriver::setConfig");
@@ -259,9 +267,9 @@ class AudioDriver {
259267
/// Determines if setInputVolume() is supported
260268
virtual bool isInputVolumeSupported() { return false; }
261269
/// Provides the pin information
262-
virtual DriverPins &pins() { return *p_pins; }
270+
virtual DriverPins& pins() { return *p_pins; }
263271

264-
void setPins(DriverPins &pins) { p_pins = &pins; }
272+
void setPins(DriverPins& pins) { p_pins = &pins; }
265273

266274
/// Sets the PA Power pin to active or inactive
267275
bool setPAPower(bool enable) {
@@ -275,7 +283,7 @@ class AudioDriver {
275283
return false;
276284
}
277285
AD_LOGI("setPAPower pin %d -> %d", pin, enable);
278-
digitalWrite(pin, enable ? HIGH : LOW);
286+
getGPIO().digitalWrite(pin, enable ? HIGH : LOW);
279287
return true;
280288
}
281289

@@ -319,9 +327,14 @@ class AudioDriver {
319327
setI2CAddress(adr);
320328
}
321329

330+
API_GPIO& getGPIO() {
331+
assert(p_pins != nullptr);
332+
return p_pins->getGPIO();
333+
}
334+
322335
protected:
323336
CodecConfig codec_cfg;
324-
DriverPins *p_pins = nullptr;
337+
DriverPins* p_pins = nullptr;
325338
int i2c_default_address = -1;
326339

327340
int mapVolume(int x, int in_min, int in_max, int out_min, int out_max) {
@@ -335,7 +348,7 @@ class AudioDriver {
335348
if (!i2c) {
336349
return DEFAULT_WIRE;
337350
}
338-
i2c_bus_handle_t *result = (i2c_bus_handle_t *)i2c.value().p_wire;
351+
i2c_bus_handle_t* result = (i2c_bus_handle_t*)i2c.value().p_wire;
339352
return result;
340353
}
341354

@@ -364,7 +377,7 @@ class AudioDriver {
364377
*/
365378
class NoDriverClass : public AudioDriver {
366379
public:
367-
virtual bool begin(CodecConfig codecCfg, DriverPins &pins) {
380+
virtual bool begin(CodecConfig codecCfg, DriverPins& pins) {
368381
// codec_cfg = codecCfg;
369382
// p_pins = &pins;
370383
return true;
@@ -424,7 +437,7 @@ class AudioDriverCS43l22Class : public AudioDriver {
424437
i2c_default_address = deviceAddr;
425438
}
426439

427-
virtual bool begin(CodecConfig codecCfg, DriverPins &pins) {
440+
virtual bool begin(CodecConfig codecCfg, DriverPins& pins) {
428441
AD_LOGD("AudioDriverCS43l22Class::begin");
429442
p_pins = &pins;
430443
codec_cfg = codecCfg;
@@ -523,7 +536,7 @@ class AudioDriverCS43l22Class : public AudioDriver {
523536
class AudioDriverCS42448Class : public AudioDriver {
524537
public:
525538
AudioDriverCS42448Class() { i2c_default_address = 0x48; }
526-
bool begin(CodecConfig codecCfg, DriverPins &pins) override {
539+
bool begin(CodecConfig codecCfg, DriverPins& pins) override {
527540
cfg = codecCfg;
528541
// setup pins
529542
pins.begin();
@@ -569,8 +582,8 @@ class AudioDriverCS42448Class : public AudioDriver {
569582
bool isVolumeSupported() override { return true; }
570583
bool isInputVolumeSupported() override { return true; }
571584

572-
DriverPins &pins() { return *p_pins; }
573-
CS42448 &driver() { return cs42448; }
585+
DriverPins& pins() { return *p_pins; }
586+
CS42448& driver() { return cs42448; }
574587

575588
protected:
576589
CS42448 cs42448;
@@ -940,7 +953,7 @@ class AudioDriverTAS5805MClass : public AudioDriver {
940953
class AudioDriverWM8960Class : public AudioDriver {
941954
public:
942955
AudioDriverWM8960Class() { i2c_default_address = 0x1A; }
943-
bool begin(CodecConfig codecCfg, DriverPins &pins) {
956+
bool begin(CodecConfig codecCfg, DriverPins& pins) {
944957
codec_cfg = codecCfg;
945958

946959
// define wire object
@@ -1121,7 +1134,7 @@ class AudioDriverWM8978Class : public AudioDriver {
11211134
public:
11221135
AudioDriverWM8978Class() = default;
11231136

1124-
bool begin(CodecConfig codecCfg, DriverPins &pins) override {
1137+
bool begin(CodecConfig codecCfg, DriverPins& pins) override {
11251138
bool rc = true;
11261139
rc = wm8078.begin(getI2C(), getI2CAddress());
11271140
setConfig(codecCfg);
@@ -1211,7 +1224,7 @@ class AudioDriverWM8978Class : public AudioDriver {
12111224

12121225
bool isInputVolumeSupported() override { return true; }
12131226

1214-
WM8978 &driver() { return wm8078; }
1227+
WM8978& driver() { return wm8078; }
12151228

12161229
protected:
12171230
WM8978 wm8078;
@@ -1264,7 +1277,7 @@ class AudioDriverWM8994Class : public AudioDriver {
12641277
this->i2c_default_address = deviceAddr;
12651278
}
12661279

1267-
virtual bool begin(CodecConfig codecCfg, DriverPins &pins) {
1280+
virtual bool begin(CodecConfig codecCfg, DriverPins& pins) {
12681281
codec_cfg = codecCfg;
12691282
// manage reset pin -> active high
12701283
setPAPower(true);
@@ -1408,7 +1421,7 @@ class AudioDriverPCM3168Class : public AudioDriver {
14081421
*/
14091422
class AudioDriverLyratMiniClass : public AudioDriver {
14101423
public:
1411-
bool begin(CodecConfig codecCfg, DriverPins &pins) {
1424+
bool begin(CodecConfig codecCfg, DriverPins& pins) {
14121425
AD_LOGI("AudioDriverLyratMiniClass::begin");
14131426
p_pins = &pins;
14141427
codec_cfg = codecCfg;
@@ -1457,16 +1470,79 @@ class AudioDriverLyratMiniClass : public AudioDriver {
14571470
AudioDriverES7243Class adc;
14581471
};
14591472

1473+
/**
1474+
* @brief Generic Driver API for boards with a different DAC and ADC codec chip
1475+
* @author Phil Schatzmann
1476+
* @copyright GPLv3
1477+
*/
1478+
class AudioDriverCombined : public AudioDriver {
1479+
public:
1480+
AudioDriverCombined(AudioDriver& dac, AudioDriver& adc, bool sdActive = true)
1481+
: p_dac(&dac), p_adc(&adc) {}
1482+
1483+
bool begin(CodecConfig codecCfg, DriverPins& pins) {
1484+
AD_LOGI("AudioDriverCombined::begin");
1485+
p_pins = &pins;
1486+
codec_cfg = codecCfg;
1487+
1488+
assert(p_dac != nullptr);
1489+
assert(p_adc != nullptr);
1490+
1491+
AD_LOGI("sd_active: %d", codecCfg.sd_active);
1492+
p_pins->setSPIActiveForSD(codecCfg.sd_active);
1493+
AD_LOGI("sdmmc_active: %d", codecCfg.sdmmc_active);
1494+
p_pins->setSDMMCActive(codecCfg.sdmmc_active);
1495+
1496+
// Start
1497+
AD_LOGI("starting DAC");
1498+
pins.begin();
1499+
p_dac->setPins(this->pins());
1500+
if (!p_dac->setConfig(codecCfg)) {
1501+
AD_LOGE("setConfig failed");
1502+
return false;
1503+
}
1504+
setPAPower(true);
1505+
setVolume(DRIVER_DEFAULT_VOLUME);
1506+
1507+
// Start ADC
1508+
if (codecCfg.input_device != ADC_INPUT_NONE) {
1509+
AD_LOGI("starting ADC");
1510+
p_adc->setPins(this->pins());
1511+
if (!p_adc->setConfig(codecCfg)) {
1512+
AD_LOGE("adc.begin failed");
1513+
return false;
1514+
}
1515+
}
1516+
return true;
1517+
}
1518+
bool end(void) {
1519+
int rc = 0;
1520+
rc += p_dac->end();
1521+
rc += p_adc->end();
1522+
return rc == 2;
1523+
}
1524+
bool setMute(bool enable) override { return p_dac->setMute(enable); }
1525+
bool setVolume(int volume) override { return p_dac->setVolume(volume); }
1526+
int getVolume() override { return p_dac->getVolume(); }
1527+
bool setInputVolume(int volume) override { return p_adc->setVolume(volume); }
1528+
int getInputVolume() { return p_adc->getVolume(); }
1529+
bool isInputVolumeSupported() override { return true; }
1530+
1531+
protected:
1532+
AudioDriver* p_dac = nullptr;
1533+
AudioDriver* p_adc = nullptr;
1534+
};
1535+
14601536
/* -- NAU8325 Driver Class--- */
14611537
class AudioDriverNAU8325Class : public AudioDriver {
14621538
public:
1463-
PCBCUPID_NAU8325 *nau8325 = nullptr; // pointer to construct later
1539+
PCBCUPID_NAU8325* nau8325 = nullptr; // pointer to construct later
14641540

14651541
~AudioDriverNAU8325Class() {
14661542
if (nau8325) delete nau8325;
14671543
}
14681544

1469-
bool begin(CodecConfig cfg, DriverPins &pins) override {
1545+
bool begin(CodecConfig cfg, DriverPins& pins) override {
14701546
AD_LOGI("AudioDriverNAU8325Class::begin");
14711547

14721548
this->p_pins = &pins;
@@ -1480,13 +1556,13 @@ class AudioDriverNAU8325Class : public AudioDriver {
14801556
PinsI2C val = i2c_opt.value();
14811557

14821558
// Create instance with required params (only TwoWire&)
1483-
nau8325 = new PCBCUPID_NAU8325(*((TwoWire *)val.p_wire));
1559+
nau8325 = new PCBCUPID_NAU8325(*((TwoWire*)val.p_wire));
14841560

14851561
// Set MCLK if available
14861562
int mclk = pins.getPinID(PinFunction::MCLK_SOURCE);
14871563
if (mclk > 0) {
14881564
pinMode(mclk, OUTPUT);
1489-
digitalWrite(mclk, HIGH);
1565+
getGPIO().digitalWrite(mclk, HIGH);
14901566
delay(10); // optional small delay to stabilize
14911567
}
14921568

@@ -1540,23 +1616,23 @@ class AudioDriverNAU8325Class : public AudioDriver {
15401616
*/
15411617
class AudioDriverAD1938Class : public AudioDriver {
15421618
public:
1543-
bool begin(CodecConfig codecCfg, DriverPins &pins) override {
1619+
bool begin(CodecConfig codecCfg, DriverPins& pins) override {
15441620
int clatch = pins.getPinID(PinFunction::LATCH);
15451621
if (clatch < 0) return false;
15461622
int reset = pins.getPinID(PinFunction::RESET);
15471623
if (reset < 0) return false;
15481624
auto spi_opt = pins.getSPIPins(PinFunction::CODEC);
1549-
SPIClass *p_spi = nullptr;
1625+
SPIClass* p_spi = nullptr;
15501626
if (spi_opt) {
1551-
p_spi = (SPIClass *)spi_opt.value().p_spi;
1627+
p_spi = (SPIClass*)spi_opt.value().p_spi;
15521628
} else {
15531629
p_spi = &SPI;
15541630
p_spi->begin();
15551631
}
15561632
// setup pins
15571633
pins.begin();
15581634
// setup ad1938
1559-
ad1938.begin(codecCfg, clatch, reset, *p_spi);
1635+
ad1938.begin(getGPIO(), codecCfg, clatch, reset, *p_spi);
15601636
ad1938.enable();
15611637
ad1938.setMute(false);
15621638
return true;
@@ -1596,8 +1672,8 @@ class AudioDriverAD1938Class : public AudioDriver {
15961672
bool isVolumeSupported() override { return true; }
15971673
bool isInputVolumeSupported() override { return false; }
15981674

1599-
DriverPins &pins() { return *p_pins; }
1600-
AD1938 &driver() { return ad1938; }
1675+
DriverPins& pins() { return *p_pins; }
1676+
AD1938& driver() { return ad1938; }
16011677

16021678
protected:
16031679
AD1938 ad1938;
@@ -1650,6 +1726,10 @@ static AudioDriverCS42448Class AudioDriverCS42448;
16501726
static AudioDriverPCM3168Class AudioDriverPCM3168;
16511727
/// @ingroup audio_driver
16521728
static AudioDriverNAU8325Class AudioDriverNAU8325;
1729+
/// @ingroup audio_driver
1730+
static AudioDriverCombined AudioDriverES8311_ES7210(AudioDriverES8311, AudioDriverES7210);
1731+
/// @ingroup audio_driver
1732+
static AudioDriverCombined AudioDriverES8311_ES7243(AudioDriverES8311, AudioDriverES7243);
16531733

16541734
#ifdef ARDUINO
16551735
/// @ingroup audio_driver

0 commit comments

Comments
 (0)