Skip to content

Commit dae2a77

Browse files
authored
Merge pull request #1730 from marauder2k9-torque/SFXSystem-Refactor
Sfx system refactor
2 parents 3cf9d1f + 823054e commit dae2a77

66 files changed

Lines changed: 3673 additions & 7690 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

Engine/lib/CMakeLists.txt

Lines changed: 26 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -197,22 +197,44 @@ add_subdirectory(squish ${TORQUE_LIB_TARG_DIRECTORY}/squish EXCLUDE_FROM_ALL)
197197
add_subdirectory(collada ${TORQUE_LIB_TARG_DIRECTORY}/collada EXCLUDE_FROM_ALL)
198198
add_subdirectory(glad ${TORQUE_LIB_TARG_DIRECTORY}/glad EXCLUDE_FROM_ALL)
199199

200+
set(ALSOFT_REQUIRE_LINUX OFF)
201+
set(ALSOFT_REQUIRE_WINDOWS OFF)
202+
set(ALSOFT_REQUIRE_WINDOWS_NOT_UWP OFF)
203+
set(ALSOFT_REQUIRE_APPLE OFF)
204+
set(ALSOFT_CPUEXT_NEON OFF)
205+
206+
if(UNIX AND NOT APPLE)
207+
set(ALSOFT_REQUIRE_LINUX ON)
208+
endif()
209+
if(WIN32)
210+
set(ALSOFT_REQUIRE_WINDOWS ON)
211+
endif()
212+
if(APPLE)
213+
set(ALSOFT_REQUIRE_APPLE ON)
214+
endif()
215+
200216
#hidden options
201217
if(TORQUE_SFX_OPENAL)
202218
advanced_option(TORQUE_OGGVORBIS "Enable OGG Vorbis" ON)
203219
advanced_option(ALSOFT_EAX "Enable legacy EAX extensions" ${WIN32})
204220
advanced_option(ALSOFT_UPDATE_BUILD_VERSION "Update git build version info" ON)
205221
mark_as_advanced(ALSOFT_BACKEND_COREAUDIO)
206-
advanced_option(ALSOFT_BACKEND_DSOUND "Enable DirectSound backend" OFF)
222+
advanced_option(ALSOFT_BACKEND_ALSA "Enable ALSA Backend" ${ALSOFT_REQUIRE_LINUX})
223+
advanced_option(ALSOFT_REQUIRE_ALSA "Require ALSA Backend" ${ALSOFT_REQUIRE_LINUX})
224+
advanced_option(ALSOFT_BACKEND_DSOUND "Enable DirectSound backend" ${ALSOFT_REQUIRE_WINDOWS})
225+
advanced_option(ALSOFT_REQUIRE_DSOUND "Require DirectSound Backend" ${ALSOFT_REQUIRE_WINDOWS})
207226
advanced_option(ALSOFT_BACKEND_JACK "Enable Jack backend" OFF)
208227
advanced_option(ALSOFT_BACKEND_OBOE "Enable OBOE backend" OFF)
209228
advanced_option(ALSOFT_BACKEND_OPENSL "Enable OpenSL backend" OFF)
210229
advanced_option(ALSOFT_BACKEND_PIPEWIRE "Enable PipeWire backend" OFF)
211230
advanced_option(ALSOFT_BACKEND_PORTAUDIO "Enable PortAudio backend" OFF)
212231
advanced_option(ALSOFT_BACKEND_PULSEAUDIO "Enable PulseAudio backend" OFF)
213-
advanced_option(ALSOFT_BACKEND_SDL2 "Use SDL2 Backend" ON)
214-
advanced_option(ALSOFT_BACKEND_WASAPI "Enable WASAPI backend" OFF)
215-
advanced_option(ALSOFT_BACKEND_WAVE "Enable Wave backend" OFF)
232+
advanced_option(ALSOFT_BACKEND_SDL2 "Use SDL2 Backend" OFF)
233+
advanced_option(ALSOFT_BACKEND_COREAUDIO "Enable CoreAudio backend" ${ALSOFT_REQUIRE_APPLE})
234+
advanced_option(ALSOFT_REQUIRE_COREAUDIO "Require CoreAudio backend" ${ALSOFT_REQUIRE_APPLE})
235+
advanced_option(ALSOFT_BACKEND_WASAPI "Enable WASAPI backend" ${ALSOFT_REQUIRE_WINDOWS})
236+
advanced_option(ALSOFT_REQUIRE_WASAPI "Require WASAPI backend" ${ALSOFT_REQUIRE_WINDOWS})
237+
advanced_option(ALSOFT_BACKEND_WAVE "Enable Wave backend" ON)
216238
advanced_option(ALSOFT_BACKEND_WINMM "Enable WinMM backend" OFF)
217239
mark_as_advanced(ALSOFT_BUILD_ROUTER)
218240
mark_as_advanced(ALSOFT_CPUEXT_NEON)
@@ -232,8 +254,6 @@ if(TORQUE_SFX_OPENAL)
232254
advanced_option(ALSOFT_INSTALL_UTILS "Install utility programs (openal-info, alsoft-config, ...)" OFF)
233255
mark_as_advanced(ALSOFT_UPDATE_BUILD_VERSION)
234256
mark_as_advanced(ALSOFT_NO_CONFIG_UTIL)
235-
mark_as_advanced(ALSOFT_REQUIRE_COREAUDIO)
236-
mark_as_advanced(ALSOFT_REQUIRE_DSOUND)
237257
mark_as_advanced(ALSOFT_REQUIRE_JACK)
238258
mark_as_advanced(ALSOFT_REQUIRE_NEON)
239259
mark_as_advanced(ALSOFT_REQUIRE_OBOE)
@@ -246,7 +266,6 @@ if(TORQUE_SFX_OPENAL)
246266
mark_as_advanced(ALSOFT_REQUIRE_SSE2)
247267
mark_as_advanced(ALSOFT_REQUIRE_SSE3)
248268
mark_as_advanced(ALSOFT_REQUIRE_SSE4_1)
249-
mark_as_advanced(ALSOFT_REQUIRE_WASAPI)
250269
mark_as_advanced(ALSOFT_REQUIRE_WINMM)
251270
mark_as_advanced(ALSOFT_SEARCH_INSTALL_DATADIR)
252271
mark_as_advanced(ALSOFT_TESTS)

