// Name: 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
+// Copyright: (c) Ryan Norton
// Licence: wxWindows licence
/////////////////////////////////////////////////////////////////////////////
-#ifdef __GNUG__
+#if defined(__GNUG__) && !defined(NO_GCC_PRAGMA)
#pragma implementation "sound.h"
#endif
+#include "wx/wxprec.h"
+
#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
//
#ifdef __WXMAC__
-#include "wx/mac/private.h"
+#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 <qtml.h>
#endif
+#ifndef __DARWIN__
#include <QuickTimeComponents.h>
+#else
+#include <QuickTime/QuickTimeComponents.h>
+#endif
-//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)
{
}
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();
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)
{
}
// ------------------------------------------------------------------
// wxSound
// ------------------------------------------------------------------
-wxTimer* lastSoundTimer=NULL;
-bool lastSoundIsPlaying=false;
//Determines whether version 4 of QT is installed
Boolean wxIsQuickTime4Installed (void)
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;
}
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;
}
}
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)
wxMacStringToPascal( fileName , lpSnd ) ;
- m_sndname = lpSnd;
+ m_sndname = fileName;
m_hSnd = (char*) GetNamedResource('snd ', (const unsigned char *) lpSnd);
#else
return false;
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;
}
{
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);
}
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
-
- 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(
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
+ //Note that due to quicktime caching this may not always
+ //work 100% correctly
while (!IsMovieDone(movie))
- MoviesTask(movie, 0);
+ MoviesTask(movie, 1);
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;
}
void wxSound::Stop()
{
- if(lastSoundIsPlaying)
+ if (lastSoundIsPlaying)
{
delete (wxTimer*&) lastSoundTimer;
lastSoundIsPlaying = false;
+ lastSoundTimer = NULL;
}
}