From 0e5b2a86b8edf1871d1acbb794cc66fefc44122b Mon Sep 17 00:00:00 2001 From: Christian Baars Date: Sat, 18 May 2024 22:15:59 +0200 Subject: [PATCH] i2s audio ,some improvements (#21433) --- .../tasmota_xdrv_driver/xdrv_42_0_i2s_0_config_idf51.ino | 4 ++++ tasmota/tasmota_xdrv_driver/xdrv_42_0_i2s_audio_idf51.ino | 8 ++++++-- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/tasmota/tasmota_xdrv_driver/xdrv_42_0_i2s_0_config_idf51.ino b/tasmota/tasmota_xdrv_driver/xdrv_42_0_i2s_0_config_idf51.ino index c9a102517..dafbfb772 100644 --- a/tasmota/tasmota_xdrv_driver/xdrv_42_0_i2s_0_config_idf51.ino +++ b/tasmota/tasmota_xdrv_driver/xdrv_42_0_i2s_0_config_idf51.ino @@ -85,7 +85,11 @@ typedef struct{ struct { uint32_t sample_rate = 32000; // B00-03 - 32000 is compatible with MP3 encoding uint16_t gain = 30 * 16; // B04-05 - in Q12.4 +#if SOC_I2S_SUPPORTS_PDM_RX uint8_t mode = I2S_MODE_PDM; // B06 - I2S mode standard, PDM, TDM, DAC +#else + uint8_t mode = I2S_MODE_STD; // B06 - I2S mode standard, PDM, TDM, DAC +#endif uint8_t slot_mask = BIT(0); // B07 - slot mask = left/right/both depended on mode, so BIT(0) maybe left or right uint8_t slot_bit_width = I2S_SLOT_BIT_WIDTH_32BIT; // B08 - auto equals data_bit_width - can differ from bits per sample e.g. INMP441 uint8_t channels = 1; // B09 - mono/stereo - 1 is added for both diff --git a/tasmota/tasmota_xdrv_driver/xdrv_42_0_i2s_audio_idf51.ino b/tasmota/tasmota_xdrv_driver/xdrv_42_0_i2s_audio_idf51.ino index f2072cb8b..1c9f5714f 100644 --- a/tasmota/tasmota_xdrv_driver/xdrv_42_0_i2s_audio_idf51.ino +++ b/tasmota/tasmota_xdrv_driver/xdrv_42_0_i2s_audio_idf51.ino @@ -404,7 +404,7 @@ void I2sMicTask(void *arg){ } ctime = TasmotaGlobal.uptime; - timeForOneRead = 1000 / ((audio_i2s.Settings->rx.sample_rate / samples_per_pass)); + timeForOneRead = 1000 / ((audio_i2s.Settings->rx.sample_rate / (samples_per_pass * audio_i2s.Settings->rx.channels ))); timeForOneRead -= 1; // be very in time AddLog(LOG_LEVEL_DEBUG, PSTR("I2S: samples %u, bytesize %u, time: %u"),samples_per_pass, bytesize, timeForOneRead); @@ -1027,7 +1027,11 @@ void CmndI2SI2SRtttl(void) { } void CmndI2SMicRec(void) { - if (audio_i2s.Settings->sys.mp3_preallocate == 1) { + if (audio_i2s_mp3.mp3ram == nullptr){ + AddLog(LOG_LEVEL_DEBUG,PSTR("I2S: try late buffer allocation for mp3 encoder")); + audio_i2s_mp3.mp3ram = special_malloc(preallocateCodecSize); + } + if (audio_i2s_mp3.mp3ram != nullptr) { if (XdrvMailbox.data_len > 0) { if (!strncmp(XdrvMailbox.data, "-?", 2)) { Response_P("{\"I2SREC-duration\":%d}", audio_i2s_mp3.recdur);