dsffile: fix negative interleave

This commit is contained in:
Wim Taymans 2022-03-03 14:01:32 +01:00
parent d25bb89cc0
commit ce2f1b3737
2 changed files with 7 additions and 8 deletions

View file

@ -215,25 +215,24 @@ dsf_file_read(struct dsf_file *f, void *data, size_t samples, const struct dsf_l
{ {
uint8_t *d = data; uint8_t *d = data;
const uint8_t *s; const uint8_t *s;
uint32_t i, j, k, total, stride, bytes; uint32_t i, j, k, total, stride, bytes, step = SPA_ABS(layout->interleave);
int32_t interleave = layout->interleave;
bool rev = layout->lsb != f->info.lsb; bool rev = layout->lsb != f->info.lsb;
stride = layout->channels * layout->interleave; stride = layout->channels * step;
bytes = samples * stride; bytes = samples * stride;
bytes -= bytes % f->info.blocksize; bytes -= bytes % f->info.blocksize;
for (total = 0; total < bytes; total += layout->channels * f->info.blocksize) { for (total = 0; total < bytes; total += layout->channels * f->info.blocksize) {
s = f->p + f->offset; s = f->p + f->offset;
for (i = 0; i < f->info.blocksize; i += interleave) { for (i = 0; i < f->info.blocksize; i += step) {
for (j = 0; j < layout->channels; j++) { for (j = 0; j < layout->channels; j++) {
const uint8_t *c = &s[f->info.blocksize * j + i]; const uint8_t *c = &s[f->info.blocksize * j + i];
if (interleave > 0) { if (layout->interleave > 0) {
for (k = 0; k < (uint32_t)interleave; k++) for (k = 0; k < step; k++)
*d++ = rev ? bitrev[c[k]] : c[k]; *d++ = rev ? bitrev[c[k]] : c[k];
} else { } else {
for (k = -interleave; k > 0; k--) for (k = step; k > 0; k--)
*d++ = rev ? bitrev[c[k-1]] : c[k-1]; *d++ = rev ? bitrev[c[k-1]] : c[k-1];
} }
} }

View file

@ -1274,7 +1274,7 @@ static int setup_dsffile(struct data *data)
data->dsf.info.lsb ? "lsb" : "msb"); data->dsf.info.lsb ? "lsb" : "msb");
data->fill = dsf_play; data->fill = dsf_play;
;
return 0; return 0;
} }