mirror of https://github.com/mgba-emu/mgba.git
Account for floating point error in resampling
This commit is contained in:
parent
4e88cc86d9
commit
94cc48faf1
|
@ -46,9 +46,10 @@ static void _pulldownResample(struct GBASDLAudio* context, struct StereoSample*
|
||||||
int32_t right[BUFFER_SIZE];
|
int32_t right[BUFFER_SIZE];
|
||||||
|
|
||||||
// toRead is in GBA samples
|
// toRead is in GBA samples
|
||||||
|
// TODO: Do this with fixed-point math
|
||||||
int toRead = samples / context->ratio;
|
int toRead = samples / context->ratio;
|
||||||
while (samples > 0) {
|
while (samples > 0) {
|
||||||
int currentRead = BUFFER_SIZE >> 2;
|
int currentRead = BUFFER_SIZE >> 1;
|
||||||
if (currentRead > toRead) {
|
if (currentRead > toRead) {
|
||||||
currentRead = toRead;
|
currentRead = toRead;
|
||||||
}
|
}
|
||||||
|
@ -57,22 +58,25 @@ static void _pulldownResample(struct GBASDLAudio* context, struct StereoSample*
|
||||||
unsigned i;
|
unsigned i;
|
||||||
for (i = 0; i < read; ++i) {
|
for (i = 0; i < read; ++i) {
|
||||||
context->drift += context->ratio;
|
context->drift += context->ratio;
|
||||||
while (context->drift >= 0) {
|
while (context->drift >= 1.f) {
|
||||||
output->left = left[i];
|
output->left = left[i];
|
||||||
output->right = right[i];
|
output->right = right[i];
|
||||||
++output;
|
++output;
|
||||||
--samples;
|
--samples;
|
||||||
#ifndef NDEBUG
|
|
||||||
if (samples < 0) {
|
|
||||||
abort();
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
context->drift -= 1.f;
|
context->drift -= 1.f;
|
||||||
|
if (samples < 0) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (read < BUFFER_SIZE >> 2) {
|
if (read < BUFFER_SIZE >> 2) {
|
||||||
memset(output, 0, toRead);
|
if (samples > 1) {
|
||||||
return;
|
memset(output, 0, samples * sizeof(struct StereoSample));
|
||||||
|
return;
|
||||||
|
} else {
|
||||||
|
// Account for lost sample due to floating point conversion
|
||||||
|
toRead = 1;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue