wxMMedia compilation fixes OGL and STC makefile build fixes git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@7528 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
		
			
				
	
	
		
			524 lines
		
	
	
		
			12 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			524 lines
		
	
	
		
			12 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| /////////////////////////////////////////////////////////////////////////////
 | |
| // Name:        mmbman.cpp
 | |
| // Purpose:     Multimedia Board manager
 | |
| // Author:      Guilhem Lavaux, <guilhem.lavaux@libertysurf.fr>
 | |
| // Modified by:
 | |
| // Created:     13/02/2000
 | |
| // RCS-ID:      $Id$
 | |
| // Copyright:   (c) 2000, Guilhem Lavaux
 | |
| // Licence:     wxWindows licence
 | |
| /////////////////////////////////////////////////////////////////////////////
 | |
| 
 | |
| #ifdef __GNUG__
 | |
|   #pragma implementation "mmbman.cpp"
 | |
| #endif
 | |
| 
 | |
| // ----------------------------------------------------------------------------
 | |
| // headers
 | |
| // ----------------------------------------------------------------------------
 | |
| 
 | |
| // For compilers that support precompilation, includes "wx/wx.h".
 | |
| #include "wx/wxprec.h"
 | |
| 
 | |
| #ifdef __BORLANDC__
 | |
|     #pragma hdrstop
 | |
| #endif
 | |
| 
 | |
| // for all others, include the necessary headers (this file is usually all you
 | |
| // need because it includes almost all "standard" wxWindows headers
 | |
| #ifndef WX_PRECOMP
 | |
|     #include "wx/wx.h"
 | |
| #endif
 | |
| 
 | |
| // Personal headers
 | |
| 
 | |
| #include "wx/stream.h"
 | |
| #include "wx/wfstream.h"
 | |
| 
 | |
| #include "wx/mmedia/sndbase.h"
 | |
| #include "wx/mmedia/sndfile.h"
 | |
| #include "wx/mmedia/sndwav.h"
 | |
| #include "wx/mmedia/sndaiff.h"
 | |
| #include "wx/mmedia/sndpcm.h"
 | |
| #include "wx/mmedia/sndulaw.h"
 | |
| #include "wx/mmedia/sndmsad.h"
 | |
| 
 | |
| #ifdef __UNIX__
 | |
| #include "wx/mmedia/sndoss.h"
 | |
| #include "wx/mmedia/sndesd.h"
 | |
| #endif
 | |
| 
 | |
| #ifdef __WIN32__
 | |
| #include "wx/mmedia/sndwin.h"
 | |
| #endif
 | |
| 
 | |
| #include "wx/mmedia/vidbase.h"
 | |
| #ifdef __UNIX__
 | |
| #include "wx/mmedia/vidxanm.h"
 | |
| #endif
 | |
| 
 | |
| #ifdef __WIN32__
 | |
| #include "wx/mmedia/vidwin.h"
 | |
| #endif
 | |
| 
 | |
| #include "mmboard.h"
 | |
| #include "mmbman.h"
 | |
| 
 | |
| // ----------------------------------------------------------------------------
 | |
| // Private class definitions
 | |
| // ----------------------------------------------------------------------------
 | |
| 
 | |
| class MMBoardSoundFile: public MMBoardFile {
 | |
| public:
 | |
|     MMBoardSoundFile(const wxString& filename);
 | |
|     ~MMBoardSoundFile();
 | |
|     
 | |
|     bool NeedWindow();
 | |
|     
 | |
|     void SetWindow(wxWindow *window);
 | |
|     
 | |
|     void Play();
 | |
|     void Pause();
 | |
|     void Resume();
 | |
|     void Stop();
 | |
|     
 | |
|     MMBoardTime GetPosition();
 | |
|     MMBoardTime GetLength();
 | |
|     void SetPosition(MMBoardTime btime);
 | |
|     
 | |
|     bool IsStopped();
 | |
|     bool IsPaused();
 | |
|     
 | |
|     wxString GetStringType();
 | |
|     wxString GetStringInformation();
 | |
|     
 | |
| protected:
 | |
|     wxSoundFileStream *GetDecoder();
 | |
|     
 | |
|     wxSoundStream *m_output_stream;
 | |
|     wxInputStream *m_input_stream;
 | |
|     wxSoundFileStream *m_file_stream;
 | |
| 
 | |
|     MMBoardTime m_length;
 | |
|     wxUint8 m_file_type;
 | |
| };
 | |
