mirror of
				https://github.com/esphome/esphome.git
				synced 2025-10-31 15:12:06 +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 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 import get_esp32_variant | ||||||
| from esphome.components.esp32.const import ( | from esphome.components.esp32.const import ( | ||||||
|     VARIANT_ESP32, |     VARIANT_ESP32, | ||||||
|  |     VARIANT_ESP32C3, | ||||||
|     VARIANT_ESP32S2, |     VARIANT_ESP32S2, | ||||||
|     VARIANT_ESP32S3, |     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"] | CODEOWNERS = ["@jesserockz"] | ||||||
| DEPENDENCIES = ["esp32"] | DEPENDENCIES = ["esp32"] | ||||||
| @@ -25,16 +25,22 @@ CONF_I2S_LRCLK_PIN = "i2s_lrclk_pin" | |||||||
| CONF_I2S_AUDIO = "i2s_audio" | CONF_I2S_AUDIO = "i2s_audio" | ||||||
| CONF_I2S_AUDIO_ID = "i2s_audio_id" | CONF_I2S_AUDIO_ID = "i2s_audio_id" | ||||||
|  |  | ||||||
|  | CONF_BITS_PER_SAMPLE = "bits_per_sample" | ||||||
| CONF_I2S_MODE = "i2s_mode" | CONF_I2S_MODE = "i2s_mode" | ||||||
| CONF_PRIMARY = "primary" | CONF_PRIMARY = "primary" | ||||||
| CONF_SECONDARY = "secondary" | CONF_SECONDARY = "secondary" | ||||||
|  |  | ||||||
|  | CONF_LEFT = "left" | ||||||
|  | CONF_RIGHT = "right" | ||||||
|  | CONF_STEREO = "stereo" | ||||||
|  |  | ||||||
| i2s_audio_ns = cg.esphome_ns.namespace("i2s_audio") | i2s_audio_ns = cg.esphome_ns.namespace("i2s_audio") | ||||||
| I2SAudioComponent = i2s_audio_ns.class_("I2SAudioComponent", cg.Component) | I2SAudioComponent = i2s_audio_ns.class_("I2SAudioComponent", cg.Component) | ||||||
| I2SAudioIn = i2s_audio_ns.class_("I2SAudioIn", cg.Parented.template(I2SAudioComponent)) | I2SAudioBase = i2s_audio_ns.class_( | ||||||
| I2SAudioOut = i2s_audio_ns.class_( |     "I2SAudioBase", cg.Parented.template(I2SAudioComponent) | ||||||
|     "I2SAudioOut", 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_t = cg.global_ns.enum("i2s_mode_t") | ||||||
| I2S_MODE_OPTIONS = { | I2S_MODE_OPTIONS = { | ||||||
| @@ -50,6 +56,59 @@ I2S_PORTS = { | |||||||
|     VARIANT_ESP32C3: 1, |     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( | CONFIG_SCHEMA = cv.Schema( | ||||||
|     { |     { | ||||||
|         cv.GenerateID(): cv.declare_id(I2SAudioComponent), |         cv.GenerateID(): cv.declare_id(I2SAudioComponent), | ||||||
|   | |||||||
| @@ -11,9 +11,23 @@ namespace i2s_audio { | |||||||
|  |  | ||||||
| class I2SAudioComponent; | 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 { | class I2SAudioComponent : public Component { | ||||||
|  public: |  public: | ||||||
|   | |||||||
| @@ -1,20 +1,19 @@ | |||||||
| import esphome.config_validation as cv |  | ||||||
| import esphome.codegen as cg |  | ||||||
|  |  | ||||||
| from esphome import pins | from esphome import pins | ||||||
| from esphome.const import CONF_CHANNEL, CONF_ID, CONF_NUMBER, CONF_SAMPLE_RATE | import esphome.codegen as cg | ||||||
| from esphome.components import microphone, esp32 | from esphome.components import esp32, microphone | ||||||
| from esphome.components.adc import ESP32_VARIANT_ADC1_PIN_TO_CHANNEL, validate_adc_pin | 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 ( | from .. import ( | ||||||
|     CONF_I2S_MODE, |  | ||||||
|     CONF_PRIMARY, |  | ||||||
|     I2S_MODE_OPTIONS, |  | ||||||
|     i2s_audio_ns, |  | ||||||
|     I2SAudioComponent, |  | ||||||
|     I2SAudioIn, |  | ||||||
|     CONF_I2S_AUDIO_ID, |  | ||||||
|     CONF_I2S_DIN_PIN, |     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"] | CODEOWNERS = ["@jesserockz"] | ||||||
| @@ -23,29 +22,13 @@ DEPENDENCIES = ["i2s_audio"] | |||||||
| CONF_ADC_PIN = "adc_pin" | CONF_ADC_PIN = "adc_pin" | ||||||
| CONF_ADC_TYPE = "adc_type" | CONF_ADC_TYPE = "adc_type" | ||||||
| CONF_PDM = "pdm" | CONF_PDM = "pdm" | ||||||
| CONF_BITS_PER_SAMPLE = "bits_per_sample" |  | ||||||
| CONF_USE_APLL = "use_apll" | CONF_USE_APLL = "use_apll" | ||||||
|  |  | ||||||
| I2SAudioMicrophone = i2s_audio_ns.class_( | I2SAudioMicrophone = i2s_audio_ns.class_( | ||||||
|     "I2SAudioMicrophone", I2SAudioIn, microphone.Microphone, cg.Component |     "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): | def validate_esp32_variant(config): | ||||||
|     variant = esp32.get_esp32_variant() |     variant = esp32.get_esp32_variant() | ||||||
| @@ -62,19 +45,7 @@ def validate_esp32_variant(config): | |||||||
|  |  | ||||||
|  |  | ||||||
| BASE_SCHEMA = microphone.MICROPHONE_SCHEMA.extend( | BASE_SCHEMA = microphone.MICROPHONE_SCHEMA.extend( | ||||||
|     { |     i2s_audio_component_schema(I2SAudioMicrophone, 16000, CONF_RIGHT, "32bit") | ||||||
|         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 |  | ||||||
|         ), |  | ||||||
|     } |  | ||||||
| ).extend(cv.COMPONENT_SCHEMA) | ).extend(cv.COMPONENT_SCHEMA) | ||||||
|  |  | ||||||
| CONFIG_SCHEMA = cv.All( | 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_I2S_DIN_PIN): pins.internal_gpio_input_pin_number, | ||||||
|                     cv.Required(CONF_PDM): cv.boolean, |                     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): | async def to_code(config): | ||||||
|     var = cg.new_Pvariable(config[CONF_ID]) |     var = cg.new_Pvariable(config[CONF_ID]) | ||||||
|     await cg.register_component(var, config) |     await cg.register_component(var, config) | ||||||
|  |     await register_i2s_audio_component(var, config) | ||||||
|     await cg.register_parented(var, config[CONF_I2S_AUDIO_ID]) |     await microphone.register_microphone(var, config) | ||||||
|  |  | ||||||
|     if config[CONF_ADC_TYPE] == "internal": |     if config[CONF_ADC_TYPE] == "internal": | ||||||
|         variant = esp32.get_esp32_variant() |         variant = esp32.get_esp32_variant() | ||||||
| @@ -112,11 +84,4 @@ async def to_code(config): | |||||||
|     else: |     else: | ||||||
|         cg.add(var.set_din_pin(config[CONF_I2S_DIN_PIN])) |         cg.add(var.set_din_pin(config[CONF_I2S_DIN_PIN])) | ||||||
|         cg.add(var.set_pdm(config[CONF_PDM])) |         cg.add(var.set_pdm(config[CONF_PDM])) | ||||||
|  |         cg.add(var.set_use_apll(config[CONF_USE_APLL])) | ||||||
|     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) |  | ||||||
|   | |||||||
| @@ -30,11 +30,6 @@ class I2SAudioMicrophone : public I2SAudioIn, public microphone::Microphone, pub | |||||||
|   } |   } | ||||||
| #endif | #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; } |   void set_use_apll(uint32_t use_apll) { this->use_apll_ = use_apll; } | ||||||
|  |  | ||||||
|  protected: |  protected: | ||||||
| @@ -48,10 +43,7 @@ class I2SAudioMicrophone : public I2SAudioIn, public microphone::Microphone, pub | |||||||
|   bool adc_{false}; |   bool adc_{false}; | ||||||
| #endif | #endif | ||||||
|   bool pdm_{false}; |   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_; |   bool use_apll_; | ||||||
|  |  | ||||||
|   HighFrequencyLoopRequester high_freq_; |   HighFrequencyLoopRequester high_freq_; | ||||||
|   | |||||||
| @@ -1,15 +1,18 @@ | |||||||
| import esphome.codegen as cg |  | ||||||
| import esphome.config_validation as cv |  | ||||||
| from esphome import pins | from esphome import pins | ||||||
| from esphome.const import CONF_ID, CONF_MODE | import esphome.codegen as cg | ||||||
| from esphome.components import esp32, speaker | from esphome.components import esp32, speaker | ||||||
|  | import esphome.config_validation as cv | ||||||
|  | from esphome.const import CONF_CHANNEL, CONF_ID | ||||||
|  |  | ||||||
| from .. import ( | from .. import ( | ||||||
|     CONF_I2S_AUDIO_ID, |  | ||||||
|     CONF_I2S_DOUT_PIN, |     CONF_I2S_DOUT_PIN, | ||||||
|     I2SAudioComponent, |     CONF_LEFT, | ||||||
|  |     CONF_RIGHT, | ||||||
|  |     CONF_STEREO, | ||||||
|     I2SAudioOut, |     I2SAudioOut, | ||||||
|  |     i2s_audio_component_schema, | ||||||
|     i2s_audio_ns, |     i2s_audio_ns, | ||||||
|  |     register_i2s_audio_component, | ||||||
| ) | ) | ||||||
|  |  | ||||||
| CODEOWNERS = ["@jesserockz"] | CODEOWNERS = ["@jesserockz"] | ||||||
| @@ -19,18 +22,16 @@ I2SAudioSpeaker = i2s_audio_ns.class_( | |||||||
|     "I2SAudioSpeaker", cg.Component, speaker.Speaker, I2SAudioOut |     "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" | CONF_DAC_TYPE = "dac_type" | ||||||
|  |  | ||||||
|  | i2s_dac_mode_t = cg.global_ns.enum("i2s_dac_mode_t") | ||||||
| INTERNAL_DAC_OPTIONS = { | INTERNAL_DAC_OPTIONS = { | ||||||
|     "left": i2s_dac_mode_t.I2S_DAC_CHANNEL_LEFT_EN, |     CONF_LEFT: i2s_dac_mode_t.I2S_DAC_CHANNEL_LEFT_EN, | ||||||
|     "right": i2s_dac_mode_t.I2S_DAC_CHANNEL_RIGHT_EN, |     CONF_RIGHT: i2s_dac_mode_t.I2S_DAC_CHANNEL_RIGHT_EN, | ||||||
|     "stereo": i2s_dac_mode_t.I2S_DAC_CHANNEL_BOTH_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] | NO_INTERNAL_DAC_VARIANTS = [esp32.const.VARIANT_ESP32S2] | ||||||
|  |  | ||||||
| @@ -44,28 +45,21 @@ def validate_esp32_variant(config): | |||||||
|     return 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( | CONFIG_SCHEMA = cv.All( | ||||||
|     cv.typed_schema( |     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( |                     cv.Required( | ||||||
|                         CONF_I2S_DOUT_PIN |                         CONF_I2S_DOUT_PIN | ||||||
|                     ): pins.internal_gpio_output_pin_number, |                     ): 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, |         key=CONF_DAC_TYPE, | ||||||
|     ), |     ), | ||||||
| @@ -76,12 +70,10 @@ CONFIG_SCHEMA = cv.All( | |||||||
| async def to_code(config): | async def to_code(config): | ||||||
|     var = cg.new_Pvariable(config[CONF_ID]) |     var = cg.new_Pvariable(config[CONF_ID]) | ||||||
|     await cg.register_component(var, config) |     await cg.register_component(var, config) | ||||||
|  |     await register_i2s_audio_component(var, config) | ||||||
|     await speaker.register_speaker(var, config) |     await speaker.register_speaker(var, config) | ||||||
|  |  | ||||||
|     await cg.register_parented(var, config[CONF_I2S_AUDIO_ID]) |  | ||||||
|  |  | ||||||
|     if config[CONF_DAC_TYPE] == "internal": |     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: |     else: | ||||||
|         cg.add(var.set_dout_pin(config[CONF_I2S_DOUT_PIN])) |         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); |   xQueueSend(this_speaker->event_queue_, &event, portMAX_DELAY); | ||||||
|  |  | ||||||
|   i2s_driver_config_t config = { |   i2s_driver_config_t config = { | ||||||
|       .mode = (i2s_mode_t) (I2S_MODE_MASTER | I2S_MODE_TX), |       .mode = (i2s_mode_t) (this_speaker->i2s_mode_ | I2S_MODE_TX), | ||||||
|       .sample_rate = 16000, |       .sample_rate = this_speaker->sample_rate_, | ||||||
|       .bits_per_sample = I2S_BITS_PER_SAMPLE_16BIT, |       .bits_per_sample = this_speaker->bits_per_sample_, | ||||||
|       .channel_format = I2S_CHANNEL_FMT_RIGHT_LEFT, |       .channel_format = this_speaker->channel_, | ||||||
|       .communication_format = I2S_COMM_FORMAT_STAND_I2S, |       .communication_format = I2S_COMM_FORMAT_STAND_I2S, | ||||||
|       .intr_alloc_flags = ESP_INTR_FLAG_LEVEL1, |       .intr_alloc_flags = ESP_INTR_FLAG_LEVEL1, | ||||||
|       .dma_buf_count = 8, |       .dma_buf_count = 8, | ||||||
|       .dma_buf_len = 128, |       .dma_buf_len = 128, | ||||||
|       .use_apll = false, |       .use_apll = false, | ||||||
|       .tx_desc_auto_clear = true, |       .tx_desc_auto_clear = true, | ||||||
|       .fixed_mclk = I2S_PIN_NO_CHANGE, |       .fixed_mclk = 0, | ||||||
|       .mclk_multiple = I2S_MCLK_MULTIPLE_256, |       .mclk_multiple = I2S_MCLK_MULTIPLE_256, | ||||||
|       .bits_per_chan = I2S_BITS_PER_CHAN_DEFAULT, |       .bits_per_chan = I2S_BITS_PER_CHAN_DEFAULT, | ||||||
|   }; |   }; | ||||||
|   | |||||||
| @@ -38,7 +38,7 @@ struct DataEvent { | |||||||
|   uint8_t data[BUFFER_SIZE]; |   uint8_t data[BUFFER_SIZE]; | ||||||
| }; | }; | ||||||
|  |  | ||||||
| class I2SAudioSpeaker : public Component, public speaker::Speaker, public I2SAudioOut { | class I2SAudioSpeaker : public I2SAudioOut, public speaker::Speaker, public Component { | ||||||
|  public: |  public: | ||||||
|   float get_setup_priority() const override { return esphome::setup_priority::LATE; } |   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 | #if SOC_I2S_SUPPORTS_DAC | ||||||
|   void set_internal_dac_mode(i2s_dac_mode_t mode) { this->internal_dac_mode_ = mode; } |   void set_internal_dac_mode(i2s_dac_mode_t mode) { this->internal_dac_mode_ = mode; } | ||||||
| #endif | #endif | ||||||
|   void set_external_dac_channels(uint8_t channels) { this->external_dac_channels_ = channels; } |  | ||||||
|  |  | ||||||
|   void start() override; |   void start() override; | ||||||
|   void stop() override; |   void stop() override; | ||||||
| @@ -76,7 +75,6 @@ class I2SAudioSpeaker : public Component, public speaker::Speaker, public I2SAud | |||||||
| #if SOC_I2S_SUPPORTS_DAC | #if SOC_I2S_SUPPORTS_DAC | ||||||
|   i2s_dac_mode_t internal_dac_mode_{I2S_DAC_CHANNEL_DISABLE}; |   i2s_dac_mode_t internal_dac_mode_{I2S_DAC_CHANNEL_DISABLE}; | ||||||
| #endif | #endif | ||||||
|   uint8_t external_dac_channels_; |  | ||||||
| }; | }; | ||||||
|  |  | ||||||
| }  // namespace i2s_audio | }  // namespace i2s_audio | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user