Sfx playlist asset working (#1109)

* GroundWork

-Reverted SFXPlaylist since it is going to be made from an asset now instead.
-Added extra options to soundAssets description.
-SFXPlaylist may need an onAdd function

* Update sfxController.cpp

* SFXPlaylist data

-Added sfxPlaylist init persist fields for the slots to sound asset
-Added logic to fil sfxPlaylist if more than 1 slot is filled

* Update SoundAsset.cpp

to stop git ci complaining, assetImporter........

* Update SoundAsset.h

* sfxPlaylist

-Fix: incomplete type error
-Added onAdd and onRemove to playlist
-SoundAsset getProfile define now returns playlist if the asset is a playlist.

* Update SoundAsset.h

-updated asset array to return playlist or profile depending on what the asset is

* SFXPlaylist working

-SFXPlaylist works
AudioChannelDefault gets its volume set to 0 for some reason and was throwing off making sfxPlaylist inaudible.

Still an exception when closing if using a playlist trips on line 355 of sfxSound

* Update sfxSound.h

* setSoundFile index null fix

* Update SoundAsset.h

* Update SoundAsset.h

* netstream safety in case of a null asset assignment

* Update sfxController.cpp

added safeties around a null playlist trying to play.

* Update with Az's asset err code changes

---------

Co-authored-by: AzaezelX <quillus@hotmail.com>
This commit is contained in:
marauder2k7 2023-10-21 23:19:02 +01:00 committed by GitHub
parent 845defb25d
commit 852ed8f225
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
14 changed files with 550 additions and 245 deletions

View file

@ -23,6 +23,7 @@
#include "sfx/sfxPlayList.h"
#include "sfx/sfxState.h"
#include "sfx/sfxTypes.h"
#include "sfx/sfxDescription.h"
#include "core/stream/bitStream.h"
#include "math/mRandom.h"
#include "math/mathTypes.h"
@ -218,10 +219,23 @@ SFXPlayList::SFXPlayList()
: mRandomMode( RANDOM_NotRandom ),
mLoopMode( LOOP_All ),
mTrace( false ),
mNumSlotsToPlay( NUM_SLOTS )
mNumSlotsToPlay( NUM_SLOTS ),
mActiveSlots(12)
{
for (U32 i=0;i<NUM_SLOTS;i++)
INIT_SOUNDASSET_ARRAY(Track, i);
}
SFXPlayList::~SFXPlayList()
{
if (!isTempClone())
return;
// cleanup after a temp-clone
if (mDescription && mDescription->isTempClone())
{
delete mDescription;
mDescription = 0;
}
}
//-----------------------------------------------------------------------------
@ -250,10 +264,10 @@ void SFXPlayList::initPersistFields()
addArray( "slots", NUM_SLOTS );
INITPERSISTFIELD_SOUNDASSET_ARRAY( Track, NUM_SLOTS, SFXPlayList,
addField("track", TypeSFXTrackName, Offset(mSlots.mTrack, SFXPlayList), NUM_SLOTS,
"Track to play in this slot.\n"
"This must be set for the slot to be considered for playback. Other settings for a slot "
"will not take effect except this field is set." );
"will not take effect except this field is set.");
addField( "replay", TYPEID< EReplayMode >(), Offset( mSlots.mReplayMode, SFXPlayList ), NUM_SLOTS,
"Behavior when an already playing sound is encountered on this slot from a previous cycle.\n"
"Each slot can have an arbitrary number of sounds playing on it from previous cycles. This field determines "
@ -340,32 +354,64 @@ void SFXPlayList::initPersistFields()
//-----------------------------------------------------------------------------
U32 SFXPlayList::getNumSlots()
{
U32 trackCount = 0;
for (U32 i = 0; i < NUM_SLOTS; i++)
{
if (mSlots.mTrack[i] == NULL)
{
return i;
}
trackCount++;
}
return trackCount;
}
bool SFXPlayList::isLooping() const
{
// pretty useless in playlist, looping handled differently.
return false;
}
bool SFXPlayList::onAdd()
{
if (!Parent::onAdd())
return false;
mActiveSlots = getNumSlots();
validate();
return true;
}
void SFXPlayList::onRemove()
{
Parent::onRemove();
}
bool SFXPlayList::preload( bool server, String& errorStr )
{
if( !Parent::preload( server, errorStr ) )
return false;
mActiveSlots = getNumSlots();
validate();
// Resolve SFXTracks and SFXStates on client.
if( !server )
{
for( U32 i = 0; i < NUM_SLOTS; ++ i )
for( U32 i = 0; i < mActiveSlots; ++ i )
{
StringTableEntry track = getTrack(i);
if (track != StringTable->EmptyString())
{
_setTrack(getTrack(i), i);
if (!getTrackProfile(i))
{
Con::errorf("SFXPlayList::Preload() - unable to find sfxProfile for asset %s", mTrackAssetId[i]);
if (!sfxResolve(&mSlots.mTrack[i], errorStr))
return false;
}
if (!sfxResolve(&mSlots.mState[i], errorStr))
if (!sfxResolve(&mSlots.mState[i], errorStr))
return false;
}
}
}
@ -382,55 +428,57 @@ void SFXPlayList::packData( BitStream* stream )
stream->writeInt( mLoopMode, NUM_LOOP_MODE_BITS );
stream->writeInt( mNumSlotsToPlay, NUM_SLOTS_TO_PLAY_BITS );
#define FOR_EACH_SLOT \
for( U32 i = 0; i < NUM_SLOTS; ++ i )
FOR_EACH_SLOT stream->writeInt( mSlots.mReplayMode[ i ], NUM_REPLAY_MODE_BITS );
FOR_EACH_SLOT stream->writeInt( mSlots.mTransitionIn[ i ], NUM_TRANSITION_MODE_BITS );
FOR_EACH_SLOT stream->writeInt( mSlots.mTransitionOut[ i ], NUM_TRANSITION_MODE_BITS );
FOR_EACH_SLOT stream->writeInt( mSlots.mStateMode[ i ], NUM_STATE_MODE_BITS );
FOR_EACH_SLOT if (stream->writeFlag(mSlots.mFadeTimeIn.mValue[ i ] != -1 ))
stream->write( mSlots.mFadeTimeIn.mValue[ i ] );
FOR_EACH_SLOT if (stream->writeFlag( mSlots.mFadeTimeIn.mVariance[ i ][ 0 ] > 0))
stream->write(mSlots.mFadeTimeIn.mVariance[ i ][ 0 ] );
FOR_EACH_SLOT if (stream->writeFlag( mSlots.mFadeTimeIn.mVariance[ i ][ 1 ] > 0))
stream->write(mSlots.mFadeTimeIn.mVariance[ i ][ 1 ] );
FOR_EACH_SLOT if (stream->writeFlag(mSlots.mFadeTimeOut.mValue[ i ] != -1 ))
stream->write( mSlots.mFadeTimeOut.mValue[ i ] );
FOR_EACH_SLOT if (stream->writeFlag(mSlots.mFadeTimeOut.mVariance[i][0] > 0))
stream->write(mSlots.mFadeTimeOut.mVariance[i][0]);
FOR_EACH_SLOT if (stream->writeFlag(mSlots.mFadeTimeOut.mVariance[i][1] > 0))
stream->write(mSlots.mFadeTimeOut.mVariance[i][1]);
FOR_EACH_SLOT if (stream->writeFlag(mSlots.mDelayTimeIn.mValue[ i ] > 0))
stream->write(mSlots.mDelayTimeIn.mValue[ i ] );
FOR_EACH_SLOT if (stream->writeFlag(mSlots.mDelayTimeIn.mVariance[ i ][ 0 ] > 0))
stream->write(mSlots.mDelayTimeIn.mVariance[ i ][ 0 ] );
FOR_EACH_SLOT if (stream->writeFlag(mSlots.mDelayTimeIn.mVariance[ i ][ 1 ] > 0))
stream->write(mSlots.mDelayTimeIn.mVariance[ i ][ 1 ] );
FOR_EACH_SLOT if (stream->writeFlag(mSlots.mDelayTimeOut.mValue[ i ] > 0))
stream->write(mSlots.mDelayTimeOut.mValue[ i ] );
FOR_EACH_SLOT if (stream->writeFlag(mSlots.mDelayTimeOut.mVariance[ i ][ 0 ] > 0))
stream->write(mSlots.mDelayTimeOut.mVariance[ i ][ 0 ] );
FOR_EACH_SLOT if (stream->writeFlag(mSlots.mDelayTimeOut.mVariance[ i ][ 1 ] > 0))
stream->write(mSlots.mDelayTimeOut.mVariance[ i ][ 1 ] );
FOR_EACH_SLOT if (stream->writeFlag(mSlots.mVolumeScale.mValue[ i ] != 1))
stream->write(mSlots.mVolumeScale.mValue[ i ] );
FOR_EACH_SLOT if (stream->writeFlag(mSlots.mVolumeScale.mVariance[ i ][ 0 ] > 0))
stream->write(mSlots.mVolumeScale.mVariance[ i ][ 0 ] );
FOR_EACH_SLOT if (stream->writeFlag(mSlots.mVolumeScale.mVariance[ i ][ 1 ] > 0))
stream->write(mSlots.mVolumeScale.mVariance[ i ][ 1 ] );
FOR_EACH_SLOT if (stream->writeFlag(mSlots.mPitchScale.mValue[ i ] != 1))
stream->write(mSlots.mPitchScale.mValue[ i ] );
FOR_EACH_SLOT if (stream->writeFlag(mSlots.mPitchScale.mVariance[ i ][ 0 ] > 0))
stream->write(mSlots.mPitchScale.mVariance[ i ][ 0 ] );
FOR_EACH_SLOT if (stream->writeFlag(mSlots.mPitchScale.mVariance[ i ][ 1 ] > 0))
stream->write(mSlots.mPitchScale.mVariance[ i ][ 1 ] );
FOR_EACH_SLOT if (stream->writeFlag( mSlots.mRepeatCount[ i ] > 0))
stream->write( mSlots.mRepeatCount[ i ] );
FOR_EACH_SLOT sfxWrite( stream, mSlots.mState[ i ] );
FOR_EACH_SLOT PACKDATA_SOUNDASSET_ARRAY(Track, i);
stream->writeInt(mActiveSlots, 8);
for (U32 i = 0; i < mActiveSlots; ++i)
{
stream->writeInt(mSlots.mReplayMode[i], NUM_REPLAY_MODE_BITS);
stream->writeInt(mSlots.mTransitionIn[i], NUM_TRANSITION_MODE_BITS);
stream->writeInt(mSlots.mTransitionOut[i], NUM_TRANSITION_MODE_BITS);
stream->writeInt(mSlots.mStateMode[i], NUM_STATE_MODE_BITS);
if (stream->writeFlag(mSlots.mFadeTimeIn.mValue[i] != -1))
stream->write(mSlots.mFadeTimeIn.mValue[i]);
if (stream->writeFlag(mSlots.mFadeTimeIn.mVariance[i][0] > 0))
stream->write(mSlots.mFadeTimeIn.mVariance[i][0]);
if (stream->writeFlag(mSlots.mFadeTimeIn.mVariance[i][1] > 0))
stream->write(mSlots.mFadeTimeIn.mVariance[i][1]);
if (stream->writeFlag(mSlots.mFadeTimeOut.mValue[i] != -1))
stream->write(mSlots.mFadeTimeOut.mValue[i]);
if (stream->writeFlag(mSlots.mFadeTimeOut.mVariance[i][0] > 0))
stream->write(mSlots.mFadeTimeOut.mVariance[i][0]);
if (stream->writeFlag(mSlots.mFadeTimeOut.mVariance[i][1] > 0))
stream->write(mSlots.mFadeTimeOut.mVariance[i][1]);
if (stream->writeFlag(mSlots.mDelayTimeIn.mValue[i] > 0))
stream->write(mSlots.mDelayTimeIn.mValue[i]);
if (stream->writeFlag(mSlots.mDelayTimeIn.mVariance[i][0] > 0))
stream->write(mSlots.mDelayTimeIn.mVariance[i][0]);
if (stream->writeFlag(mSlots.mDelayTimeIn.mVariance[i][1] > 0))
stream->write(mSlots.mDelayTimeIn.mVariance[i][1]);
if (stream->writeFlag(mSlots.mDelayTimeOut.mValue[i] > 0))
stream->write(mSlots.mDelayTimeOut.mValue[i]);
if (stream->writeFlag(mSlots.mDelayTimeOut.mVariance[i][0] > 0))
stream->write(mSlots.mDelayTimeOut.mVariance[i][0]);
if (stream->writeFlag(mSlots.mDelayTimeOut.mVariance[i][1] > 0))
stream->write(mSlots.mDelayTimeOut.mVariance[i][1]);
if (stream->writeFlag(mSlots.mVolumeScale.mValue[i] != 1))
stream->write(mSlots.mVolumeScale.mValue[i]);
if (stream->writeFlag(mSlots.mVolumeScale.mVariance[i][0] > 0))
stream->write(mSlots.mVolumeScale.mVariance[i][0]);
if (stream->writeFlag(mSlots.mVolumeScale.mVariance[i][1] > 0))
stream->write(mSlots.mVolumeScale.mVariance[i][1]);
if (stream->writeFlag(mSlots.mPitchScale.mValue[i] != 1))
stream->write(mSlots.mPitchScale.mValue[i]);
if (stream->writeFlag(mSlots.mPitchScale.mVariance[i][0] > 0))
stream->write(mSlots.mPitchScale.mVariance[i][0]);
if (stream->writeFlag(mSlots.mPitchScale.mVariance[i][1] > 0))
stream->write(mSlots.mPitchScale.mVariance[i][1]);
if (stream->writeFlag(mSlots.mRepeatCount[i] > 0))
stream->write(mSlots.mRepeatCount[i]);
sfxWrite(stream, mSlots.mState[i]);
sfxWrite(stream, mSlots.mTrack[i]);
}
}
//-----------------------------------------------------------------------------
@ -442,36 +490,39 @@ void SFXPlayList::unpackData( BitStream* stream )
mRandomMode = ( ERandomMode ) stream->readInt( NUM_RANDOM_MODE_BITS );
mLoopMode = ( ELoopMode ) stream->readInt( NUM_LOOP_MODE_BITS );
mNumSlotsToPlay = stream->readInt( NUM_SLOTS_TO_PLAY_BITS );
FOR_EACH_SLOT mSlots.mReplayMode[ i ] = ( EReplayMode ) stream->readInt( NUM_REPLAY_MODE_BITS );
FOR_EACH_SLOT mSlots.mTransitionIn[ i ] = ( ETransitionMode ) stream->readInt( NUM_TRANSITION_MODE_BITS );
FOR_EACH_SLOT mSlots.mTransitionOut[ i ] = ( ETransitionMode ) stream->readInt( NUM_TRANSITION_MODE_BITS );
FOR_EACH_SLOT mSlots.mStateMode[ i ] = ( EStateMode ) stream->readInt( NUM_STATE_MODE_BITS );
FOR_EACH_SLOT if(stream->readFlag()){ stream->read( &mSlots.mFadeTimeIn.mValue[ i ] );}
FOR_EACH_SLOT if(stream->readFlag()){ stream->read( &mSlots.mFadeTimeIn.mVariance[ i ][ 0 ] );}
FOR_EACH_SLOT if(stream->readFlag()){ stream->read( &mSlots.mFadeTimeIn.mVariance[ i ][ 1 ] );}
FOR_EACH_SLOT if(stream->readFlag()){ stream->read( &mSlots.mFadeTimeOut.mValue[ i ] );}
FOR_EACH_SLOT if(stream->readFlag()){ stream->read( &mSlots.mFadeTimeOut.mVariance[ i ][ 0 ] );}
FOR_EACH_SLOT if(stream->readFlag()){ stream->read( &mSlots.mFadeTimeOut.mVariance[ i ][ 1 ] );}
FOR_EACH_SLOT if(stream->readFlag()){ stream->read( &mSlots.mDelayTimeIn.mValue[ i ] );}
FOR_EACH_SLOT if(stream->readFlag()){ stream->read( &mSlots.mDelayTimeIn.mVariance[ i ][ 0 ] );}
FOR_EACH_SLOT if(stream->readFlag()){ stream->read( &mSlots.mDelayTimeIn.mVariance[ i ][ 1 ] );}
FOR_EACH_SLOT if(stream->readFlag()){ stream->read( &mSlots.mDelayTimeOut.mValue[ i ] );}
FOR_EACH_SLOT if(stream->readFlag()){ stream->read( &mSlots.mDelayTimeOut.mVariance[ i ][ 0 ] );}
FOR_EACH_SLOT if(stream->readFlag()){ stream->read( &mSlots.mDelayTimeOut.mVariance[ i ][ 1 ] );}
FOR_EACH_SLOT if(stream->readFlag()){ stream->read( &mSlots.mVolumeScale.mValue[ i ] );}
FOR_EACH_SLOT if(stream->readFlag()){ stream->read( &mSlots.mVolumeScale.mVariance[ i ][ 0 ] );}
FOR_EACH_SLOT if(stream->readFlag()){ stream->read( &mSlots.mVolumeScale.mVariance[ i ][ 1 ] );}
FOR_EACH_SLOT if(stream->readFlag()){ stream->read( &mSlots.mPitchScale.mValue[ i ] );}
FOR_EACH_SLOT if(stream->readFlag()){ stream->read( &mSlots.mPitchScale.mVariance[ i ][ 0 ] );}
FOR_EACH_SLOT if(stream->readFlag()){ stream->read( &mSlots.mPitchScale.mVariance[ i ][ 1 ] );}
FOR_EACH_SLOT if(stream->readFlag()){ stream->read( &mSlots.mRepeatCount[ i ] );}
FOR_EACH_SLOT sfxRead( stream, &mSlots.mState[ i ] );
FOR_EACH_SLOT UNPACKDATA_SOUNDASSET_ARRAY(Track, i);
#undef FOR_EACH_SLOT
mActiveSlots = stream->readInt(8);
for (U32 i = 0; i < mActiveSlots; ++i)
{
mSlots.mReplayMode[i] = (EReplayMode)stream->readInt(NUM_REPLAY_MODE_BITS);
mSlots.mTransitionIn[i] = (ETransitionMode)stream->readInt(NUM_TRANSITION_MODE_BITS);
mSlots.mTransitionOut[i] = (ETransitionMode)stream->readInt(NUM_TRANSITION_MODE_BITS);
mSlots.mStateMode[i] = (EStateMode)stream->readInt(NUM_STATE_MODE_BITS);
if (stream->readFlag()) { stream->read(&mSlots.mFadeTimeIn.mValue[i]); }
if (stream->readFlag()) { stream->read(&mSlots.mFadeTimeIn.mVariance[i][0]); }
if (stream->readFlag()) { stream->read(&mSlots.mFadeTimeIn.mVariance[i][1]); }
if (stream->readFlag()) { stream->read(&mSlots.mFadeTimeOut.mValue[i]); }
if (stream->readFlag()) { stream->read(&mSlots.mFadeTimeOut.mVariance[i][0]); }
if (stream->readFlag()) { stream->read(&mSlots.mFadeTimeOut.mVariance[i][1]); }
if (stream->readFlag()) { stream->read(&mSlots.mDelayTimeIn.mValue[i]); }
if (stream->readFlag()) { stream->read(&mSlots.mDelayTimeIn.mVariance[i][0]); }
if (stream->readFlag()) { stream->read(&mSlots.mDelayTimeIn.mVariance[i][1]); }
if (stream->readFlag()) { stream->read(&mSlots.mDelayTimeOut.mValue[i]); }
if (stream->readFlag()) { stream->read(&mSlots.mDelayTimeOut.mVariance[i][0]); }
if (stream->readFlag()) { stream->read(&mSlots.mDelayTimeOut.mVariance[i][1]); }
if (stream->readFlag()) { stream->read(&mSlots.mVolumeScale.mValue[i]); }
if (stream->readFlag()) { stream->read(&mSlots.mVolumeScale.mVariance[i][0]); }
if (stream->readFlag()) { stream->read(&mSlots.mVolumeScale.mVariance[i][1]); }
if (stream->readFlag()) { stream->read(&mSlots.mPitchScale.mValue[i]); }
if (stream->readFlag()) { stream->read(&mSlots.mPitchScale.mVariance[i][0]); }
if (stream->readFlag()) { stream->read(&mSlots.mPitchScale.mVariance[i][1]); }
if (stream->readFlag()) { stream->read(&mSlots.mRepeatCount[i]); }
sfxRead(stream, &mSlots.mState[i]);
sfxRead(stream, &mSlots.mTrack[i]);
}
}
//-----------------------------------------------------------------------------
@ -486,8 +537,8 @@ void SFXPlayList::inspectPostApply()
void SFXPlayList::validate()
{
if( mNumSlotsToPlay > NUM_SLOTS )
mNumSlotsToPlay = NUM_SLOTS;
if( mNumSlotsToPlay > mActiveSlots )
mNumSlotsToPlay = mActiveSlots;
mSlots.mFadeTimeIn.validate();
mSlots.mFadeTimeOut.validate();