Still can't do "if (flags & wxSOUND_SYNC)..." because it will always

be zero.  This is the 2nd or 3rd time I've fixed this, please stop
changing it back!

Fixes to allow ASYNC sounds to continue after the sound object has
been deleted, and so there won't be a crash the next time an async
sound is played.


git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@28730 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Robin Dunn 2004-08-09 23:04:22 +00:00
parent b6468434e3
commit c22edec9fc

View File

@ -63,17 +63,20 @@
#include <QuickTimeComponents.h>
//Time inbetween timer calls
//Time between timer calls
#define MOVIE_DELAY 100
static wxTimer* lastSoundTimer=NULL;
static bool lastSoundIsPlaying=false;
// ------------------------------------------------------------------
// wxQTTimer - Handle Asyncronous Playing
// ------------------------------------------------------------------
class wxQTTimer : public wxTimer
{
public:
wxQTTimer(Movie movie, bool bLoop, bool& playing) :
m_movie(movie), m_bLoop(bLoop), m_pbPlaying(&playing)
wxQTTimer(Movie movie, bool bLoop, bool* playing) :
m_movie(movie), m_bLoop(bLoop), m_pbPlaying(playing)
{
}
@ -138,8 +141,8 @@ public:
class wxSMTimer : public wxTimer
{
public:
wxSMTimer(void* hSnd, void* pSndChannel, const bool& bLoop, bool& playing)
: m_hSnd(hSnd), m_pSndChannel(pSndChannel), m_bLoop(bLoop), m_pbPlaying(&playing)
wxSMTimer(void* hSnd, void* pSndChannel, bool bLoop, bool* playing)
: m_hSnd(hSnd), m_pSndChannel(pSndChannel), m_bLoop(bLoop), m_pbPlaying(playing)
{
}
@ -196,8 +199,6 @@ public:
// ------------------------------------------------------------------
// wxSound
// ------------------------------------------------------------------
wxTimer* lastSoundTimer=NULL;
bool lastSoundIsPlaying=false;
//Determines whether version 4 of QT is installed
Boolean wxIsQuickTime4Installed (void)
@ -251,13 +252,6 @@ wxSound::wxSound(int size, const wxByte* data)
wxSound::~wxSound()
{
if(lastSoundIsPlaying)
{
if(m_type == wxSound_RESOURCE)
((wxSMTimer*)lastSoundTimer)->m_pbPlaying = NULL;
else
((wxQTTimer*)lastSoundTimer)->m_pbPlaying = NULL;
}
}
bool wxSound::Create(const wxString& fileName, bool isResource)
@ -365,7 +359,8 @@ bool wxSound::DoPlay(unsigned flags) const
{
lastSoundTimer = ((wxSMTimer*&)m_pTimer)
= new wxSMTimer(pSndChannel, m_hSnd, flags & wxSOUND_LOOP ? 1 : 0,
lastSoundIsPlaying=true);
&lastSoundIsPlaying);
lastSoundIsPlaying = true;
((wxTimer*)m_pTimer)->Start(MOVIE_DELAY, wxTIMER_CONTINUOUS);
}
@ -429,11 +424,19 @@ bool wxSound::DoPlay(unsigned flags) const
return false;
}//end switch(m_type)
//Start the movie!
StartMovie(movie);
if (flags & wxSOUND_SYNC)
if (flags & wxSOUND_ASYNC)
{
//Start timer and play movie asyncronously
lastSoundTimer = ((wxQTTimer*&)m_pTimer) =
new wxQTTimer(movie, flags & wxSOUND_LOOP ? 1 : 0,
&lastSoundIsPlaying);
lastSoundIsPlaying = true;
((wxQTTimer*)m_pTimer)->Start(MOVIE_DELAY, wxTIMER_CONTINUOUS);
}
else
{
wxASSERT_MSG(!(flags & wxSOUND_LOOP), wxT("Can't loop and play syncronously at the same time"));
@ -443,12 +446,6 @@ bool wxSound::DoPlay(unsigned flags) const
DisposeMovie(movie);
}
else
{
//Start timer and play movie asyncronously
lastSoundTimer = ((wxQTTimer*&)m_pTimer) = new wxQTTimer(movie, flags & wxSOUND_LOOP ? 1 : 0,lastSoundIsPlaying=true);
((wxQTTimer*)m_pTimer)->Start(MOVIE_DELAY, wxTIMER_CONTINUOUS);
}
return true;
}
@ -460,10 +457,11 @@ bool wxSound::IsPlaying()
void wxSound::Stop()
{
if(lastSoundIsPlaying)
if (lastSoundIsPlaying)
{
delete (wxTimer*&) lastSoundTimer;
lastSoundIsPlaying = false;
lastSoundTimer = NULL;
}
}