From c22edec9fceab1ddd75f886008dbd6218446201c Mon Sep 17 00:00:00 2001 From: Robin Dunn Date: Mon, 9 Aug 2004 23:04:22 +0000 Subject: [PATCH] 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 --- src/mac/carbon/sound.cpp | 46 +++++++++++++++++++--------------------- 1 file changed, 22 insertions(+), 24 deletions(-) diff --git a/src/mac/carbon/sound.cpp b/src/mac/carbon/sound.cpp index 3c4920a0cb..fc24d21ac3 100644 --- a/src/mac/carbon/sound.cpp +++ b/src/mac/carbon/sound.cpp @@ -63,17 +63,20 @@ #include -//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; } }