diff --git a/src/BASpiMemory.cpp b/src/BASpiMemory.cpp index c130e49..0d9d1fd 100644 --- a/src/BASpiMemory.cpp +++ b/src/BASpiMemory.cpp @@ -293,6 +293,8 @@ BASpiMemoryDMA::BASpiMemoryDMA(SpiDeviceId memDeviceId, uint32_t speedHz, size_t case SpiDeviceId::SPI_DEVICE1 : cs = SPI_CS_MEM1; break; + default : + cs = SPI_CS_MEM0; } m_cs = new ActiveLowChipSelect(cs, m_settings); m_txBuffer = new uint8_t[bufferSizeBytes+4]; @@ -396,7 +398,7 @@ void BASpiMemoryDMA::zero16(size_t address, size_t numWords) void BASpiMemoryDMA::read(size_t address, uint8_t *dest, size_t numBytes) { - UNUSED(dest) + UNUSED(dest); while ( m_rxTransfer->busy()) {} uint16_t transferCount = numBytes + 4; m_setSpiCmdAddr(SPI_READ_CMD, address, m_rxBuffer); @@ -406,7 +408,7 @@ void BASpiMemoryDMA::read(size_t address, uint8_t *dest, size_t numBytes) void BASpiMemoryDMA::read16(size_t address, uint16_t *dest, size_t numWords) { - UNUSED(dest) + UNUSED(dest); while ( m_rxTransfer->busy()) {} m_setSpiCmdAddr(SPI_READ_CMD, address, m_rxBuffer); size_t numBytes = sizeof(uint16_t)*numWords; diff --git a/src/BASpiMemory.h b/src/BASpiMemory.h index ed9c375..fa7e3d1 100644 --- a/src/BASpiMemory.h +++ b/src/BASpiMemory.h @@ -94,6 +94,7 @@ protected: //constexpr int MAX_DMA_XFERS = 4; class BASpiMemoryDMA : public BASpiMemory { +public: BASpiMemoryDMA() = delete; /// Create an object to control either MEM0 (via SPI1) or MEM1 (via SPI2). /// @details default is 20 Mhz diff --git a/src/BATypes.h b/src/BATypes.h index 2c2bbf9..0177c67 100644 --- a/src/BATypes.h +++ b/src/BATypes.h @@ -10,6 +10,8 @@ namespace BAGuitar { +#define UNUSED(x) (void)(x) + /**************************************************************************//** * Customer RingBuffer with random access *****************************************************************************/ diff --git a/src/LibBasicFunctions.cpp b/src/LibBasicFunctions.cpp index 19c581a..4170b92 100644 --- a/src/LibBasicFunctions.cpp +++ b/src/LibBasicFunctions.cpp @@ -213,7 +213,7 @@ bool AudioDelay::getSamples(audio_block_t *dest, size_t offset, size_t numSample // destPtr--; // } - m_slot->readAdvance16(AUDIO_BLOCK_SAMPLES); + m_slot->readAdvance16(dest->data, AUDIO_BLOCK_SAMPLES); // // Code below worked // int16_t *destPtr = dest->data; @@ -268,13 +268,13 @@ bool IirBiQuadFilter::process(int16_t *output, int16_t *input, size_t numSamples // create convertion buffers on teh stack int32_t input32[numSamples]; int32_t output32[numSamples]; - for (int i=0; ireadBufferContents(dest, numBytes, bufferOffset); + if (m_useDma) { + (static_cast(m_spi))->readBufferContents(dest, numBytes, bufferOffset); +// BASpiMemoryDMA *spi = nullptr; +// spi = static_cast(m_spi); +// spi->readBufferContents(dest, numBytes, bufferOffset); + } } @@ -256,14 +261,14 @@ size_t ExternalSramManager::availableMemory(BAGuitar::MemSelect mem) return m_memConfig[mem].totalAvailable; } -bool ExternalSramManager::requestMemory(ExtMemSlot *slot, float delayMilliseconds, BAGuitar::MemSelect mem, bool useDma) +bool ExternalSramManager::requestMemory(ExtMemSlot *slot, float delayMilliseconds, BAGuitar::MemSelect mem, size_t dmaBufferSize) { // convert the time to numer of samples size_t delayLengthInt = (size_t)((delayMilliseconds*(AUDIO_SAMPLE_RATE_EXACT/1000.0f))+0.5f); - return requestMemory(slot, delayLengthInt * sizeof(int16_t), mem, useDma); + return requestMemory(slot, delayLengthInt * sizeof(int16_t), mem, dmaBufferSize); } -bool ExternalSramManager::requestMemory(ExtMemSlot *slot, size_t sizeBytes, BAGuitar::MemSelect mem, bool useDma) +bool ExternalSramManager::requestMemory(ExtMemSlot *slot, size_t sizeBytes, BAGuitar::MemSelect mem, size_t dmaBufferSize) { if (m_memConfig[mem].totalAvailable >= sizeBytes) { @@ -276,10 +281,12 @@ bool ExternalSramManager::requestMemory(ExtMemSlot *slot, size_t sizeBytes, BAGu slot->m_size = sizeBytes; if (!m_memConfig[mem].m_spi) { - if (useDma) { - m_memConfig[mem].m_spi = new BAGuitar::BASpiMemoryDma(static_cast(mem)); + if (dmaBufferSize > 0) { + m_memConfig[mem].m_spi = new BAGuitar::BASpiMemoryDMA(static_cast(mem), dmaBufferSize); + slot->m_useDma = true; } else { m_memConfig[mem].m_spi = new BAGuitar::BASpiMemory(static_cast(mem)); + slot->m_useDma = false; } if (!m_memConfig[mem].m_spi) { Serial.println("requestMemory: new failed! m_spi is a nullptr"); @@ -295,7 +302,6 @@ bool ExternalSramManager::requestMemory(ExtMemSlot *slot, size_t sizeBytes, BAGu slot->m_valid = true; if (!slot->isEnabled()) { slot->enable(); } slot->clear(); - slot->m_useDma = useDma; return true; } else { // there is not enough memory available for the request diff --git a/src/LibMemoryManagement.h b/src/LibMemoryManagement.h index 18b507e..fe9948c 100644 --- a/src/LibMemoryManagement.h +++ b/src/LibMemoryManagement.h @@ -110,7 +110,7 @@ public: /// @param dest pointer to the destination of the read. /// @param numWords number of 16-bit words to transfer /// @returns true on success, else false on error - bool readAdvance16(int16_t *dest=nullptr, size_t numWords); + bool readAdvance16(int16_t *dest, size_t numWords); /// Write a block of 16-bit data from the specified location in circular operation /// @param src pointer to the start of the block of data to write to memory @@ -186,15 +186,17 @@ public: /// @param slot a pointer to the global slot object to which memory will be allocated /// @param delayMilliseconds request the amount of memory based on required time for audio samples, rather than number of bytes. /// @param mem specify which external memory to allocate from + /// @param dmaBufferSize When > 0, DMA mode is used with the specified DMA buffer size /// @returns true on success, otherwise false on error - bool requestMemory(ExtMemSlot *slot, float delayMilliseconds, BAGuitar::MemSelect mem = BAGuitar::MemSelect::MEM0, bool useDma = true); + bool requestMemory(ExtMemSlot *slot, float delayMilliseconds, BAGuitar::MemSelect mem = BAGuitar::MemSelect::MEM0, size_t dmaBufferSize = 0); /// Request memory be allocated for the provided slot /// @param slot a pointer to the global slot object to which memory will be allocated /// @param sizeBytes request the amount of memory in bytes to request /// @param mem specify which external memory to allocate from + /// @param dmaBufferSize When > 0, DMA mode is used with the specified DMA buffer size /// @returns true on success, otherwise false on error - bool requestMemory(ExtMemSlot *slot, size_t sizeBytes, BAGuitar::MemSelect mem = BAGuitar::MemSelect::MEM0, bool useDma = true); + bool requestMemory(ExtMemSlot *slot, size_t sizeBytes, BAGuitar::MemSelect mem = BAGuitar::MemSelect::MEM0, size_t dmaBufferSize = 0); private: static bool m_configured; ///< there should only be one instance of ExternalSramManager in the whole project