applied patch #997019: '[wxMac] updated wxSound', adds static IsPlaying() and Stop()

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@28557 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Dimitri Schoolwerth 2004-07-31 07:36:13 +00:00
parent eaca2a2cfc
commit 4b430ee141
2 changed files with 137 additions and 100 deletions

View File

@ -2,11 +2,11 @@
// Name: sound.h
// Purpose: wxSound class (loads and plays short Windows .wav files).
// Optional on non-Windows platforms.
// Author: Stefan Csomor
// Author: Ryan Norton, Stefan Csomor
// Modified by:
// Created: 1998-01-01
// RCS-ID: $Id$
// Copyright: (c) Stefan Csomor
// Copyright: (c) Ryan Norton, Stefan Csomor
// Licence: wxWindows licence
/////////////////////////////////////////////////////////////////////////////
@ -32,12 +32,11 @@ public:
public:
bool Create(const wxString& fileName, bool isResource = FALSE);
bool IsOk() const { return !m_sndname.IsEmpty(); }
static void Stop();
static bool IsPlaying();
void* GetHandle();
protected:
// prevent collision with some BSD definitions of macro Free()
bool FreeData();
bool DoPlay(unsigned flags) const;
private:

View File

@ -1,7 +1,7 @@
/////////////////////////////////////////////////////////////////////////////
// Name: sound.cpp
// Purpose: wxSound class implementation: optional
// Author: Ryan Norton, Stefan Csomor
// Author: Ryan Norton
// Modified by:
// Created: 1998-01-01
// RCS-ID: $Id$
@ -72,34 +72,41 @@
class wxQTTimer : public wxTimer
{
public:
wxQTTimer(Movie movie, bool bLoop) :
m_movie(movie), m_bLoop(bLoop)
wxQTTimer(Movie movie, bool bLoop, bool& playing) :
m_movie(movie), m_bLoop(bLoop), m_pbPlaying(&playing)
{
}
~wxQTTimer()
{
Shutdown();
}
if(m_pbPlaying)
*m_pbPlaying = false;
void Shutdown()
{
StopMovie(m_movie);
DisposeMovie(m_movie);
m_movie = NULL ;
Stop();
//Note that ExitMovies() is not neccessary, but
//the docs are fuzzy on whether or not TerminateQTML is
ExitMovies();
#ifndef __WXMAC__
#ifndef __WXMAC__
TerminateQTML();
#endif
#endif
}
void Shutdown()
{
delete this;
}
void Notify()
{
if (m_pbPlaying && !*m_pbPlaying)
{
Shutdown();
}
if(IsMovieDone(m_movie))
{
if (!m_bLoop)
@ -117,27 +124,40 @@ public:
Movie& GetMovie() {return m_movie;}
protected:
Movie m_movie;
bool m_bLoop;
public:
bool* m_pbPlaying;
};
class wxSMTimer : public wxTimer
{
public:
wxSMTimer(void* hSnd, void* pSndChannel, const bool& bLoop)
: m_hSnd(hSnd), m_pSndChannel(pSndChannel), m_bLoop(bLoop)
wxSMTimer(void* hSnd, void* pSndChannel, const bool& bLoop, bool& playing)
: m_hSnd(hSnd), m_pSndChannel(pSndChannel), m_bLoop(bLoop), m_pbPlaying(&playing)
{
}
~wxSMTimer()
{
Shutdown();
if(m_pbPlaying)
*m_pbPlaying = false;
SndDisposeChannel((SndChannelPtr)m_pSndChannel, TRUE);
Stop();
}
void Notify()
{
if (m_pbPlaying && !*m_pbPlaying)
{
Shutdown();
}
SCStatus stat;
if (SndChannelStatus((SndChannelPtr)m_pSndChannel, sizeof(SCStatus), &stat) != 0)
@ -159,19 +179,25 @@ public:
void Shutdown()
{
SndDisposeChannel((SndChannelPtr)m_pSndChannel, TRUE);
Stop();
delete this;
}
void* GetChannel() {return m_pSndChannel;}
protected:
void* m_hSnd;
void* m_pSndChannel;
bool m_bLoop;
public:
bool* m_pbPlaying;
};
// ------------------------------------------------------------------
// wxSound
// ------------------------------------------------------------------
wxTimer* lastSoundTimer=NULL;
bool lastSoundIsPlaying=false;
//Determines whether version 4 of QT is installed
Boolean wxIsQuickTime4Installed (void)
@ -221,20 +247,22 @@ wxSound::wxSound(const wxString& sFileName, bool isResource)
wxSound::wxSound(int size, const wxByte* data)
: m_hSnd((char*)data), m_waveLength(size), m_pTimer(NULL), m_type(wxSound_MEMORY)
{
if (!wxInitQT())
m_type = wxSound_NONE;
}
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)
{
if(!wxInitQT())
return false;
FreeData();
Stop();
if (isResource)
{
@ -262,8 +290,7 @@ bool wxSound::Create(const wxString& fileName, bool isResource)
bool wxSound::DoPlay(unsigned flags) const
{
// wxASSERT(m_pTimer == NULL || !((wxTimer*)m_pTimer)->IsRunning() );
FreeData();
Stop();
Movie movie;
@ -271,6 +298,8 @@ bool wxSound::DoPlay(unsigned flags) const
{
case wxSound_MEMORY:
{
if (!wxInitQT())
return false;
Handle myHandle, dataRef = nil;
MovieImportComponent miComponent;
Track targetTrack = nil;
@ -326,15 +355,17 @@ bool wxSound::DoPlay(unsigned flags) const
SndChannelPtr pSndChannel;
SndNewChannel(&pSndChannel, sampledSynth,
initNoInterp +
(data.numChannels == 1 ? initMono : initStereo), NULL);
initNoInterp
+ (data.numChannels == 1 ? initMono : initStereo), NULL);
if(SndPlay(pSndChannel, (SndListHandle) m_hSnd, flags & wxSOUND_ASYNC ? 1 : 0) != noErr)
return false;
if (flags & wxSOUND_ASYNC)
{
((wxSMTimer*&)m_pTimer) = new wxSMTimer(pSndChannel, m_hSnd, flags & wxSOUND_LOOP ? 1 : 0);
lastSoundTimer = ((wxSMTimer*&)m_pTimer)
= new wxSMTimer(pSndChannel, m_hSnd, flags & wxSOUND_LOOP ? 1 : 0,
lastSoundIsPlaying=true);
((wxTimer*)m_pTimer)->Start(MOVIE_DELAY, wxTIMER_CONTINUOUS);
}
@ -346,6 +377,9 @@ bool wxSound::DoPlay(unsigned flags) const
break;
case wxSound_FILE:
{
if (!wxInitQT())
return false;
short movieResFile;
FSSpec sfFile;
@ -399,13 +433,7 @@ bool wxSound::DoPlay(unsigned flags) const
//Start the movie!
StartMovie(movie);
if (flags & wxSOUND_ASYNC)
{
//Start timer and play movie asyncronously
((wxQTTimer*&)m_pTimer) = new wxQTTimer(movie, flags & wxSOUND_LOOP ? 1 : 0);
((wxQTTimer*)m_pTimer)->Start(MOVIE_DELAY, wxTIMER_CONTINUOUS);
}
else
if (flags & wxSOUND_SYNC)
{
wxASSERT_MSG(!(flags & wxSOUND_LOOP), "Can't loop and play syncronously at the same time");
@ -415,26 +443,36 @@ bool wxSound::DoPlay(unsigned flags) const
DisposeMovie(movie);
}
return true;
}
void* wxSound::GetHandle()
{
return (void*) ((wxQTTimer*) m_pTimer)->GetMovie();
}
bool wxSound::FreeData()
{
if (m_pTimer != NULL)
else
{
delete (wxQTTimer*) m_pTimer;
m_pTimer = NULL;
//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;
}
bool wxSound::IsPlaying()
{
return lastSoundIsPlaying;
}
void wxSound::Stop()
{
if(lastSoundIsPlaying)
{
delete (wxTimer*&) lastSoundTimer;
lastSoundIsPlaying = false;
}
}
void* wxSound::GetHandle()
{
if(m_type == wxSound_RESOURCE)
return (void*) ((wxSMTimer*)m_pTimer)->GetChannel();
return (void*) ((wxQTTimer*) m_pTimer)->GetMovie();
}
#endif //wxUSE_SOUND