Isle
Loading...
Searching...
No Matches
legocachesoundmanager.cpp
Go to the documentation of this file.
2
3#include "legoworld.h"
4#include "misc.h"
5
8
9// FUNCTION: LEGO1 0x1003cf20
11{
12 LegoCacheSound* sound;
13
14 while (!m_set.empty()) {
15 sound = (*m_set.begin()).GetSound();
16 m_set.erase(m_set.begin());
17 sound->Stop();
18 delete sound;
19 }
20
21 while (!m_list.empty()) {
22 sound = (*m_list.begin()).GetSound();
23 // TODO: LegoCacheSoundEntry::~LegoCacheSoundEntry should not be inlined here
24 m_list.erase(m_list.begin());
25 sound->Stop();
26 delete sound;
27 }
28}
29
30// FUNCTION: LEGO1 0x1003d050
32{
33#ifdef COMPAT_MODE
34 Set100d6b4c::iterator setIter;
35 for (setIter = m_set.begin(); setIter != m_set.end(); setIter++) {
36#else
37 for (Set100d6b4c::iterator setIter = m_set.begin(); setIter != m_set.end(); setIter++) {
38#endif
39 LegoCacheSound* sound = (*setIter).GetSound();
40 if (sound->GetUnknown0x58()) {
41 sound->FUN_10006be0();
42 }
43 }
44
45 List100d6b4c::iterator listIter = m_list.begin();
46 while (listIter != m_list.end()) {
47 LegoCacheSound* sound = (*listIter).GetSound();
48
49 if (sound->GetUnknown0x58()) {
50 sound->FUN_10006be0();
51 listIter++;
52 }
53 else {
54 sound->Stop();
55 m_list.erase(listIter++);
56 delete sound;
57 }
58 }
59
60 return SUCCESS;
61}
62
63// FUNCTION: LEGO1 0x1003d170
64// FUNCTION: BETA10 0x1006539d
66{
67 // This function has changed completely since BETA10, but its calls suggest the match is correct
68
69 char* key = new char[strlen(p_key) + 1];
70 strcpy(key, p_key);
71
72 Set100d6b4c::iterator it = m_set.find(LegoCacheSoundEntry(NULL, key));
73 if (it != m_set.end()) {
74 return (*it).GetSound();
75 }
76
77 return NULL;
78}
79
80// FUNCTION: LEGO1 0x1003d290
82{
83 Set100d6b4c::iterator it = m_set.find(LegoCacheSoundEntry(p_sound));
84 if (it != m_set.end()) {
85 LegoCacheSound* sound = (*it).GetSound();
86
87 if (sound->GetUnknown0x58()) {
88 m_list.push_back(LegoCacheSoundEntry(p_sound));
89 return p_sound;
90 }
91 else {
92 delete p_sound;
93 return sound;
94 }
95 }
96
97 m_set.insert(LegoCacheSoundEntry(p_sound));
98 LegoWorld* world = CurrentWorld();
99 if (world) {
100 world->Add(p_sound);
101 }
102
103 return p_sound;
104}
105
106// FUNCTION: LEGO1 0x1003dae0
107// FUNCTION: BETA10 0x10065502
108LegoCacheSound* LegoCacheSoundManager::Play(const char* p_key, const char* p_name, MxBool p_looping)
109{
110 return Play(FindSoundByKey(p_key), p_name, p_looping);
111}
112
113// FUNCTION: LEGO1 0x1003db10
114// FUNCTION: BETA10 0x10065537
115LegoCacheSound* LegoCacheSoundManager::Play(LegoCacheSound* p_sound, const char* p_name, MxBool p_looping)
116{
117 if (!p_sound) {
118 return NULL;
119 }
120
121 if (p_sound->GetUnknown0x58()) {
122 LegoCacheSound* clone = p_sound->Clone();
123
124 if (clone) {
125 LegoCacheSound* sound = ManageSoundEntry(clone);
126 sound->Play(p_name, p_looping);
127 return sound;
128 }
129 }
130 else {
131 p_sound->Play(p_name, p_looping);
132 return p_sound;
133 }
134
135 return NULL;
136}
137
138// FUNCTION: LEGO1 0x1003db80
139// FUNCTION: BETA10 0x100656a7
141{
142#ifdef COMPAT_MODE
143 Set100d6b4c::iterator setIter;
144 for (setIter = m_set.begin(); setIter != m_set.end(); setIter++) {
145#else
146 for (Set100d6b4c::iterator setIter = m_set.begin(); setIter != m_set.end(); setIter++) {
147#endif
148 if ((*setIter).GetSound() == p_sound) {
149 p_sound->Stop();
150 return;
151 }
152 }
153
154#ifdef COMPAT_MODE
155 List100d6b4c::iterator listIter;
156 for (listIter = m_list.begin();; listIter++) {
157#else
158 for (List100d6b4c::iterator listIter = m_list.begin();; listIter++) {
159#endif
160 if (listIter == m_list.end()) {
161 return;
162 }
163
164 LegoCacheSound* sound = (*listIter).GetSound();
165 if (sound == p_sound) {
166 p_sound->Stop();
167 return;
168 }
169 }
170}
171
172// FUNCTION: LEGO1 0x1003dc40
174{
175#ifdef COMPAT_MODE
176 Set100d6b4c::iterator setIter;
177 for (setIter = m_set.begin(); setIter != m_set.end(); setIter++) {
178#else
179 for (Set100d6b4c::iterator setIter = m_set.begin(); setIter != m_set.end(); setIter++) {
180#endif
181 if ((*setIter).GetSound() == p_sound) {
182 p_sound->Stop();
183
184 delete p_sound;
185 m_set.erase(setIter);
186 return;
187 }
188 }
189
190#ifdef COMPAT_MODE
191 List100d6b4c::iterator listIter;
192 for (listIter = m_list.begin();; listIter++) {
193#else
194 for (List100d6b4c::iterator listIter = m_list.begin();; listIter++) {
195#endif
196 if (listIter == m_list.end()) {
197 return;
198 }
199
200 LegoCacheSound* sound = (*listIter).GetSound();
201 if (sound == p_sound) {
202 p_sound->Stop();
203
204 delete sound;
205 m_list.erase(listIter);
206 return;
207 }
208 }
209}
[AI] Manages caching, reuse, and playback of LegoCacheSound objects.
void Destroy(LegoCacheSound *&p_sound)
[AI] Destroys (deletes and removes) the specified sound object from all tracking.
LegoCacheSound * FindSoundByKey(const char *p_key)
[AI] Attempts to find and return a cached sound by its key (case-insensitive).
LegoCacheSound * ManageSoundEntry(LegoCacheSound *p_sound)
[AI] Manages a sound entry.
LegoCacheSound * Play(const char *p_key, const char *p_name, MxBool p_looping)
[AI] Plays a sound identified by key, with the given playback name and looping flag.
void Stop(LegoCacheSound *&p_sound)
[AI] Stops playback of the specified sound object.
virtual MxResult Tickle()
[AI] Advances or cleans up all managed sounds.
Sound cache object managing DirectSound buffers and 3D positioning for preloaded sound data.
Definition: legocachsound.h:17
LegoCacheSound * Clone()
Creates an identical copy of this LegoCacheSound, including memory buffers, properties,...
MxResult Play(const char *p_name, MxBool p_looping)
Starts playback of the cached sound in this buffer.
void FUN_10006be0()
Handles sound updates per tick; manages stopping, buffer state, and 3D-position refreshes if sound is...
const MxBool GetUnknown0x58() const
Returns whether this sound is currently playing or is flagged as 'active'.
Definition: legocachsound.h:87
void Stop()
Immediately stops playback and resets buffer, clearing event tag and position cues.
Represents the active 3D world, holding all entity, animation, sound, path, and ROI objects.
Definition: legoworld.h:49
virtual void Add(MxCore *p_object)
Adds an object (entity, presenter, ROI, etc.) to the appropriate world-managed list or set.
Definition: legoworld.cpp:418
#define DECOMP_SIZE_ASSERT(T, S)
Definition: decomp.h:19
#define NULL
[AI] Null pointer value (C/C++ semantics).
Definition: legotypes.h:26
#define SUCCESS
[AI] Used to indicate a successful operation in result codes.
Definition: legotypes.h:30
LegoWorld * CurrentWorld()
[AI] Accessor for the currently active LegoWorld instance. [AI]
Definition: misc.cpp:93
MxU8 MxBool
[AI]
Definition: mxtypes.h:124
MxLong MxResult
[AI]
Definition: mxtypes.h:106
[AI] Represents a single entry in the cached sound system, linking a sound pointer with its identifyi...