| 
 | |
| class MMBoardVideoFile: public MMBoardFile {
 | |
| public:
 | |
|     MMBoardVideoFile(const wxString& filename);
 | |
|     ~MMBoardVideoFile();
 | |
|     
 | |
|     bool NeedWindow();
 | |
|     
 | |
|     void SetWindow(wxWindow *window);
 | |
|     
 | |
|     void Play();
 | |
|     void Pause();
 | |
|     void Resume();
 | |
|     void Stop();
 | |
|     
 | |
|     MMBoardTime GetPosition();
 | |
|     MMBoardTime GetLength();
 | |
|     void SetPosition(MMBoardTime btime);
 | |
|     
 | |
|     bool IsStopped();
 | |
|     bool IsPaused();
 | |
|     
 | |
|     wxString GetStringType();
 | |
|     wxString GetStringInformation();
 | |
|     
 | |
| protected:
 | |
|     wxWindow *m_output_window;
 | |
|     wxVideoBaseDriver *m_video_driver;
 | |
| };
 | |
| 
 | |
| // ----------------------------------------------------------------------------
 | |
| // Implementation
 | |
| // ----------------------------------------------------------------------------
 | |
| 
 | |
| #define MMBoard_UNKNOWNTYPE 0
 | |
| #define MMBoard_WAVE 1
 | |
| #define MMBoard_AIFF 2
 | |
| 
 | |
| // ----------------------------------------------------------------------------
 | |
| // MMBoardSoundFile
 | |
| 
 | |
| MMBoardSoundFile::MMBoardSoundFile(const wxString& filename)
 | |
|   : MMBoardFile()
 | |
| {
 | |
|     m_input_stream = new wxFileInputStream(filename);
 | |
|     m_output_stream = MMBoardManager::OpenSoundStream();
 | |
|     
 | |
|     m_file_stream = GetDecoder();
 | |
|     
 | |
|     if (!m_file_stream) {
 | |
|         SetError(MMBoard_UnknownFile);
 | |
|         return;
 | |
|     }
 | |
|     
 | |
|     // Compute length
 | |
|     wxUint32 length, seconds;
 | |
| 
 | |
|     length = m_file_stream->GetLength();
 | |
|     seconds = m_file_stream->GetSoundFormat().GetTimeFromBytes(length);
 | |
|     m_length.seconds = seconds % 60;
 | |
|     m_length.minutes = (seconds / 60) % 60;
 | |
|     m_length.hours   = seconds / 3600;
 | |
| }
 | |
| 
 | |
| MMBoardSoundFile::~MMBoardSoundFile()
 | |
| {
 | |
|     if (m_file_stream)
 | |
|         delete m_file_stream;
 | |
|     MMBoardManager::UnrefSoundStream(m_output_stream);
 | |
|     delete m_input_stream;
 | |
| }
 | |
| 
 | |
| wxSoundFileStream *MMBoardSoundFile::GetDecoder()
 | |
| {
 | |
|     wxSoundFileStream *f_stream;
 | |
|     
 | |
|     // First, we try a Wave decoder
 | |
|     f_stream = new wxSoundWave(*m_input_stream, *m_output_stream);
 | |
|     m_file_type = MMBoard_WAVE;
 | |
|     if (f_stream->CanRead())
 | |
|         return f_stream;
 | |
|     delete f_stream;
 | |
|     
 | |
|     // Then, a AIFF decoder
 | |
|     f_stream = new wxSoundAiff(*m_input_stream, *m_output_stream);
 | |
|     m_file_type = MMBoard_AIFF;
 | |
|     if (f_stream->CanRead())
 | |
|         return f_stream;
 | |
|     delete f_stream;
 | |
|     
 | |
|     m_file_type = MMBoard_UNKNOWNTYPE;
 | |
|     
 | |
|     // TODO: automate
 | |
|     
 | |
|     return NULL;
 | |
| }
 | |
| 
 | |
| MMBoardTime MMBoardSoundFile::GetLength()
 | |
