X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/4b430ee141ef657dc3dc5610d8bdbf568f38cc73..d49641639156283ee9fa747426f479f1567e0e76:/src/mac/carbon/sound.cpp diff --git a/src/mac/carbon/sound.cpp b/src/mac/carbon/sound.cpp index e346f5c9d4..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) @@ -228,7 +230,7 @@ inline bool wxInitQT () } else { - wxLogSysError("Quicktime is not installed, or Your Version of Quicktime is <= 4."); + wxLogSysError(wxT("Quicktime is not installed, or Your Version of Quicktime is <= 4.")); return false; } } @@ -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) @@ -273,7 +268,7 @@ bool wxSound::Create(const wxString& fileName, bool isResource) wxMacStringToPascal( fileName , lpSnd ) ; - m_sndname = lpSnd; + m_sndname = fileName; m_hSnd = (char*) GetNamedResource('snd ', (const unsigned char *) lpSnd); #else return false; @@ -322,7 +317,7 @@ bool wxSound::DoPlay(unsigned flags) const miComponent = OpenDefaultComponent(MovieImportType, kQTFileTypeAIFC); else { - wxLogSysError("wxSound - Location in memory does not contain valid data"); + wxLogSysError(wxT("wxSound - Location in memory does not contain valid data")); return false; } @@ -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,13 +440,21 @@ 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), "Can't loop and play syncronously at the same time"); + wxASSERT_MSG(!(flags & wxSOUND_LOOP), wxT("Can't loop and play syncronously at the same time")); //Play movie until it ends, then exit while (!IsMovieDone(movie)) @@ -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; } }