]> git.saurik.com Git - wxWidgets.git/blobdiff - src/osx/carbon/sound.cpp
fixing osx_cocoa, there's a reason m_peer is private in the base class
[wxWidgets.git] / src / osx / carbon / sound.cpp
index 6de5ccd27e24e46e8a8f9d4383d3e9ab61849f31..3ae66a0b12134699580483e9e9ad6db6d4115aa0 100644 (file)
@@ -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
@@ -187,13 +190,13 @@ public:
     wxOSXQuickTimeSoundData(const wxString& fileName);
     wxOSXQuickTimeSoundData(int size, const wxByte* 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) :
     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;
 }