Torque3D Documentation / _generateds / sfxFMODEventGroup.cpp

sfxFMODEventGroup.cpp

Engine/source/sfx/fmod/sfxFMODEventGroup.cpp

More...

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