X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/3b3d8b979b9c8cb76a550cf3e0c0c42fa0dc3fa2..5778dedc92f6d31435aa1cda6846979a0e9ad35b:/src/osx/sound_osx.cpp diff --git a/src/osx/sound_osx.cpp b/src/osx/sound_osx.cpp index 141552e29a..ba8d3166f6 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,20 +58,22 @@ wxVector s_soundsPlaying; wxSoundData::wxSoundData() { m_pTimer = NULL; + m_markedForDeletion = false; } wxSoundData::~wxSoundData() { } +void wxSoundData::MarkForDeletion() +{ + m_markedForDeletion = true; +} + void wxSoundData::Stop() { DoStop(); - if ( m_pTimer ) - { - delete m_pTimer; - m_pTimer = NULL; - } + wxDELETE(m_pTimer); } //Time between timer calls @@ -105,7 +109,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()