wave file parser WIP

This commit is contained in:
Sebastian
2025-06-06 10:22:29 +02:00
parent 55bcb2c389
commit db463c5b8c
2 changed files with 104 additions and 0 deletions

View File

@ -10,6 +10,7 @@
#include <SD.h>
#include "codec.h"
#include "ringbuffer.h"
#include "wavestream.h"
#define HAPTIC 1
#define AURAL 1
@ -26,6 +27,8 @@ int16_t buffer2[ECHO];
RingBuffer<int16_t> ringbuffer[NSTREAMS];
WaveStream stream;
File streams[NSTREAMS];
bool streams_loaded = false;

View File

@ -0,0 +1,101 @@
#pragma once
#include <SD.h>
#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<int16_t> 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];
};