| {
 | |
|     return m_length;
 | |
| }
 | |
| 
 | |
| bool MMBoardSoundFile::IsStopped()
 | |
| {
 | |
|     return m_file_stream->IsStopped();
 | |
| }
 | |
| 
 | |
| bool MMBoardSoundFile::IsPaused()
 | |
| {
 | |
|     return m_file_stream->IsPaused();
 | |
| }
 | |
| 
 | |
| MMBoardTime MMBoardSoundFile::GetPosition()
 | |
| {
 | |
|     wxUint32 length, seconds;
 | |
|     MMBoardTime file_time;
 | |
|     
 | |
|     file_time.seconds = file_time.minutes = file_time.hours = 0;
 | |
|     if (m_file_stream->IsStopped())
 | |
|         return file_time;
 | |
|     
 | |
|     length = m_file_stream->GetPosition();
 | |
|     seconds = m_file_stream->GetSoundFormat().GetTimeFromBytes(length);
 | |
|     file_time.seconds = seconds % 60;
 | |
|     file_time.minutes = (seconds / 60) % 60;
 | |
|     file_time.hours   = seconds / 3600;
 | |
|     
 | |
|     return file_time;
 | |
| }
 | |
| 
 | |
| void MMBoardSoundFile::SetPosition(MMBoardTime btime)
 | |
| {
 | |
|     wxUint32 itime;
 | |
| 
 | |
|     itime = btime.seconds + btime.minutes * 60 + btime.hours;
 | |
| 
 | |
|     m_file_stream->SetPosition(
 | |
|         m_file_stream->GetSoundFormat().GetBytesFromTime(itime)
 | |
|         );
 | |
| }
 | |
| 
 | |
| bool MMBoardSoundFile::NeedWindow()
 | |
| {
 | |
|     return FALSE;
 | |
| }
 | |
| 
 | |
| void MMBoardSoundFile::SetWindow(wxWindow *window)
 | |
| {
 | |
| }
 | |
| 
 | |
| void MMBoardSoundFile::Play()
 | |
| {
 | |
|     m_file_stream->Play();
 | |
| }
 | |
| 
 | |
| void MMBoardSoundFile::Pause()
 | |
| {
 | |
|     m_file_stream->Pause();
 | |
| }
 | |
| 
 | |
| void MMBoardSoundFile::Resume()
 | |
| {
 | |
|     m_file_stream->Resume();
 | |
| }
 | |
| 
 | |
| void MMBoardSoundFile::Stop()
 | |
| {
 | |
|     m_file_stream->Stop();
 | |
| }
 | |
| 
 | |
| wxString MMBoardSoundFile::GetStringType()
 | |
| {
 | |
|     switch (m_file_type) {
 | |
|         case MMBoard_WAVE:
 | |
|             return wxString(wxT("WAVE file"));
 | |
|             break;
 | |
|         case MMBoard_AIFF:
 | |
|             return wxString(wxT("AIFF file"));
 | |
|             break;
 | |
|         default:
 | |
|             return wxString(wxT("Unknown file"));
 | |
|             break;
 | |
|     }
 | |
| }
 | |
| 
 | |
| wxString MMBoardSoundFile::GetStringInformation()
 | |
