// Name: src/osx/sound_osx.cpp
// Purpose: wxSound class common osx code
// Author: Stefan Csomor
-// Modified by:
+// Modified by:
// Created: 2009-09-01
-// RCS-ID: $Id: sound.cpp 61475 2009-07-20 16:47:54Z VZ $
// Copyright: (c) Stefan Csomor
// Licence: wxWindows licence
/////////////////////////////////////////////////////////////////////////////
: m_sound(snd)
{
}
-
+
virtual ~wxSoundTimer()
{
Stop();
- m_sound->DoStop();
+ if (m_sound)
+ m_sound->DoStop();
}
-
+
void Notify()
{
- m_sound->SoundTask();
+ if (m_sound)
+ m_sound->SoundTask();
}
-
+
protected:
wxSoundData* m_sound;
};
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
m_pTimer->Start(MOVIE_DELAY, wxTIMER_CONTINUOUS);
}
-wxSound::wxSound()
+wxSound::wxSound()
{
Init();
}
Create(sFileName, isResource);
}
-wxSound::wxSound(int size, const wxByte* data)
+wxSound::wxSound(size_t size, const void* data)
{
Init();
Create( size, 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()
if ( !m_data->Play(flags) )
s_soundsPlaying.pop_back();
}
-
+
return false;
}
for ( wxVector<wxSoundData*>::iterator s = s_soundsPlaying.begin();
s != s_soundsPlaying.end(); ++s )
{
- if ( (*s) == data )
+ if ( (*s) == data )
{
s_soundsPlaying.erase(s);
break;