mirror of
https://gitlab.freedesktop.org/pipewire/pipewire.git
synced 2025-11-04 13:30:12 -05:00
dsffile: fix negative interleave
This commit is contained in:
parent
d25bb89cc0
commit
ce2f1b3737
2 changed files with 7 additions and 8 deletions
|
|
@ -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];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue