From db463c5b8ce6b9c9b46ee23af38e64017d93342c Mon Sep 17 00:00:00 2001 From: Sebastian Date: Fri, 6 Jun 2025 10:22:29 +0200 Subject: [PATCH] wave file parser WIP --- soundcube-firmware/soundcube-firmware.ino | 3 + soundcube-firmware/wavestream.h | 101 ++++++++++++++++++++++ 2 files changed, 104 insertions(+) create mode 100644 soundcube-firmware/wavestream.h diff --git a/soundcube-firmware/soundcube-firmware.ino b/soundcube-firmware/soundcube-firmware.ino index 55ab035..f9282f5 100644 --- a/soundcube-firmware/soundcube-firmware.ino +++ b/soundcube-firmware/soundcube-firmware.ino @@ -10,6 +10,7 @@ #include #include "codec.h" #include "ringbuffer.h" +#include "wavestream.h" #define HAPTIC 1 #define AURAL 1 @@ -26,6 +27,8 @@ int16_t buffer2[ECHO]; RingBuffer ringbuffer[NSTREAMS]; +WaveStream stream; + File streams[NSTREAMS]; bool streams_loaded = false; diff --git a/soundcube-firmware/wavestream.h b/soundcube-firmware/wavestream.h new file mode 100644 index 0000000..6ae4f10 --- /dev/null +++ b/soundcube-firmware/wavestream.h @@ -0,0 +1,101 @@ +#pragma once + +#include +#include "ringbuffer.h" + +struct WaveFile{ + File file; + + bool load(File _file){ + file = _file; + + file.seek(0, SeekSet); + uint8_t start[4]; + uint8_t size[4]; + uint8_t wave[4]; + + // RIFF Header + file.read(start, 4); + if(strcmp("RIFF", (const char*)start) != 0) return false; + + file.seek(4, SeekSet); + file.read(size, 4); + length = (size[3] << 24 + size[2] << 16 + size[1] << 8 + size[0]) - 8; + + file.seek(8, SeekSet); + file.read(wave, 4); + if(strcmp("WAVE", (const char*)wave) != 0) return false; + + // FORMAT + uint8_t fmt[4]; + uint8_t fmtLen[4]; + uint8_t fmtTag[2]; + uint8_t fmtChannels[2]; + uint8_t fmtSamplerate[4]; + uint8_t fmtBytesPerSecond[4]; + uint8_t fmtBlockalign[2]; + uint8_t fmtBitsPerSample[2]; + + file.seek(12, SeekSet); + file.read(fmt, 4); + if(strcmp("fmt ", (const char*)fmt) != 0) return false; + + file.seek(20, SeekSet); + file.read(fmtTag, 4); + 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]; + + file.seek(24, SeekSet); + file.read(fmtSamplerate, 4); + 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]; + + file.seek(34, SeekSet); + file.read(fmtBitsPerSample, 2); + bitspersample = fmtBitsPerSample[1] << 8 + fmtBitsPerSample[0]; + + return true; + } + + uint16_t format = 0; + uint32_t length = 0; + uint16_t channels = 0; + uint32_t samplerate = 0; + uint16_t blockalign = 0; + uint16_t bitspersample = 0; + + RingBuffer buffer; +}; + +class WaveStream{ + public: + WaveStream(){} + + void begin(){} + void update(){} + + bool load(int stream, File wavefile){ + if(stream < 0 || stream > 7) return false; + if(!wavefiles[stream].load(wavefile)) return false; + return true; + } + + void start(int stream){} + void stop(int stream){} + void pause(int stream){} + + void stopAll(){} + void startAll(){} + void pauseAll(){} + + private: + WaveFile wavefiles[8]; + +}; \ No newline at end of file