X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/7f0b95bbe1a91228e1d34a0c3aaa2fd9050a86dd..3e2656801d825761f55ea9b0b766802c6cd32f1d:/src/mac/carbon/sound.cpp diff --git a/src/mac/carbon/sound.cpp b/src/mac/carbon/sound.cpp index 3c4920a0cb..2aa657b7a0 100644 --- a/src/mac/carbon/sound.cpp +++ b/src/mac/carbon/sound.cpp @@ -19,6 +19,7 @@ #include "wx/file.h" #include "wx/sound.h" #include "wx/timer.h" +#include "wx/intl.h" #if wxUSE_SOUND @@ -41,7 +42,7 @@ // #ifdef __WXMAC__ -#include "wx/mac/private.h" +#include "wx/mac/uma.h" #include #include #endif @@ -63,17 +64,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 +142,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 +200,6 @@ public: // ------------------------------------------------------------------ // wxSound // ------------------------------------------------------------------ -wxTimer* lastSoundTimer=NULL; -bool lastSoundIsPlaying=false; //Determines whether version 4 of QT is installed Boolean wxIsQuickTime4Installed (void) @@ -251,13 +253,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 +360,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); } @@ -380,42 +376,57 @@ bool wxSound::DoPlay(unsigned flags) const if (!wxInitQT()) return false; - short movieResFile; - FSSpec sfFile; - -#ifdef __WXMAC__ - wxMacFilename2FSSpec( m_sndname , &sfFile ) ; -#else - int nError; - if ((nError = NativePathNameToFSSpec ((char*) m_sndname.c_str(), &sfFile, 0)) != noErr) + OSErr err = noErr ; +#if defined( __WXMAC__ ) && TARGET_API_MAC_OSX && ( MAC_OS_X_VERSION_MAX_ALLOWED > MAC_OS_X_VERSION_10_2 ) + if ( UMAGetSystemVersion() >= 0x1030 ) { - wxLogSysError(wxString::Format(wxT("File:%s does not exist\nError:%i"), - m_sndname.c_str(), nError)); - return false; + Handle dataRef = NULL; + OSType dataRefType; + + err = QTNewDataReferenceFromFullPathCFString(wxMacCFStringHolder(m_sndname,wxLocale::GetSystemEncoding()), + kQTNativeDefaultPathStyle, 0, &dataRef, &dataRefType); + + if (NULL != dataRef) + { + err = NewMovieFromDataRef( &movie, newMovieDontAskUnresolvedDataRefs , NULL, dataRef, dataRefType ); + DisposeHandle(dataRef); + } } + else #endif - - if (OpenMovieFile (&sfFile, &movieResFile, fsRdPerm) != noErr) { - wxLogSysError(wxT("Quicktime couldn't open the file")); - return false; + short movieResFile; + FSSpec sfFile; +#ifdef __WXMAC__ + wxMacFilename2FSSpec( m_sndname , &sfFile ) ; +#else + int nError; + if ((nError = NativePathNameToFSSpec ((char*) m_sndname.c_str(), &sfFile, 0)) != noErr) + { + wxLogSysError(wxString::Format(wxT("File:%s does not exist\nError:%i"), + m_sndname.c_str(), nError)); + return false; + } +#endif + if (OpenMovieFile (&sfFile, &movieResFile, fsRdPerm) != noErr) + { + wxLogSysError(wxT("Quicktime couldn't open the file")); + return false; + } + short movieResID = 0; + Str255 movieName; + + err = NewMovieFromFile ( + &movie, + movieResFile, + &movieResID, + movieName, + newMovieActive, + NULL); //wasChanged + + CloseMovieFile (movieResFile); } - - - short movieResID = 0; - Str255 movieName; - OSErr err; - - err = NewMovieFromFile ( - &movie, - movieResFile, - &movieResID, - movieName, - newMovieActive, - NULL); //wasChanged - - CloseMovieFile (movieResFile); - + if (err != noErr) { wxLogSysError( @@ -429,11 +440,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 +462,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 +473,11 @@ bool wxSound::IsPlaying() void wxSound::Stop() { - if(lastSoundIsPlaying) + if (lastSoundIsPlaying) { delete (wxTimer*&) lastSoundTimer; lastSoundIsPlaying = false; + lastSoundTimer = NULL; } }