Main Page | Namespace List | Class Hierarchy | Alphabetical List | Data Structures | File List | Namespace Members | Data Fields | Globals

arssound.cpp

Go to the documentation of this file.
00001 #include "SdlArs.h"
00002 
00003 namespace Ars
00004 {
00005 static int      cnt = 0;
00006 
00007 Sounds::Sounds( void )
00008 : loop( 0 ) , ticks( -1 ) , channel( 0 ) , wave( 0 ) , id( ++cnt )
00009 {
00010 }
00011 
00012 Sounds::~Sounds( void )
00013 {
00014         if( wave )
00015                 Mix_FreeChunk( wave );
00016         wave = 0;
00017 }
00018 
00019 void Sounds::Configure( const int aChannel , const int nr , const int aTicks )
00020 {
00021         if( nr != -2 )
00022                 loop = nr;
00023         if( aChannel != -2 )
00024                 channel = aChannel;
00025         if( aTicks != -2 )
00026                 ticks = aTicks;
00027 }
00028 
00029 void Sounds::Play( const int aChannel , const int nr , const int aTicks )
00030 {
00031         Configure( aChannel , nr , aTicks );
00032         if( wave )
00033                 Mix_PlayChannelTimed( channel , wave , loop , ticks );
00034 }
00035 
00036 const bool Sounds::Load( const string &aSection , const string &akey , string aCfgFile  )
00037 {
00038         if( aCfgFile.empty() )
00039                 aCfgFile = Cfg::GetCfg().GetCfgFile( "Paths" , "sounds" );
00040         Cfg::Handler &h = Cfg::GetCfg( aCfgFile );
00041 
00042         return Load( h.GetCfgFile( aSection , akey ) );
00043 }
00044 
00045 const bool Sounds::Load( const string &aFilename )
00046 {
00047         if( wave )
00048                 Mix_FreeChunk( wave );
00049 
00050         wave = Mix_LoadWAV( aFilename.c_str() );
00051         return wave != 0;
00052 }
00053 
00054 std::map<icstring , Sounds *>   soundList;
00055 
00056 Sounds  emptySound;
00057 
00058 Sounds &GetSound( const icstring &name )
00059 {
00060         std::map<icstring , Sounds *>::iterator pos = soundList.find( name );
00061 
00062         if( pos == soundList.end() )
00063                 return emptySound;
00064         return *pos->second;
00065 }
00066 Sounds &AddSound( const icstring &name , const string &aSection , const string &akey , string aCfgFile )
00067 {
00068         if( GetSound( name ) == emptySound )
00069         {
00070                 Sounds  *s = new Sounds();
00071                 s->Load( aSection , akey , aCfgFile );
00072                 soundList.insert( make_pair( name , s ) );
00073         }
00074         return GetSound( name );
00075 }
00076 
00077 Sounds &AddSound( const icstring &name , const string &aFilename )
00078 {
00079         if( !GetSound( name ) )
00080         {
00081                 Sounds  *s = new Sounds();
00082                 s->Load( aFilename );
00083                 soundList.insert( make_pair( name , s ) );
00084         }
00085         return GetSound( name );
00086 }
00087 
00088 void UnloadSounds( void )
00089 {
00090         for(  std::map<icstring , Sounds *>::iterator it = soundList.begin() ; it != soundList.end() ; ++it )
00091                 delete it->second;
00092         soundList.clear();
00093 }
00094 
00095 void Preload( const icstring &aSection )
00096 {
00097         Cfg::Handler    &h = Cfg::GetCfg( "@sounds" );
00098         Rsrc    res( Cfg::GetCfg().GetCfgString( "Paths" , "Sounds" ) );
00099         string  path = h.GetPath();
00100 
00101         icstring        tmp = icstring( aSection.c_str() );
00102         tmp = res.FindCombination( tmp );
00103         icstring        snd = strip( tmp );
00104 
00105         while( !snd.empty() )
00106         {
00107                 icstring        sndDef = Rsrc::GetList( snd );
00108                 if( !sndDef.empty() )
00109                 {
00110                         icstring        name = Rsrc::GetId( sndDef );
00111                         string  fname =  path + Rsrc::GetStr( sndDef ).c_str();
00112                         AddSound( name , fname );
00113                 }
00114         }
00115 }
00116 
00117 }

Generated on Fri Dec 5 04:05:59 2003 for Borqueror by doxygen 1.3.3