diff --git a/soundcube-firmware/codec.h b/soundcube-firmware/codec.h index d9ac183..78ff667 100644 --- a/soundcube-firmware/codec.h +++ b/soundcube-firmware/codec.h @@ -47,9 +47,9 @@ class TLV320AIC3204{ // POWER and CM cw(0x00, 0x01); // select page 1 cw(0x01, 0b00001000); // disable weak (crude) AVdd connection to DVdd - cw(0x02, 0b00000001); // enable internal AVdd LDO and enable analog blocks + cw(0x02, 0b01011001); // enable internal AVdd LDO and enable analog blocks cw(0x09, 0b00001100); // power up LOL, LOR, power down MAL, MAR, HPL, HPR - cw(0x0a, 0b00001000); // set full chip CM to 0.75V + cw(0x0a, 0b01000000); // set full chip CM to 0.75V cw(0x47, 0b00110011); // analog input quick charge time 1.6ms // ROUTING diff --git a/soundcube-firmware/soundcube-firmware.ino b/soundcube-firmware/soundcube-firmware.ino index 71122d3..cf856ab 100644 --- a/soundcube-firmware/soundcube-firmware.ino +++ b/soundcube-firmware/soundcube-firmware.ino @@ -18,18 +18,13 @@ #define AURAL 1 #define UI_SAMPLERATE 22050 -#define SIZE 1024 -#define RINGBUFFER 16384 -#define ECHO 24000 - +#define BUFFERSIZE 1024 #define NSTREAMS 8 -int16_t buffer[SIZE]; -int16_t buffer2[ECHO]; +int16_t buffer[BUFFERSIZE]; WaveStream stream[NSTREAMS]; -//File streams[NSTREAMS]; bool streams_loaded = false; I2S i2s(INPUT_PULLUP); @@ -101,28 +96,18 @@ size_t count; size_t tape_write = 0; void codec_transmit() { - // for(int i = 0; i < count; i++){ - // buffer2[tape_write] = buffer[i]; - // tape_write++; - // if(tape_write == ECHO) tape_write = 0; - - // int tape_read = tape_write + 1; - // if(tape_read < 0) tape_read += ECHO; - // buffer[i] += buffer2[tape_read % ECHO]; - // } - for(int i = 0; i < count; i++){ int16_t sample = 0; int j = active % NSTREAMS; sample = stream[j].get(); - buffer[i] += (sample); + buffer[i] += sample; } i2s.write((const uint8_t *)&buffer, count * sizeof(int16_t)); } void codec_receive(){ - count = i2s.read((uint8_t *)&buffer, SIZE * sizeof(int16_t)) * sizeof(uint32_t) / sizeof(int16_t); + count = i2s.read((uint8_t *)&buffer, BUFFERSIZE * sizeof(int16_t)) * sizeof(uint32_t) / sizeof(int16_t); for(int i = 0; i < count; i++){ buffer[i] *= -1; } @@ -256,7 +241,7 @@ void setup() { i2s.swapClocks(); i2s.setBitsPerSample(16); - i2s.setBuffers(6, SIZE * sizeof(int16_t) / sizeof(uint32_t)); + i2s.setBuffers(4, BUFFERSIZE * sizeof(int16_t) / sizeof(uint32_t)); if(!i2s.begin(48000)){ Serial.println("I2S error!"); @@ -265,13 +250,29 @@ void setup() { if(sdInitialized) { for(int i = 0; i < NSTREAMS; i++){ + stream[i].begin(); char filename[40]; sprintf(filename, "/sound/%d.wav", i+1); if(SD.exists(filename)){ - stream[i].load(SD.open(filename)); - stream[i].begin(); - //stream[i].play(); - Serial.println(stream[i].wavefile.blockalign); + bool loaded = stream[i].load(SD.open(filename)); + + if(loaded) { + Serial.print("file read: "); + Serial.print(stream[i].wavefile.length); + Serial.print(" bytes | "); + Serial.print(stream[i].wavefile.samplerate); + Serial.print(" kHz | "); + Serial.print(stream[i].wavefile.bitspersample); + Serial.print(" bits | "); + Serial.print(stream[i].wavefile.channels); + Serial.print(" channels | "); + Serial.print(stream[i].wavefile.blockalign); + Serial.println(" bytes"); + + //stream[i].play(); + } else { + Serial.println("file loading error"); + } } else { for(int k = 0; k < 3; k++){ digitalWrite(6, HIGH); @@ -386,6 +387,11 @@ void loop() { Serial.println(codec.getVolumeL()); + for(int i = 0; i < NSTREAMS; i++){ + stream[i].pause(); + } + stream[active % NSTREAMS].play(); + buttonChanged = false; } @@ -408,6 +414,15 @@ void loop() { } FastLED.show(); + if(streams_loaded) { + for(int i = 0; i < NSTREAMS; i++){ + stream[i].stream(); + } + } + + if(i2s.getOverflow()) Serial.println("overflow"); + if(i2s.getUnderflow()) Serial.println("underflow"); + delay(20); // wait 1ms } @@ -416,9 +431,5 @@ void setup1(){ } void loop1(){ - if(streams_loaded) { - for(int i = 0; i < NSTREAMS; i++){ - stream[i].stream(); - } - } + } \ No newline at end of file diff --git a/soundcube-firmware/wavestream.h b/soundcube-firmware/wavestream.h index 921f9ea..ba32583 100644 --- a/soundcube-firmware/wavestream.h +++ b/soundcube-firmware/wavestream.h @@ -6,25 +6,33 @@ struct WaveFile{ File file; + char cstart[4]; + char cwave[4]; + char cfmt[4]; + bool load(File _file){ file = _file; - file.seek(0, SeekSet); + // RIFF Header uint8_t start[4]; uint8_t size[4]; uint8_t wave[4]; - // RIFF Header + file.seek(0, SeekSet); file.read(start, 4); - if(strcmp("RIFF", (const char*)start) != 0) return false; + + memcpy(cstart, start, 4); + + if(strcmp("RIFF", cstart) != 0) return false; file.seek(4, SeekSet); file.read(size, 4); - length = (size[3] << 24 + size[2] << 16 + size[1] << 8 + size[0]) - 8; + length = (size[3] << 24) + (size[2] << 16) + (size[1] << 8) + size[3] - 8; file.seek(8, SeekSet); file.read(wave, 4); - if(strcmp("WAVE", (const char*)wave) != 0) return false; + memcpy(cwave, wave, 4); + if(strcmp("WAVE", cwave) != 0) return false; // FORMAT uint8_t fmt[4]; @@ -38,28 +46,30 @@ struct WaveFile{ file.seek(12, SeekSet); file.read(fmt, 4); - if(strcmp("fmt ", (const char*)fmt) != 0) return false; + memcpy(cfmt, fmt, 4); + + if(strcmp("fmt ", cfmt) != 0) return false; file.seek(20, SeekSet); file.read(fmtTag, 4); - format = fmtTag[1] << 8 + fmtTag[0]; + format = (fmtTag[1] << 8) + fmtTag[0]; if(format != 0x0001) return false; file.seek(22, SeekSet); file.read(fmtChannels, 2); - channels = fmtChannels[1] << 8 + fmtChannels[0]; + channels = (fmtChannels[1] << 8) + fmtChannels[0]; file.seek(24, SeekSet); file.read(fmtSamplerate, 4); - samplerate = fmtSamplerate[3] << 24 + fmtSamplerate[2] << 16 + fmtSamplerate[1] << 8 + fmtSamplerate[0]; + samplerate = (fmtSamplerate[3] << 24) + (fmtSamplerate[2] << 16) + (fmtSamplerate[1] << 8) + fmtSamplerate[0]; file.seek(32, SeekSet); file.read(fmtBlockalign, 2); - blockalign = fmtBlockalign[1] << 8 + fmtBlockalign[0]; + blockalign = (fmtBlockalign[1] << 8) + fmtBlockalign[0]; file.seek(34, SeekSet); file.read(fmtBitsPerSample, 2); - bitspersample = fmtBitsPerSample[1] << 8 + fmtBitsPerSample[0]; + bitspersample = (fmtBitsPerSample[1] << 8) + fmtBitsPerSample[0]; return true; } @@ -70,8 +80,10 @@ struct WaveFile{ file.read(samplebyte, blockalign); if(!file.available() && loop) file.seek(44, SeekSet); - int16_t sample = (samplebyte[1] << 8) + samplebyte[0]; - buffer.push(sample); + for(int i = 0; i < blockalign; i+=2){ + int16_t sample = (samplebyte[i+1] << 8) + samplebyte[i]; + buffer.push(sample); + } } int16_t get(){ @@ -98,7 +110,8 @@ class WaveStream{ WaveStream(){} void begin(){ - wavefile.buffer.setSize(8192); + wavefile.buffer.setSize(16384); + wavefile.buffer.begin(); } bool load(File _wavefile){ @@ -107,16 +120,18 @@ class WaveStream{ } void play(){playing = true;} + void stop(){ playing = false; wavefile.stop(); } + void pause(){playing = false;} void stream(){ if(!wavefile.buffer.isFull() && playing){ int cnt = 0; - while (!wavefile.buffer.isFull() && cnt < 10000) { + while (!wavefile.buffer.isFull() && cnt < 4096) { wavefile.readblock(); cnt++; }