Engine/source/T3D/assets/SoundAsset.cpp

Lines changed: 351 additions & 201 deletions
Large diffs are not rendered by default.

Engine/source/T3D/assets/SoundAsset.h

Lines changed: 55 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -87,21 +87,12 @@ class SoundAsset : public AssetBase
8787
typedef AssetPtr<SoundAsset> ConcreteAssetPtr;
8888

8989
protected:
90-
StringTableEntry mSoundFile[SFXPlayList::SFXPlaylistSettings::NUM_SLOTS];
91-
StringTableEntry mSoundPath[SFXPlayList::SFXPlaylistSettings::NUM_SLOTS];
92-
SimObjectPtr<SFXProfile> mSFXProfile[SFXPlayList::SFXPlaylistSettings::NUM_SLOTS];
9390

94-
SFXDescription mProfileDesc;
95-
SFXPlayList mPlaylist;
96-
// subtitles
97-
StringTableEntry mSubtitleString;
98-
bool mPreload;
99-
bool mIsPlaylist;
10091
//SFXPlayList::SlotData mSlots;
10192

10293
/*These will be needed in the refactor!
10394
Resource<SFXResource> mSoundResource;
104-
95+
10596
10697
// SFXDesctriptions, some off these will be removed
10798
F32 mPitchAdjust;
@@ -121,9 +112,6 @@ class SoundAsset : public AssetBase
121112
F32 mPriority;
122113
*/
123114

