I2S media player allow setting communication format for external DACs (#4918)

Co-authored-by: Carlos Cordero <ccordero@bkool.com>
This commit is contained in:
Carlos Cordero 2023-06-12 21:48:01 +02:00 committed by GitHub
parent f7c0ec6595
commit 5afdb1e97f
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 12 additions and 0 deletions

View file

@ -27,6 +27,7 @@ i2s_dac_mode_t = cg.global_ns.enum("i2s_dac_mode_t")
CONF_MUTE_PIN = "mute_pin" CONF_MUTE_PIN = "mute_pin"
CONF_AUDIO_ID = "audio_id" CONF_AUDIO_ID = "audio_id"
CONF_DAC_TYPE = "dac_type" CONF_DAC_TYPE = "dac_type"
CONF_I2S_COMM_FMT = "i2s_comm_fmt"
INTERNAL_DAC_OPTIONS = { INTERNAL_DAC_OPTIONS = {
"left": i2s_dac_mode_t.I2S_DAC_CHANNEL_LEFT_EN, "left": i2s_dac_mode_t.I2S_DAC_CHANNEL_LEFT_EN,
@ -38,6 +39,8 @@ EXTERNAL_DAC_OPTIONS = ["mono", "stereo"]
NO_INTERNAL_DAC_VARIANTS = [esp32.const.VARIANT_ESP32S2] NO_INTERNAL_DAC_VARIANTS = [esp32.const.VARIANT_ESP32S2]
I2C_COMM_FMT_OPTIONS = ["lsb", "msb"]
def validate_esp32_variant(config): def validate_esp32_variant(config):
if config[CONF_DAC_TYPE] != "internal": if config[CONF_DAC_TYPE] != "internal":
@ -69,6 +72,9 @@ CONFIG_SCHEMA = cv.All(
cv.Optional(CONF_MODE, default="mono"): cv.one_of( cv.Optional(CONF_MODE, default="mono"): cv.one_of(
*EXTERNAL_DAC_OPTIONS, lower=True *EXTERNAL_DAC_OPTIONS, lower=True
), ),
cv.Optional(CONF_I2S_COMM_FMT, default="msb"): cv.one_of(
*I2C_COMM_FMT_OPTIONS, lower=True
),
} }
).extend(cv.COMPONENT_SCHEMA), ).extend(cv.COMPONENT_SCHEMA),
}, },
@ -94,6 +100,7 @@ async def to_code(config):
pin = await cg.gpio_pin_expression(config[CONF_MUTE_PIN]) pin = await cg.gpio_pin_expression(config[CONF_MUTE_PIN])
cg.add(var.set_mute_pin(pin)) cg.add(var.set_mute_pin(pin))
cg.add(var.set_external_dac_channels(2 if config[CONF_MODE] == "stereo" else 1)) cg.add(var.set_external_dac_channels(2 if config[CONF_MODE] == "stereo" else 1))
cg.add(var.set_i2s_comm_fmt_lsb(config[CONF_I2S_COMM_FMT] == "lsb"))
cg.add_library("WiFiClientSecure", None) cg.add_library("WiFiClientSecure", None)
cg.add_library("HTTPClient", None) cg.add_library("HTTPClient", None)

View file

@ -148,6 +148,7 @@ void I2SAudioMediaPlayer::start_() {
pin_config.data_out_num = this->dout_pin_; pin_config.data_out_num = this->dout_pin_;
i2s_set_pin(this->parent_->get_port(), &pin_config); i2s_set_pin(this->parent_->get_port(), &pin_config);
this->audio_->setI2SCommFMT_LSB(this->i2s_comm_fmt_lsb_);
this->audio_->forceMono(this->external_dac_channels_ == 1); this->audio_->forceMono(this->external_dac_channels_ == 1);
if (this->mute_pin_ != nullptr) { if (this->mute_pin_ != nullptr) {
this->mute_pin_->setup(); this->mute_pin_->setup();

View file

@ -39,6 +39,8 @@ class I2SAudioMediaPlayer : public Component, public media_player::MediaPlayer,
#endif #endif
void set_external_dac_channels(uint8_t channels) { this->external_dac_channels_ = channels; } void set_external_dac_channels(uint8_t channels) { this->external_dac_channels_ = channels; }
void set_i2s_comm_fmt_lsb(bool lsb) { this->i2s_comm_fmt_lsb_ = lsb; }
media_player::MediaPlayerTraits get_traits() override; media_player::MediaPlayerTraits get_traits() override;
bool is_muted() const override { return this->muted_; } bool is_muted() const override { return this->muted_; }
@ -71,6 +73,8 @@ class I2SAudioMediaPlayer : public Component, public media_player::MediaPlayer,
#endif #endif
uint8_t external_dac_channels_; uint8_t external_dac_channels_;
bool i2s_comm_fmt_lsb_;
HighFrequencyLoopRequester high_freq_; HighFrequencyLoopRequester high_freq_;
optional<std::string> current_url_{}; optional<std::string> current_url_{};