]> git.saurik.com Git - wxWidgets.git/commitdiff
Added a bigger wxMMedia2 demonstration: wxMultimediaBoard: it is a sort
authorGuilhem Lavaux <lavaux@easynet.fr>
Mon, 14 Feb 2000 18:12:37 +0000 (18:12 +0000)
committerGuilhem Lavaux <lavaux@easynet.fr>
Mon, 14 Feb 2000 18:12:37 +0000 (18:12 +0000)
of light clone of the Windows Media Player.
Early development, but it plays WAV/AIFF files and should work on Windows
as soon as I build the makefiles.

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@6011 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

utils/wxMMedia2/board/Makefile.in [new file with mode: 0644]
utils/wxMMedia2/board/eject.xpm [new file with mode: 0644]
utils/wxMMedia2/board/mmbman.cpp [new file with mode: 0644]
utils/wxMMedia2/board/mmbman.h [new file with mode: 0644]
utils/wxMMedia2/board/mmboard.cpp [new file with mode: 0644]
utils/wxMMedia2/board/mmboard.h [new file with mode: 0644]
utils/wxMMedia2/board/mondrian.ico [new file with mode: 0644]
utils/wxMMedia2/board/mondrian.xpm [new file with mode: 0644]
utils/wxMMedia2/board/pause.xpm [new file with mode: 0644]
utils/wxMMedia2/board/play.xpm [new file with mode: 0644]
utils/wxMMedia2/board/stop.xpm [new file with mode: 0644]

diff --git a/utils/wxMMedia2/board/Makefile.in b/utils/wxMMedia2/board/Makefile.in
new file mode 100644 (file)
index 0000000..c2d3ac1
--- /dev/null
@@ -0,0 +1,38 @@
+#
+# File:                makefile.unx
+# Author:      Julian Smart
+# Created:     1998
+# Updated:     
+# Copyright:   (c) 1998 Julian Smart
+#
+# "%W% %G%"
+#
+# Makefile for minimal example (UNIX).
+
+top_srcdir = @top_srcdir@
+top_builddir = ../../..
+program_dir = utils/wxMMedia2/board
+
+PROGRAM=mmboard
+
+OBJECTS=$(PROGRAM).o
+
+EXTRA_CPPFLAGS= -I$(top_srcdir)/utils/wxMMedia2/lib
+
+EXTRA_LIBS= ../lib/libwxmmedia2.a
+# the comment at the end of the next line is needed because otherwise autoconf
+# would remove this line completely - it contains a built-in hack to remove
+# any VPATH assignment not containing ':'
+VPATH = @PATH_IFS@$(top_srcdir)/utils/wxMMedia2/sample # ':' for autoconf
+
+include ../../../src/make.env
+
+.SUFFIXES: .o .cpp .c
+
+.cpp.o:
+       $(CC) $(CPPFLAGS) $(EXTRA_CPPFLAGS) -o $@ $<
+
+all: $(PROGRAM)
+
+mmboard: $(OBJECTS)
+       $(CC) $(LDFLAGS) -o mmboard $(OBJECTS) $(EXTRA_LIBS) $(LDLIBS) $(top_builddir)/lib/@WX_TARGET_LIBRARY@
diff --git a/utils/wxMMedia2/board/eject.xpm b/utils/wxMMedia2/board/eject.xpm
new file mode 100644 (file)
index 0000000..890cc6b
--- /dev/null
@@ -0,0 +1,24 @@
+/* XPM */
+static char * eject_xpm[] = {
+"15 16 5 1",
+"      c None",
+".     c #949594",
+"+     c #000000",
+"@     c #FFFFFF",
+"#     c #8E8E8E",
+"       .       ",
+"      .+@      ",
+"     .+++@     ",
+"    .+++++@    ",
+"   .+++++++@   ",
+"  .+++++++++@  ",
+" .+++++++++++@ ",
+".+############@",
+".@@@@@@@@@@@@@@",
+"               ",
+"...............",
+".++++++++++++#@",
+".++++++++++++#@",
+".++++++++++++#@",
+".+############@",
+".@@@@@@@@@@@@@@"};
diff --git a/utils/wxMMedia2/board/mmbman.cpp b/utils/wxMMedia2/board/mmbman.cpp
new file mode 100644 (file)
index 0000000..95d8d67
--- /dev/null
@@ -0,0 +1,308 @@
+/////////////////////////////////////////////////////////////////////////////
+// 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
+
+// Personnal headers
+
+#include "wx/stream.h"
+#include "wx/wfstream.h"
+
+#include "sndbase.h"
+#include "sndfile.h"
+#include "sndwav.h"
+#include "sndaiff.h"
+#include "sndpcm.h"
+#include "sndulaw.h"
+
+#ifdef __UNIX__
+#include "sndoss.h"
+#include "sndesd.h"
+#endif
+
+#ifdef __WIN32__
+#include "sndwin.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();
+
+  bool IsStopped();
+
+  wxString GetStringType();
+  wxString GetStringInformation();
+
+protected:
+  wxSoundFileStream *GetDecoder();
+
+  wxSoundStream *m_output_stream;
+  wxInputStream *m_input_stream;
+  wxSoundFileStream *m_file_stream;
+
+  MMBoardTime m_length;
+};
+
+// ----------------------------------------------------------------------------
+// Implementation
+// ----------------------------------------------------------------------------
+
+
+// ----------------------------------------------------------------------------
+// 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);
+
+  // 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()
+{
+  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);
+  if (f_stream->CanRead())
+    return f_stream;
+  delete f_stream;
+
+  // Then, a AIFF decoder
+  f_stream = new wxSoundAiff(*m_input_stream, *m_output_stream);
+  if (f_stream->CanRead())
+    return f_stream;
+  delete f_stream;
+
+  // TODO: automate
+
+  return NULL;
+}
+
+MMBoardTime MMBoardSoundFile::GetLength()
+{
+  return m_length;
+}
+
+bool MMBoardSoundFile::IsStopped()
+{
+  return m_file_stream->IsStopped();
+}
+
+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;
+}
+
+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()
+{
+  return wxString("WAVE file");
+}
+
+wxString MMBoardSoundFile::GetStringInformation()
+{
+  wxString info;
+  wxSoundFormatBase *format;
+
+  format = &(m_file_stream->GetSoundFormat());
+
+  info = _T("Data encoding: ");
+  switch (format->GetType()) {
+  case wxSOUND_PCM: {
+    wxSoundFormatPcm *pcm_format = (wxSoundFormatPcm *)format;
+
+    info += _T("PCM\n");
+    info += wxString::Format(_T("Sampling rate: %d\n")
+                            _T("Bits per sample: %d\n")
+                            _T("Number of channels: %d\n"),
+                            pcm_format->GetSampleRate(),
+                            pcm_format->GetBPS(),
+                            pcm_format->GetChannels());
+
+    break;
+  }
+  case wxSOUND_ULAW: {
+    wxSoundFormatUlaw *ulaw_format = (wxSoundFormatUlaw *)format;
+    info += _T("ULAW\n");
+    info += wxString::Format(_T("Sampling rate: %d\n"), ulaw_format->GetSampleRate());
+    break;
+  }
+  default:
+    info += _T("Unknown");
+    break;
+  }
+  return info;
+}
+
+// ----------------------------------------------------------------------------
+
+
+// ----------------------------------------------------------------------------
+// MMBoardFile
+
+MMBoardFile::MMBoardFile()
+{
+  m_error = 0;
+}
+
+MMBoardFile::~MMBoardFile()
+{
+}
+
+//
+// ----------------------------------------------------------------------------
+
+// ----------------------------------------------------------------------------
+// MMBoardManager
+
+MMBoardFile *MMBoardManager::Open(const wxString& filename)
+{
+  MMBoardFile *file;
+
+  file = new MMBoardSoundFile(filename);
+  if (file->GetError()) {
+    delete file;
+    return NULL;
+  }
+  return file;
+}
+
+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;
+}
+
+// ----------------------------------------------------------------------------
+
diff --git a/utils/wxMMedia2/board/mmbman.h b/utils/wxMMedia2/board/mmbman.h
new file mode 100644 (file)
index 0000000..7a31081
--- /dev/null
@@ -0,0 +1,82 @@
+/////////////////////////////////////////////////////////////////////////////
+// Name:        mmbman.h
+// 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
+/////////////////////////////////////////////////////////////////////////////
+
+#ifndef _MMBMAN_APP_H_
+#define _MMBMAN_APP_H_
+
+#ifdef __GNUG__
+  #pragma interface "mmbman.cpp"
+#endif
+
+#include "wx/stream.h"
+#include "sndbase.h"
+
+// -------------------------------------------------------------------------
+// Base structure definitions
+// -------------------------------------------------------------------------
+
+typedef struct {
+  wxUint8 seconds, minutes, hours;
+} MMBoardTime;
+
+// -------------------------------------------------------------------------
+// Constants
+// -------------------------------------------------------------------------
+
+#define MMBoard_NoError 0
+#define MMBoard_UnknownFile 1
+
+// -------------------------------------------------------------------------
+// Interface definition: MMBoardFile
+// -------------------------------------------------------------------------
+
+class MMBoardFile {
+ public:
+  MMBoardFile();
+  virtual ~MMBoardFile();
+
+  virtual bool NeedWindow() = 0;
+
+  virtual void SetWindow(wxWindow *window) = 0;
+  
+  virtual void Play() = 0;
+  virtual void Pause() = 0;
+  virtual void Resume() = 0;
+  virtual void Stop() = 0;
+
+  virtual MMBoardTime GetPosition() = 0;
+  virtual MMBoardTime GetLength() = 0;
+
+  virtual bool IsStopped() = 0;
+
+  virtual wxString GetStringType() = 0;
+  virtual wxString GetStringInformation() = 0;
+
+  void SetError(wxUint8 error) { m_error = error; }
+  wxUint8 GetError() const { return m_error; }
+
+ protected:
+  wxUint8 m_error;
+};
+
+// -------------------------------------------------------------------------
+// Main manager
+// -------------------------------------------------------------------------
+
+class MMBoardManager {
+ public:
+  static MMBoardFile *Open(const wxString& filename);
+
+  static wxSoundStream *OpenSoundStream();
+  static void UnrefSoundStream(wxSoundStream *stream);
+};
+
+#endif
diff --git a/utils/wxMMedia2/board/mmboard.cpp b/utils/wxMMedia2/board/mmboard.cpp
new file mode 100644 (file)
index 0000000..c0144f2
--- /dev/null
@@ -0,0 +1,468 @@
+/////////////////////////////////////////////////////////////////////////////
+// Name:        mmboard.cpp
+// Purpose:     Multimedia Library sample
+// Author:      Guilhem Lavaux (created from minimal by J. Smart)
+// Modified by:
+// Created:     13/02/2000
+// RCS-ID:      $Id$
+// Copyright:   (c) Guilhem Lavaux
+// Licence:     wxWindows licence
+/////////////////////////////////////////////////////////////////////////////
+
+// ============================================================================
+// declarations
+// ============================================================================
+
+// ----------------------------------------------------------------------------
+// headers
+// ----------------------------------------------------------------------------
+#ifdef __GNUG__
+    #pragma implementation "mmboard.cpp"
+#endif
+
+// 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
+
+// ----------------------------------------------------------------------------
+// ressources
+// ----------------------------------------------------------------------------
+// the application icon
+#if defined(__WXGTK__) || defined(__WXMOTIF__)
+    #include "mondrian.xpm"
+#endif
+
+// include multimedia classes
+#include "sndbase.h"
+#ifdef __WIN32__
+    #include "sndwin.h"
+#endif
+#ifdef __UNIX__
+    #include "sndoss.h"
+    #include "sndesd.h"
+#endif
+
+#include "wx/statline.h"
+#include "wx/stattext.h"
+
+// include personnal classes
+#include "mmboard.h"
+#include "mmbman.h"
+
+#include "play.xpm"
+#include "stop.xpm"
+#include "eject.xpm"
+#include "pause.xpm"
+
+// ----------------------------------------------------------------------------
+// private classes
+// ----------------------------------------------------------------------------
+
+// Main Multimedia Board frame
+class MMBoardFrame : public wxFrame
+{
+public:
+  // ctor(s)
+  MMBoardFrame(const wxString& title, const wxPoint& pos, const wxSize& size);
+  // dtor
+  ~MMBoardFrame();
+
+  // event handlers
+  void OnQuit(wxCommandEvent& event);
+  void OnAbout(wxCommandEvent& event);
+  void OnOpen(wxCommandEvent& event);
+  void OnPlay(wxCommandEvent& event);
+  void OnStop(wxCommandEvent& event);
+  void OnPause(wxCommandEvent& event);
+  void OnRefreshInfo(wxEvent& event);
+
+private:
+  // any class wishing to process wxWindows events must use this macro
+  DECLARE_EVENT_TABLE()
+  
+private:
+  void UpdateMMedInfo(); 
+  void UpdateInfoText();
+
+  MMBoardFile *m_opened_file;
+
+  wxSlider *m_positionSlider;
+  wxBitmapButton *m_playButton, *m_pauseButton, *m_stopButton, *m_ejectButton;
+  wxStaticText *m_fileType, *m_infoText;
+
+  wxTimer *m_refreshTimer;
+};
+
+// ----------------------------------------------------------------------------
+// constants
+// ----------------------------------------------------------------------------
+
+// IDs for the controls and the menu commands
+enum
+{
+    // menu items
+    MMBoard_Quit = 1,
+    MMBoard_Open,
+    MMBoard_About,
+    MMBoard_PositionSlider,
+    MMBoard_PlayButton,
+    MMBoard_PauseButton,
+    MMBoard_ResumeButton,
+    MMBoard_StopButton,
+    MMBoard_EjectButton,
+    MMBoard_RefreshInfo
+};
+
+// ----------------------------------------------------------------------------
+// event tables and other macros for wxWindows
+// ----------------------------------------------------------------------------
+
+BEGIN_EVENT_TABLE(MMBoardFrame, wxFrame)
+  EVT_MENU(MMBoard_Quit,  MMBoardFrame::OnQuit)
+  EVT_MENU(MMBoard_About, MMBoardFrame::OnAbout)
+  EVT_MENU(MMBoard_Open, MMBoardFrame::OnOpen)
+  EVT_BUTTON(MMBoard_PlayButton, MMBoardFrame::OnPlay)
+  EVT_BUTTON(MMBoard_StopButton, MMBoardFrame::OnStop)
+  EVT_BUTTON(MMBoard_PauseButton, MMBoardFrame::OnPause)
+  EVT_CUSTOM(wxEVT_TIMER, MMBoard_RefreshInfo, MMBoardFrame::OnRefreshInfo)
+END_EVENT_TABLE()
+
+// ---------------------------------------------------------------------------
+// Main board application launcher
+// ---------------------------------------------------------------------------
+
+IMPLEMENT_APP(MMBoardApp)
+
+// ============================================================================
+// implementation
+// ============================================================================
+
+// ----------------------------------------------------------------------------
+// the application class
+// ----------------------------------------------------------------------------
+
+bool MMBoardApp::OnInit()
+{
+    // create the main application window
+    MMBoardFrame *frame = new MMBoardFrame("Multimedia Board",
+                                 wxPoint(50, 50), wxSize(450, 340));
+
+    // and show it (the frames, unlike simple controls, are not shown when
+    // created initially)
+    frame->Show(TRUE);
+
+    m_caps = TestMultimediaCaps();
+
+    if (!m_caps) {
+      wxMessageBox("Your system has no multimedia capabilities. We are exiting now.", "Major error !", wxOK | wxICON_ERROR, NULL);
+      return FALSE;
+    }
+
+    wxString msg;
+    msg.Printf("Detected : %s%s%s", (m_caps & MM_SOUND_OSS) ? "OSS " : "",
+                                   (m_caps & MM_SOUND_ESD) ? "ESD " : "",
+                                   (m_caps & MM_SOUND_WIN) ? "WIN" : "");
+
+    wxMessageBox(msg, "Good !", wxOK | wxICON_INFORMATION, NULL);
+
+    // success: wxApp::OnRun() will be called which will enter the main message
+    // loop and the application will run. If we returned FALSE here, the
+    // application would exit immediately.
+    return TRUE;
+}
+
+wxUint8 MMBoardApp::TestMultimediaCaps()
+{
+  wxSoundStream *dev;
+  wxUint8 caps;
+
+  caps = 0;
+
+#ifdef __UNIX__
+  // We test the OSS (Open Sound System) support.
+
+  dev = new wxSoundStreamOSS();
+  if (dev->GetError() == wxSOUND_NOERR) 
+    caps |= MM_SOUND_OSS;
+  delete dev;
+
+  // We now test the ESD support
+
+  dev = new wxSoundStreamESD();
+  if (dev->GetError() == wxSOUND_NOERR)
+    caps |= MM_SOUND_ESD;
+  delete dev;
+#endif
+
+#ifdef __WIN32__
+  // We test the Windows sound support.
+
+  dev = new wxSoundStreamWin();
+  if (dev->GetError() == wxSOUND_NOERR)
+    caps |= MM_SOUND_WIN;
+  delete dev;
+#endif
+
+  return caps;
+}
+
+// ----------------------------------------------------------------------------
+// main frame
+// ----------------------------------------------------------------------------
+
+// frame constructor
+MMBoardFrame::MMBoardFrame(const wxString& title, const wxPoint& pos, const wxSize& size)
+       : wxFrame((wxFrame *)NULL, -1, title, pos, size)
+{
+#ifdef __WXMAC__
+    // we need this in order to allow the about menu relocation, since ABOUT is
+    // not the default id of the about menu
+    wxApp::s_macAboutMenuItemId = MMBoard_About;
+#endif
+
+    // set the frame icon
+    SetIcon(wxICON(mondrian));
+
+    // create a menu bar
+    wxMenu *menuFile = new wxMenu(_T(""), wxMENU_TEAROFF);
+
+    // the "About" item should be in the help menu
+    wxMenu *helpMenu = new wxMenu;
+    helpMenu->Append(MMBoard_About, _T("&About...\tCtrl-A"), _T("Show about dialog"));
+
+    menuFile->Append(MMBoard_Open, _T("&Open\tAlt-O"), _T("Open file"));
+    menuFile->AppendSeparator();
+    menuFile->Append(MMBoard_Quit, _T("E&xit\tAlt-X"), _T("Quit this program"));
+
+    // now append the freshly created menu to the menu bar...
+    wxMenuBar *menuBar = new wxMenuBar();
+    menuBar->Append(menuFile, _T("&File"));
+    menuBar->Append(helpMenu, _T("&Help"));
+
+    // ... and attach this menu bar to the frame
+    SetMenuBar(menuBar);
+
+#if wxUSE_STATUSBAR
+    // create a status bar just for fun (by default with 1 pane only)
+    CreateStatusBar(3);
+    SetStatusText(_T("Welcome to wxWindows!"));
+#endif // wxUSE_STATUSBAR
+
+    // Misc variables
+    m_opened_file = NULL;
+
+    wxPanel *panel = new wxPanel(this, -1);
+
+    // Initialize main slider
+    m_positionSlider = new wxSlider( panel, MMBoard_PositionSlider, 0, 0, 60,
+                                    wxDefaultPosition, wxSize(300, -1),
+                                    wxSL_HORIZONTAL | wxSL_AUTOTICKS);
+    m_positionSlider->SetPageSize(60);  // 60 secs
+
+    // Initialize info panel
+    wxPanel *infoPanel = new wxPanel( panel, -1);
+    infoPanel->SetBackgroundColour(*wxBLACK);
+    infoPanel->SetForegroundColour(*wxWHITE);
+
+    wxBoxSizer *infoSizer = new wxBoxSizer(wxVERTICAL);
+
+    m_fileType = new wxStaticText(infoPanel, -1, _T(""));
+    wxStaticLine *line = new wxStaticLine(infoPanel, -1);
+    m_infoText = new wxStaticText(infoPanel, -1, "");
+
+    UpdateInfoText();
+
+    infoSizer->Add(m_fileType, 0, wxGROW | wxALL, 1);
+    infoSizer->Add(line, 0, wxGROW | wxCENTRE, 20);
+    infoSizer->Add(m_infoText, 0, wxGROW | wxALL, 1);
+    infoPanel->SetSizer(infoSizer);
+    infoPanel->SetAutoLayout(TRUE);
+
+    // Bitmap button panel
+    wxBoxSizer *buttonSizer = new wxBoxSizer(wxHORIZONTAL);
+    
+    wxBitmap *play_bmp = new wxBitmap(play_back_xpm);
+    wxBitmap *stop_bmp = new wxBitmap(stop_back_xpm);
+    wxBitmap *eject_bmp = new wxBitmap(eject_xpm);
+    wxBitmap *pause_bmp = new wxBitmap(pause_xpm);
+
+    m_playButton = new wxBitmapButton(panel, MMBoard_PlayButton, *play_bmp);
+    m_playButton->Enable(FALSE);
+    m_pauseButton = new wxBitmapButton(panel, MMBoard_PauseButton, *pause_bmp);
+    m_pauseButton->Enable(FALSE);
+    m_stopButton = new wxBitmapButton(panel, MMBoard_StopButton, *stop_bmp);
+    m_stopButton->Enable(FALSE);
+    m_ejectButton = new wxBitmapButton(panel, MMBoard_EjectButton, *eject_bmp);
+    m_ejectButton->Enable(FALSE);
+    
+    buttonSizer->Add(m_playButton, 0, wxALL, 2);
+    buttonSizer->Add(m_pauseButton, 0, wxALL, 2);  
+    buttonSizer->Add(m_stopButton, 0, wxALL, 2);
+    buttonSizer->Add(m_ejectButton, 0, wxALL, 2);
+
+    // Top sizer
+    wxBoxSizer *sizer = new wxBoxSizer(wxVERTICAL);
+    sizer->Add(new wxStaticLine(panel, -1), 0, wxGROW | wxCENTRE, 0);
+    sizer->Add(m_positionSlider, 0, wxCENTRE | wxGROW | wxALL, 2);
+    sizer->Add(new wxStaticLine(panel, -1), 0, wxGROW | wxCENTRE, 0);
+    sizer->Add(buttonSizer, 0, wxALL, 0);
+    sizer->Add(new wxStaticLine(panel, -1), 0, wxGROW | wxCENTRE, 0);
+    sizer->Add(infoPanel, 1, wxCENTRE | wxGROW, 0);
+    
+    panel->SetSizer(sizer);
+    panel->SetAutoLayout(TRUE);
+    sizer->Fit(this);
+    sizer->SetSizeHints(this);
+
+    // Timer
+    m_refreshTimer = new wxTimer(this, MMBoard_RefreshInfo);
+}
+
+MMBoardFrame::~MMBoardFrame()
+{
+  if (m_opened_file)
+    delete m_opened_file;
+
+  delete m_refreshTimer;
+}
+
+// event handlers
+
+void MMBoardFrame::OnQuit(wxCommandEvent& WXUNUSED(event))
+{
+    // TRUE is to force the frame to close
+    Close(TRUE);
+}
+
+void MMBoardFrame::OnAbout(wxCommandEvent& WXUNUSED(event))
+{
+    wxString msg;
+    msg.Printf( _T("wxWindows Multimedia board v1.0a, wxMMedia v2.0a:\n")
+                _T("an example of the capabilities of the wxWindows multimedia classes.\n")
+               _T("Copyright 1999, 2000, Guilhem Lavaux.\n"));
+    wxMessageBox(msg, "About MMBoard", wxOK | wxICON_INFORMATION, this);
+}
+
+void MMBoardFrame::OnOpen(wxCommandEvent& WXUNUSED(event))
+{
+  wxString selected_file;
+
+  // select a file to be opened
+  selected_file = wxLoadFileSelector("multimedia", "*", NULL, this);
+  if (selected_file.IsNull())
+    return;
+
+  m_opened_file = MMBoardManager::Open(selected_file);
+
+  // Change the range values of the slider.
+  MMBoardTime length;
+
+  length = m_opened_file->GetLength();
+  m_positionSlider->SetRange(0, length.hours * 3600 + length.minutes * 60 + length.seconds);
+
+  // Update misc info
+  UpdateMMedInfo();
+  SetStatusText(selected_file, 2);
+
+  // Update info text
+  UpdateInfoText();
+
+  // Enable a few buttons
+  m_playButton->Enable(TRUE);
+  m_ejectButton->Enable(TRUE);
+}
+
+void MMBoardFrame::UpdateInfoText()
+{
+  wxString infotext1, infotext2;
+
+  if (m_opened_file) {
+    infotext1 = _T("File type:\n\t");
+    infotext1 += m_opened_file->GetStringType() + _T("\n");
+
+    infotext2 = _T("File informations:\n\n");
+    infotext2 += m_opened_file->GetStringInformation();
+  } else {
+    infotext1 = _T("File type: \n\tNo file opened");
+    infotext2 = _T("File informations:\nNo information\n\n\n\n\n");
+  }
+
+  m_fileType->SetLabel(infotext1);
+  m_infoText->SetLabel(infotext2);
+}
+
+void MMBoardFrame::UpdateMMedInfo()
+{
+  wxString temp_string;
+  MMBoardTime current, length;
+
+  if (m_opened_file) {
+    current = m_opened_file->GetPosition();
+    length  = m_opened_file->GetLength();
+  }
+
+  // We refresh the status bar
+  temp_string.Printf("%02d:%02d / %02d:%02d", current.hours * 60 + current.minutes,
+                    current.seconds, length.hours * 60 + length.minutes, length.seconds);
+  SetStatusText(temp_string, 1);
+
+  // We set the slider position
+  m_positionSlider->SetValue(current.hours * 3600 + current.minutes * 60 + current.seconds);
+}
+
+// ----------------------------------------------------------------------------
+// Playing management, refreshers, ...
+
+void MMBoardFrame::OnRefreshInfo(wxEvent& WXUNUSED(event))
+{
+  UpdateMMedInfo();
+
+  if (m_opened_file->IsStopped()) {
+    m_refreshTimer->Stop();
+    m_playButton->Enable(TRUE);
+    m_stopButton->Enable(FALSE);
+    m_pauseButton->Enable(FALSE);
+  }
+}
+
+void MMBoardFrame::OnPlay(wxCommandEvent& WXUNUSED(event))
+{
+  m_refreshTimer->Start(1000, FALSE);
+
+  m_opened_file->Play();
+
+  m_stopButton->Enable(TRUE);
+  m_pauseButton->Enable(TRUE);
+  m_playButton->Enable(FALSE);
+}
+
+void MMBoardFrame::OnStop(wxCommandEvent& WXUNUSED(event))
+{
+  m_opened_file->Stop();
+  m_refreshTimer->Stop();
+
+  m_stopButton->Enable(FALSE);
+  m_playButton->Enable(TRUE);
+
+  UpdateMMedInfo();
+}
+
+void MMBoardFrame::OnPause(wxCommandEvent& WXUNUSED(event))
+{
+  m_opened_file->Pause();
+
+  m_playButton->Enable(TRUE);
+  m_pauseButton->Enable(FALSE);
+}
diff --git a/utils/wxMMedia2/board/mmboard.h b/utils/wxMMedia2/board/mmboard.h
new file mode 100644 (file)
index 0000000..df2590b
--- /dev/null
@@ -0,0 +1,57 @@
+/////////////////////////////////////////////////////////////////////////////
+// Name:        mmboard.h
+// Purpose:     Multimedia Board header
+// Author:      Guilhem Lavaux, <guilhem.lavaux@libertysurf.fr>
+// Modified by:
+// Created:     13/02/2000
+// RCS-ID:      $Id$
+// Copyright:   (c) 2000, Guilhem Lavaux
+// Licence:     wxWindows licence
+/////////////////////////////////////////////////////////////////////////////
+
+#ifndef _MMBOARD_APP_H_
+#define _MMBOARD_APP_H_
+
+#ifdef __GNUG__
+    #pragma interface "mmboard.cpp"
+#endif
+
+// 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
+#ifndef WX_PRECOMP
+    #include "wx/wx.h"
+#endif
+
+// --------------------------------------------------------------------------
+// constants
+// --------------------------------------------------------------------------
+
+#define MM_SOUND_OSS 0x01
+#define MM_SOUND_ESD 0x02
+#define MM_SOUND_WIN 0x04
+
+// --------------------------------------------------------------------------
+// Class definitions
+// --------------------------------------------------------------------------
+
+// Define a new application type, each program should derive a class from wxApp
+class MMBoardApp : public wxApp
+{
+public:
+  wxUint8 m_caps;
+
+  // override base class virtuals
+  // ----------------------------
+
+  virtual bool OnInit();
+  
+  wxUint8 TestMultimediaCaps();
+};
+
+#endif
diff --git a/utils/wxMMedia2/board/mondrian.ico b/utils/wxMMedia2/board/mondrian.ico
new file mode 100644 (file)
index 0000000..2310c5d
Binary files /dev/null and b/utils/wxMMedia2/board/mondrian.ico differ
diff --git a/utils/wxMMedia2/board/mondrian.xpm b/utils/wxMMedia2/board/mondrian.xpm
new file mode 100644 (file)
index 0000000..409f27a
--- /dev/null
@@ -0,0 +1,44 @@
+/* XPM */
+static char *mondrian_xpm[] = {
+/* columns rows colors chars-per-pixel */
+"32 32 6 1",
+"  c Black",
+". c Blue",
+"X c #00bf00",
+"o c Red",
+"O c Yellow",
+"+ c Gray100",
+/* pixels */
+"                                ",
+" oooooo +++++++++++++++++++++++ ",
+" oooooo +++++++++++++++++++++++ ",
+" oooooo +++++++++++++++++++++++ ",
+" oooooo +++++++++++++++++++++++ ",
+" oooooo +++++++++++++++++++++++ ",
+" oooooo +++++++++++++++++++++++ ",
+" oooooo +++++++++++++++++++++++ ",
+"                                ",
+" ++++++ ++++++++++++++++++ .... ",
+" ++++++ ++++++++++++++++++ .... ",
+" ++++++ ++++++++++++++++++ .... ",
+" ++++++ ++++++++++++++++++ .... ",
+" ++++++ ++++++++++++++++++ .... ",
+" ++++++ ++++++++++++++++++      ",
+" ++++++ ++++++++++++++++++ ++++ ",
+" ++++++ ++++++++++++++++++ ++++ ",
+" ++++++ ++++++++++++++++++ ++++ ",
+" ++++++ ++++++++++++++++++ ++++ ",
+" ++++++ ++++++++++++++++++ ++++ ",
+" ++++++ ++++++++++++++++++ ++++ ",
+" ++++++ ++++++++++++++++++ ++++ ",
+" ++++++ ++++++++++++++++++ ++++ ",
+" ++++++ ++++++++++++++++++ ++++ ",
+" ++++++                    ++++ ",
+" ++++++ OOOOOOOOOOOO XXXXX ++++ ",
+" ++++++ OOOOOOOOOOOO XXXXX ++++ ",
+" ++++++ OOOOOOOOOOOO XXXXX ++++ ",
+" ++++++ OOOOOOOOOOOO XXXXX ++++ ",
+" ++++++ OOOOOOOOOOOO XXXXX ++++ ",
+" ++++++ OOOOOOOOOOOO XXXXX ++++ ",
+"                                "
+};
diff --git a/utils/wxMMedia2/board/pause.xpm b/utils/wxMMedia2/board/pause.xpm
new file mode 100644 (file)
index 0000000..2283f24
--- /dev/null
@@ -0,0 +1,23 @@
+/* XPM */
+static char * pause_xpm[] = {
+"13 15 5 1",
+"      c None",
+".     c #949594",
+"+     c #000000",
+"@     c #8E8E8E",
+"#     c #FFFFFF",
+"...... ......",
+".+++@# .+++@#",
+".+++@# .+++@#",
+".+++@# .+++@#",
+".+++@# .+++@#",
+".+++@# .+++@#",
+".+++@# .+++@#",
+".+++@# .+++@#",
+".+++@# .+++@#",
+".+++@# .+++@#",
+".+++@# .+++@#",
+".+++@# .+++@#",
+".+++@# .+++@#",
+".+@@@# .+@@@#",
+".##### .#####"};
diff --git a/utils/wxMMedia2/board/play.xpm b/utils/wxMMedia2/board/play.xpm
new file mode 100644 (file)
index 0000000..5b7db49
--- /dev/null
@@ -0,0 +1,23 @@
+/* XPM */
+static char * play_back_xpm[] = {
+"13 15 5 1",
+"      c None",
+".     c #949594",
+"+     c #000000",
+"@     c #8E8E8E",
+"#     c #FFFFFF",
+"......       ",
+".+++++.      ",
+".++++++.     ",
+".+++++++.    ",
+".++++++++.   ",
+".+++++++++.  ",
+".++++++++++. ",
+".++++++++++@#",
+".+++++++++@# ",
+".++++++++@#  ",
+".+++++++@#   ",
+".++++++@#    ",
+".+++++@#     ",
+".+@@@@#      ",
+".#####       "};
diff --git a/utils/wxMMedia2/board/stop.xpm b/utils/wxMMedia2/board/stop.xpm
new file mode 100644 (file)
index 0000000..2d159d0
--- /dev/null
@@ -0,0 +1,23 @@
+/* XPM */
+static char * stop_back_xpm[] = {
+"13 15 5 1",
+"      c None",
+".     c #949594",
+"+     c #000000",
+"@     c #8E8E8E",
+"#     c #FFFFFF",
+".............",
+".++++++++++@#",
+".++++++++++@#",
+".++++++++++@#",
+".++++++++++@#",
+".++++++++++@#",
+".++++++++++@#",
+".++++++++++@#",
+".++++++++++@#",
+".++++++++++@#",
+".++++++++++@#",
+".++++++++++@#",
+".++++++++++@#",
+".+@@@@@@@@@@#",
+".############"};