X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/3b3d8b979b9c8cb76a550cf3e0c0c42fa0dc3fa2..2efd54a41b12a5977713c837c585d89f35a13d14:/src/osx/sound_osx.cpp diff --git a/src/osx/sound_osx.cpp b/src/osx/sound_osx.cpp index 141552e29a..1155660e46 100644 --- a/src/osx/sound_osx.cpp +++ b/src/osx/sound_osx.cpp @@ -39,12 +39,14 @@ public: virtual ~wxSoundTimer() { Stop(); - m_sound->DoStop(); + if (m_sound) + m_sound->DoStop(); } void Notify() { - m_sound->SoundTask(); + if (m_sound) + m_sound->SoundTask(); } protected: @@ -56,12 +58,18 @@ wxVector s_soundsPlaying; wxSoundData::wxSoundData() { m_pTimer = NULL; + m_markedForDeletion = false; } wxSoundData::~wxSoundData() { } +void wxSoundData::MarkForDeletion() +{ + m_markedForDeletion = true; +} + void wxSoundData::Stop() { DoStop(); @@ -105,7 +113,24 @@ wxSound::wxSound(int size, const wxByte* data) wxSound::~wxSound() { - delete m_data; + // if the sound is in a playing state, just mark it to be deleted and + // delete it after it plays. Otherwise, async sounds created on the stack + // may never get the chance to play. + bool isPlaying = false; + for ( wxVector::reverse_iterator s = s_soundsPlaying.rbegin(); + s != s_soundsPlaying.rend(); ++s ) + { + if (*s == m_data) + { + isPlaying = true; + break; + } + } + + if (isPlaying) + m_data->MarkForDeletion(); + else + delete m_data; } void wxSound::Init()