]> git.saurik.com Git - wxWidgets.git/blobdiff - src/mac/carbon/sound.cpp
changing guard to support popupwindows as well
[wxWidgets.git] / src / mac / carbon / sound.cpp
index 2aa657b7a0e49a83a985ab1557a6edcc5482f07a..b3ff384fc86d9544d2b81cede45cca6357e8de31 100644 (file)
@@ -1,27 +1,30 @@
 /////////////////////////////////////////////////////////////////////////////
-// Name:        sound.cpp
+// Name:        src/mac/carbon/sound.cpp
 // Purpose:     wxSound class implementation: optional
 // Author:      Ryan Norton
-// Modified by:
+// Modified by: Stefan Csomor
 // Created:     1998-01-01
 // RCS-ID:      $Id$
-// Copyright:   (c) Ryan Norton, Stefan Csomor
-// Licence:       wxWindows licence
+// Copyright:   (c) Ryan Norton
+// Licence:     wxWindows licence
 /////////////////////////////////////////////////////////////////////////////
 
-#ifdef __GNUG__
-#pragma implementation "sound.h"
-#endif
+// For compilers that support precompilation, includes "wx.h".
+#include "wx/wxprec.h"
+
+#if wxUSE_SOUND
 
-#include "wx/object.h"
-#include "wx/string.h"
-#include "wx/log.h"
-#include "wx/file.h"
 #include "wx/sound.h"
-#include "wx/timer.h"
-#include "wx/intl.h"
 
-#if wxUSE_SOUND
+#ifndef WX_PRECOMP
+    #include "wx/object.h"
+    #include "wx/string.h"
+    #include "wx/intl.h"
+    #include "wx/log.h"
+    #include "wx/timer.h"
+#endif
+
+#include "wx/file.h"
 
 // Carbon QT Implementation Details -
 //
@@ -33,9 +36,9 @@
 // 5) IsMovieDone(), MoviesTask() //2nd param is minimum wait time to allocate to quicktime
 //
 // File:
-// 1) Obtain FSSpec
-// 2) Call OpenMovieFile
-// 3) Call NewMovieFromFile
+// 1) Path as CFString
+// 2) Call QTNewDataReferenceFromFullPathCFString
+// 3) Call NewMovieFromDataRef
 // 4) Call CloseMovieFile
 // 4) PlayMovie();
 // 5) IsMovieDone(), MoviesTask() //2nd param is minimum wait time to allocate to quicktime
 
 #ifdef __WXMAC__
 #include "wx/mac/uma.h"
+#ifndef __DARWIN__
 #include <Movies.h>
 #include <Gestalt.h>
 #endif
+#endif
 
-#if defined __WXMAC__ && defined __DARWIN__/*TARGET_CARBON*/
-#ifdef __APPLE_CC__
 #include <Carbon/Carbon.h>
-#else
-#include <Carbon.h>
-#endif
-#else
-#include <Sound.h>
-#endif
 
 //quicktime media layer only required for mac emulation on pc
 #ifndef __WXMAC__
 #include <qtml.h>
 #endif
 
+#ifndef __DARWIN__
 #include <QuickTimeComponents.h>
+#else
+#include <QuickTime/QuickTimeComponents.h>
+#endif
 
 //Time between timer calls
 #define MOVIE_DELAY 100
 static wxTimer* lastSoundTimer=NULL;
 static bool lastSoundIsPlaying=false;
 
+#if !defined(__LP64__)
+#define USE_QUICKTIME 1
+#else
+#define USE_QUICKTIME 0
+#endif
+
+#if USE_QUICKTIME
 // ------------------------------------------------------------------
 //          wxQTTimer - Handle Asyncronous Playing
 // ------------------------------------------------------------------
@@ -81,7 +89,7 @@ public:
     {
     }
 
-    ~wxQTTimer()
+    virtual ~wxQTTimer()
     {
         if(m_pbPlaying)
             *m_pbPlaying = false;
@@ -90,7 +98,7 @@ public:
         DisposeMovie(m_movie);
         Stop();
 
-        //Note that ExitMovies() is not neccessary, but
+        //Note that ExitMovies() is not necessary, but
         //the docs are fuzzy on whether or not TerminateQTML is
         ExitMovies();
 
@@ -147,7 +155,7 @@ public:
     {
     }
 
-    ~wxSMTimer()
+    virtual ~wxSMTimer()
     {
         if(m_pbPlaying)
             *m_pbPlaying = false;
@@ -223,7 +231,7 @@ inline bool wxInitQT ()
         int nError;
         //-2093 no dll
             if ((nError = InitializeQTML(0)) != noErr)
-                wxLogSysError(wxString::Format("Couldn't Initialize Quicktime-%i", nError));
+                wxLogSysError(wxString::Format(wxT("Couldn't Initialize Quicktime-%i"), nError));
         #endif
         EnterMovies();
         return true;
@@ -235,6 +243,8 @@ inline bool wxInitQT ()
     }
 }
 
+#endif
+
 wxSound::wxSound()
 : m_hSnd(NULL), m_waveLength(0), m_pTimer(NULL), m_type(wxSound_NONE)
 {
@@ -287,6 +297,8 @@ bool wxSound::DoPlay(unsigned flags) const
 {
     Stop();
 
+#if USE_QUICKTIME
+
     Movie movie;
 
     switch(m_type)
@@ -377,56 +389,22 @@ bool wxSound::DoPlay(unsigned flags) const
                 return false;
 
             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 )
-            {
-                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
+
+            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)
             {
-                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);
+                err = NewMovieFromDataRef( &movie, newMovieDontAskUnresolvedDataRefs , NULL, dataRef, dataRefType );
+                wxASSERT(err == noErr);
+                DisposeHandle(dataRef);
             }
-            
+
             if (err != noErr)
             {
                 wxLogSysError(
@@ -457,11 +435,14 @@ bool wxSound::DoPlay(unsigned flags) const
         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(movie))
-            MoviesTask(movie, 0);
+            MoviesTask(movie, 1);
 
         DisposeMovie(movie);
     }
+#endif
 
     return true;
 }
@@ -483,10 +464,13 @@ void wxSound::Stop()
 
 void* wxSound::GetHandle()
 {
+#if USE_QUICKTIME
     if(m_type == wxSound_RESOURCE)
         return (void*)  ((wxSMTimer*)m_pTimer)->GetChannel();
 
     return (void*) ((wxQTTimer*) m_pTimer)->GetMovie();
+#endif
+    return NULL;
 }
 
 #endif //wxUSE_SOUND