| {
 | |
|     wxString info;
 | |
|     wxSoundFormatBase *format;
 | |
|     
 | |
|     format = &(m_file_stream->GetSoundFormat());
 | |
|     
 | |
|     info = wxT("Data encoding: ");
 | |
|     switch (format->GetType()) {
 | |
|     case wxSOUND_PCM: {
 | |
|         wxSoundFormatPcm *pcm_format = (wxSoundFormatPcm *)format;
 | |
|       
 | |
| 	info += wxString::Format(wxT("PCM %s %s\n"),
 | |
|                                  pcm_format->Signed() ? wxT("signed") : wxT("unsigned"),
 | |
|                                  pcm_format->GetOrder() == wxLITTLE_ENDIAN ? wxT("little endian") : wxT("big endian"));
 | |
| 	info += wxString::Format(wxT("Sampling rate: %d\n")
 | |
| 				 wxT("Bits per sample: %d\n")
 | |
| 				 wxT("Number of channels: %d\n"),
 | |
| 				 pcm_format->GetSampleRate(),
 | |
| 				 pcm_format->GetBPS(),
 | |
| 				 pcm_format->GetChannels());
 | |
| 	
 | |
| 	break;
 | |
|     }
 | |
|     case wxSOUND_MSADPCM: {
 | |
|         wxSoundFormatMSAdpcm *adpcm_format = (wxSoundFormatMSAdpcm *)format;
 | |
| 
 | |
|         info += wxString::Format(wxT("Microsoft ADPCM\n"));
 | |
|         info += wxString::Format(wxT("Sampling Rate: %d\n")
 | |
|                                  wxT("Number of channels: %d\n"),
 | |
|                                  adpcm_format->GetSampleRate(),
 | |
|                                  adpcm_format->GetChannels());
 | |
|         break;
 | |
|     }
 | |
|     case wxSOUND_ULAW: {
 | |
|         wxSoundFormatUlaw *ulaw_format = (wxSoundFormatUlaw *)format;
 | |
| 	info += wxT("ULAW\n");
 | |
| 	info += wxString::Format(wxT("Sampling rate: %d\n"), ulaw_format->GetSampleRate());
 | |
| 	break;
 | |
|     }
 | |
|     default:
 | |
|         info += wxT("Unknown");
 | |
| 	break;
 | |
|     }
 | |
|     return info;
 | |
| }
 | |
| 
 | |
| // ----------------------------------------------------------------------------
 | |
| 
 | |
| 
 | |
| // ----------------------------------------------------------------------------
 | |
| // MMBoardVideoFile
 | |
| 
 | |
| MMBoardVideoFile::MMBoardVideoFile(const wxString& filename)
 | |
| {
 | |
|     m_output_window = NULL;
 | |
|   
 | |
| #if defined(__UNIX__)
 | |
|     m_video_driver = new wxVideoXANIM(filename);
 | |
| #elif defined(__WIN32__)
 | |
|     m_video_driver = new wxVideoWindows(filename);
 | |
| #else
 | |
|     m_video_driver = NULL;
 | |
|     SetError(MMBoard_UnknownFile);
 | |
| #endif
 | |
| }
 | |
| 
 | |
| MMBoardVideoFile::~MMBoardVideoFile()
 | |
| {
 | |
|     if (m_video_driver)
 | |
|         delete m_video_driver;
 | |
| }
 | |
| 
 | |
| bool MMBoardVideoFile::NeedWindow()
 | |
| {
 | |
|     return TRUE;
 | |
| }
 | |
| 
 | |
| void MMBoardVideoFile::SetWindow(wxWindow *window)
 | |
| {
 | |
|     m_output_window = window;
 | |
|     m_video_driver->AttachOutput(*window);
 | |
| 
 | |
|     wxSize size;
 | |
|     m_video_driver->GetSize(size);
 | |
|     window->SetSize(size);
 | |
|     // BAD BAD
 | |
|     // and we remove
 | |
|     // window->GetParent()->GetSizer()->Fit(window->GetParent());
 | |
| }
 | |
| 
 | |
| void MMBoardVideoFile::Play()
 | |
| {
 | |
|     m_video_driver->Play();
 | |
| }
 | |
| 
 | |
| void MMBoardVideoFile::Pause()
 | |
| {
 | |
|     m_video_driver->Pause();
 | |
| }
 | |
| 
 | |
| void MMBoardVideoFile::Resume()
 | |
| {
 | |
|     m_video_driver->Resume();
 | |
| }
 | |
| 
 | |
| void MMBoardVideoFile::Stop()
 | |
| {
 | |
|     m_video_driver->Stop();
 | |
| }
 | |
| 
 | |
| MMBoardTime MMBoardVideoFile::GetPosition()
 | |
| {
 | |
|     MMBoardTime btime;
 | |
| 
 | |
|     btime.seconds = btime.minutes = btime.hours = 0;
 | |
|     return btime;
 | |
| }
 | |
| 
 | |
| MMBoardTime MMBoardVideoFile::GetLength()
 | |
| {
 | |
|     MMBoardTime btime;
 | |
|     int frameTime;
 | |
| 
 | |
|     frameTime = (int)( m_video_driver->GetNbFrames() / m_video_driver->GetFrameRate());
 | |
|     
 | |
|     btime.seconds = frameTime % 60;
 | |
|     btime.minutes = (frameTime / 60) % 60;
 | |
|     btime.hours   = frameTime / 3600;
 | |
|     return btime;
 | |
| }
 | |
