OpenClonk
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros
C4SoundSystem Class Reference

#include <C4SoundSystem.h>

Collaboration diagram for C4SoundSystem:
[legend]

Public Member Functions

 C4SoundSystem ()
 
 ~C4SoundSystem ()
 
void Clear ()
 
void Execute ()
 
int32_t LoadEffects (C4Group &hGroup, const char *namespace_prefix, bool group_is_root)
 
C4SoundInstanceNewEffect (const char *szSound, bool fLoop=false, int32_t iVolume=100, C4Object *pObj=nullptr, int32_t iCustomFalloffDistance=0, int32_t iPitch=0, C4SoundModifier *modifier=nullptr)
 
C4SoundInstanceFindInstance (const char *szSound, C4Object *pObj)
 
C4SoundInstanceGetFirstInstance () const
 
C4SoundInstanceGetNextInstance (C4SoundInstance *prev) const
 
bool Init ()
 
void ClearPointers (C4Object *pObj)
 
C4SoundEffectGetFirstSound () const
 

Public Attributes

C4SoundModifierList Modifiers
 

Protected Member Functions

void ClearEffects ()
 
C4SoundEffectGetEffect (const char *szSound)
 
int32_t RemoveEffect (const char *szFilename)
 

Protected Attributes

C4Group SoundFile
 
C4SoundEffectFirstSound
 

Detailed Description

Definition at line 38 of file C4SoundSystem.h.

Constructor & Destructor Documentation

C4SoundSystem::C4SoundSystem ( )

Definition at line 33 of file C4SoundSystem.cpp.

33  :
34  FirstSound (nullptr)
35 {
36 }
C4SoundEffect * FirstSound
Definition: C4SoundSystem.h:57
C4SoundSystem::~C4SoundSystem ( )

Definition at line 38 of file C4SoundSystem.cpp.

39 {
40 
41 }

Member Function Documentation

void C4SoundSystem::Clear ( )

Definition at line 64 of file C4SoundSystem.cpp.

References C4SoundModifierList::Clear(), ClearEffects(), C4Group::Close(), Modifiers, and SoundFile.

Referenced by C4Application::Clear(), C4Game::Clear(), and C4MainMenu::MenuCommand().

65 {
66  ClearEffects();
67  Modifiers.Clear();
68  // Close sound file
69  SoundFile.Close();
70 }
C4SoundModifierList Modifiers
Definition: C4SoundSystem.h:54
bool Close()
Definition: C4Group.cpp:755
C4Group SoundFile
Definition: C4SoundSystem.h:56

Here is the call graph for this function:

Here is the caller graph for this function:

void C4SoundSystem::ClearEffects ( )
protected

Definition at line 72 of file C4SoundSystem.cpp.

References FirstSound, and C4SoundEffect::Next.

Referenced by Clear(), and Init().

73 {
74  // Clear sound bank
75  C4SoundEffect *csfx,*next;
76  for (csfx=FirstSound; csfx; csfx=next)
77  {
78  next=csfx->Next;
79  delete csfx;
80  }
81  FirstSound=nullptr;
82 }
C4SoundEffect * Next
C4SoundEffect * FirstSound
Definition: C4SoundSystem.h:57

Here is the caller graph for this function:

void C4SoundSystem::ClearPointers ( C4Object pObj)

Definition at line 245 of file C4SoundSystem.cpp.

References FirstSound, and C4SoundEffect::Next.

Referenced by C4Game::ClearPointers().

246 {
247  for (C4SoundEffect *pEff=FirstSound; pEff; pEff=pEff->Next)
248  pEff->ClearPointers(pObj);
249 }
C4SoundEffect * Next
C4SoundEffect * FirstSound
Definition: C4SoundSystem.h:57

Here is the caller graph for this function:

void C4SoundSystem::Execute ( )

Definition at line 84 of file C4SoundSystem.cpp.

References Application, C4SoundEffect::Execute(), FirstSound, C4Application::MusicSystem, C4SoundEffect::Next, and C4MusicSystem::SelectContext().

Referenced by C4Application::GameTick().

