1919#include " Driver/wm8994/wm8994.h"
2020#include " DriverCommon.h"
2121#include " DriverPins.h"
22+ #include " Platforms/API_GPIO.h"
2223
2324namespace 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 {
195197class 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 */
365378class 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 {
523536class 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 {
940953class 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 */
14091422class 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--- */
14611537class 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 */
15411617class 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;
16501726static AudioDriverPCM3168Class AudioDriverPCM3168;
16511727// / @ingroup audio_driver
16521728static 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