| 
 | |
| void MMBoardVideoFile::SetPosition(MMBoardTime btime)
 | |
| {
 | |
| }
 | |
| 
 | |
| bool MMBoardVideoFile::IsStopped()
 | |
| {
 | |
|     return m_video_driver->IsStopped();
 | |
| }
 | |
| 
 | |
| bool MMBoardVideoFile::IsPaused()
 | |
| {
 | |
|     return m_video_driver->IsPaused();
 | |
| }
 | |
| 
 | |
| wxString MMBoardVideoFile::GetStringType()
 | |
| {
 | |
|     return wxString(wxT("Video XANIM"));
 | |
| }
 | |
| 
 | |
| wxString MMBoardVideoFile::GetStringInformation()
 | |
| {
 | |
|     wxString info;
 | |
| 
 | |
|     info = wxT("Video codec: ");
 | |
|     info += m_video_driver->GetMovieCodec() + "\n";
 | |
|     info += wxT("Audio codec: ");
 | |
|     info += m_video_driver->GetAudioCodec();
 | |
|     info += wxString::Format(" Sample rate: %d Channels: %d\n", m_video_driver->GetSampleRate(),
 | |
|                              m_video_driver->GetBPS());
 | |
|     info += wxString::Format(" Frame rate: %.01f", m_video_driver->GetFrameRate());
 | |
|     return info;
 | |
| }
 | |
| 
 | |
| // ----------------------------------------------------------------------------
 | |
| 
 | |
| // ----------------------------------------------------------------------------
 | |
| // MMBoardFile
 | |
| 
 | |
| MMBoardFile::MMBoardFile()
 | |
| {
 | |
|   m_error = 0;
 | |
| }
 | |
| 
 | |
| MMBoardFile::~MMBoardFile()
 | |
| {
 | |
| }
 | |
| 
 | |
| //
 | |
| // ----------------------------------------------------------------------------
 | |
| 
 | |
| // ----------------------------------------------------------------------------
 | |
| // MMBoardManager
 | |
| 
 | |
| MMBoardFile *MMBoardManager::Open(const wxString& filename)
 | |
| {
 | |
|   MMBoardFile *file;
 | |
| 
 | |
|   // Test the audio codec
 | |
|   file = new MMBoardSoundFile(filename);
 | |
|   if (!file->GetError())
 | |
|     return file;
 | |
|   delete file;
 | |
| 
 | |
|   // Test the video codec
 | |
|   file = new MMBoardVideoFile(filename);
 | |
|   if (!file->GetError())
 | |
|     return file;
 | |
|   delete file;
 | |
| 
 | |
|   // Arrrgh, we just could not see what is that file ...
 | |
|   return NULL;
 | |
| }
 | |
| 
 | |
| DECLARE_APP(MMBoardApp)
 | |
| 
 | |
| wxSoundStream *MMBoardManager::OpenSoundStream()
 | |
| {
 | |
| #ifdef __UNIX__
 | |
|   if ((wxGetApp().m_caps & MM_SOUND_ESD) != 0)
 | |
|     return new wxSoundStreamESD();
 | |
| 
 | |
|   if ((wxGetApp().m_caps & MM_SOUND_OSS) != 0)
 | |
|     return new wxSoundStreamOSS();
 | |
| #endif
 | |
| 
 | |
| #ifdef __WIN32__
 | |
|   if ((wxGetApp().m_caps & MM_SOUND_WIN) != 0)
 | |
|     return new wxSoundStreamWin();
 | |
| #endif
 | |
| 
 | |
|   wxMessageBox("You are trying to open a multimedia but you have not devices", "Error", wxOK | wxICON_ERROR, NULL);
 | |
| 
 | |
|   return NULL;
 | |
| }
 | |
| 
 | |
| void MMBoardManager::UnrefSoundStream(wxSoundStream *stream)
 | |
| {
 | |
|   delete stream;
 | |
| }
 | |
| 
 | |
| // ----------------------------------------------------------------------------
 | |
| 
 |