85 {
86 #if AUDIO_TK == AUDIO_TK_OPENAL
88 #endif
89  C4SoundEffect *csfx;
90  for (csfx=FirstSound; csfx; csfx=csfx->Next)
91  {
92  // Instance removal check
93  csfx->Execute();
94  }
95 }
void SelectContext()
C4SoundEffect * Next
C4SoundEffect * FirstSound
Definition: C4SoundSystem.h:57
C4Application Application
Definition: C4Globals.cpp:44
C4MusicSystem MusicSystem
Definition: C4Application.h:41

Here is the call graph for this function:

Here is the caller graph for this function:

C4SoundInstance * C4SoundSystem::FindInstance ( const char *  szSound,
C4Object pObj 
)

Definition at line 146 of file C4SoundSystem.cpp.

References C4MaxSoundName, DefaultExtension(), FirstSound, C4SoundEffect::Next, SCopy(), and WildcardMatch().

Referenced by GetSoundInstance(), SoundLevel(), SoundPan(), SoundPitch(), and StopSoundEffect().

147 {
148  char szName[C4MaxSoundName+2+1];
149  // Evaluate sound name (see GetEffect)
150  SCopy(szSndName,szName,C4MaxSoundName);
151  DefaultExtension(szName,"*");
152  // Find an effect with a matching instance
153  for (C4SoundEffect *csfx = FirstSound; csfx; csfx = csfx->Next)
154  if (WildcardMatch(szName, csfx->Name))
155  {
156  C4SoundInstance *pInst = csfx->GetInstance(pObj);
157  if (pInst) return pInst;
158  }
159  return nullptr;
160 }
void SCopy(const char *szSource, char *sTarget, size_t iMaxL)
Definition: Standard.cpp:122
const int32_t C4MaxSoundName
Definition: C4SoundSystem.h:27
C4SoundEffect * Next
C4SoundEffect * FirstSound
Definition: C4SoundSystem.h:57
void DefaultExtension(char *szFilename, const char *szExtension)
Definition: StdFile.cpp:284
bool WildcardMatch(const char *szWildcard, const char *szString)
Definition: StdFile.cpp:384

Here is the call graph for this function:

Here is the caller graph for this function:

C4SoundEffect * C4SoundSystem::GetEffect ( const char *  szSound)
protected

Definition at line 97 of file C4SoundSystem.cpp.

References C4MaxSoundName, DefaultExtension(), FirstSound, C4SoundEffect::Name, C4SoundEffect::Next, SCharCount(), SCopy(), UnsyncedRandom(), and WildcardMatch().

Referenced by NewEffect().

98 {
99  // Remember wildcards before adding .* extension - if there are 2 versions with different file extensions, play the last added
100  bool bRandomSound = SCharCount('?',szSndName) || SCharCount('*',szSndName);
101  // Evaluate sound name
102  char szName[C4MaxSoundName+2+1];
103  SCopy(szSndName,szName,C4MaxSoundName);
104  // Any extension accepted
105  DefaultExtension(szName,"*");
106  // Play nth Sound. Standard: 1
107  int32_t iNumber = 1;
108  // Sound with a wildcard: determine number of available matches
109  if (bRandomSound)
110  {
111  iNumber = 0;
112  // Count matching sounds
113  for (C4SoundEffect *pSfx=FirstSound; pSfx; pSfx=pSfx->Next)
114  if (WildcardMatch(szName,pSfx->Name))
115  ++iNumber;
116  // Nothing found? Abort
117  if(iNumber == 0)
118  return nullptr;
119  iNumber=UnsyncedRandom(iNumber)+1;
120  }
121  // Find requested sound effect in bank
122  C4SoundEffect *pSfx;
123  for (pSfx=FirstSound; pSfx; pSfx=pSfx->Next)
124  if (WildcardMatch(szName,pSfx->Name))
125  if(!--iNumber)
126  break;
127  return pSfx; // Is still nullptr if nothing is found
128 }
void SCopy(const char *szSource, char *sTarget, size_t iMaxL)
Definition: Standard.cpp:122
uint32_t UnsyncedRandom()
Definition: C4Random.cpp:58
char Name[C4MaxSoundName+1]
const int32_t C4MaxSoundName
Definition: C4SoundSystem.h:27
unsigned int SCharCount(char cTarget, const char *szInStr, const char *cpUntil)
Definition: Standard.cpp:290
C4SoundEffect * Next
C4SoundEffect * FirstSound
Definition: C4SoundSystem.h:57
void DefaultExtension(char *szFilename, const char *szExtension)
Definition: StdFile.cpp:284
bool WildcardMatch(const char *szWildcard, const char *szString)
Definition: StdFile.cpp:384

