Few changes to fix the preload failures

Adds extra error output for erroneous buffer preload
SndStream now correctly sets sndfile to null when it closes, Also extra error reporting around the read function
SFXResource now returns a new threadsaferef each time we openstream. This should only be called on a fresh instance.
This commit is contained in:
marauder2k7 2026-04-06 10:46:04 +01:00
parent d4c0c6fd3d
commit b625250af0
3 changed files with 100 additions and 53 deletions

View file

@ -275,21 +275,37 @@ void SFXProfile::_onResourceChanged( const Torque::Path& path )
bool SFXProfile::_preloadBuffer()
{
AssertFatal( !mDescription->mIsStreaming, "SFXProfile::_preloadBuffer() - must not be called for streaming profiles" );
AssertFatal(!mDescription->mIsStreaming, "SFXProfile::_preloadBuffer() - must not be called for streaming profiles");
if (mFilename == StringTable->EmptyString())
{
Con::errorf("SFXProfile::_preloadBuffer(%s) - no filename set", getName());
return false;
}
Con::printf("SFXProfile::_preloadBuffer(%s) - attempting to preload '%s'", getName(), mFilename);
mBuffer = _createBuffer();
return ( !mBuffer.isNull() );
if (mBuffer.isNull())
{
Con::errorf("SFXProfile::_preloadBuffer(%s) - _createBuffer() returned null for '%s'", getName(), mFilename);
return false;
}
return true;
}
//-----------------------------------------------------------------------------
Resource<SFXResource>& SFXProfile::getResource()
{
if (!mResource && SFXResource::exists(mFilename))
mResource = SFXResource::load(mFilename);
else
mResource = NULL;
if (!mResource)
{
if (SFXResource::exists(mFilename))
mResource = SFXResource::load(mFilename);
else
Con::errorf("SFXProfile::getResource(%s) - file does not exist: '%s'", getName(), mFilename);
}
return mResource;
}
@ -317,47 +333,51 @@ SFXBuffer* SFXProfile::getBuffer()
SFXBuffer* SFXProfile::_createBuffer()
{
SFXBuffer* buffer = 0;
// Try to create through SFXDevie.
if( mFilename != StringTable->EmptyString() && SFX )
{
buffer = SFX->_createBuffer( mFilename, mDescription );
if( buffer )
{
#ifdef TORQUE_DEBUG
const SFXFormat& format = buffer->getFormat();
Con::printf( "%s SFX: %s (%i channels, %i kHz, %.02f sec, %i kb)",
mDescription->mIsStreaming ? "Streaming" : "Loaded", mFilename,
format.getChannels(),
format.getSamplesPerSecond() / 1000,
F32( buffer->getDuration() ) / 1000.0f,
format.getDataLength( buffer->getDuration() ) / 1024 );
#endif
}
}
// If that failed, load through SFXResource.
if( !buffer )
{
Resource< SFXResource >& resource = getResource();
if( resource != NULL && SFX )
{
#ifdef TORQUE_DEBUG
const SFXFormat& format = resource->getFormat();
Con::printf( "%s SFX: %s (%i channels, %i kHz, %.02f sec, %i kb)",
mDescription->mIsStreaming ? "Streaming" : "Loading", resource->getFileName().c_str(),
format.getChannels(),
format.getSamplesPerSecond(),
F32( resource->getDuration() ) / 1000.0f,
format.getDataLength( resource->getDuration() ) / 1024 );
#endif
SFXBuffer* buffer = NULL;
ThreadSafeRef< SFXStream > sfxStream = resource->openStream();
buffer = SFX->_createBuffer( sfxStream, mDescription );
if (mFilename == StringTable->EmptyString())
{
Con::errorf("SFXProfile::_createBuffer(%s) - mFilename is empty!", getName());
return NULL;
}
if (!SFX)
{
Con::errorf("SFXProfile::_createBuffer(%s) - No SFX system available!", getName());
return NULL;
}
// Try to create through SFXDevice. For now this always fails and i think was just here for historical reasons. Function just returns null.
/*buffer = SFX->_createBuffer(mFilename, mDescription);
if (!buffer)
Con::warnf("SFXProfile::_createBuffer(%s) - Device _createBuffer from filename failed, falling back to SFXResource.", getName());*/
// If that failed, load through SFXResource.
if (!buffer)
{
if (!SFXResource::exists(mFilename))
{
Con::errorf("SFXProfile::_createBuffer(%s) - SFXResource::exists() returned false for '%s'", getName(), mFilename);
return NULL;
}
Resource< SFXResource >& resource = getResource();
if (resource == NULL)
{
Con::errorf("SFXProfile::_createBuffer(%s) - getResource() returned NULL for '%s'", getName(), mFilename);
return NULL;
}
ThreadSafeRef< SFXStream > sfxStream = resource->openStream();
if (!sfxStream)
{
Con::errorf("SFXProfile::_createBuffer(%s) - openStream() returned NULL for '%s'", getName(), mFilename);
return NULL;
}
buffer = SFX->_createBuffer(sfxStream, mDescription);
if (!buffer)
Con::errorf("SFXProfile::_createBuffer(%s) - Device _createBuffer from stream also failed for '%s'", getName(), mFilename);
}
return buffer;