sfxFMODEventGroup.cpp
Engine/source/sfx/fmod/sfxFMODEventGroup.cpp
Public Functions
ConsoleDocClass(SFXFMODEventGroup , "@brief A group of events in an imported FMOD Designer <a href="/coding/file/cmdscan_8cpp/#cmdscan_8cpp_1aeab71244afb687f16d8c4f5ee9d6ef0e">project.\n\n</a>" "" "@note Instances of this class \<a href="/coding/file/cmdscan_8cpp/#cmdscan_8cpp_1aeab71244afb687f16d8c4f5ee9d6ef0e">n\n</a>" "@ingroup <a href="/coding/file/cmdscan_8cpp/#cmdscan_8cpp_1aeab71244afb687f16d8c4f5ee9d6ef0e">SFXFMOD\n</a>" "@ingroup Datablocks" )
DefineEngineMethod(SFXFMODEventGroup , freeData , void , () , "Release the resource data <a href="/coding/file/cmdscan_8cpp/#cmdscan_8cpp_1a2732ab74fa0237854c2ba0f75f88a624">for</a> this group and its <a href="/coding/file/cmdscan_8cpp/#cmdscan_8cpp_1aeab71244afb687f16d8c4f5ee9d6ef0e">subgroups.\n\n</a>" "@see SFXFMODProject_resources" )
DefineEngineMethod(SFXFMODEventGroup , isDataLoaded , bool , () , "Test whether the resource data <a href="/coding/file/cmdscan_8cpp/#cmdscan_8cpp_1a2732ab74fa0237854c2ba0f75f88a624">for</a> this group has been <a href="/coding/file/cmdscan_8cpp/#cmdscan_8cpp_1aeab71244afb687f16d8c4f5ee9d6ef0e">loaded.\n\n</a>" "@return True <a href="/coding/file/tsmeshintrinsics_8cpp/#tsmeshintrinsics_8cpp_1a4e4fa7e3399708e0777b5308db01278c">if</a> the resource data <a href="/coding/file/cmdscan_8cpp/#cmdscan_8cpp_1a2732ab74fa0237854c2ba0f75f88a624">for</a> this group is currently <a href="/coding/file/cmdscan_8cpp/#cmdscan_8cpp_1aeab71244afb687f16d8c4f5ee9d6ef0e">loaded.\n</a>" )
DefineEngineMethod(SFXFMODEventGroup , loadData , bool , (bool loadStreams, bool loadSamples) , (true, true) , "Load the resource data <a href="/coding/file/cmdscan_8cpp/#cmdscan_8cpp_1a2732ab74fa0237854c2ba0f75f88a624">for</a> this group, <a href="/coding/file/tsmeshintrinsics_8cpp/#tsmeshintrinsics_8cpp_1a4e4fa7e3399708e0777b5308db01278c">if</a> it has not already been loaded(either directly " "or indirectly through <a href="/coding/file/pointer_8h/#pointer_8h_1aeeddce917cf130d62c370b8f216026dd">a</a> parent group).\<a href="/coding/file/cmdscan_8cpp/#cmdscan_8cpp_1aeab71244afb687f16d8c4f5ee9d6ef0e">n</a>" "This method works recursively and thus data <a href="/coding/file/cmdscan_8cpp/#cmdscan_8cpp_1a2732ab74fa0237854c2ba0f75f88a624">for</a> direct and indirect child groups <a href="/coding/file/cmdgram_8cpp/#cmdgram_8cpp_1a5bafda9519252aa2d0fd038153f77dca">to</a> this group will be " "loaded as <a href="/coding/file/cmdscan_8cpp/#cmdscan_8cpp_1aeab71244afb687f16d8c4f5ee9d6ef0e">well.\n\n</a>" " @param loadStreams Whether <a href="/coding/file/cmdgram_8cpp/#cmdgram_8cpp_1a5bafda9519252aa2d0fd038153f77dca">to</a> open <a href="/coding/file/cmdscan_8cpp/#cmdscan_8cpp_1aeab71244afb687f16d8c4f5ee9d6ef0e">streams.\n</a>" " @param loadSamples Whether <a href="/coding/file/cmdgram_8cpp/#cmdgram_8cpp_1a5bafda9519252aa2d0fd038153f77dca">to</a> load sample <a href="/coding/file/cmdscan_8cpp/#cmdscan_8cpp_1aeab71244afb687f16d8c4f5ee9d6ef0e">banks.\n</a>" " @return True <a href="/coding/file/tsmeshintrinsics_8cpp/#tsmeshintrinsics_8cpp_1a4e4fa7e3399708e0777b5308db01278c">if</a> the data has been successfully loaded;false <a href="/coding/file/cmdscan_8cpp/#cmdscan_8cpp_1aeab71244afb687f16d8c4f5ee9d6ef0e">otherwise.\n\n</a>" " @see SFXFMODProject_resources" )
Detailed Description
Public Functions
ConsoleDocClass(SFXFMODEventGroup , "@brief A group of events in an imported FMOD Designer <a href="/coding/file/cmdscan_8cpp/#cmdscan_8cpp_1aeab71244afb687f16d8c4f5ee9d6ef0e">project.\n\n</a>" "" "@note Instances of this class \<a href="/coding/file/cmdscan_8cpp/#cmdscan_8cpp_1aeab71244afb687f16d8c4f5ee9d6ef0e">n\n</a>" "@ingroup <a href="/coding/file/cmdscan_8cpp/#cmdscan_8cpp_1aeab71244afb687f16d8c4f5ee9d6ef0e">SFXFMOD\n</a>" "@ingroup Datablocks" )
DefineEngineMethod(SFXFMODEventGroup , freeData , void , () , "Release the resource data <a href="/coding/file/cmdscan_8cpp/#cmdscan_8cpp_1a2732ab74fa0237854c2ba0f75f88a624">for</a> this group and its <a href="/coding/file/cmdscan_8cpp/#cmdscan_8cpp_1aeab71244afb687f16d8c4f5ee9d6ef0e">subgroups.\n\n</a>" "@see SFXFMODProject_resources" )
DefineEngineMethod(SFXFMODEventGroup , isDataLoaded , bool , () , "Test whether the resource data <a href="/coding/file/cmdscan_8cpp/#cmdscan_8cpp_1a2732ab74fa0237854c2ba0f75f88a624">for</a> this group has been <a href="/coding/file/cmdscan_8cpp/#cmdscan_8cpp_1aeab71244afb687f16d8c4f5ee9d6ef0e">loaded.\n\n</a>" "@return True <a href="/coding/file/tsmeshintrinsics_8cpp/#tsmeshintrinsics_8cpp_1a4e4fa7e3399708e0777b5308db01278c">if</a> the resource data <a href="/coding/file/cmdscan_8cpp/#cmdscan_8cpp_1a2732ab74fa0237854c2ba0f75f88a624">for</a> this group is currently <a href="/coding/file/cmdscan_8cpp/#cmdscan_8cpp_1aeab71244afb687f16d8c4f5ee9d6ef0e">loaded.\n</a>" )
DefineEngineMethod(SFXFMODEventGroup , loadData , bool , (bool loadStreams, bool loadSamples) , (true, true) , "Load the resource data <a href="/coding/file/cmdscan_8cpp/#cmdscan_8cpp_1a2732ab74fa0237854c2ba0f75f88a624">for</a> this group, <a href="/coding/file/tsmeshintrinsics_8cpp/#tsmeshintrinsics_8cpp_1a4e4fa7e3399708e0777b5308db01278c">if</a> it has not already been loaded(either directly " "or indirectly through <a href="/coding/file/pointer_8h/#pointer_8h_1aeeddce917cf130d62c370b8f216026dd">a</a> parent group).\<a href="/coding/file/cmdscan_8cpp/#cmdscan_8cpp_1aeab71244afb687f16d8c4f5ee9d6ef0e">n</a>" "This method works recursively and thus data <a href="/coding/file/cmdscan_8cpp/#cmdscan_8cpp_1a2732ab74fa0237854c2ba0f75f88a624">for</a> direct and indirect child groups <a href="/coding/file/cmdgram_8cpp/#cmdgram_8cpp_1a5bafda9519252aa2d0fd038153f77dca">to</a> this group will be " "loaded as <a href="/coding/file/cmdscan_8cpp/#cmdscan_8cpp_1aeab71244afb687f16d8c4f5ee9d6ef0e">well.\n\n</a>" " @param loadStreams Whether <a href="/coding/file/cmdgram_8cpp/#cmdgram_8cpp_1a5bafda9519252aa2d0fd038153f77dca">to</a> open <a href="/coding/file/cmdscan_8cpp/#cmdscan_8cpp_1aeab71244afb687f16d8c4f5ee9d6ef0e">streams.\n</a>" " @param loadSamples Whether <a href="/coding/file/cmdgram_8cpp/#cmdgram_8cpp_1a5bafda9519252aa2d0fd038153f77dca">to</a> load sample <a href="/coding/file/cmdscan_8cpp/#cmdscan_8cpp_1aeab71244afb687f16d8c4f5ee9d6ef0e">banks.\n</a>" " @return True <a href="/coding/file/tsmeshintrinsics_8cpp/#tsmeshintrinsics_8cpp_1a4e4fa7e3399708e0777b5308db01278c">if</a> the data has been successfully loaded;false <a href="/coding/file/cmdscan_8cpp/#cmdscan_8cpp_1aeab71244afb687f16d8c4f5ee9d6ef0e">otherwise.\n\n</a>" " @see SFXFMODProject_resources" )
IMPLEMENT_CO_DATABLOCK_V1(SFXFMODEventGroup )
1 2//----------------------------------------------------------------------------- 3// Copyright (c) 2012 GarageGames, LLC 4// 5// Permission is hereby granted, free of charge, to any person obtaining a copy 6// of this software and associated documentation files (the "Software"), to 7// deal in the Software without restriction, including without limitation the 8// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or 9// sell copies of the Software, and to permit persons to whom the Software is 10// furnished to do so, subject to the following conditions: 11// 12// The above copyright notice and this permission notice shall be included in 13// all copies or substantial portions of the Software. 14// 15// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 20// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS 21// IN THE SOFTWARE. 22//----------------------------------------------------------------------------- 23 24#include "sfx/fmod/sfxFMODEventGroup.h" 25#include "sfx/fmod/sfxFMODDevice.h" 26#include "sfx/fmod/sfxFMODEvent.h" 27#include "sfx/fmod/sfxFMODProject.h" 28#include "core/stream/bitStream.h" 29#include "console/engineAPI.h" 30 31 32IMPLEMENT_CO_DATABLOCK_V1( SFXFMODEventGroup ); 33 34ConsoleDocClass( SFXFMODEventGroup, 35 "@brief A group of events in an imported FMOD Designer project.\n\n" 36 37 "" 38 39 "@note Instances of this class \n\n" 40 41 "@ingroup SFXFMOD\n" 42 "@ingroup Datablocks" 43); 44 45//----------------------------------------------------------------------------- 46 47SFXFMODEventGroup::SFXFMODEventGroup() 48 : mProject( NULL ), 49 mHandle( NULL ), 50 mParent( NULL ), 51 mChildren( NULL ), 52 mSibling( NULL ), 53 mLoadCount( 0 ), 54 mEvents( NULL ), 55 mNumEvents( 0 ), 56 mNumGroups( 0 ), 57 mParentId( 0 ), 58 mProjectId( 0 ) 59{ 60} 61 62//----------------------------------------------------------------------------- 63 64SFXFMODEventGroup::SFXFMODEventGroup( SFXFMODProject* project, FMOD_EVENTGROUP* handle, SFXFMODEventGroup* parent ) 65 : mProject( project ), 66 mHandle( handle ), 67 mParent( parent ), 68 mChildren( NULL ), 69 mSibling( NULL ), 70 mLoadCount( 0 ), 71 mEvents( NULL ), 72 mNumEvents( 0 ), 73 mNumGroups( 0 ), 74 mParentId( 0 ), 75 mProjectId( 0 ) 76{ 77 AssertFatal( project != NULL, "SFXFMODEventGroup::SFXFMODEventGroup - got a NULL project!" ); 78 AssertFatal( handle != NULL, "SFXFMODEventGroup::SFXFMODEventGroup - got a NULL group handle!" ); 79 80 // Fetch the name. 81 82 int index; 83 char* name = NULL; 84 85 SFXFMODDevice::smFunc->FMOD_EventGroup_GetInfo( handle, &index, &name ); 86 87 mName = name; 88} 89 90//----------------------------------------------------------------------------- 91 92SFXFMODEventGroup::~SFXFMODEventGroup() 93{ 94 AssertFatal( mEvents == NULL, "SFXFMODEventGroup::~SFXFMODEventGroup - group still has events attached" ); 95 AssertFatal( mChildren == NULL, "SFXFMODEventGroup::~SFXFMODEventGroup - group still has subgroups attached" ); 96} 97 98//----------------------------------------------------------------------------- 99 100void SFXFMODEventGroup::initPersistFields() 101{ 102 addGroup( "DO NOT MODIFY!!" ); 103 addField( "fmodProject", TYPEID< SFXFMODProject >(), Offset( mProject, SFXFMODEventGroup ), "DO NOT MODIFY!!" ); 104 addField( "fmodGroup", TYPEID< SFXFMODEventGroup >(), Offset( mParent, SFXFMODEventGroup ), "DO NOT MODIFY!!" ); 105 addField( "fmodName", TypeRealString, Offset( mName, SFXFMODEventGroup ), "DO NOT MODIFY!!" ); 106 endGroup( "DO NOT MODIFY!!" ); 107 108 Parent::initPersistFields(); 109} 110 111//----------------------------------------------------------------------------- 112 113bool SFXFMODEventGroup::onAdd() 114{ 115 if( !Parent::onAdd() ) 116 return false; 117 118 if( !mProject ) 119 { 120 Con::errorf( "SFXFMODEventGroup - not part of a project" ); 121 return false; 122 } 123 124 if( mParent ) 125 mParent->_addGroup( this ); 126 127 mProject->_addGroup( this ); 128 129 return true; 130} 131 132//----------------------------------------------------------------------------- 133 134void SFXFMODEventGroup::onRemove() 135{ 136 Parent::onRemove(); 137 138 if( !mProject ) 139 return; 140 141 release(); 142 143 while( mEvents ) 144 mEvents->deleteObject(); 145 while( mChildren ) 146 mChildren->deleteObject(); 147 148 if( mParent ) 149 mParent->_removeGroup( this ); 150 151 mProject->_removeGroup( this ); 152} 153 154//----------------------------------------------------------------------------- 155 156bool SFXFMODEventGroup::preload( bool server, String& errorStr ) 157{ 158 if( !Parent::preload( server, errorStr ) ) 159 return false; 160 161 if( !server ) 162 { 163 if( mParentId != 0 && !Sim::findObject( mParentId, mParent ) ) 164 { 165 errorStr = String::ToString( "SFXFMODEventGroup - parent group '%i' does not exist", mParentId ); 166 return false; 167 } 168 if( !Sim::findObject( mProjectId, mProject ) ) 169 { 170 errorStr = String::ToString( "SFXFMODEventGroup - project '%i' does not exist", mProjectId ); 171 return false; 172 } 173 } 174 175 return true; 176} 177 178//----------------------------------------------------------------------------- 179 180void SFXFMODEventGroup::packData( BitStream* stream ) 181{ 182 Parent::packData( stream ); 183 184 stream->write( mName ); 185 stream->writeRangedS32( mProject->getId(), DataBlockObjectIdFirst, DataBlockObjectIdLast ); 186 if( stream->writeFlag( mParent ) ) 187 stream->writeRangedS32( mParent->getId(), DataBlockObjectIdFirst, DataBlockObjectIdLast ); 188} 189 190//----------------------------------------------------------------------------- 191 192void SFXFMODEventGroup::unpackData( BitStream* stream ) 193{ 194 Parent::unpackData( stream ); 195 196 stream->read( &mName ); 197 198 mProjectId = stream->readRangedS32( DataBlockObjectIdFirst, DataBlockObjectIdLast ); 199 if( stream->readFlag() ) 200 mParentId = stream->readRangedS32( DataBlockObjectIdFirst, DataBlockObjectIdLast ); 201 else 202 mParentId = 0; 203} 204 205//----------------------------------------------------------------------------- 206 207String SFXFMODEventGroup::getQualifiedName() const 208{ 209 if( mParent ) 210 return String::ToString( "%s/%s", mParent->getQualifiedName().c_str(), mName.c_str() ); 211 else 212 return mName; 213} 214 215//----------------------------------------------------------------------------- 216 217bool SFXFMODEventGroup::isDataLoaded() const 218{ 219 // Check whether we or any of our parents has triggered a load. 220 221 for( const SFXFMODEventGroup* group = this; group != NULL; group = group->mParent ) 222 if( group->mLoadCount > 0 ) 223 return true; 224 225 return false; 226} 227 228//----------------------------------------------------------------------------- 229 230bool SFXFMODEventGroup::loadData( bool samples, bool streams ) 231{ 232 if( !mHandle ) 233 acquire(); 234 235 if( !mLoadCount ) 236 { 237 FMOD_EVENT_RESOURCE resource; 238 if( samples && streams ) 239 resource = FMOD_EVENT_RESOURCE_STREAMS_AND_SAMPLES; 240 else if( samples ) 241 resource = FMOD_EVENT_RESOURCE_SAMPLES; 242 else if( streams ) 243 resource = FMOD_EVENT_RESOURCE_STREAMS; 244 else 245 return true; 246 247 FMOD_RESULT result = SFXFMODDevice::smFunc->FMOD_EventGroup_LoadEventData( mHandle, resource, FMOD_EVENT_DEFAULT ); 248 if( result != FMOD_OK ) 249 { 250 Con::errorf( "SFXFMODEventGroup::loadData - could not load data: %s", FMODResultToString( result ).c_str() ); 251 return false; 252 } 253 254 SFXFMODDevice::instance()->updateMemUsageStats(); 255 Con::printf( "SFXFMODProject - %s: Loaded data for group '%s'", mProject->getName(), getQualifiedName().c_str() ); 256 } 257 258 mLoadCount ++; 259 return true; 260} 261 262//----------------------------------------------------------------------------- 263 264void SFXFMODEventGroup::freeData( bool force ) 265{ 266 bool isLoaded = ( mLoadCount > 0 ); 267 268 if( !isLoaded ) 269 isLoaded = ( mParent ? mParent->isDataLoaded() : false ); 270 else 271 { 272 if( force ) 273 mLoadCount = 0; 274 else 275 -- mLoadCount; 276 } 277 278 if( !mLoadCount && isLoaded ) 279 { 280 FMOD_RESULT result = SFXFMODDevice::smFunc->FMOD_EventGroup_FreeEventData( mHandle, ( FMOD_EVENT* ) NULL, false ); 281 if( result != FMOD_OK ) 282 Con::errorf( "SFXFMODEventGroup - failed freeing event data: %s", FMODResultToString( result ).c_str() ); 283 284 SFXFMODDevice::instance()->updateMemUsageStats(); 285 Con::printf( "SFXFMODProject - %s: Cleared data for group '%s'", mProject->getName(), getQualifiedName().c_str() ); 286 } 287} 288 289//----------------------------------------------------------------------------- 290 291void SFXFMODEventGroup::acquire( bool recursive ) 292{ 293 // Make sure the project is acquired. 294 295 mProject->acquire(); 296 297 // Acquire the group. 298 299 if( !mHandle ) 300 { 301 if( mParent ) 302 { 303 mParent->acquire(); 304 SFXFMODDevice::smFunc->FMOD_EventGroup_GetGroup( mParent->mHandle, mName, true, &mHandle ); 305 } 306 else 307 { 308 mProject->acquire(); 309 SFXFMODDevice::smFunc->FMOD_EventProject_GetGroup( mProject->mHandle, mName, true, &mHandle ); 310 } 311 } 312 313 // Acquite events and subgroups. 314 315 if( recursive ) 316 { 317 for( SFXFMODEvent* event = mEvents; event != NULL; event = event->mSibling ) 318 event->acquire(); 319 320 for( SFXFMODEventGroup* group = mChildren; group != NULL; group = group->mSibling ) 321 group->acquire( true ); 322 } 323} 324 325//----------------------------------------------------------------------------- 326 327void SFXFMODEventGroup::release() 328{ 329 if( !mHandle ) 330 return; 331 332 // Free the event data if we still have it loaded. 333 334 if( isDataLoaded() ) 335 freeData( true ); 336 337 // Release events. 338 339 for( SFXFMODEvent* event = mEvents; event != NULL; event = event->mSibling ) 340 event->release(); 341 342 // Release children. 343 344 for( SFXFMODEventGroup* child = mChildren; child != NULL; child = child->mSibling ) 345 child->release(); 346 347 // Release our handle. 348 349 freeData(); 350 mHandle = NULL; 351} 352 353//----------------------------------------------------------------------------- 354 355void SFXFMODEventGroup::_load() 356{ 357 // Make sure we have the group open. 358 359 if( !mHandle ) 360 acquire(); 361 362 // Fetch info. 363 364 int numEvents; 365 int numGroups; 366 367 SFXFMODDevice::smFunc->FMOD_EventGroup_GetNumEvents( mHandle, &numEvents ); 368 SFXFMODDevice::smFunc->FMOD_EventGroup_GetNumGroups( mHandle, &numGroups ); 369 370 // Load events. 371 372 for( U32 i = 0; i < numEvents; ++ i ) 373 { 374 FMOD_EVENT* handle; 375 if( SFXFMODDevice::smFunc->FMOD_EventGroup_GetEventByIndex( mHandle, i, FMOD_EVENT_INFOONLY, &handle ) == FMOD_OK ) 376 { 377 SFXFMODEvent* event = new SFXFMODEvent( this, handle ); 378 if( !isClientOnly() ) 379 event->assignId(); 380 381 event->registerObject( String::ToString( "%s_%s", getName(), FMODEventPathToTorqueName( event->getEventName() ).c_str() ) ); 382 if( isClientOnly() ) 383 Sim::getRootGroup()->addObject( event ); 384 } 385 } 386 387 // Load subgroups. 388 389 for( U32 i = 0; i < numGroups; ++ i ) 390 { 391 FMOD_EVENTGROUP* handle; 392 if( SFXFMODDevice::smFunc->FMOD_EventGroup_GetGroupByIndex( mHandle, i, true, &handle ) == FMOD_OK ) 393 { 394 SFXFMODEventGroup* group = new SFXFMODEventGroup( mProject, handle, this ); 395 if( !isClientOnly() ) 396 group->assignId(); 397 398 group->registerObject( String::ToString( "%s_%s", getName(), FMODEventPathToTorqueName( group->getGroupName() ).c_str() ) ); 399 if( isClientOnly() ) 400 Sim::getRootGroup()->addObject( group ); 401 402 group->_load(); 403 } 404 } 405} 406 407//----------------------------------------------------------------------------- 408 409void SFXFMODEventGroup::_addEvent( SFXFMODEvent* event ) 410{ 411 event->mSibling = mEvents; 412 mEvents = event; 413 mNumEvents ++; 414} 415 416//----------------------------------------------------------------------------- 417 418void SFXFMODEventGroup::_removeEvent( SFXFMODEvent* event ) 419{ 420 if( mEvents == event ) 421 { 422 mEvents = event->mSibling; 423 event->mSibling = NULL; 424 mNumEvents --; 425 } 426 else 427 { 428 SFXFMODEvent* p = mEvents; 429 while( p != NULL && p->mSibling != event ) 430 p = p->mSibling; 431 432 if( p ) 433 { 434 p->mSibling = event->mSibling; 435 event->mSibling = NULL; 436 mNumEvents --; 437 } 438 } 439} 440 441//----------------------------------------------------------------------------- 442 443void SFXFMODEventGroup::_addGroup( SFXFMODEventGroup* group ) 444{ 445 group->mSibling = mChildren; 446 mChildren = group; 447 mNumGroups ++; 448} 449 450//----------------------------------------------------------------------------- 451 452void SFXFMODEventGroup::_removeGroup( SFXFMODEventGroup* group ) 453{ 454 if( mChildren == group ) 455 { 456 mChildren = group->mSibling; 457 group->mSibling = NULL; 458 mNumGroups --; 459 } 460 else 461 { 462 SFXFMODEventGroup* p = mChildren; 463 while( p != NULL && p->mSibling != group ) 464 p = p->mSibling; 465 466 if( p ) 467 { 468 p->mSibling = group->mSibling; 469 group->mSibling = NULL; 470 mNumGroups --; 471 } 472 } 473} 474 475//============================================================================= 476// Console Methods. 477//============================================================================= 478// MARK: ---- Console Methods ---- 479 480//----------------------------------------------------------------------------- 481 482DefineEngineMethod( SFXFMODEventGroup, isDataLoaded, bool, (),, 483 "Test whether the resource data for this group has been loaded.\n\n" 484 "@return True if the resource data for this group is currently loaded.\n" ) 485{ 486 return object->isDataLoaded(); 487} 488 489//----------------------------------------------------------------------------- 490 491DefineEngineMethod( SFXFMODEventGroup, loadData, bool, ( bool loadStreams, bool loadSamples ), ( true, true ), 492 "Load the resource data for this group, if it has not already been loaded (either directly " 493 "or indirectly through a parent group).\n" 494 "This method works recursively and thus data for direct and indirect child groups to this group will be " 495 "loaded as well.\n\n" 496 "@param loadStreams Whether to open streams.\n" 497 "@param loadSamples Whether to load sample banks.\n" 498 "@return True if the data has been successfully loaded; false otherwise.\n\n" 499 "@see SFXFMODProject_resources" ) 500{ 501 return object->loadData( loadSamples, loadStreams ); 502} 503 504//----------------------------------------------------------------------------- 505 506DefineEngineMethod( SFXFMODEventGroup, freeData, void, (),, 507 "Release the resource data for this group and its subgroups.\n\n" 508 "@see SFXFMODProject_resources" ) 509{ 510 object->freeData(); 511} 512