forked from W4D/soundcube-firmware
found some bugs now 4 samples play simultaneous without errors
This commit is contained in:
@ -64,7 +64,7 @@ class RingBuffer{
|
||||
|
||||
void advance(int nbytes){
|
||||
for(int i = 0; i < nbytes/2; ++i){
|
||||
if(counter < bufferSize){
|
||||
if(counter < (bufferSize-1)){
|
||||
write++; // % bufferSize;
|
||||
if(write == bufferSize) write = 0;
|
||||
counter++;
|
||||
@ -73,7 +73,7 @@ class RingBuffer{
|
||||
}
|
||||
|
||||
void popDMA(int32_t *target){
|
||||
if(counter > 0) {
|
||||
if(counter > 1) {
|
||||
counter -= 2;
|
||||
rp2040.memcpyDMA(target, &buffer[read], 4);
|
||||
read += 2;
|
||||
@ -86,13 +86,17 @@ class RingBuffer{
|
||||
}
|
||||
|
||||
bool isFull(){
|
||||
return counter == bufferSize;
|
||||
return counter == (bufferSize-2);
|
||||
}
|
||||
|
||||
int size(){
|
||||
return counter;
|
||||
}
|
||||
|
||||
int remains(){
|
||||
return (bufferSize-2) - counter;
|
||||
}
|
||||
|
||||
private:
|
||||
size_t bufferSize = 0;
|
||||
int counter = 0;
|
||||
|
||||
@ -22,7 +22,7 @@ bool core1_disable_systick = true;
|
||||
#define AURAL 1
|
||||
#define UI_SAMPLERATE 22050
|
||||
|
||||
#define BUFFERSIZE 64
|
||||
#define BUFFERSIZE 256
|
||||
#define NSTREAMS 16
|
||||
|
||||
I2S i2s(INPUT_PULLUP);
|
||||
@ -51,6 +51,10 @@ enum BUTTON {MODE, LOOP, INL, INR, OUTR, OUTL, TEMPO, RESET, BACK, POWER, SELECT
|
||||
|
||||
int lut_ring_cw[48] = {39,38,37,36,35,34,33,32,31,30,29,28,27,26,25,24,23,22,21,20,19,18,17,16,15,14,13,12,11,10,9,8,7,6,5,4,3,50,49,48,47,46,45,44,43,42,41,40};
|
||||
int lut_ring_ccw[48] = {40,41,42,43,44,45,46,47,48,49,50,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39};
|
||||
|
||||
int lut_ring_cw_3[48] = {40,39,38,37,36,35,34,33,32,31,30,29,28,27,26,25,24,23,22,21,20,19,18,17,16,15,14,13,12,11,10,9,8,7,6,5,4,3,50,49,48,47,46,45,44,43,42,41};
|
||||
int lut_ring_ccw_3[48] = {39,40,41,42,43,44,45,46,47,48,49,50,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38};
|
||||
|
||||
int lut_matrix[13] = {56,55,57,58,59,62,61,60,63,64,65,67,66};
|
||||
|
||||
int lut_banks[4] = {56,55,67,66};
|
||||
@ -174,21 +178,23 @@ void codec_transmit() {
|
||||
for(int k = 0; k < NSTREAMS; k++){
|
||||
//int32_t twosamples;
|
||||
int16_t twosamples[2];
|
||||
stream[k].getDMA((int32_t*)&twosamples);
|
||||
if(stream[k].isPlaying()){
|
||||
stream[k].getDMA((int32_t*)&twosamples);
|
||||
|
||||
int16_t sample_l = twosamples[0];// >> 16;
|
||||
int16_t sample_r = twosamples[1];// & 0xFFFF;
|
||||
int16_t sample_l = twosamples[0];// >> 16;
|
||||
int16_t sample_r = twosamples[1];// & 0xFFFF;
|
||||
|
||||
// int16_t *sample_l = stream[k].wavefile.buffer.getReadPointer(); //twosamples >> 16;
|
||||
// stream[k].wavefile.buffer.pointerPop(2);
|
||||
// int16_t *sample_r = stream[k].wavefile.buffer.getReadPointer(); //twosamples & 0xFFFF;
|
||||
// stream[k].wavefile.buffer.pointerPop(2);
|
||||
// int16_t *sample_l = stream[k].wavefile.buffer.getReadPointer(); //twosamples >> 16;
|
||||
// stream[k].wavefile.buffer.pointerPop(2);
|
||||
// int16_t *sample_r = stream[k].wavefile.buffer.getReadPointer(); //twosamples & 0xFFFF;
|
||||
// stream[k].wavefile.buffer.pointerPop(2);
|
||||
|
||||
// buffer[i] += (*sample_l / 16);
|
||||
// buffer[i+1] += (*sample_r / 16);
|
||||
|
||||
buffer[i] += (sample_l / 16);
|
||||
buffer[i+1] += (sample_r / 16);
|
||||
// buffer[i] += (*sample_l / 16);
|
||||
// buffer[i+1] += (*sample_r / 16);
|
||||
|
||||
buffer[i] += (sample_l / 16);
|
||||
buffer[i+1] += (sample_r / 16);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -708,13 +714,13 @@ void loop1() {
|
||||
for(int i = 0; i < 48; i++){
|
||||
int step = floor(i/3);
|
||||
if(step == set_bar){
|
||||
ui_leds[lut_ring_cw[i]] = CRGB(config.ring_color.r_active, config.ring_color.g_active, config.ring_color.b_active);
|
||||
ui_leds[lut_ring_cw_3[i]] = CRGB(config.ring_color.r_active, config.ring_color.g_active, config.ring_color.b_active);
|
||||
}
|
||||
if(step == bar){
|
||||
ui_leds[lut_ring_cw[i]] = CRGB(config.ring_color.r, config.ring_color.g, config.ring_color.b);
|
||||
ui_leds[lut_ring_cw_3[i]] = CRGB(config.ring_color.r, config.ring_color.g, config.ring_color.b);
|
||||
}
|
||||
if(steps[step].len > 0) {
|
||||
ui_leds[lut_ring_cw[i]] = CRGB(0, 10, 0);
|
||||
ui_leds[lut_ring_cw_3[i]] = CRGB(0, 10, 0);
|
||||
}
|
||||
|
||||
}
|
||||
@ -733,7 +739,7 @@ void loop1() {
|
||||
}
|
||||
}
|
||||
//int sc = 0;
|
||||
int cnt = 0;
|
||||
int streamcnt = 0;
|
||||
void loop(){
|
||||
if(setup1_finished && setup0_finished){
|
||||
|
||||
@ -741,11 +747,19 @@ void loop(){
|
||||
uint32_t delta = millis() - last;
|
||||
|
||||
if(delta >= delta_bpm) {
|
||||
|
||||
|
||||
bar = (bar + 1) % 16;
|
||||
if(steps[bar].len > 0) {
|
||||
steps[bar].trigger();
|
||||
// Serial.print("trigger ");
|
||||
// Serial.println(bar);
|
||||
}
|
||||
|
||||
if(streams_loaded) {
|
||||
for(int i = 0; i < NSTREAMS; i++){
|
||||
Serial.print(stream[i].wavefile.buffer.size());
|
||||
Serial.print("\t");
|
||||
}
|
||||
Serial.println();
|
||||
}
|
||||
|
||||
// Serial.print(delta_bpm);
|
||||
@ -755,14 +769,13 @@ void loop(){
|
||||
last = millis();
|
||||
}
|
||||
|
||||
// stream[cnt].stream();
|
||||
// cnt++;
|
||||
// if(cnt == 16) cnt = 0;
|
||||
if(streams_loaded) {
|
||||
for(int i = 0; i < NSTREAMS; i++){
|
||||
stream[i].stream();
|
||||
}
|
||||
// for(int i = 0; i < NSTREAMS; i++){
|
||||
stream[streamcnt].stream();
|
||||
// }
|
||||
}
|
||||
streamcnt = (streamcnt + 1) % 16;
|
||||
|
||||
// int16_t sample_l = 0;
|
||||
// int16_t sample_r = 0;
|
||||
//
|
||||
|
||||
@ -108,9 +108,9 @@ struct WaveFile{
|
||||
|
||||
bool readblockDMA128(){
|
||||
void *bufferStart = buffer.getWritePointer();
|
||||
|
||||
int adv = 128;
|
||||
adv = file.read((uint8_t*)bufferStart, 128);
|
||||
|
||||
remains = min(buffer.remains(), 128);
|
||||
adv = file.readBytes((char*)bufferStart, remains);
|
||||
buffer.advance(adv);
|
||||
|
||||
if(!file.available() && loop) file.seek(44, SeekSet);
|
||||
@ -141,6 +141,9 @@ struct WaveFile{
|
||||
uint16_t blockalign = 0;
|
||||
uint16_t bitspersample = 0;
|
||||
|
||||
int adv = 0;
|
||||
int remains = 0;
|
||||
|
||||
RingBuffer buffer;
|
||||
};
|
||||
|
||||
@ -149,7 +152,7 @@ class WaveStream{
|
||||
WaveStream(){}
|
||||
|
||||
void begin(){
|
||||
wavefile.buffer.setSize(1024);
|
||||
wavefile.buffer.setSize(2048);
|
||||
wavefile.buffer.begin();
|
||||
}
|
||||
|
||||
@ -174,7 +177,7 @@ class WaveStream{
|
||||
|
||||
void stream(){
|
||||
int cnt = 0;
|
||||
while (!wavefile.buffer.isFull() && cnt < 128) {
|
||||
while (!wavefile.buffer.isFull() && cnt < 1024) {
|
||||
bool ok = wavefile.readblockDMA();
|
||||
if(!ok) playing = false;
|
||||
cnt += 2;
|
||||
|
||||
Reference in New Issue
Block a user