Here is the call graph for this function:

Here is the caller graph for this function:

C4SoundInstance * C4SoundSystem::GetFirstInstance ( ) const

Definition at line 251 of file C4SoundSystem.cpp.

References FirstSound, and C4SoundEffect::Next.

Referenced by C4SoundModifierList::SetGlobalModifier().

252 {
253  // Return by searching through effect linked list.
254  for (C4SoundEffect *pSfx = FirstSound; pSfx; pSfx = pSfx->Next)
255  if (pSfx->FirstInst) return pSfx->FirstInst;
256  return nullptr;
257 }
C4SoundEffect * Next
C4SoundEffect * FirstSound
Definition: C4SoundSystem.h:57

Here is the caller graph for this function:

C4SoundEffect* C4SoundSystem::GetFirstSound ( ) const
inline

Definition at line 52 of file C4SoundSystem.h.

References FirstSound.

52 { return FirstSound; }
C4SoundEffect * FirstSound
Definition: C4SoundSystem.h:57
C4SoundInstance * C4SoundSystem::GetNextInstance ( C4SoundInstance prev) const

Definition at line 259 of file C4SoundSystem.cpp.

References C4SoundEffect::Next, C4SoundInstance::pEffect, and C4SoundInstance::pNext.

Referenced by C4SoundModifierList::SetGlobalModifier().

260 {
261  // Return by searching through instance linked list and parent linked list of effects
262  assert(prev && prev->pEffect);
263  if (prev->pNext) return prev->pNext;
264  for (C4SoundEffect *pSfx = prev->pEffect->Next; pSfx; pSfx = pSfx->Next)
265  if (pSfx->FirstInst) return pSfx->FirstInst;
266  return nullptr;
267 }
C4SoundInstance * pNext
C4SoundEffect * Next
C4SoundEffect * pEffect

Here is the caller graph for this function:

bool C4SoundSystem::Init ( )

Definition at line 43 of file C4SoundSystem.cpp.

References Application, C4CFN_Sound, C4MaxSoundInstances, ClearEffects(), C4SoundModifierList::Init(), C4MusicSystem::InitializeMOD(), C4Group::IsOpen(), LoadEffects(), Modifiers, C4MusicSystem::MODInitialized, C4Application::MusicSystem, C4Reloc::Open(), Reloc, and SoundFile.

Referenced by C4MainMenu::MenuCommand(), and C4Application::PreInit().

44 {
47  return false;
48 
49  // Might be reinitialisation
50  ClearEffects();
51  // (re)init EFX
52  Modifiers.Init();
53  // Open sound file
54  if (!SoundFile.IsOpen())
55  if (!Reloc.Open(SoundFile, C4CFN_Sound)) return false;
56  // Load static sound from Sound.ocg
57  LoadEffects(SoundFile, nullptr, false);
58 #if AUDIO_TK == AUDIO_TK_SDL_MIXER
59  Mix_AllocateChannels(C4MaxSoundInstances);
60 #endif
61  return true;
62 }
int32_t LoadEffects(C4Group &hGroup, const char *namespace_prefix, bool group_is_root)
C4SoundModifierList Modifiers
Definition: C4SoundSystem.h:54
bool IsOpen() const
Definition: C4Group.cpp:1891
#define C4CFN_Sound
Definition: C4Components.h:26
bool Open(C4Group &hGroup, const char *filename) const
Definition: C4Reloc.cpp:69
const int32_t C4MaxSoundInstances
Definition: C4SoundSystem.h:28
C4Reloc Reloc
Definition: C4Reloc.cpp:22
C4Group SoundFile
Definition: C4SoundSystem.h:56
C4Application Application
Definition: C4Globals.cpp:44
bool InitializeMOD()
C4MusicSystem MusicSystem
Definition: C4Application.h:41

