Skip to content
This repository was archived by the owner on Aug 23, 2023. It is now read-only.

Commit 3153119

Browse files
Fixed free effects error caused by deletion of effect zone after playback. Can't delete effect zone during playback.
1 parent f1178ad commit 3153119

7 files changed

+69
-8
lines changed

src/echo-zone.cpp

Lines changed: 29 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -69,10 +69,7 @@ EchoZone::EchoZone() : EffectZone()
6969

7070
EchoZone::~EchoZone()
7171
{
72-
if(m_effect != 0 && m_slot != 0)
73-
{
74-
FreeEffects();
75-
}
72+
7673
}
7774

7875
void EchoZone::InitEchoZone(std::string& thisName,
@@ -210,16 +207,42 @@ ALuint EchoZone::GetEffectsSlot(){return m_slot;}
210207

211208
void EchoZone::FreeEffects()
212209
{
213-
if(m_effect != 0)
210+
//std::cout << "\nFree effects called!\n";
211+
ALenum err;
212+
213+
err = alGetError();
214+
if(err != AL_NO_ERROR)
215+
{
216+
fprintf(stderr, "1. free effects. value above code wrong. OpenAL error: %s\n", alGetString(err));
217+
}
218+
219+
if(m_effect)
214220
{
215221
alDeleteEffects(1, &m_effect);
216222
m_effect = 0;
217223
}
218-
if(m_slot != 0)
224+
225+
m_effect = 0;
226+
227+
err = alGetError();
228+
if(err != AL_NO_ERROR)
229+
{
230+
fprintf(stderr, "2. free effects. value above code wrong. OpenAL error: %s\n", alGetString(err));
231+
}
232+
233+
if(m_slot)
219234
{
220235
alDeleteAuxiliaryEffectSlots(1, &m_slot);
221236
m_slot = 0;
222237
}
238+
239+
err = alGetError();
240+
if(err != AL_NO_ERROR)
241+
{
242+
fprintf(stderr, "3. free effects. value above code wrong. OpenAL error: %s\n", alGetString(err));
243+
}
244+
245+
m_slot = 0;
223246
}
224247

225248
EchoZoneSaveData EchoZone::GetEchoZoneSaveData()

src/effects-manager.cpp

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -444,3 +444,16 @@ void EffectsManager::SetEffectZonePicked(bool state,EffectZoneType& type, int& i
444444
default:{ break;}
445445
}
446446
}
447+
448+
void EffectsManager::RemoveEffectFromAllSources()
449+
{
450+
for(size_t i = 0; i < m_sound_producer_reg_ptr->sound_producer_vector_ref->size(); i++)
451+
{
452+
SoundProducer* thisSoundProducer = m_sound_producer_reg_ptr->sound_producer_vector_ref->at(i).get();
453+
454+
ALuint* source_ptr = thisSoundProducer->getSource();
455+
456+
EffectsManager::RemoveEffectFromThisSource(source_ptr);
457+
thisSoundProducer->SetEffectAppliedBool(false);
458+
}
459+
}

src/effects-manager.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,8 @@ class EffectsManager
6868
friend class SaveSystem;
6969
friend class LoadSystem;
7070

71+
void RemoveEffectFromAllSources();
72+
7173
private:
7274

7375
//pointer to manager that contains all soundproducer tracks used
@@ -101,6 +103,8 @@ class EffectsManager
101103

102104
//std::vector <SoundProducerTrack*> *GetReferenceToSoundProducerTracksVector();
103105
SoundProducerRegistry* m_sound_producer_reg_ptr;
106+
107+
104108
};
105109

106110

src/immediate_mode_sound_player.cpp

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,8 @@ ImmediateModeSoundPlayer::ImmediateModeSoundPlayer()
1818
m_sound_producer_reg_ptr = nullptr;
1919

2020
time_res_seconds = double(TIME_RESOLUTION) / 1000;
21+
22+
player_active_use = false;
2123
}
2224

2325
ImmediateModeSoundPlayer::~ImmediateModeSoundPlayer()
@@ -37,6 +39,8 @@ void ImmediateModeSoundPlayer::SetPointerToEffectsManager(EffectsManager* effect
3739
local_effect_manager_ptr = effects_manager;
3840
}
3941

42+
bool ImmediateModeSoundPlayer::PlayerInActiveUse(){return player_active_use;}
43+
4044
void ImmediateModeSoundPlayer::RunStateForPlayer()
4145
{
4246

@@ -119,6 +123,8 @@ void DetermineEffect()
119123

120124
void ImmediateModeSoundPlayer::PlayAll()
121125
{
126+
player_active_use = true;
127+
122128
typedef std::chrono::high_resolution_clock clock;
123129
typedef std::chrono::duration<float, std::milli> duration;
124130

@@ -243,6 +249,9 @@ void ImmediateModeSoundPlayer::PauseAll()
243249
}
244250

245251
m_current_time += time_res_seconds;
252+
253+
player_active_use = false;
254+
m_effects_manager_ptr->RemoveEffectFromAllSources();
246255
}
247256

248257
}
@@ -268,6 +277,9 @@ void ImmediateModeSoundPlayer::StopAll()
268277

269278
}
270279

280+
player_active_use = false;
281+
m_effects_manager_ptr->RemoveEffectFromAllSources();
282+
271283
m_current_time = 0;
272284
}
273285

src/immediate_mode_sound_player.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,9 @@ class ImmediateModeSoundPlayer
2727

2828
enum class IMSoundPlayerState : std::uint8_t {NONE=0,PLAYING, PAUSED, REWINDING, FAST_FORWARDING };
2929

30+
//function to indicate that player is not in none or paused state.
31+
bool PlayerInActiveUse();
32+
3033
private:
3134

3235
//state of immmediate mode player
@@ -65,6 +68,9 @@ class ImmediateModeSoundPlayer
6568

6669
//amonut of time to increment for playback
6770
double time_res_seconds;
71+
72+
bool player_active_use;
73+
6874
};
6975

7076
#endif

src/main_gui_editor.cpp

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -346,6 +346,8 @@ static float new_listener_position_x = 0;
346346
static float new_listener_position_y = 0;
347347
static float new_listener_position_z = 0;
348348

349+
static bool sound_player_active = false;
350+
349351
void MainGuiEditor::logic()
350352
{
351353
float dt = GetFrameTime();
@@ -444,7 +446,7 @@ void MainGuiEditor::logic()
444446

445447
}
446448

447-
if(deleteKeyPressed)
449+
if(deleteKeyPressed && !sound_player_active)
448450
{
449451
if(soundproducer_picked != -1)
450452
{
@@ -476,6 +478,7 @@ void MainGuiEditor::logic()
476478
//run state for immediate mode sound player
477479
im_sound_player.RunStateForPlayer();
478480

481+
sound_player_active = im_sound_player.PlayerInActiveUse();
479482
}
480483

481484
void MainGuiEditor::DrawGUI_Items()

src/reverb-zone.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -616,7 +616,7 @@ ALuint ReverbZone::GetEffectsSlot(){return m_slot;}
616616

617617
void ReverbZone::FreeEffects()
618618
{
619-
std::cout << "\nFree effects called!\n";
619+
//std::cout << "\nFree effects called!\n";
620620
ALenum err;
621621

622622
err = alGetError();

0 commit comments

Comments
 (0)