]> git.saurik.com Git - wxWidgets.git/blobdiff - src/mac/carbon/sound.cpp
Include wx/bitmap.h according to precompiled headers of wx/wx.h (with other minor...
[wxWidgets.git] / src / mac / carbon / sound.cpp
index 3c4920a0cbb3b2151862179db165aeeac04874bd..f6ccb1557b2b001d25ecf697a8d6a6287965df40 100644 (file)
@@ -1,26 +1,30 @@
 /////////////////////////////////////////////////////////////////////////////
 /////////////////////////////////////////////////////////////////////////////
-// Name:        sound.cpp
+// Name:        src/mac/carbon/sound.cpp
 // Purpose:     wxSound class implementation: optional
 // Author:      Ryan Norton
 // Purpose:     wxSound class implementation: optional
 // Author:      Ryan Norton
-// Modified by:
+// Modified by: Stefan Csomor
 // Created:     1998-01-01
 // RCS-ID:      $Id$
 // 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/sound.h"
-#include "wx/timer.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 -
 //
 
 // Carbon QT Implementation Details -
 //
 //
 
 #ifdef __WXMAC__
 //
 
 #ifdef __WXMAC__
-#include "wx/mac/private.h"
+#include "wx/mac/uma.h"
+#ifndef __DARWIN__
 #include <Movies.h>
 #include <Gestalt.h>
 #endif
 #include <Movies.h>
 #include <Gestalt.h>
 #endif
+#endif
 
 #if defined __WXMAC__ && defined __DARWIN__/*TARGET_CARBON*/
 #ifdef __APPLE_CC__
 
 #if defined __WXMAC__ && defined __DARWIN__/*TARGET_CARBON*/
 #ifdef __APPLE_CC__
 #include <qtml.h>
 #endif
 
 #include <qtml.h>
 #endif
 
+#ifndef __DARWIN__
 #include <QuickTimeComponents.h>
 #include <QuickTimeComponents.h>
+#else
+#include <QuickTime/QuickTimeComponents.h>
+#endif
 
 
-//Time inbetween timer calls
+//Time between timer calls
 #define MOVIE_DELAY 100
 
 #define MOVIE_DELAY 100
 
+static wxTimer* lastSoundTimer=NULL;
+static bool lastSoundIsPlaying=false;
+
 // ------------------------------------------------------------------
 //          wxQTTimer - Handle Asyncronous Playing
 // ------------------------------------------------------------------
 class wxQTTimer : public wxTimer
 {
 public:
 // ------------------------------------------------------------------
 //          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)
     {
     }
 
     {
     }
 
@@ -86,7 +99,7 @@ public:
         DisposeMovie(m_movie);
         Stop();
 
         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();
 
         //the docs are fuzzy on whether or not TerminateQTML is
         ExitMovies();
 
@@ -138,8 +151,8 @@ public:
 class wxSMTimer : public wxTimer
 {
 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 +209,6 @@ public:
 // ------------------------------------------------------------------
 //          wxSound
 // ------------------------------------------------------------------
 // ------------------------------------------------------------------
 //          wxSound
 // ------------------------------------------------------------------
-wxTimer* lastSoundTimer=NULL;
-bool lastSoundIsPlaying=false;
 
 //Determines whether version 4 of QT is installed
 Boolean wxIsQuickTime4Installed (void)
 
 //Determines whether version 4 of QT is installed
 Boolean wxIsQuickTime4Installed (void)
@@ -221,7 +232,7 @@ inline bool wxInitQT ()
         int nError;
         //-2093 no dll
             if ((nError = InitializeQTML(0)) != noErr)
         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;
         #endif
         EnterMovies();
         return true;
@@ -251,13 +262,6 @@ wxSound::wxSound(int size, const wxByte* data)
 
 wxSound::~wxSound()
 {
 
 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)
 }
 
 bool wxSound::Create(const wxString& fileName, bool isResource)
@@ -365,7 +369,8 @@ bool wxSound::DoPlay(unsigned flags) const
             {
                 lastSoundTimer = ((wxSMTimer*&)m_pTimer)
                     = new wxSMTimer(pSndChannel, m_hSnd, flags & wxSOUND_LOOP ? 1 : 0,
             {
                 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);
             }
 
                 ((wxTimer*)m_pTimer)->Start(MOVIE_DELAY, wxTIMER_CONTINUOUS);
             }
@@ -380,42 +385,76 @@ bool wxSound::DoPlay(unsigned flags) const
             if (!wxInitQT())
                 return false;
 
             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 ;
+//NB:  RN: Stefan - I think the 10.3 path functions are broken if kQTNativeDefaultPathStyle is
+//going to trigger a warning every time it is used - where its _supposed to be used_!!
+//(kQTNativePathStyle is negative but the function argument is unsigned!)
+//../src/mac/carbon/sound.cpp: In member function `virtual bool
+//   wxSound::DoPlay(unsigned int) const':
+//../src/mac/carbon/sound.cpp:387: warning: passing negative value `
+//   kQTNativeDefaultPathStyle' for argument passing 2 of `OSErr
+//   QTNewDataReferenceFromFullPathCFString(const __CFString*, long unsigned int,
+//   long unsigned int, char***, OSType*)'
+//../src/mac/carbon/sound.cpp:387: warning: argument of negative value `
+//   kQTNativeDefaultPathStyle' to `long unsigned int'
+#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()),
+                    //FIXME: Why does this have to be casted?
+                    (unsigned int)kQTNativeDefaultPathStyle,
+                    //FIXME: End
+                    0, &dataRef, &dataRefType);
+
+                wxASSERT(err == noErr);
+
+                if (NULL != dataRef || err != noErr)
+                {
+                    err = NewMovieFromDataRef( &movie, newMovieDontAskUnresolvedDataRefs , NULL, dataRef, dataRefType );
+                    wxASSERT(err == noErr);
+                    DisposeHandle(dataRef);
+                }
             }
             }
+            else
 #endif
 #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(
             if (err != noErr)
             {
                 wxLogSysError(
@@ -429,26 +468,30 @@ bool wxSound::DoPlay(unsigned flags) const
         return false;
     }//end switch(m_type)
 
         return false;
     }//end switch(m_type)
 
-
     //Start the movie!
     StartMovie(movie);
 
     //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"));
 
         //Play movie until it ends, then exit
     {
         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))
         while (!IsMovieDone(movie))
-            MoviesTask(movie, 0);
+            MoviesTask(movie, 1);
 
         DisposeMovie(movie);
     }
 
         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;
 }
 
     return true;
 }
@@ -460,10 +503,11 @@ bool wxSound::IsPlaying()
 
 void wxSound::Stop()
 {
 
 void wxSound::Stop()
 {
-    if(lastSoundIsPlaying)
+    if (lastSoundIsPlaying)
     {
         delete (wxTimer*&) lastSoundTimer;
         lastSoundIsPlaying = false;
     {
         delete (wxTimer*&) lastSoundTimer;
         lastSoundIsPlaying = false;
+        lastSoundTimer = NULL;
     }
 }
 
     }
 }