Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
34 changes: 23 additions & 11 deletions tinywav.c
Original file line number Diff line number Diff line change
Expand Up @@ -234,6 +234,8 @@ int tinywav_read_f(TinyWav *tw, void *data, int len) {
// Sometimes there are additionl chunks *after* -- ignore these.
return 0; // there's nothing more to read, not an error.
}

int ret = 0;

switch (tw->sampFmt) {
case TW_INT16: {
Expand All @@ -246,27 +248,31 @@ int tinywav_read_f(TinyWav *tw, void *data, int len) {
for (int pos = 0; pos < tw->numChannels * frames_read; pos++) {
((float *) data)[pos] = (float) interleaved_data[pos] / INT16_MAX;
}
return frames_read;
ret = frames_read;
break;
}
case TW_INLINE: { // channel buffer is inlined e.g. [LLLLRRRR]
for (int i = 0, pos = 0; i < tw->numChannels; i++) {
for (int j = i; j < frames_read * tw->numChannels; j += tw->numChannels, ++pos) {
((float *) data)[pos] = (float) interleaved_data[j] / INT16_MAX;
}
}
return frames_read;
ret = frames_read;
break;
}
case TW_SPLIT: { // channel buffer is split e.g. [[LLLL],[RRRR]]
for (int i = 0, pos = 0; i < tw->numChannels; i++) {
for (int j = 0; j < frames_read; j++, ++pos) {
((float **) data)[i][j] = (float) interleaved_data[j*tw->numChannels + i] / INT16_MAX;
}
}
return frames_read;
ret = frames_read;
break;
}
default: return 0;
default: break;
}
TW_DEALLOC(interleaved_data);
break;
}
case TW_FLOAT32: {
TW_ALLOC(float, interleaved_data, tw->numChannels*len);
Expand All @@ -276,30 +282,36 @@ int tinywav_read_f(TinyWav *tw, void *data, int len) {
switch (tw->chanFmt) {
case TW_INTERLEAVED: { // channel buffer is interleaved e.g. [LRLRLRLR]
memcpy(data, interleaved_data, tw->numChannels*frames_read*sizeof(float));
return frames_read;
ret = frames_read;
break;
}
case TW_INLINE: { // channel buffer is inlined e.g. [LLLLRRRR]
for (int i = 0, pos = 0; i < tw->numChannels; i++) {
for (int j = i; j < frames_read * tw->numChannels; j += tw->numChannels, ++pos) {
((float *) data)[pos] = interleaved_data[j];
}
}
return frames_read;
ret = frames_read;
break;
}
case TW_SPLIT: { // channel buffer is split e.g. [[LLLL],[RRRR]]
for (int i = 0, pos = 0; i < tw->numChannels; i++) {
for (int j = 0; j < frames_read; j++, ++pos) {
((float **) data)[i][j] = interleaved_data[j*tw->numChannels + i];
}
}
return frames_read;
ret = frames_read;
break;
}
default: return 0;
default: break;
}
TW_DEALLOC(interleaved_data);
break;
}
default: return 0;
default: break;
}

return ret;
}

void tinywav_close_read(TinyWav *tw) {
Expand Down Expand Up @@ -349,7 +361,7 @@ int tinywav_write_f(TinyWav *tw, void *f, int len) {
}
break;
}
default: return 0;
default: TW_DEALLOC(z); return 0;
}

size_t samples_written = fwrite(z, sizeof(int16_t), tw->numChannels*len, tw->f);
Expand Down Expand Up @@ -386,7 +398,7 @@ int tinywav_write_f(TinyWav *tw, void *f, int len) {
}
break;
}
default: return 0;
default: TW_DEALLOC(z); return 0;
}

size_t samples_written = fwrite(z, sizeof(float), tw->numChannels*len, tw->f);
Expand Down