]> git.saurik.com Git - wxWidgets.git/commitdiff
To support playing async sounds on the stack on Mac, do not delete the wxSoundData...
authorKevin Ollivier <kevino@theolliviers.com>
Wed, 30 Dec 2009 17:41:29 +0000 (17:41 +0000)
committerKevin Ollivier <kevino@theolliviers.com>
Wed, 30 Dec 2009 17:41:29 +0000 (17:41 +0000)
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@63023 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

include/wx/osx/sound.h
src/osx/carbon/sound.cpp
src/osx/core/sound.cpp
src/osx/sound_osx.cpp

index 10a781caf97f7b3147885754878fc5858e928aa8..7b0329bdec3bc1e967d9ff7fc18feff7cd7e63fb 100644 (file)
@@ -30,6 +30,9 @@ public :
     virtual void Stop();
     // can be called by a timer for repeated tasks during playback
     virtual void SoundTask();
+    // mark this to be deleted
+    virtual void MarkForDeletion();
+    virtual bool IsMarkedForDeletion() const { return m_markedForDeletion; }
     
     // does the true work of stopping and cleaning up
     virtual void DoStop() = 0;
@@ -38,6 +41,7 @@ protected :
     
     unsigned int m_flags;
     wxSoundTimer* m_pTimer;
+    bool m_markedForDeletion;
 } ;
 
 class WXDLLIMPEXP_ADV wxSound : public wxSoundBase
index 6de5ccd27e24e46e8a8f9d4383d3e9ab61849f31..39bb269856513287ef54a55d50720a4ecaf42972 100644 (file)
@@ -100,6 +100,9 @@ void wxOSXSoundManagerSoundData::DoStop()
         m_pSndChannel = NULL;
         wxSound::SoundStopped(this);
     }
+    
+    if (IsMarkedForDeletion())
+        delete this;
 }
 
 bool wxOSXSoundManagerSoundData::Play(unsigned flags)
index fd9d6d4b768c55814a37479394ed43c6484cb5ea..8d6c883af6ab8952f42b898e1d58bdad44298731 100644 (file)
@@ -68,6 +68,9 @@ wxOSXAudioToolboxSoundData::CompletionCallback(SystemSoundID WXUNUSED(mySSID),
     wxOSXAudioToolboxSoundData* data = (wxOSXAudioToolboxSoundData*) soundRef;
     
     data->SoundCompleted();
+    
+    if (data->IsMarkedForDeletion())
+        delete data;
 }
 
 void wxOSXAudioToolboxSoundData::SoundCompleted()
index 141552e29aa3f128c109a9320c6c77606edfb7c6..1155660e46ddb01ae0e634760927b6fb7f7ca83a 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,12 +58,18 @@ wxVector<wxSoundData*> 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<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()