124-
typedef Signal<void()> SoundAssetChanged;
125-
SoundAssetChanged mChangeSignal;
126-
127115
public:
128116
enum SoundAssetErrCode
129117
{
@@ -142,41 +130,79 @@ class SoundAsset : public AssetBase
142130
if (errCode > SoundAssetErrCode::Extended) return "undefined error";
143131
return mErrCodeStrings[errCode - Parent::Extended];
144132
};
133+
134+
private:
135+
StringTableEntry mSoundFile[SFXPlayList::SFXPlaylistSettings::NUM_SLOTS];
136+
Resource<SFXResource> mSoundResource[SFXPlayList::SFXPlaylistSettings::NUM_SLOTS];
137+
138+
SFXDescription mProfileDesc;
139+
140+
SFXPlayList mPlaylist;
141+
// subtitles
142+
StringTableEntry mSubtitleString;
143+
bool mPreload;
144+
bool mIsPlaylist;
145+
SFXTrack* mResolvedTrack;
146+
SFXDescription* mResolvedDescription;
147+
148+
public:
145149
SoundAsset();
146150
virtual ~SoundAsset();
147151

148152
/// Engine.
149153
static void initPersistFields();
154+
void onRemove() override;
155+
void inspectPostApply() override;
150156
void copyTo(SimObject* object) override;
151157

152158
//SFXResource* getSound() { return mSoundResource; }
153-
Resource<SFXResource> getSoundResource(const U32 slotId = 0) { load(); return mSFXProfile[slotId]->getResource(); }
159+
Resource<SFXResource> getSoundResource(const U32 slotId = 0) { load(); return mSoundResource[slotId]; }
154160

155161
/// Declare Console Object.
156162
DECLARE_CONOBJECT(SoundAsset);
157163

158-
static bool _setSoundFile(void* object, const char* index, const char* data);
164+
// asset Base load
159165
U32 load() override;
160-
inline StringTableEntry getSoundPath(const U32 slotId = 0) const { return mSoundPath[slotId]; };
161-
SFXProfile* getSfxProfile(const U32 slotId = 0) { return mSFXProfile[slotId]; }
162-
SFXPlayList* getSfxPlaylist() { return &mPlaylist; }
163-
SFXTrack* getSFXTrack() { load(); return mIsPlaylist ? dynamic_cast<SFXTrack*>(&mPlaylist) : dynamic_cast<SFXTrack*>(mSFXProfile[0].getPointer()); }
164-
SFXDescription* getSfxDescription() { return &mProfileDesc; }
165-
bool isPlaylist(){ return mIsPlaylist; }
166+
167+
void setSoundFile(StringTableEntry pSoundFile, U32 slot = 0);
168+
inline StringTableEntry getSoundFile(U32 slot = 0) { return mSoundFile[slot]; }
169+
inline StringTableEntry getRelativeSoundFile(U32 slot = 0) { return collapseAssetFilePath(mSoundFile[slot]); }
170+
171+
SFXTrack* getSFXTrack() { load(); return mResolvedTrack; }
172+
SFXDescription* getSfxDescription() { return mResolvedDescription ? mResolvedDescription : &mProfileDesc; }
173+
bool isPlaylist() { return mIsPlaylist; }
166174

167175
bool isLoop() { return mProfileDesc.mIsLooping; }
168176
bool is3D() { return mProfileDesc.mIs3D; }
169177

170178
static StringTableEntry getAssetIdByFileName(StringTableEntry fileName);
171179
static U32 getAssetById(StringTableEntry assetId, AssetPtr<SoundAsset>* materialAsset);
172-
static U32 getAssetByFileName(StringTableEntry fileName, AssetPtr<SoundAsset>* matAsset);
180+
static U32 getAssetByFilename(StringTableEntry fileName, AssetPtr<SoundAsset>* matAsset);
181+
182+
void buildDescription();
183+
SFXProfile* buildProfile();
184+
SFXPlayList* buildPlaylist();
185+
186+
void populateSFXTrack(void);
187+
188+
protected:
189+
// Asset Base callback
190+
void initializeAsset(void) override;
191+
void _onResourceChanged(const Torque::Path& path);
192+
void onAssetRefresh(void) override;
193+
194+
/// Taml callbacks.
195+
void onTamlPreWrite(void) override;
196+
void onTamlPostWrite(void) override;
197+
void onTamlCustomWrite(TamlCustomNodes& customNodes) override;
198+
void onTamlCustomRead(const TamlCustomNodes& customNodes) override;
173199

