Browse Source

Merge pull request #805 from Areloch/SoundFixRandD

Sound Networking Fixes
Brian Roberts 3 years ago
parent
commit
dc6eba0519

+ 7 - 1
Engine/source/T3D/assets/SoundAsset.cpp

@@ -228,6 +228,9 @@ bool SoundAsset::loadSound()
          mSFXProfile.setDescription(&mProfileDesc);
          mSFXProfile.setSoundFileName(mSoundPath);
          mSFXProfile.setPreload(mPreload);
+
+         //give it a nudge to preload if required
+         mSFXProfile.getBuffer();
       }
 
    }
@@ -341,7 +344,10 @@ DefineEngineMethod(SoundAsset, playSound, S32, (Point3F position), (Point3F::Zer
       MatrixF transform;
       transform.setPosition(position);
       SFXSource* source = SFX->playOnce(object->getSfxProfile(), &transform, NULL, -1);
-      return source->getId();
+      if(source)
+         return source->getId();
+      else
+         return 0;
    }
    else
       return 0;

+ 79 - 11
Engine/source/T3D/assets/SoundAsset.h

@@ -186,6 +186,7 @@ public:
    AssetPtr<SoundAsset> m##name##Asset = NULL;\
    SFXProfile* m##name##Profile = NULL;\
    SFXDescription* m##name##Desc = NULL;\
+   SimObjectId m##name##SFXId = NULL;\
 public: \
    const StringTableEntry get##name##File() const { return m##name##Name; }\
    void set##name##File(const FileName &_in) { m##name##Name = StringTable->insert(_in.c_str());}\
@@ -253,7 +254,7 @@ public: \
          Con::errorf("%s(%s)::_set%s() - sound asset failure\"%s\" due to [%s]", macroText(className), getName(), macroText(name), _in, SoundAsset::getAssetErrstrn(m##name##Asset->getStatus()).c_str());\
          return false; \
       }\
-      else if (!m##name)\
+      else if (!m##name && (m##name##Name != StringTable->EmptyString() && !Sim::findObject(m##name##Name)))\
       {\
          Con::errorf("%s(%s)::_set%s() - Couldn't load sound \"%s\"", macroText(className), getName(), macroText(name), _in);\
          return false;\
@@ -310,31 +311,57 @@ public: \
 #define PACKDATA_SOUNDASSET(name)\
    if (stream->writeFlag(m##name##Asset.notNull()))\
    {\
-      if (m##name##Profile)\
-         m##name##Profile->packData(stream);\
-      sfxWrite(stream, m##name##Desc);\
+      stream->writeString(m##name##Asset.getAssetId());\
    }\
    else\
-      stream->writeString(m##name##Name);
+   {\
+      if(stream->writeFlag(Sim::findObject(m##name##Name)))\
+      {\
+         SFXTrack* sndTrack;\
+         Sim::findObject(m##name##Name, sndTrack);\
+         stream->writeRangedU32(SimObjectId(sndTrack->getId()), DataBlockObjectIdFirst, DataBlockObjectIdLast);\
+      }\
+      else\
+      {\
+         stream->writeString(m##name##Name);\
+      }\
+   }
+
 
 //network recieve - datablock
 #define UNPACKDATA_SOUNDASSET(name)\
    if (stream->readFlag())\
    {\
-      if (m##name##Profile)\
-         m##name##Profile->unpackData(stream);\
-      sfxRead(stream, &m##name##Desc);\
+      m##name##AssetId = stream->readSTString();\
+      _set##name(m##name##AssetId);\
    }\
    else\
    {\
-      m##name##Name = stream->readSTString();\
-      _set##name(m##name##Name);\
+      if(stream->readFlag())\
+      {\
+         m##name##SFXId = stream->readRangedU32( DataBlockObjectIdFirst, DataBlockObjectIdLast );\
+      }\
+      else\
+      {\
+         m##name##Name = stream->readSTString(); \
+         _set##name(m##name##Name); \
+      }\
    }
 
 #pragma endregion
 
 #pragma region Arrayed Asset Macros
 
+#define INIT_SOUNDASSET_ARRAY(name, index) \
+{\
+   m##name##Name[index] = StringTable->EmptyString(); \
+   m##name##AssetId[index] = StringTable->EmptyString(); \
+   m##name##Asset[index] = NULL;\
+   m##name[index] = NULL;\
+   m##name##Profile[index] = NULL;\
+   m##name##SFXId[index] = 0;\
+}
+
 #define DECLARE_SOUNDASSET_ARRAY(className,name,max) public: \
    static const U32 sm##name##Count = max;\
    Resource<SFXResource> m##name[max];\
@@ -342,6 +369,7 @@ public: \
    StringTableEntry m##name##AssetId[max];\
    AssetPtr<SoundAsset> m##name##Asset[max];\
    SFXProfile* m##name##Profile[max];\
+   SimObjectId m##name##SFXId[max];\
 public: \
    const StringTableEntry get##name##File(const U32& index) const { return m##name##Name[index]; }\
    void set##name##File(const FileName &_in, const U32& index) { m##name##Name[index] = StringTable->insert(_in.c_str());}\
@@ -417,7 +445,7 @@ public: \
          Con::errorf("%s(%s)::_set%s(%i) - sound asset failure\"%s\" due to [%s]", macroText(className), getName(), macroText(name),index, _in, SoundAsset::getAssetErrstrn(m##name##Asset[index]->getStatus()).c_str());\
          return false; \
       }\
-      else if (!m##name[index])\
+      else if (!m##name[index] && (m##name##Name[index] != StringTable->EmptyString() && !Sim::findObject(m##name##Name[index])))\
       {\
          Con::errorf("%s(%s)::_set%s(%i) - Couldn't load sound \"%s\"", macroText(className), getName(), macroText(name),index, _in);\
          return false;\
@@ -489,6 +517,46 @@ if (m##name##AssetId[index] != StringTable->EmptyString())\
          addField(assetEnumNameConcat(enumString, Asset), TypeSoundAssetId, Offset(m##name##AssetId[0], consoleClass) + sizeof(m##name##AssetId[0])*i, assetText(name, asset reference.));\
       }\
    }
+
+#define PACKDATA_SOUNDASSET_ARRAY(name, index)\
+   if (stream->writeFlag(m##name##Asset[index].notNull()))\
+   {\
+      stream->writeString(m##name##Asset[index].getAssetId());\
+   }\
+   else\
+   {\
+      if(stream->writeFlag(Sim::findObject(m##name##Name[index])))\
+      {\
+         SFXTrack* sndTrack;\
+         Sim::findObject(m##name##Name[index], sndTrack);\
+         stream->writeRangedU32(SimObjectId(sndTrack->getId()), DataBlockObjectIdFirst, DataBlockObjectIdLast);\
+      }\
+      else\
+      {\
+         stream->writeString(m##name##Name[index]);\
+      }\
+   }
+      
+
+//network recieve - datablock
+#define UNPACKDATA_SOUNDASSET_ARRAY(name, index)\
+   if (stream->readFlag())\
+   {\
+      m##name##AssetId[index] = stream->readSTString();\
+      _set##name(m##name##AssetId[index], index);\
+   }\
+   else\
+   {\
+      if(stream->readFlag())\
+      {\
+         m##name##SFXId[index] = stream->readRangedU32( DataBlockObjectIdFirst, DataBlockObjectIdLast );\
+      }\
+      else\
+      {\
+         m##name##Name[index] = stream->readSTString(); \
+         _set##name(m##name##Name[index], index); \
+      }\
+   }
 #pragma endregion
 
 #endif // _ASSET_BASE_H_

+ 3 - 2
Engine/source/T3D/fx/explosion.cpp

@@ -652,7 +652,8 @@ void ExplosionData::packData(BitStream* stream)
 
    PACKDATA_ASSET(ExplosionShape);
 
-   PACKDATA_SOUNDASSET(Sound);
+   //PACKDATA_SOUNDASSET(Sound);
+   PACKDATA_ASSET(Sound);
 
    if (stream->writeFlag(particleEmitter))
       stream->writeRangedU32(particleEmitter->getId(),DataBlockObjectIdFirst,DataBlockObjectIdLast);
@@ -756,7 +757,7 @@ void ExplosionData::unpackData(BitStream* stream)
 
    UNPACKDATA_ASSET(ExplosionShape);
 
-   UNPACKDATA_SOUNDASSET(Sound);
+   UNPACKDATA_ASSET(Sound);
 
    if (stream->readFlag())
       particleEmitterId = stream->readRangedU32(DataBlockObjectIdFirst, DataBlockObjectIdLast);

+ 3 - 8
Engine/source/T3D/gameBase/gameConnection.cpp

@@ -1566,12 +1566,7 @@ void GameConnection::play2D(StringTableEntry assetId)
 {
    if (AssetDatabase.isDeclaredAsset(assetId))
    {
-
-      AssetPtr<SoundAsset> tempSoundAsset;
-      tempSoundAsset = assetId;
-
-      postNetEvent(new SimSoundAssetEvent(tempSoundAsset));
-
+      postNetEvent(new SimSoundAssetEvent(assetId));
    }
 }
 
@@ -1587,7 +1582,7 @@ void GameConnection::play3D(StringTableEntry assetId, const MatrixF *transform)
       tempSoundAsset = assetId;
 
       if (!mControlObject)
-         postNetEvent(new SimSoundAssetEvent(tempSoundAsset, transform));
+         postNetEvent(new SimSoundAssetEvent(assetId, *transform));
       else
       {
          // TODO: Maybe improve this to account for the duration
@@ -1601,7 +1596,7 @@ void GameConnection::play3D(StringTableEntry assetId, const MatrixF *transform)
          transform->getColumn(3, &pos);
          mControlObject->getTransform().getColumn(3, &ear);
          if ((ear - pos).len() < tempSoundAsset->getSfxDescription()->mMaxDistance)
-            postNetEvent(new SimSoundAssetEvent(tempSoundAsset, transform));
+            postNetEvent(new SimSoundAssetEvent(assetId, *transform));
       }
 
    }

+ 3 - 3
Engine/source/T3D/gameBase/gameConnectionEvents.cpp

@@ -297,13 +297,13 @@ void SimDataBlockEvent::process(NetConnection *cptr)
 static F32 SoundPosAccuracy = 0.5;
 static S32 SoundRotBits = 8;
 
-SimSoundAssetEvent::SimSoundAssetEvent(AssetPtr<SoundAsset> asset, const MatrixF* mat)
+SimSoundAssetEvent::SimSoundAssetEvent(StringTableEntry assetId, const MatrixF& mat)
 {
    // cant get here unless the asset is declared.
-   mAsset = asset;
+   mAsset = assetId;
 
    if (mat)
-      mTransform = *mat;
+      mTransform = mat;
 }
 
 void SimSoundAssetEvent::pack(NetConnection* con, BitStream* stream)

+ 1 - 1
Engine/source/T3D/gameBase/gameConnectionEvents.h

@@ -114,7 +114,7 @@ private:
 public:
    typedef NetEvent Parent;
    
-   SimSoundAssetEvent(AssetPtr<SoundAsset> asset = NULL, const MatrixF* mat = NULL);
+   SimSoundAssetEvent(StringTableEntry assetId = StringTable->EmptyString(), const MatrixF& mat = MatrixF::Identity);
    void pack(NetConnection*, BitStream* bstream);
    void write(NetConnection*, BitStream* bstream);
    void unpack(NetConnection*, BitStream* bstream);

+ 2 - 0
Engine/source/T3D/shapeBase.h

@@ -504,6 +504,8 @@ struct ShapeBaseImageData: public GameBaseData {
    
    void inspectPostApply();
 
+   void handleStateSoundTrack(const U32& stateId);
+
    /// @}
 
    /// @name Callbacks

+ 45 - 17
Engine/source/T3D/shapeImage.cpp

@@ -258,7 +258,7 @@ ShapeBaseImageData::ShapeBaseImageData()
       stateShapeSequence[i] = 0;
       stateScaleShapeSequence[i] = false;
 
-      INIT_ASSET_ARRAY(stateSound, i);
+      INIT_SOUNDASSET_ARRAY(stateSound, i);
       stateScript[i] = 0;
       stateEmitter[i] = 0;
       stateEmitterTime[i] = 0;
@@ -372,20 +372,8 @@ bool ShapeBaseImageData::onAdd()
          s.shapeSequenceScale = stateScaleShapeSequence[i];
 
          //_setstateSound(getstateSound(i),i);
-         s.sound = getstateSoundAsset(i);
-         if (s.sound == NULL && mstateSoundName[i] != StringTable->EmptyString())
-         {
-            //ok, so we've got some sort of special-case here like a fallback or SFXPlaylist. So do the hook-up now
-            SFXTrack* sndTrack;
-            if (!Sim::findObject(mstateSoundName[i], sndTrack))
-            {
-               Con::errorf("ShapeBaseImageData::onAdd() - attempted to find sound %s but failed!", mstateSoundName[i]);
-            }
-            else
-            {
-               s.soundTrack = sndTrack;
-            }
-         }
+         handleStateSoundTrack(i);
+
          s.script = stateScript[i];
          s.emitter = stateEmitter[i];
          s.emitterTime = stateEmitterTime[i];
@@ -591,6 +579,45 @@ bool ShapeBaseImageData::preload(bool server, String &errorStr)
    return true;
 }
 
+void ShapeBaseImageData::handleStateSoundTrack(const U32& stateId)
+{
+   if (stateId > MaxStates)
+      return;
+
+   StateData& s = state[stateId];
+
+   s.sound = getstateSoundAsset(stateId);
+
+   if (s.sound == NULL)
+   {
+      if (mstateSoundName[stateId] != StringTable->EmptyString())
+      {
+         //ok, so we've got some sort of special-case here like a fallback or SFXPlaylist. So do the hook-up now
+         SFXTrack* sndTrack;
+         if (!Sim::findObject(mstateSoundName[stateId], sndTrack))
+         {
+            Con::errorf("ShapeBaseImageData::onAdd() - attempted to find sound %s but failed!", mstateSoundName[stateId]);
+         }
+         else
+         {
+            s.soundTrack = sndTrack;
+         }
+      }
+      else if (mstateSoundSFXId[stateId] != 0)
+      {
+         SFXTrack* sndTrack;
+         if (!Sim::findObject(mstateSoundSFXId[stateId], sndTrack))
+         {
+            Con::errorf("ShapeBaseImageData::onAdd() - attempted to find sound %i but failed!", mstateSoundSFXId[stateId]);
+         }
+         else
+         {
+            s.soundTrack = sndTrack;
+         }
+      }
+   }
+}
+
 S32 ShapeBaseImageData::lookupState(const char* name)
 {
    if (!name || !name[0])
@@ -1160,7 +1187,7 @@ void ShapeBaseImageData::packData(BitStream* stream)
             }
          }
 
-         PACKDATA_ASSET_ARRAY(stateSound, i);
+         PACKDATA_SOUNDASSET_ARRAY(stateSound, i);
       }
    stream->write(maxConcurrentSounds);
    stream->writeFlag(useRemainderDT);
@@ -1365,7 +1392,8 @@ void ShapeBaseImageData::unpackData(BitStream* stream)
          else
             s.emitter = 0;
             
-         UNPACKDATA_ASSET_ARRAY(stateSound, i);
+         UNPACKDATA_SOUNDASSET_ARRAY(stateSound, i);
+         handleStateSoundTrack(i);
       }
    }