mirror of
				https://github.com/esphome/esphome.git
				synced 2025-10-30 22:53:59 +00:00 
			
		
		
		
	Move I2S config settings the the base i2sAudio files. Phase 1 (#7183)
Co-authored-by: Jesse Hills <3060199+jesserockz@users.noreply.github.com>
This commit is contained in:
		| @@ -1,16 +1,16 @@ | ||||
| import esphome.config_validation as cv | ||||
| import esphome.final_validate as fv | ||||
| import esphome.codegen as cg | ||||
|  | ||||
| from esphome import pins | ||||
| from esphome.const import CONF_ID | ||||
| import esphome.codegen as cg | ||||
| from esphome.components.esp32 import get_esp32_variant | ||||
| from esphome.components.esp32.const import ( | ||||
|     VARIANT_ESP32, | ||||
|     VARIANT_ESP32C3, | ||||
|     VARIANT_ESP32S2, | ||||
|     VARIANT_ESP32S3, | ||||
|     VARIANT_ESP32C3, | ||||
| ) | ||||
| import esphome.config_validation as cv | ||||
| from esphome.const import CONF_CHANNEL, CONF_ID, CONF_SAMPLE_RATE | ||||
| from esphome.cpp_generator import MockObjClass | ||||
| import esphome.final_validate as fv | ||||
|  | ||||
| CODEOWNERS = ["@jesserockz"] | ||||
| DEPENDENCIES = ["esp32"] | ||||
| @@ -25,16 +25,22 @@ CONF_I2S_LRCLK_PIN = "i2s_lrclk_pin" | ||||
| CONF_I2S_AUDIO = "i2s_audio" | ||||
| CONF_I2S_AUDIO_ID = "i2s_audio_id" | ||||
|  | ||||
| CONF_BITS_PER_SAMPLE = "bits_per_sample" | ||||
| CONF_I2S_MODE = "i2s_mode" | ||||
| CONF_PRIMARY = "primary" | ||||
| CONF_SECONDARY = "secondary" | ||||
|  | ||||
| CONF_LEFT = "left" | ||||
| CONF_RIGHT = "right" | ||||
| CONF_STEREO = "stereo" | ||||
|  | ||||
| i2s_audio_ns = cg.esphome_ns.namespace("i2s_audio") | ||||
| I2SAudioComponent = i2s_audio_ns.class_("I2SAudioComponent", cg.Component) | ||||
| I2SAudioIn = i2s_audio_ns.class_("I2SAudioIn", cg.Parented.template(I2SAudioComponent)) | ||||
| I2SAudioOut = i2s_audio_ns.class_( | ||||
|     "I2SAudioOut", cg.Parented.template(I2SAudioComponent) | ||||
| I2SAudioBase = i2s_audio_ns.class_( | ||||
|     "I2SAudioBase", cg.Parented.template(I2SAudioComponent) | ||||
| ) | ||||
| I2SAudioIn = i2s_audio_ns.class_("I2SAudioIn", I2SAudioBase) | ||||
| I2SAudioOut = i2s_audio_ns.class_("I2SAudioOut", I2SAudioBase) | ||||
|  | ||||
| i2s_mode_t = cg.global_ns.enum("i2s_mode_t") | ||||
| I2S_MODE_OPTIONS = { | ||||
| @@ -50,6 +56,59 @@ I2S_PORTS = { | ||||
|     VARIANT_ESP32C3: 1, | ||||
| } | ||||
|  | ||||
| i2s_channel_fmt_t = cg.global_ns.enum("i2s_channel_fmt_t") | ||||
| I2S_CHANNELS = { | ||||
|     CONF_LEFT: i2s_channel_fmt_t.I2S_CHANNEL_FMT_ONLY_LEFT, | ||||
|     CONF_RIGHT: i2s_channel_fmt_t.I2S_CHANNEL_FMT_ONLY_RIGHT, | ||||
|     CONF_STEREO: i2s_channel_fmt_t.I2S_CHANNEL_FMT_RIGHT_LEFT, | ||||
| } | ||||
|  | ||||
| i2s_bits_per_sample_t = cg.global_ns.enum("i2s_bits_per_sample_t") | ||||
| I2S_BITS_PER_SAMPLE = { | ||||
|     8: i2s_bits_per_sample_t.I2S_BITS_PER_SAMPLE_8BIT, | ||||
|     16: i2s_bits_per_sample_t.I2S_BITS_PER_SAMPLE_16BIT, | ||||
|     32: i2s_bits_per_sample_t.I2S_BITS_PER_SAMPLE_32BIT, | ||||
| } | ||||
|  | ||||
| INTERNAL_ADC_VARIANTS = [VARIANT_ESP32] | ||||
| PDM_VARIANTS = [VARIANT_ESP32, VARIANT_ESP32S3] | ||||
|  | ||||
| _validate_bits = cv.float_with_unit("bits", "bit") | ||||
|  | ||||
|  | ||||
| def i2s_audio_component_schema( | ||||
|     class_: MockObjClass, | ||||
|     default_sample_rate: int, | ||||
|     default_channel: str, | ||||
|     default_bits_per_sample: str, | ||||
| ): | ||||
|     return cv.Schema( | ||||
|         { | ||||
|             cv.GenerateID(): cv.declare_id(class_), | ||||
|             cv.GenerateID(CONF_I2S_AUDIO_ID): cv.use_id(I2SAudioComponent), | ||||
|             cv.Optional(CONF_CHANNEL, default=default_channel): cv.enum(I2S_CHANNELS), | ||||
|             cv.Optional(CONF_SAMPLE_RATE, default=default_sample_rate): cv.int_range( | ||||
|                 min=1 | ||||
|             ), | ||||
|             cv.Optional(CONF_BITS_PER_SAMPLE, default=default_bits_per_sample): cv.All( | ||||
|                 _validate_bits, cv.enum(I2S_BITS_PER_SAMPLE) | ||||
|             ), | ||||
|             cv.Optional(CONF_I2S_MODE, default=CONF_PRIMARY): cv.enum( | ||||
|                 I2S_MODE_OPTIONS, lower=True | ||||
|             ), | ||||
|         } | ||||
|     ) | ||||
|  | ||||
|  | ||||
| async def register_i2s_audio_component(var, config): | ||||
|     await cg.register_parented(var, config[CONF_I2S_AUDIO_ID]) | ||||
|  | ||||
|     cg.add(var.set_i2s_mode(config[CONF_I2S_MODE])) | ||||
|     cg.add(var.set_channel(config[CONF_CHANNEL])) | ||||
|     cg.add(var.set_sample_rate(config[CONF_SAMPLE_RATE])) | ||||
|     cg.add(var.set_bits_per_sample(config[CONF_BITS_PER_SAMPLE])) | ||||
|  | ||||
|  | ||||
| CONFIG_SCHEMA = cv.Schema( | ||||
|     { | ||||
|         cv.GenerateID(): cv.declare_id(I2SAudioComponent), | ||||
|   | ||||
| @@ -11,9 +11,23 @@ namespace i2s_audio { | ||||
|  | ||||
| class I2SAudioComponent; | ||||
|  | ||||
| class I2SAudioIn : public Parented<I2SAudioComponent> {}; | ||||
| class I2SAudioBase : public Parented<I2SAudioComponent> { | ||||
|  public: | ||||
|   void set_i2s_mode(i2s_mode_t mode) { this->i2s_mode_ = mode; } | ||||
|   void set_channel(i2s_channel_fmt_t channel) { this->channel_ = channel; } | ||||
|   void set_sample_rate(uint32_t sample_rate) { this->sample_rate_ = sample_rate; } | ||||
|   void set_bits_per_sample(i2s_bits_per_sample_t bits_per_sample) { this->bits_per_sample_ = bits_per_sample; } | ||||
|  | ||||
| class I2SAudioOut : public Parented<I2SAudioComponent> {}; | ||||
|  protected: | ||||
|   i2s_mode_t i2s_mode_{}; | ||||
|   i2s_channel_fmt_t channel_; | ||||
|   uint32_t sample_rate_; | ||||
|   i2s_bits_per_sample_t bits_per_sample_; | ||||
| }; | ||||
|  | ||||
| class I2SAudioIn : public I2SAudioBase {}; | ||||
|  | ||||
| class I2SAudioOut : public I2SAudioBase {}; | ||||
|  | ||||
| class I2SAudioComponent : public Component { | ||||
|  public: | ||||
|   | ||||
| @@ -1,20 +1,19 @@ | ||||
| import esphome.config_validation as cv | ||||
| import esphome.codegen as cg | ||||
|  | ||||
| from esphome import pins | ||||
| from esphome.const import CONF_CHANNEL, CONF_ID, CONF_NUMBER, CONF_SAMPLE_RATE | ||||
| from esphome.components import microphone, esp32 | ||||
| import esphome.codegen as cg | ||||
| from esphome.components import esp32, microphone | ||||
| from esphome.components.adc import ESP32_VARIANT_ADC1_PIN_TO_CHANNEL, validate_adc_pin | ||||
| import esphome.config_validation as cv | ||||
| from esphome.const import CONF_ID, CONF_NUMBER | ||||
|  | ||||
| from .. import ( | ||||
|     CONF_I2S_MODE, | ||||
|     CONF_PRIMARY, | ||||
|     I2S_MODE_OPTIONS, | ||||
|     i2s_audio_ns, | ||||
|     I2SAudioComponent, | ||||
|     I2SAudioIn, | ||||
|     CONF_I2S_AUDIO_ID, | ||||
|     CONF_I2S_DIN_PIN, | ||||
|     CONF_RIGHT, | ||||
|     INTERNAL_ADC_VARIANTS, | ||||
|     PDM_VARIANTS, | ||||
|     I2SAudioIn, | ||||
|     i2s_audio_component_schema, | ||||
|     i2s_audio_ns, | ||||
|     register_i2s_audio_component, | ||||
| ) | ||||
|  | ||||
| CODEOWNERS = ["@jesserockz"] | ||||
| @@ -23,29 +22,13 @@ DEPENDENCIES = ["i2s_audio"] | ||||
| CONF_ADC_PIN = "adc_pin" | ||||
| CONF_ADC_TYPE = "adc_type" | ||||
| CONF_PDM = "pdm" | ||||
| CONF_BITS_PER_SAMPLE = "bits_per_sample" | ||||
|  | ||||
| CONF_USE_APLL = "use_apll" | ||||
|  | ||||
| I2SAudioMicrophone = i2s_audio_ns.class_( | ||||
|     "I2SAudioMicrophone", I2SAudioIn, microphone.Microphone, cg.Component | ||||
| ) | ||||
|  | ||||
| i2s_channel_fmt_t = cg.global_ns.enum("i2s_channel_fmt_t") | ||||
| CHANNELS = { | ||||
|     "left": i2s_channel_fmt_t.I2S_CHANNEL_FMT_ONLY_LEFT, | ||||
|     "right": i2s_channel_fmt_t.I2S_CHANNEL_FMT_ONLY_RIGHT, | ||||
| } | ||||
| i2s_bits_per_sample_t = cg.global_ns.enum("i2s_bits_per_sample_t") | ||||
| BITS_PER_SAMPLE = { | ||||
|     16: i2s_bits_per_sample_t.I2S_BITS_PER_SAMPLE_16BIT, | ||||
|     32: i2s_bits_per_sample_t.I2S_BITS_PER_SAMPLE_32BIT, | ||||
| } | ||||
|  | ||||
| INTERNAL_ADC_VARIANTS = [esp32.const.VARIANT_ESP32] | ||||
| PDM_VARIANTS = [esp32.const.VARIANT_ESP32, esp32.const.VARIANT_ESP32S3] | ||||
|  | ||||
| _validate_bits = cv.float_with_unit("bits", "bit") | ||||
|  | ||||
|  | ||||
| def validate_esp32_variant(config): | ||||
|     variant = esp32.get_esp32_variant() | ||||
| @@ -62,19 +45,7 @@ def validate_esp32_variant(config): | ||||
|  | ||||
|  | ||||
| BASE_SCHEMA = microphone.MICROPHONE_SCHEMA.extend( | ||||
|     { | ||||
|         cv.GenerateID(): cv.declare_id(I2SAudioMicrophone), | ||||
|         cv.GenerateID(CONF_I2S_AUDIO_ID): cv.use_id(I2SAudioComponent), | ||||
|         cv.Optional(CONF_CHANNEL, default="right"): cv.enum(CHANNELS), | ||||
|         cv.Optional(CONF_SAMPLE_RATE, default=16000): cv.int_range(min=1), | ||||
|         cv.Optional(CONF_BITS_PER_SAMPLE, default="32bit"): cv.All( | ||||
|             _validate_bits, cv.enum(BITS_PER_SAMPLE) | ||||
|         ), | ||||
|         cv.Optional(CONF_USE_APLL, default=False): cv.boolean, | ||||
|         cv.Optional(CONF_I2S_MODE, default=CONF_PRIMARY): cv.enum( | ||||
|             I2S_MODE_OPTIONS, lower=True | ||||
|         ), | ||||
|     } | ||||
|     i2s_audio_component_schema(I2SAudioMicrophone, 16000, CONF_RIGHT, "32bit") | ||||
| ).extend(cv.COMPONENT_SCHEMA) | ||||
|  | ||||
| CONFIG_SCHEMA = cv.All( | ||||
| @@ -89,6 +60,7 @@ CONFIG_SCHEMA = cv.All( | ||||
|                 { | ||||
|                     cv.Required(CONF_I2S_DIN_PIN): pins.internal_gpio_input_pin_number, | ||||
|                     cv.Required(CONF_PDM): cv.boolean, | ||||
|                     cv.Optional(CONF_USE_APLL, default=False): cv.boolean, | ||||
|                 } | ||||
|             ), | ||||
|         }, | ||||
| @@ -101,8 +73,8 @@ CONFIG_SCHEMA = cv.All( | ||||
| async def to_code(config): | ||||
|     var = cg.new_Pvariable(config[CONF_ID]) | ||||
|     await cg.register_component(var, config) | ||||
|  | ||||
|     await cg.register_parented(var, config[CONF_I2S_AUDIO_ID]) | ||||
|     await register_i2s_audio_component(var, config) | ||||
|     await microphone.register_microphone(var, config) | ||||
|  | ||||
|     if config[CONF_ADC_TYPE] == "internal": | ||||
|         variant = esp32.get_esp32_variant() | ||||
| @@ -112,11 +84,4 @@ async def to_code(config): | ||||
|     else: | ||||
|         cg.add(var.set_din_pin(config[CONF_I2S_DIN_PIN])) | ||||
|         cg.add(var.set_pdm(config[CONF_PDM])) | ||||
|  | ||||
|     cg.add(var.set_i2s_mode(config[CONF_I2S_MODE])) | ||||
|     cg.add(var.set_channel(config[CONF_CHANNEL])) | ||||
|     cg.add(var.set_sample_rate(config[CONF_SAMPLE_RATE])) | ||||
|     cg.add(var.set_bits_per_sample(config[CONF_BITS_PER_SAMPLE])) | ||||
|     cg.add(var.set_use_apll(config[CONF_USE_APLL])) | ||||
|  | ||||
|     await microphone.register_microphone(var, config) | ||||
|         cg.add(var.set_use_apll(config[CONF_USE_APLL])) | ||||
|   | ||||
| @@ -30,11 +30,6 @@ class I2SAudioMicrophone : public I2SAudioIn, public microphone::Microphone, pub | ||||
|   } | ||||
| #endif | ||||
|  | ||||
|   void set_i2s_mode(i2s_mode_t mode) { this->i2s_mode_ = mode; } | ||||
|  | ||||
|   void set_channel(i2s_channel_fmt_t channel) { this->channel_ = channel; } | ||||
|   void set_sample_rate(uint32_t sample_rate) { this->sample_rate_ = sample_rate; } | ||||
|   void set_bits_per_sample(i2s_bits_per_sample_t bits_per_sample) { this->bits_per_sample_ = bits_per_sample; } | ||||
|   void set_use_apll(uint32_t use_apll) { this->use_apll_ = use_apll; } | ||||
|  | ||||
|  protected: | ||||
| @@ -48,10 +43,7 @@ class I2SAudioMicrophone : public I2SAudioIn, public microphone::Microphone, pub | ||||
|   bool adc_{false}; | ||||
| #endif | ||||
|   bool pdm_{false}; | ||||
|   i2s_mode_t i2s_mode_{}; | ||||
|   i2s_channel_fmt_t channel_; | ||||
|   uint32_t sample_rate_; | ||||
|   i2s_bits_per_sample_t bits_per_sample_; | ||||
|  | ||||
|   bool use_apll_; | ||||
|  | ||||
|   HighFrequencyLoopRequester high_freq_; | ||||
|   | ||||
| @@ -1,15 +1,18 @@ | ||||
| import esphome.codegen as cg | ||||
| import esphome.config_validation as cv | ||||
| from esphome import pins | ||||
| from esphome.const import CONF_ID, CONF_MODE | ||||
| import esphome.codegen as cg | ||||
| from esphome.components import esp32, speaker | ||||
| import esphome.config_validation as cv | ||||
| from esphome.const import CONF_CHANNEL, CONF_ID | ||||
|  | ||||
| from .. import ( | ||||
|     CONF_I2S_AUDIO_ID, | ||||
|     CONF_I2S_DOUT_PIN, | ||||
|     I2SAudioComponent, | ||||
|     CONF_LEFT, | ||||
|     CONF_RIGHT, | ||||
|     CONF_STEREO, | ||||
|     I2SAudioOut, | ||||
|     i2s_audio_component_schema, | ||||
|     i2s_audio_ns, | ||||
|     register_i2s_audio_component, | ||||
| ) | ||||
|  | ||||
| CODEOWNERS = ["@jesserockz"] | ||||
| @@ -19,18 +22,16 @@ I2SAudioSpeaker = i2s_audio_ns.class_( | ||||
|     "I2SAudioSpeaker", cg.Component, speaker.Speaker, I2SAudioOut | ||||
| ) | ||||
|  | ||||
| i2s_dac_mode_t = cg.global_ns.enum("i2s_dac_mode_t") | ||||
|  | ||||
| CONF_MUTE_PIN = "mute_pin" | ||||
| CONF_DAC_TYPE = "dac_type" | ||||
|  | ||||
| i2s_dac_mode_t = cg.global_ns.enum("i2s_dac_mode_t") | ||||
| INTERNAL_DAC_OPTIONS = { | ||||
|     "left": i2s_dac_mode_t.I2S_DAC_CHANNEL_LEFT_EN, | ||||
|     "right": i2s_dac_mode_t.I2S_DAC_CHANNEL_RIGHT_EN, | ||||
|     "stereo": i2s_dac_mode_t.I2S_DAC_CHANNEL_BOTH_EN, | ||||
|     CONF_LEFT: i2s_dac_mode_t.I2S_DAC_CHANNEL_LEFT_EN, | ||||
|     CONF_RIGHT: i2s_dac_mode_t.I2S_DAC_CHANNEL_RIGHT_EN, | ||||
|     CONF_STEREO: i2s_dac_mode_t.I2S_DAC_CHANNEL_BOTH_EN, | ||||
| } | ||||
|  | ||||
| EXTERNAL_DAC_OPTIONS = ["mono", "stereo"] | ||||
|  | ||||
| NO_INTERNAL_DAC_VARIANTS = [esp32.const.VARIANT_ESP32S2] | ||||
|  | ||||
| @@ -44,28 +45,21 @@ def validate_esp32_variant(config): | ||||
|     return config | ||||
|  | ||||
|  | ||||
| BASE_SCHEMA = speaker.SPEAKER_SCHEMA.extend( | ||||
|     i2s_audio_component_schema(I2SAudioSpeaker, 16000, "stereo", "16bit") | ||||
| ).extend(cv.COMPONENT_SCHEMA) | ||||
|  | ||||
| CONFIG_SCHEMA = cv.All( | ||||
|     cv.typed_schema( | ||||
|         { | ||||
|             "internal": speaker.SPEAKER_SCHEMA.extend( | ||||
|             "internal": BASE_SCHEMA, | ||||
|             "external": BASE_SCHEMA.extend( | ||||
|                 { | ||||
|                     cv.GenerateID(): cv.declare_id(I2SAudioSpeaker), | ||||
|                     cv.GenerateID(CONF_I2S_AUDIO_ID): cv.use_id(I2SAudioComponent), | ||||
|                     cv.Required(CONF_MODE): cv.enum(INTERNAL_DAC_OPTIONS, lower=True), | ||||
|                 } | ||||
|             ).extend(cv.COMPONENT_SCHEMA), | ||||
|             "external": speaker.SPEAKER_SCHEMA.extend( | ||||
|                 { | ||||
|                     cv.GenerateID(): cv.declare_id(I2SAudioSpeaker), | ||||
|                     cv.GenerateID(CONF_I2S_AUDIO_ID): cv.use_id(I2SAudioComponent), | ||||
|                     cv.Required( | ||||
|                         CONF_I2S_DOUT_PIN | ||||
|                     ): pins.internal_gpio_output_pin_number, | ||||
|                     cv.Optional(CONF_MODE, default="mono"): cv.one_of( | ||||
|                         *EXTERNAL_DAC_OPTIONS, lower=True | ||||
|                     ), | ||||
|                 } | ||||
|             ).extend(cv.COMPONENT_SCHEMA), | ||||
|             ), | ||||
|         }, | ||||
|         key=CONF_DAC_TYPE, | ||||
|     ), | ||||
| @@ -76,12 +70,10 @@ CONFIG_SCHEMA = cv.All( | ||||
| async def to_code(config): | ||||
|     var = cg.new_Pvariable(config[CONF_ID]) | ||||
|     await cg.register_component(var, config) | ||||
|     await register_i2s_audio_component(var, config) | ||||
|     await speaker.register_speaker(var, config) | ||||
|  | ||||
|     await cg.register_parented(var, config[CONF_I2S_AUDIO_ID]) | ||||
|  | ||||
|     if config[CONF_DAC_TYPE] == "internal": | ||||
|         cg.add(var.set_internal_dac_mode(config[CONF_MODE])) | ||||
|         cg.add(var.set_internal_dac_mode(config[CONF_CHANNEL])) | ||||
|     else: | ||||
|         cg.add(var.set_dout_pin(config[CONF_I2S_DOUT_PIN])) | ||||
|         cg.add(var.set_external_dac_channels(2 if config[CONF_MODE] == "stereo" else 1)) | ||||
|   | ||||
| @@ -64,17 +64,17 @@ void I2SAudioSpeaker::player_task(void *params) { | ||||
|   xQueueSend(this_speaker->event_queue_, &event, portMAX_DELAY); | ||||
|  | ||||
|   i2s_driver_config_t config = { | ||||
|       .mode = (i2s_mode_t) (I2S_MODE_MASTER | I2S_MODE_TX), | ||||
|       .sample_rate = 16000, | ||||
|       .bits_per_sample = I2S_BITS_PER_SAMPLE_16BIT, | ||||
|       .channel_format = I2S_CHANNEL_FMT_RIGHT_LEFT, | ||||
|       .mode = (i2s_mode_t) (this_speaker->i2s_mode_ | I2S_MODE_TX), | ||||
|       .sample_rate = this_speaker->sample_rate_, | ||||
|       .bits_per_sample = this_speaker->bits_per_sample_, | ||||
|       .channel_format = this_speaker->channel_, | ||||
|       .communication_format = I2S_COMM_FORMAT_STAND_I2S, | ||||
|       .intr_alloc_flags = ESP_INTR_FLAG_LEVEL1, | ||||
|       .dma_buf_count = 8, | ||||
|       .dma_buf_len = 128, | ||||
|       .use_apll = false, | ||||
|       .tx_desc_auto_clear = true, | ||||
|       .fixed_mclk = I2S_PIN_NO_CHANGE, | ||||
|       .fixed_mclk = 0, | ||||
|       .mclk_multiple = I2S_MCLK_MULTIPLE_256, | ||||
|       .bits_per_chan = I2S_BITS_PER_CHAN_DEFAULT, | ||||
|   }; | ||||
|   | ||||
| @@ -38,7 +38,7 @@ struct DataEvent { | ||||
|   uint8_t data[BUFFER_SIZE]; | ||||
| }; | ||||
|  | ||||
| class I2SAudioSpeaker : public Component, public speaker::Speaker, public I2SAudioOut { | ||||
| class I2SAudioSpeaker : public I2SAudioOut, public speaker::Speaker, public Component { | ||||
|  public: | ||||
|   float get_setup_priority() const override { return esphome::setup_priority::LATE; } | ||||
|  | ||||
| @@ -49,7 +49,6 @@ class I2SAudioSpeaker : public Component, public speaker::Speaker, public I2SAud | ||||
| #if SOC_I2S_SUPPORTS_DAC | ||||
|   void set_internal_dac_mode(i2s_dac_mode_t mode) { this->internal_dac_mode_ = mode; } | ||||
| #endif | ||||
|   void set_external_dac_channels(uint8_t channels) { this->external_dac_channels_ = channels; } | ||||
|  | ||||
|   void start() override; | ||||
|   void stop() override; | ||||
| @@ -76,7 +75,6 @@ class I2SAudioSpeaker : public Component, public speaker::Speaker, public I2SAud | ||||
| #if SOC_I2S_SUPPORTS_DAC | ||||
|   i2s_dac_mode_t internal_dac_mode_{I2S_DAC_CHANNEL_DISABLE}; | ||||
| #endif | ||||
|   uint8_t external_dac_channels_; | ||||
| }; | ||||
|  | ||||
| }  // namespace i2s_audio | ||||
|   | ||||
		Reference in New Issue
	
	Block a user