174200
protected:
175-
void initializeAsset(void) override;
176-
void _onResourceChanged(const Torque::Path & path);
177-
void onAssetRefresh(void) override;
201+
static bool _setSoundFile(void* obj, const char* index, const char* data) { U32 idx = 0; if (index) idx = dAtoi(index); static_cast<SoundAsset*>(obj)->setSoundFile(data, idx); return false; }
202+
178203
};
179204

205+
DECLARE_STRUCT(AssetPtr<SoundAsset>)
180206
DefineConsoleType(TypeSoundAssetPtr, SoundAsset)
181207
DefineConsoleType(TypeSoundAssetId, String)
182208

@@ -272,8 +298,8 @@ public: \
272298
\
273299
const StringTableEntry get##name() const\
274300
{\
275-
if (m##name##Asset && (m##name##Asset->getSoundPath() != StringTable->EmptyString()))\
276-
return m##name##Asset->getSoundPath();\
301+
if (m##name##Asset && (m##name##Asset->getSoundFile() != StringTable->EmptyString()))\
302+
return m##name##Asset->getSoundFile();\
277303
else if (m##name##AssetId != StringTable->EmptyString())\
278304
return m##name##AssetId;\
279305
else if (m##name##Name != StringTable->EmptyString())\
@@ -467,8 +493,8 @@ public: \
467493
\
468494
const StringTableEntry get##name(const U32& index) const\
469495
{\
470-
if (m##name##Asset[index] && (m##name##Asset[index]->getSoundPath() != StringTable->EmptyString()))\
471-
return m##name##Asset[index]->getSoundPath();\
496+
if (m##name##Asset[index] && (m##name##Asset[index]->getSoundFile() != StringTable->EmptyString()))\
497+
return m##name##Asset[index]->getSoundFile();\
472498
else if (m##name##AssetId[index] != StringTable->EmptyString())\
473499
return m##name##AssetId[index];\
474500
else if (m##name##Name[index] != StringTable->EmptyString())\

Engine/source/T3D/assets/assetImporter.cpp

Lines changed: 5 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -3309,30 +3309,19 @@ Torque::Path AssetImporter::importSoundAsset(AssetImportObject* assetItem)
33093309

33103310
StringTableEntry assetName = StringTable->insert(assetItem->assetName.c_str());
33113311

3312-
String soundFileName = assetItem->filePath.getFileName() + "." + assetItem->filePath.getExtension();
3313-
String assetPath = targetPath + "/" + soundFileName;
3312+
String soundFileName = assetItem->filePath.getFullFileName();
3313+
String assetPath = "@" + soundFileName;
33143314
String tamlPath = targetPath + "/" + assetName + ".asset.taml";
33153315
String originalPath = assetItem->filePath.getFullPath().c_str();
33163316

3317-
char qualifiedFromFile[2048];
3318-
char qualifiedToFile[2048];
3319-
3320-
#ifndef TORQUE_SECURE_VFS
3321-
Platform::makeFullPathName(originalPath.c_str(), qualifiedFromFile, sizeof(qualifiedFromFile));
3322-
Platform::makeFullPathName(assetPath.c_str(), qualifiedToFile, sizeof(qualifiedToFile));
3323-
#else
3324-
dStrcpy(qualifiedFromFile, originalPath.c_str(), sizeof(qualifiedFromFile));
3325-
dStrcpy(qualifiedToFile, assetPath.c_str(), sizeof(qualifiedToFile));
3326-
#endif
3327-
33283317
newAsset->setAssetName(assetName);
3329-
newAsset->_setSoundFile(newAsset, "0", soundFileName.c_str());
3318+
newAsset->setSoundFile(assetPath.c_str());
33303319

33313320
//If it's not a re-import, check that the file isn't being in-place imported. If it isn't, store off the original
33323321
//file path for reimporting support later
3333-
if (!isReimport && String::compare(qualifiedFromFile, qualifiedToFile) && Torque::FS::IsFile(qualifiedFromFile))
3322+
if (!isReimport)
33343323
{
3335-
newAsset->setDataField(StringTable->insert("originalFilePath"), NULL, qualifiedFromFile);
3324+
newAsset->setDataField(StringTable->insert("originalFilePath"), nullptr, originalPath.c_str());
33363325
}
33373326

33383327
Taml tamlWriter;
@@ -3345,18 +3334,6 @@ Torque::Path AssetImporter::importSoundAsset(AssetImportObject* assetItem)
33453334
return "";
33463335
}
33473336

3348-
if (!isReimport)
3349-
{
3350-
bool isInPlace = !String::compare(qualifiedFromFile, qualifiedToFile);
3351-
3352-
if (!isInPlace && !Torque::FS::CopyFile(qualifiedFromFile, qualifiedToFile, !isReimport))
3353-
{
3354-
dSprintf(importLogBuffer, sizeof(importLogBuffer), "Error! Unable to copy file %s", assetItem->filePath.getFullPath().c_str());
3355-
activityLog.push_back(importLogBuffer);
3356-
return "";
3357-
}
3358-
}
3359-
33603337
return tamlPath;
33613338
}
33623339

Engine/source/T3D/levelInfo.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -217,7 +217,7 @@ U32 LevelInfo::packUpdate(NetConnection *conn, U32 mask, BitStream *stream)
217217
mathWrite( *stream, mAmbientLightBlendCurve );
218218

219219
sfxWrite( stream, mSoundAmbience );
220-
stream->writeInt( mSoundDistanceModel, 1 );
220+
stream->writeInt( mSoundDistanceModel, 4 );
221221

222222
PACK_ASSET_REFACTOR(conn, AccuTexture);
223223

@@ -251,7 +251,7 @@ void LevelInfo::unpackUpdate(NetConnection *conn, BitStream *stream)
251251
String errorStr;
252252
if( !sfxReadAndResolve( stream, &mSoundAmbience, errorStr ) )
253253
Con::errorf( "%s", errorStr.c_str() );
254-
mSoundDistanceModel = ( SFXDistanceModel ) stream->readInt( 1 );
254+
mSoundDistanceModel = ( SFXDistanceModel ) stream->readInt( 4 );
255255

256256
if( isProperlyAdded() )
257257
{

Engine/source/T3D/sfx/sfxEmitter.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -820,7 +820,7 @@ void SFXEmitter::_update()
820820
// is toggled on a local profile sound. It makes the
821821
// editor feel responsive and that things are working.
822822
if( gEditingMission &&
823-
(SoundAsset::getAssetErrCode(mSoundAsset) || !mSoundAsset->getSfxProfile()) &&
823+
(SoundAsset::getAssetErrCode(mSoundAsset) || !mSoundAsset->getSFXTrack()) &&
824824
mPlayOnAdd &&
825825
mDirty.test( IsLooping ) )
826826
prevState = SFXStatusPlaying;

Engine/source/gui/core/guiCanvas.cpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -231,6 +231,12 @@ bool GuiCanvas::onAdd()
231231
{
232232
// ensure that we have a cursor
233233
setCursor(dynamic_cast<GuiCursor*>(Sim::findObject("DefaultCursor")));
234+
235+
SFXSystem::enumerateProviders();
236+
SFXProvider* p = SFXSystem::getBestProviderChoice();
237+
238+
if (p)
239+
SFX->createDevice(p);
234240

235241
// Enumerate things for GFX before we have an active device.
236242
GFXInit::enumerateAdapters();

Engine/source/sfx/dsound/dsFunctions.h

Lines changed: 0 additions & 27 deletions
This file was deleted.

0 commit comments

Comments
 (0)