]> git.saurik.com Git - wxWidgets.git/blobdiff - src/osx/sound_osx.cpp
Swap client data pointers in wxRearrangeList too.
[wxWidgets.git] / src / osx / sound_osx.cpp
index 141552e29aa3f128c109a9320c6c77606edfb7c6..ba8d3166f65e2f92e9de66deff173bfe09563e80 100644 (file)
@@ -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<wxSoundData*> 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<wxSoundData*>::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()