summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--sdkconfig.common1
-rw-r--r--src/audio/audio_fsm.cpp22
2 files changed, 16 insertions, 7 deletions
diff --git a/sdkconfig.common b/sdkconfig.common
index 7ae9aea2..45f21e9a 100644
--- a/sdkconfig.common
+++ b/sdkconfig.common
@@ -22,7 +22,6 @@ CONFIG_SPI_MASTER_IN_IRAM=y
# CONFIG_TWAI_ERRATA_FIX_RX_FIFO_CORRUPT is not set
# CONFIG_TWAI_ERRATA_FIX_LISTEN_ONLY_DOM is not set
CONFIG_GPIO_CTRL_FUNC_IN_IRAM=y
-CONFIG_I2S_ISR_IRAM_SAFE=y
# CONFIG_ETH_USE_ESP32_EMAC is not set
# CONFIG_ETH_USE_SPI_ETHERNET is not set
# CONFIG_ESP_EVENT_POST_FROM_ISR is not set
diff --git a/src/audio/audio_fsm.cpp b/src/audio/audio_fsm.cpp
index ba6e5ffe..0119855a 100644
--- a/src/audio/audio_fsm.cpp
+++ b/src/audio/audio_fsm.cpp
@@ -13,7 +13,9 @@
#include "audio_sink.hpp"
#include "bluetooth_types.hpp"
+#include "esp_heap_caps.h"
#include "esp_log.h"
+#include "freertos/FreeRTOS.h"
#include "freertos/portmacro.h"
#include "freertos/projdefs.h"
@@ -192,20 +194,28 @@ void AudioState::react(const TogglePlayPause& ev) {
namespace states {
+// Two seconds of samples for two channels, at a representative sample rate.
+constexpr size_t kDrainBufferSize = sizeof(sample::Sample) * 48000 * 4;
+static StreamBufferHandle_t sDrainBuffer;
+
void Uninitialised::react(const system_fsm::BootComplete& ev) {
sServices = ev.services;
- constexpr size_t kDrainBufferSize =
- drivers::kI2SBufferLengthFrames * sizeof(sample::Sample) * 2 * 8;
ESP_LOGI(kTag, "allocating drain buffer, size %u KiB",
kDrainBufferSize / 1024);
- StreamBufferHandle_t stream = xStreamBufferCreateWithCaps(
- kDrainBufferSize, sizeof(sample::Sample), MALLOC_CAP_DMA);
+
+ auto meta = reinterpret_cast<StaticStreamBuffer_t*>(
+ heap_caps_malloc(sizeof(StaticStreamBuffer_t), MALLOC_CAP_DMA));
+ auto storage = reinterpret_cast<uint8_t*>(
+ heap_caps_malloc(kDrainBufferSize, MALLOC_CAP_SPIRAM));
+
+ sDrainBuffer = xStreamBufferCreateStatic(
+ kDrainBufferSize, sizeof(sample::Sample), storage, meta);
sFileSource.reset(
new FatfsAudioInput(sServices->tag_parser(), sServices->bg_worker()));
- sI2SOutput.reset(new I2SAudioOutput(stream, sServices->gpios()));
- sBtOutput.reset(new BluetoothAudioOutput(stream, sServices->bluetooth(),
+ sI2SOutput.reset(new I2SAudioOutput(sDrainBuffer, sServices->gpios()));
+ sBtOutput.reset(new BluetoothAudioOutput(sDrainBuffer, sServices->bluetooth(),
sServices->bg_worker()));
auto& nvs = sServices->nvs();