///////////////////////////////////////////////////////////////////////////// // Name: mac/carbon/moviectrl.cpp // Purpose: wxMovieCtrl MAC CARBON QT // Author: Ryan Norton // Modified by: // Created: 11/07/04 // RCS-ID: $Id$ // Copyright: (c) Ryan Norton // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// //#if defined(__GNUG__) && !defined(NO_GCC_PRAGMA) //#pragma implementation "moviectrl.h" //#endif // For compilers that support precompilation, includes "wx.h". #include "wx/wxprec.h" #ifdef __BORLANDC__ #pragma hdrstop #endif #define wxUSE_MOVIECTRL 1 #if wxUSE_MOVIECTRL #include "wx/moviectrl.h" #include "wx/sound.h" #include "wx/timer.h" IMPLEMENT_CLASS(wxMovieCtrl, wxControl); BEGIN_EVENT_TABLE(wxMovieCtrl, wxControl) EVT_SIZE(wxMovieCtrl::OnSize) END_EVENT_TABLE() //MESSY headers #ifdef __WXMAC__ #include "wx/mac/uma.h" #include #include #endif //quicktime media layer only required for mac emulation on pc #ifndef __WXMAC__ #include #endif #include //Time between timer calls #define MOVIE_DELAY 100 // ------------------------------------------------------------------ // wxQTTimer - Handle Asyncronous Playing // ------------------------------------------------------------------ class _wxQTTimer : public wxTimer { public: _wxQTTimer(Movie movie) : m_movie(movie), m_bPaused(false) { } ~_wxQTTimer() { } bool GetPaused() {return m_bPaused;} void SetPaused(bool bPaused) {m_bPaused = bPaused;} void Notify() { if (!m_bPaused) { if(!IsMovieDone(m_movie)) MoviesTask(m_movie, MOVIE_DELAY); //Give QT time to play movie else Stop(); } } protected: Movie m_movie; bool m_bPaused; }; //Determines whether version 3 of QT is installed Boolean wxIsQuickTime3Installed (void) { #ifdef __WXMAC__ short error; long result; error = Gestalt (gestaltQuickTime, &result); return (error == noErr) && (((result >> 16) & 0xffff) >= 0x0300); #else return true; #endif } bool wxMovieCtrl::InitQT () { if (wxIsQuickTime3Installed()) { #ifndef __WXMAC__ int nError; //-2093 no dll if ((nError = InitializeQTML(0)) != noErr) { wxFAIL_MSG(wxString::Format(wxT("Couldn't Initialize Quicktime-%i"), nError)); } #endif EnterMovies(); return true; } else { wxFAIL_MSG(wxT("Quicktime is not installed, or Your Version of Quicktime is <= 4.")); return false; } } bool wxMovieCtrl::Create(wxWindow* parent, wxWindowID id, const wxString& fileName, const wxString& label, const wxPoint& pos, const wxSize& size, long WXUNUSED(style), const wxString& name) { if ( !InitQT() ) return false; OSErr err = noErr; short movieResFile; FSSpec sfFile; #ifdef __WXMAC__ wxMacFilename2FSSpec( m_sndname , &sfFile ) ; #else int nError; if ((nError = NativePathNameToFSSpec ((char*) fileName.c_str(), &sfFile, 0)) != noErr) { wxFAIL_MSG(wxString::Format(wxT("File:%s does not exist\nError:%i"), fileName.c_str(), nError)); return false; } #endif if (OpenMovieFile (&sfFile, &movieResFile, fsRdPerm) != noErr) { wxFAIL_MSG(wxT("Quicktime couldn't open the file")); return false; } short movieResID = 0; Str255 movieName; err = NewMovieFromFile ( &m_movie, movieResFile, &movieResID, movieName, newMovieActive, NULL); //wasChanged CloseMovieFile (movieResFile); if (err != noErr) { wxFAIL_MSG(wxT("Could not create movie")); return false; } m_timer = new _wxQTTimer(m_movie); wxASSERT(m_timer); //get the real size of the movie Rect outRect; ::GetMovieNaturalBoundsRect (m_movie, &outRect); m_bestSize.x = outRect.right - outRect.left; m_bestSize.y = outRect.bottom - outRect.top; //do some window stuff if ( !wxControl::Create(parent, id, pos, size, wxNO_BORDER, wxDefaultValidator, name) ) return false; //Set our background color to black by default SetBackgroundColour(*wxBLACK); //reparent movie #ifdef __WXMSW__ CreatePortAssociation(this->GetHWND(), NULL, 0L); #endif SetMovieGWorld(m_movie, (CGrafPtr) #ifdef __WXMSW__ GetNativeWindowPort(this->GetHWND()) #else this->GetHandle() #endif , nil); //go! SetLabel(label); Play(); return true; } void wxMovieCtrl::SetLabel(const wxString& label) { wxControl::SetLabel(label); } bool wxMovieCtrl::Play() { ::StartMovie(m_movie); m_timer->SetPaused(false); m_timer->Start(MOVIE_DELAY, wxTIMER_CONTINUOUS); return ::GetMoviesError() == noErr; } bool wxMovieCtrl::Pause() { ::StopMovie(m_movie); m_timer->SetPaused(true); return ::GetMoviesError() == noErr; } bool wxMovieCtrl::Stop() { m_timer->SetPaused(false); ::StopMovie(m_movie); if(::GetMoviesError() != noErr) return false; ::GoToEndOfMovie(m_movie); return ::GetMoviesError() == noErr; } #if wxUSE_DATETIME bool wxMovieCtrl::Seek(const wxTimeSpan& where) { TimeRecord theTimeRecord; theTimeRecord.value.lo = ((size_t)where.GetMilliseconds().ToLong()) * 10; theTimeRecord.scale = ::GetMovieTimeScale(m_movie); theTimeRecord.base = ::GetMovieTimeBase(m_movie); ::SetMovieTime(m_movie, &theTimeRecord); if (::GetMoviesError() != noErr) return false; return true; } #endif // wxUSE_DATETIME wxMovieCtrlState wxMovieCtrl::GetState() { if( m_timer->IsRunning() == true ) return wxMOVIECTRL_STOPPED; if ( m_timer->GetPaused() == false ) return wxMOVIECTRL_PLAYING; else return wxMOVIECTRL_PAUSED; } wxMovieCtrl::~wxMovieCtrl() { if (m_timer) { delete m_timer; StopMovie(m_movie); DisposeMovie(m_movie); //Note that ExitMovies() is not neccessary, but //the docs are fuzzy on whether or not TerminateQTML is ExitMovies(); #ifndef __WXMAC__ TerminateQTML(); #endif } } wxSize wxMovieCtrl::DoGetBestSize() const { return m_bestSize; } void wxMovieCtrl::OnSize(wxSizeEvent& evt) { Rect theRect; theRect.left = 0; theRect.top = 0; theRect.bottom = evt.GetSize().y; theRect.right = evt.GetSize().x; ::SetMovieBox(m_movie, &theRect); wxASSERT(::GetMoviesError() == noErr); evt.Skip(); } #endif //wxUSE_MOVIECTRL