Skip to content

Commit da9a0a9

Browse files
committed
work in progress, support both sync and async loading
1 parent d5d472a commit da9a0a9

File tree

2 files changed

+81
-12
lines changed

2 files changed

+81
-12
lines changed

src/flashloader.cpp

Lines changed: 45 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -22,13 +22,53 @@
2222
#include "flashloader.h"
2323

2424
namespace newdigate {
25-
/*
25+
2626
audiosample * flashloader::loadSample(const char *filename ) {
2727
Serial.printf("Reading %s\n", filename);
2828
//unsigned s = ((-_lastPointer) % 512)-4;
2929
//Serial.printf("Align size: %x\n", s);
3030
//auto* align = (unsigned*)extmem_malloc (s);
3131

32+
File f = SD.open(filename, O_READ);
33+
if (f) {
34+
uint64_t size = f.size();
35+
//uint mod = size % 1024;
36+
//size = size + mod;
37+
if (f.size() < _bytes_available) {
38+
noInterrupts();
39+
uint32_t total_read = 0;
40+
auto *data = (uint32_t*)extmem_malloc( size );
41+
memset(data, 0, size);
42+
43+
int8_t *index = (int8_t*)data + 4;
44+
while (f.available()) {
45+
size_t bytesRead = f.read(index, flashloader_default_sd_buffer_size);
46+
if (bytesRead == -1)
47+
break;
48+
total_read += bytesRead;
49+
index += bytesRead;
50+
}
51+
interrupts();
52+
_bytes_available -= total_read;
53+
54+
audiosample *sample = new audiosample();
55+
sample->sampledata = (int16_t*)data;
56+
sample->samplesize = f.size();
57+
58+
return sample;
59+
}
60+
}
61+
62+
Serial.printf("not found %s\n", filename);
63+
return nullptr;
64+
}
65+
66+
audiosample * flashloader::loadSampleWav(const char *filename ) {
67+
Serial.printf("Reading %s\n", filename);
68+
//unsigned s = ((-_lastPointer) % 512)-4;
69+
//Serial.printf("Align size: %x\n", s);
70+
//auto* align = (unsigned*)extmem_malloc (s);
71+
3272
File f = SD.open(filename, O_READ);
3373
if (f) {
3474
uint64_t size = f.size();
@@ -38,9 +78,9 @@ namespace newdigate {
3878
noInterrupts();
3979
uint32_t total_read = 0;
4080
auto *data = (uint32_t*)extmem_malloc( size + 4);
41-
//_lastPointer = (uint32_t)data;
4281
memset(data, 0, size + 4);
43-
data[0] = (01 << 24) | size; // format == 01 PCM
82+
//data[0] = (01 << 24) | size; // format == 01 PCM
83+
data[0] = (0x81 << 24) | (size / 2); // format == 01 PCM
4484

4585
int8_t *index = (int8_t*)data + 4;
4686
while (f.available()) {
@@ -57,17 +97,16 @@ namespace newdigate {
5797
audiosample *sample = new audiosample();
5898
sample->sampledata = (int16_t*)data;
5999
sample->samplesize = f.size();
60-
100+
/*
61101
Serial.printf("\tsample start %x\n", (uint32_t)data);
62102
Serial.printf("\tsample size %d\n", sample->samplesize);
63103
Serial.printf("\tavailable: %d\n", _bytes_available);
64-
104+
*/
65105
return sample;
66106
}
67107
}
68108

69109
Serial.printf("not found %s\n", filename);
70110
return nullptr;
71111
}
72-
*/
73112
}

src/flashloader.h

Lines changed: 36 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -141,12 +141,41 @@ namespace newdigate {
141141
return sample;
142142
}
143143

144+
audiosample * beginAsyncLoadWav(File &file) {
145+
if (!file) {
146+
Serial.println("WARN: file is not open!");
147+
return nullptr;
148+
}
149+
_currentFile = &file;
150+
151+
auto size = _currentFile->size();
152+
uint mod = size % 512;
153+
//size = size + (512 - mod);
154+
size = size + (512 - mod);
155+
Serial.printf("size: %x\n", size);
156+
file.seek(0);
157+
158+
audiosample *sample = _writeHeap->allocate(size + 4);
159+
if (!sample) {
160+
Serial.println("WARN: sample was not allocated");
161+
return nullptr;
162+
}
163+
memset( sample->sampledata, 0, size + 4);
164+
//((uint32_t*)(sample->sampledata))[0] = (0x81 << 24) | (size / 2); // format == 81 PCM
165+
((uint32_t*)(sample->sampledata))[0] = (0x01 << 24) | (size / 2); // format == 01 PCM
166+
//((uint16_t*)(sample->sampledata))[0] = 0x81 << 8 | size/2 >> 16;
167+
//((uint16_t*)(sample->sampledata))[1] = size/2 & 0xFFFF;
168+
_currentSampleOffset += 4;
169+
_currentReadSample = sample;
170+
return sample;
171+
}
172+
144173
bool continueAsyncLoadPartial() {
145174
if (_currentFile && _currentReadSample) {
146175

147-
//AudioNoInterrupts();
148-
size_t bytesRead = _currentFile->read( (int8_t*)_currentReadSample->sampledata + _currentSampleOffset, _read_buffer_size);
149-
//AudioInterrupts();
176+
AudioNoInterrupts();
177+
size_t bytesRead = _currentFile->read( _currentReadSample->sampledata + _currentSampleOffset, _read_buffer_size);
178+
AudioInterrupts();
150179

151180
_currentSampleOffset += bytesRead;
152181
if (bytesRead == _read_buffer_size) {
@@ -170,18 +199,19 @@ namespace newdigate {
170199
// 4. call toggle_afterNewPatternStarts()
171200
void toggle_beforeNewPatternVoicesStart() {
172201
// switch the read and write heap
173-
//AudioNoInterrupts();
202+
AudioNoInterrupts();
174203
audio_chunk_heap *temp = _readHeap;
175204
_readHeap = _writeHeap;
176205
_writeHeap = temp;
177-
// AudioInterrupts();
206+
AudioInterrupts();
178207
}
179208

180209
void toggle_afterNewPatternStarts() const {
181210
_writeHeap->reset();
182211
}
183212

184-
//audiosample * loadSample(const char *filename );
213+
audiosample * loadSampleWav(const char *filename );
214+
audiosample * loadSample(const char *filename );
185215
};
186216
};
187217
#endif

0 commit comments

Comments
 (0)