Here is the call graph for this function:

Here is the caller graph for this function:

int32_t C4SoundSystem::LoadEffects ( C4Group hGroup,
const char *  namespace_prefix,
bool  group_is_root 
)

Definition at line 164 of file C4SoundSystem.cpp.

References _MAX_FNAME, StdStrBuf::Append(), C4CFN_Sound, C4CFN_SoundFiles, C4CFN_SoundSubgroups, StdStrBuf::Copy(), C4Group::FindEntry(), C4Group::FindNextEntry(), FirstSound, StdStrBuf::getData(), C4SoundEffect::Load(), C4SoundEffect::Name, C4SoundEffect::Next, C4Group::OpenAsChild(), RemoveEffect(), C4Group::ResetSearch(), and SCopySegment().

Referenced by Init(), and C4Game::InitGame().

165 {
166  // Local definition sounds: If there is a Sound.ocg in the group, load the sound from there
167  if(group_is_root && hGroup.FindEntry(C4CFN_Sound))
168  {
169  C4Group g;
170  g.OpenAsChild(&hGroup, C4CFN_Sound, false, false);
171  return LoadEffects(g, namespace_prefix, false);
172  }
173  int32_t iNum=0;
174  char szFilename[_MAX_FNAME+1];
175  char szFileType[_MAX_FNAME+1];
176  C4SoundEffect *nsfx;
177  // Process segmented list of file types
178  for (int32_t i = 0; SCopySegment(C4CFN_SoundFiles, i, szFileType, '|', _MAX_FNAME); i++)
179  {
180  // Search all sound files in group
181  hGroup.ResetSearch();
182  while (hGroup.FindNextEntry(szFileType, szFilename))
183  // Create and load effect
184  if ((nsfx = new C4SoundEffect))
185  {
186  if (nsfx->Load(szFilename, hGroup, namespace_prefix))
187  {
188  // Overload same name effects
189  RemoveEffect(nsfx->Name);
190  // Add effect
191  nsfx->Next=FirstSound;
192  FirstSound=nsfx;
193  iNum++;
194  }
195  else
196  delete nsfx;
197  }
198  }
199  // Load subgroups from Sound.ocg and other subgroups
200  if (!group_is_root)
201  {
202  hGroup.ResetSearch();
203  while (hGroup.FindNextEntry(C4CFN_SoundSubgroups, szFilename))
204  {
205  // Load from subgroup as a sub-namespace
206  // get namespace name
207  StdStrBuf sub_namespace;
208  if (namespace_prefix)
209  {
210  sub_namespace.Copy(namespace_prefix);
211  sub_namespace.Append("::");
212  }
213  sub_namespace.Append(szFilename, strlen(szFilename) - strlen(C4CFN_SoundSubgroups) + 1);
214  // load from child group
215  C4Group subgroup;
216  if (subgroup.OpenAsChild(&hGroup, szFilename, false, false))
217  {
218  iNum += LoadEffects(subgroup, sub_namespace.getData(), false);
219  }
220  }
221  }
222  return iNum;
223 }
const char * getData() const
Definition: StdBuf.h:450
bool FindEntry(const char *szWildCard, StdStrBuf *sFileName=nullptr, size_t *iSize=nullptr)
Definition: C4Group.cpp:1774
bool SCopySegment(const char *szString, int iSegment, char *sTarget, char cSeparator, int iMaxL, bool fSkipWhitespace)
Definition: Standard.cpp:243
int32_t LoadEffects(C4Group &hGroup, const char *namespace_prefix, bool group_is_root)
char Name[C4MaxSoundName+1]
#define C4CFN_SoundSubgroups
Definition: C4Components.h:27
C4SoundEffect * Next
#define C4CFN_SoundFiles
Definition: C4Components.h:171
bool Load(const char *szFileName, C4Group &hGroup, const char *namespace_prefix)
void Append(const char *pnData, size_t iChars)
Definition: StdBuf.h:527
#define C4CFN_Sound
Definition: C4Components.h:26
C4SoundEffect * FirstSound
Definition: C4SoundSystem.h:57
#define _MAX_FNAME
bool FindNextEntry(const char *szWildCard, StdStrBuf *sFileName=nullptr, size_t *iSize=nullptr, bool fStartAtFilename=false)
Definition: C4Group.cpp:1780
void ResetSearch(bool reload_contents=false)
Definition: C4Group.cpp:1013
void Copy()
Definition: StdBuf.h:475
int32_t RemoveEffect(const char *szFilename)
bool OpenAsChild(C4Group *pMother, const char *szEntryName, bool fExclusive=false, bool fCreate=false)
Definition: C4Group.cpp:1585

