|
|
@@ -26,6 +26,16 @@ |
|
|
|
|
|
|
|
#include "effect_delay_ext.h" |
|
|
|
|
|
|
|
//#define INTERNAL_TEST |
|
|
|
|
|
|
|
// Use these with the audio adaptor board (should be adjustable by the user...) |
|
|
|
#define SPIRAM_MOSI_PIN 7 |
|
|
|
#define SPIRAM_MISO_PIN 12 |
|
|
|
#define SPIRAM_SCK_PIN 14 |
|
|
|
|
|
|
|
#define SPIRAM_CS_PIN 6 |
|
|
|
|
|
|
|
|
|
|
|
void AudioEffectDelayExternal::update(void) |
|
|
|
{ |
|
|
|
audio_block_t *block; |
|
|
@@ -34,7 +44,7 @@ void AudioEffectDelayExternal::update(void) |
|
|
|
// grab incoming data and put it into the memory |
|
|
|
block = receiveReadOnly(); |
|
|
|
if (memory_type >= AUDIO_MEMORY_UNDEFINED) { |
|
|
|
// ignore input and do nothing is undefined memory type |
|
|
|
// ignore input and do nothing if undefined memory type |
|
|
|
release(block); |
|
|
|
return; |
|
|
|
} |
|
|
@@ -92,7 +102,6 @@ void AudioEffectDelayExternal::update(void) |
|
|
|
|
|
|
|
uint32_t AudioEffectDelayExternal::allocated[2] = {0, 0}; |
|
|
|
|
|
|
|
|
|
|
|
void AudioEffectDelayExternal::initialize(AudioEffectDelayMemoryType_t type, uint32_t samples) |
|
|
|
{ |
|
|
|
uint32_t memsize, avail; |
|
|
@@ -101,8 +110,13 @@ void AudioEffectDelayExternal::initialize(AudioEffectDelayMemoryType_t type, uin |
|
|
|
head_offset = 0; |
|
|
|
memory_type = type; |
|
|
|
if (type == AUDIO_MEMORY_23LC1024) { |
|
|
|
//memsize = 65536; |
|
|
|
#ifdef INTERNAL_TEST |
|
|
|
memsize = 8000; |
|
|
|
#else |
|
|
|
memsize = 65536; |
|
|
|
#endif |
|
|
|
pinMode(SPIRAM_CS_PIN, OUTPUT); |
|
|
|
digitalWriteFast(SPIRAM_CS_PIN, HIGH); |
|
|
|
} else if (type == AUDIO_MEMORY_MEMORYBOARD) { |
|
|
|
memsize = 393216; |
|
|
|
} else { |
|
|
@@ -117,24 +131,109 @@ void AudioEffectDelayExternal::initialize(AudioEffectDelayMemoryType_t type, uin |
|
|
|
memory_begin = allocated[type]; |
|
|
|
allocated[type] += samples; |
|
|
|
memory_length = samples; |
|
|
|
|
|
|
|
SPI.setMOSI(SPIRAM_MOSI_PIN); |
|
|
|
SPI.setMISO(SPIRAM_MISO_PIN); |
|
|
|
SPI.setSCK(SPIRAM_SCK_PIN); |
|
|
|
|
|
|
|
SPI.begin(); |
|
|
|
zero(0, memory_length); |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
static int16_t testmem[8000]; |
|
|
|
#ifdef INTERNAL_TEST |
|
|
|
static int16_t testmem[8000]; // testing only |
|
|
|
#endif |
|
|
|
|
|
|
|
|
|
|
|
#define SPISETTING SPISettings(20000000, MSBFIRST, SPI_MODE0) |
|
|
|
|
|
|
|
void AudioEffectDelayExternal::read(uint32_t offset, uint32_t count, int16_t *data) |
|
|
|
{ |
|
|
|
while (count) { *data++ = testmem[memory_begin + offset++]; count--; } |
|
|
|
uint32_t addr = memory_begin + offset; |
|
|
|
|
|
|
|
#ifdef INTERNAL_TEST |
|
|
|
while (count) { *data++ = testmem[addr++]; count--; } // testing only |
|
|
|
#else |
|
|
|
if (memory_type == AUDIO_MEMORY_23LC1024) { |
|
|
|
addr *= 2; |
|
|
|
SPI.beginTransaction(SPISETTING); |
|
|
|
digitalWriteFast(SPIRAM_CS_PIN, LOW); |
|
|
|
SPI.transfer16((0x03 << 8) | (addr >> 16)); |
|
|
|
SPI.transfer16(addr & 0xFFFF); |
|
|
|
while (count) { |
|
|
|
*data++ = (int16_t)(SPI.transfer16(0)); |
|
|
|
count--; |
|
|
|
} |
|
|
|
digitalWriteFast(SPIRAM_CS_PIN, HIGH); |
|
|
|
SPI.endTransaction(); |
|
|
|
} else if (memory_type == AUDIO_MEMORY_MEMORYBOARD) { |
|
|
|
// TODO.... similar, but handle partition across 6 chips |
|
|
|
} |
|
|
|
#endif |
|
|
|
} |
|
|
|
|
|
|
|
void AudioEffectDelayExternal::write(uint32_t offset, uint32_t count, const int16_t *data) |
|
|
|
{ |
|
|
|
while (count) { testmem[memory_begin + offset++] = *data++; count--; } |
|
|
|
uint32_t addr = memory_begin + offset; |
|
|
|
|
|
|
|
#ifdef INTERNAL_TEST |
|
|
|
while (count) { testmem[addr++] = *data++; count--; } // testing only |
|
|
|
#else |
|
|
|
if (memory_type == AUDIO_MEMORY_23LC1024) { |
|
|
|
addr *= 2; |
|
|
|
SPI.beginTransaction(SPISETTING); |
|
|
|
digitalWriteFast(SPIRAM_CS_PIN, LOW); |
|
|
|
SPI.transfer16((0x02 << 8) | (addr >> 16)); |
|
|
|
SPI.transfer16(addr & 0xFFFF); |
|
|
|
while (count) { |
|
|
|
SPI.transfer16(*data++); |
|
|
|
count--; |
|
|
|
} |
|
|
|
digitalWriteFast(SPIRAM_CS_PIN, HIGH); |
|
|
|
SPI.endTransaction(); |
|
|
|
} else if (memory_type == AUDIO_MEMORY_MEMORYBOARD) { |
|
|
|
// TODO.... similar, but handle partition across 6 chips |
|
|
|
} |
|
|
|
#endif |
|
|
|
} |
|
|
|
|
|
|
|
void AudioEffectDelayExternal::zero(uint32_t offset, uint32_t count) |
|
|
|
{ |
|
|
|
while (count) { testmem[memory_begin + offset++] = 0; count--; } |
|
|
|
uint32_t addr = memory_begin + offset; |
|
|
|
|
|
|
|
#ifdef INTERNAL_TEST |
|
|
|
while (count) { testmem[addr++] = 0; count--; } // testing only |
|
|
|
#else |
|
|
|
if (memory_type == AUDIO_MEMORY_23LC1024) { |
|
|
|
addr *= 2; |
|
|
|
SPI.beginTransaction(SPISETTING); |
|
|
|
//digitalWriteFast(SPIRAM_CS_PIN, LOW); |
|
|
|
//SPI.transfer16((0x01 << 8) | 0x40); // not needed, defaults to this mode |
|
|
|
//digitalWriteFast(SPIRAM_CS_PIN, HIGH); |
|
|
|
//delayMicroseconds(1); |
|
|
|
//digitalWriteFast(SPIRAM_CS_PIN, LOW); |
|
|
|
//SPI.transfer16((0x05 << 8) | 0x40); // not needed, defaults to this mode |
|
|
|
//digitalWriteFast(SPIRAM_CS_PIN, HIGH); |
|
|
|
//delayMicroseconds(1); |
|
|
|
digitalWriteFast(SPIRAM_CS_PIN, LOW); |
|
|
|
SPI.transfer16((0x02 << 8) | (addr >> 16)); |
|
|
|
SPI.transfer16(addr & 0xFFFF); |
|
|
|
while (count) { |
|
|
|
SPI.transfer16(0); |
|
|
|
count--; |
|
|
|
} |
|
|
|
digitalWriteFast(SPIRAM_CS_PIN, HIGH); |
|
|
|
SPI.endTransaction(); |
|
|
|
} else if (memory_type == AUDIO_MEMORY_MEMORYBOARD) { |
|
|
|
// TODO.... similar, but handle partition across 6 chips |
|
|
|
} |
|
|
|
#endif |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|