X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/deb0a11e9907e4834247d7cddebe9edbb71dd34b..64ea838d8f4d1853b7d850db93ee565e901d099a:/src/osx/carbon/sound.cpp?ds=inline diff --git a/src/osx/carbon/sound.cpp b/src/osx/carbon/sound.cpp index 6de5ccd27e..cfd49959a9 100644 --- a/src/osx/carbon/sound.cpp +++ b/src/osx/carbon/sound.cpp @@ -66,23 +66,23 @@ class wxOSXSoundManagerSoundData : public wxSoundData public: wxOSXSoundManagerSoundData(const wxString& fileName); ~wxOSXSoundManagerSoundData(); - + virtual bool Play(unsigned flags); virtual void SoundTask(); void DoStop(); protected: - SndListHandle m_hSnd; + SndListHandle m_hSnd; SndChannelPtr m_pSndChannel; }; wxOSXSoundManagerSoundData::wxOSXSoundManagerSoundData(const wxString& fileName) : m_pSndChannel(NULL) -{ +{ Str255 lpSnd ; - + wxMacStringToPascal( fileName , lpSnd ) ; - + m_hSnd = (SndListHandle) GetNamedResource('snd ', (const unsigned char *) lpSnd); } @@ -100,6 +100,9 @@ void wxOSXSoundManagerSoundData::DoStop() m_pSndChannel = NULL; wxSound::SoundStopped(this); } + + if (IsMarkedForDeletion()) + delete this; } bool wxOSXSoundManagerSoundData::Play(unsigned flags) @@ -110,31 +113,31 @@ bool wxOSXSoundManagerSoundData::Play(unsigned flags) SoundComponentData data; unsigned long numframes, offset; - + ParseSndHeader((SndListHandle)m_hSnd, &data, &numframes, &offset); SndNewChannel(&m_pSndChannel, sampledSynth, initNoInterp + (data.numChannels == 1 ? initMono : initStereo), NULL); - + if(SndPlay(m_pSndChannel, (SndListHandle) m_hSnd, flags & wxSOUND_ASYNC ? 1 : 0) != noErr) return false; - + if (flags & wxSOUND_ASYNC) CreateAndStartTimer(); else DoStop(); - + return true; } void wxOSXSoundManagerSoundData::SoundTask() { SCStatus stat; - + if (SndChannelStatus((SndChannelPtr)m_pSndChannel, sizeof(SCStatus), &stat) != 0) Stop(); - + //if the sound isn't playing anymore, see if it's looped, //and if so play it again, otherwise close things up if (stat.scChannelBusy == FALSE) @@ -175,7 +178,7 @@ void wxExitQT() //Note that ExitMovies() is not necessary, but //the docs are fuzzy on whether or not TerminateQTML is ExitMovies(); - + #ifndef __WXMAC__ TerminateQTML(); #endif @@ -185,15 +188,15 @@ class wxOSXQuickTimeSoundData : public wxSoundData { public: wxOSXQuickTimeSoundData(const wxString& fileName); - wxOSXQuickTimeSoundData(int size, const wxByte* data); + wxOSXQuickTimeSoundData(size_t size, const void* data); ~wxOSXQuickTimeSoundData(); - + virtual bool Play(unsigned flags); virtual void SoundTask(); virtual void DoStop(); protected: Movie m_movie; - + wxString m_sndname; //file path Handle m_soundHandle; }; @@ -201,13 +204,13 @@ protected: wxOSXQuickTimeSoundData::wxOSXQuickTimeSoundData(const wxString& fileName) : m_movie(NULL), m_soundHandle(NULL) -{ +{ m_sndname = fileName; } -wxOSXQuickTimeSoundData::wxOSXQuickTimeSoundData(int size, const wxByte* data) : +wxOSXQuickTimeSoundData::wxOSXQuickTimeSoundData(size_t size, const void* data) : m_movie(NULL) -{ +{ m_soundHandle = NewHandleClear((Size)size); BlockMove(data, *m_soundHandle, size); } @@ -222,9 +225,9 @@ bool wxOSXQuickTimeSoundData::Play(unsigned flags) { if ( m_movie ) Stop(); - + m_flags = flags; - + if (!wxInitQT()) return false; @@ -237,9 +240,9 @@ bool wxOSXQuickTimeSoundData::Play(unsigned flags) long outFlags = 0; OSErr err; ComponentResult result; - + err = PtrToHand(&m_soundHandle, &dataRef, sizeof(Handle)); - + HLock(m_soundHandle); if (memcmp(&(*m_soundHandle)[8], "WAVE", 4) == 0) miComponent = OpenDefaultComponent(MovieImportType, kQTFileTypeWave); @@ -253,43 +256,43 @@ bool wxOSXQuickTimeSoundData::Play(unsigned flags) wxLogSysError(wxT("wxSound - Location in memory does not contain valid data")); return false; } - + HUnlock(m_soundHandle); m_movie = NewMovie(0); - + result = MovieImportDataRef(miComponent, dataRef, HandleDataHandlerSubType, m_movie, nil, &targetTrack, nil, &addedDuration, movieImportCreateTrack, &outFlags); - + if (result != noErr) { wxLogSysError(wxString::Format(wxT("Couldn't import movie data\nError:%i"), (int)result)); } - + SetMovieVolume(m_movie, kFullVolume); GoToBeginningOfMovie(m_movie); } else { OSErr err = noErr ; - + Handle dataRef = NULL; OSType dataRefType; - + err = QTNewDataReferenceFromFullPathCFString(wxCFStringRef(m_sndname,wxLocale::GetSystemEncoding()), (UInt32)kQTNativeDefaultPathStyle, 0, &dataRef, &dataRefType); - + wxASSERT(err == noErr); - + if (NULL != dataRef || err != noErr) { err = NewMovieFromDataRef( &m_movie, newMovieDontAskUnresolvedDataRefs , NULL, dataRef, dataRefType ); wxASSERT(err == noErr); DisposeHandle(dataRef); } - + if (err != noErr) { wxLogSysError( @@ -298,10 +301,10 @@ bool wxOSXQuickTimeSoundData::Play(unsigned flags) return false; } } - + //Start the m_movie! StartMovie(m_movie); - + if (flags & wxSOUND_ASYNC) { CreateAndStartTimer(); @@ -309,16 +312,16 @@ bool wxOSXQuickTimeSoundData::Play(unsigned flags) else { wxASSERT_MSG(!(flags & wxSOUND_LOOP), wxT("Can't loop and play syncronously at the same time")); - + //Play movie until it ends, then exit //Note that due to quicktime caching this may not always //work 100% correctly while (!IsMovieDone(m_movie)) MoviesTask(m_movie, 1); - + DoStop(); } - + return true; } @@ -351,7 +354,7 @@ void wxOSXQuickTimeSoundData::SoundTask() MoviesTask(m_movie, MOVIE_DELAY); //Give QT time to play movie } -bool wxSound::Create(int size, const wxByte* data) +bool wxSound::Create(size_t size, const void* data) { m_data = new wxOSXQuickTimeSoundData(size,data); return true;