SFX System fixes for loading sounds and buffers

This commit is contained in:
marauder2k7 2026-05-06 18:16:52 +01:00
parent 8407fa360c
commit 5c5894703c
3 changed files with 102 additions and 61 deletions

View file

@ -33,11 +33,11 @@ bool SFXSndStream::_readHeader()
dMemset(&sfinfo, 0, sizeof(SF_INFO));
vio.get_filelen = sndFileLen;
vio.seek = sndSeek;
vio.read = sndRead;
vio.write = sndWrite;
vio.tell = sndTell;
vio.get_filelen = sndFileLen;
vio.seek = sndSeek;
vio.read = sndRead;
vio.write = sndWrite;
vio.tell = sndTell;
vio_data.length = 0;
vio_data.offset = 0;
@ -85,6 +85,7 @@ void SFXSndStream::_close()
return;
sf_close(sndFile);
sndFile = NULL;
}
SFXSndStream* SFXSndStream::create(Stream* stream)
@ -99,18 +100,40 @@ SFXSndStream* SFXSndStream::create(Stream* stream)
void SFXSndStream::reset()
{
if (!sndFile)
return;
vio_data.offset = 0;
sf_seek(sndFile, 0, SEEK_SET);
}
U32 SFXSndStream::read(U8* buffer, U32 length)
{
if (!sndFile)
{
Con::errorf("SFXSndStream - read: Called on uninitialized stream.");
Con::errorf("SFXSndStream - read: Called on uninitialized or closed stream.");
return 0;
}
if (!buffer)
{
Con::errorf("SFXSndStream - read: NULL buffer passed.");
return 0;
}
const U32 bytesPerSample = mFormat.getBytesPerSample();
if (bytesPerSample == 0)
{
Con::errorf("SFXSndStream - read: bytesPerSample is zero, format not initialized?");
return 0;
}
U32 framesToRead = length / bytesPerSample;
if (framesToRead == 0)
{
Con::errorf("SFXSndStream - read: length %d too small for bytesPerSample %d", length, bytesPerSample);
return 0;
}
U32 framesToRead = length / mFormat.getBytesPerSample();
U32 framesRead = 0;
switch (sfinfo.format & SF_FORMAT_SUBMASK)
@ -136,13 +159,13 @@ U32 SFXSndStream::read(U8* buffer, U32 length)
Con::errorf("SFXSndStream - read: %s", sf_strerror(sndFile));
}
// (convert to frames) - number of frames available < MAX_BUFFER? reset
if (((getPosition() / mFormat.getBytesPerSample()) - sfinfo.frames) < MAX_BUFFER)
sf_count_t currentFrame = sf_seek(sndFile, 0, SEEK_CUR);
if (currentFrame >= sfinfo.frames - (sf_count_t)MAX_BUFFER)
{
// reset stream
setPosition(0);
sf_seek(sndFile, 0, SEEK_SET);
vio_data.offset = 0;
}
return framesRead * mFormat.getBytesPerSample();
}
@ -221,4 +244,3 @@ sf_count_t SFXSndStream::sndFileLen(void* user_data)
return vf->length;
}