FileGameSound: fix buffer advance accounting

Change-Id: I15bb2b1e703cad955544a1151adc6a1277b077a8
Reviewed-on: https://review.haiku-os.org/c/haiku/+/3467
Reviewed-by: Jérôme Duval <[email protected]>
This commit is contained in:
Máximo Castañeda
2020-12-08 04:32:56 +00:00
committed by waddlesplash
parent 9293eadbda
commit 15de111dcf
+10 -74
View File
@@ -32,17 +32,18 @@ struct _gs_media_tracker {
// Local utility functions -----------------------------------------------
template<typename T>
bool
FillBuffer(_gs_ramp* ramp, uint8* data, uint8* buffer, size_t* bytes)
FillBuffer(_gs_ramp* ramp, T* dest, const T* src, size_t* bytes)
{
int32 samples = *bytes / sizeof(uint8);
size_t samples = *bytes / sizeof(T);
for (int32 byte = 0; byte < samples; byte++) {
for (size_t sample = 0; sample < samples; sample++) {
float gain = *ramp->value;
data[byte] = uint8(float(buffer[byte]) * gain);
dest[sample] = T(float(src[sample]) * gain);
if (ChangeRamp(ramp)) {
*bytes = byte * sizeof(uint8);
*bytes = sample * sizeof(T);
return true;
}
}
@@ -51,71 +52,6 @@ FillBuffer(_gs_ramp* ramp, uint8* data, uint8* buffer, size_t* bytes)
}
bool
FillBuffer(_gs_ramp* ramp, int16* data, int16* buffer, size_t* bytes)
{
int32 samples = *bytes / sizeof(int16);
for (int32 byte = 0; byte < samples; byte++) {
float gain = *ramp->value;
data[byte] = int16(float(buffer[byte]) * gain);
if (ChangeRamp(ramp)) {
*bytes = byte * sizeof(int16);
return true;
}
}
return false;
}
bool
FillBuffer(_gs_ramp* ramp, int32* data, int32* buffer, size_t* bytes)
{
size_t byte = 0;
bool bytesAreReady = (*bytes > 0);
while (bytesAreReady) {
float gain = *ramp->value;
data[byte] = int32(float(buffer[byte]) * gain);
if (ChangeRamp(ramp)) {
*bytes = byte;
return true;
}
byte++;
bytesAreReady = (byte >= *bytes);
}
return false;
}
bool
FillBuffer(_gs_ramp* ramp, float* data, float* buffer, size_t* bytes)
{
size_t byte = 0;
bool bytesAreReady = (*bytes > 0);
while (bytesAreReady) {
float gain = *ramp->value;
data[byte] = buffer[byte] * gain;
if (ChangeRamp(ramp)) {
*bytes = byte;
return true;
}
byte++;
bytesAreReady = (byte >= *bytes);
}
return false;
}
// BFileGameSound -------------------------------------------------------
BFileGameSound::BFileGameSound(const entry_ref* file, bool looping,
BGameSoundDevice* device)
@@ -273,25 +209,25 @@ BFileGameSound::FillBuffer(void* inBuffer, size_t inByteCount)
switch(Format().format) {
case gs_audio_format::B_GS_U8:
rampDone = ::FillBuffer(fPausing,
rampDone = ::FillBuffer<uint8>(fPausing,
(uint8*)&buffer[out_offset],
(uint8*)&fBuffer[fPlayPosition], &bytes);
break;
case gs_audio_format::B_GS_S16:
rampDone = ::FillBuffer(fPausing,
rampDone = ::FillBuffer<int16>(fPausing,
(int16*)&buffer[out_offset],
(int16*)&fBuffer[fPlayPosition], &bytes);
break;
case gs_audio_format::B_GS_S32:
rampDone = ::FillBuffer(fPausing,
rampDone = ::FillBuffer<int32>(fPausing,
(int32*)&buffer[out_offset],
(int32*)&fBuffer[fPlayPosition], &bytes);
break;
case gs_audio_format::B_GS_F:
rampDone = ::FillBuffer(fPausing,
rampDone = ::FillBuffer<float>(fPausing,
(float*)&buffer[out_offset],
(float*)&fBuffer[fPlayPosition], &bytes);
break;