Here is the call graph for this function:

Here is the caller graph for this function:

C4SoundInstance * C4SoundSystem::NewEffect ( const char *  szSound,
bool  fLoop = false,
int32_t  iVolume = 100,
C4Object pObj = nullptr,
int32_t  iCustomFalloffDistance = 0,
int32_t  iPitch = 0,
C4SoundModifier modifier = nullptr 
)

Definition at line 130 of file C4SoundSystem.cpp.

References Config, DebugLogF(), GetEffect(), C4SoundEffect::New(), C4ConfigSound::RXSound, and C4Config::Sound.

Referenced by StartSoundEffect().

131 {
132  // Sound not active
133  if (!Config.Sound.RXSound) return nullptr;
134  // Get sound
135  C4SoundEffect *csfx;
136  if (!(csfx = GetEffect(szSndName)))
137  {
138  // Warn about missing or incorrectly spelled sound to allow finding mistakes earlier.
139  DebugLogF("Warning: could not find sound matching '%s'", szSndName);
140  return nullptr;
141  }
142  // Play
143  return csfx->New(fLoop, iVolume, pObj, iCustomFalloffDistance, iPitch, modifier);
144 }
C4Config Config
Definition: C4Config.cpp:837
int32_t RXSound
Definition: C4Config.h:127
C4SoundEffect * GetEffect(const char *szSound)
bool DebugLogF(const char *strMessage...)
Definition: C4Log.cpp:281
C4SoundInstance * New(bool fLoop=false, int32_t iVolume=100, C4Object *pObj=nullptr, int32_t iCustomFalloffDistance=0, int32_t iPitch=0, C4SoundModifier *modifier=nullptr)
C4ConfigSound Sound
Definition: C4Config.h:255

Here is the call graph for this function:

Here is the caller graph for this function:

int32_t C4SoundSystem::RemoveEffect ( const char *  szFilename)
protected

Definition at line 225 of file C4SoundSystem.cpp.

References FirstSound, iResult, C4SoundEffect::Next, and WildcardMatch().

Referenced by LoadEffects().

226 {
227  int32_t iResult=0;
228  C4SoundEffect *pNext,*pPrev=nullptr;
229  for (C4SoundEffect *pSfx=FirstSound; pSfx; pSfx=pNext)
230  {
231  pNext=pSfx->Next;
232  if (WildcardMatch(szFilename,pSfx->Name))
233  {
234  delete pSfx;
235  if (pPrev) pPrev->Next=pNext;
236  else FirstSound=pNext;
237  iResult++;
238  }
239  else
240  pPrev=pSfx;
241  }
242  return iResult;
243 }
C4SoundEffect * Next
int iResult
Definition: C4GroupMain.cpp:39
C4SoundEffect * FirstSound
Definition: C4SoundSystem.h:57
bool WildcardMatch(const char *szWildcard, const char *szString)
Definition: StdFile.cpp:384

Here is the call graph for this function:

Here is the caller graph for this function:

Member Data Documentation

C4SoundEffect* C4SoundSystem::FirstSound
protected
C4Group C4SoundSystem::SoundFile
protected

Definition at line 56 of file C4SoundSystem.h.

Referenced by Clear(), and Init().


The documentation for this class was generated from the following files: