From: Guilhem Lavaux Date: Mon, 14 Feb 2000 18:12:37 +0000 (+0000) Subject: Added a bigger wxMMedia2 demonstration: wxMultimediaBoard: it is a sort X-Git-Url: https://git.saurik.com/wxWidgets.git/commitdiff_plain/55196c5464563deb1caddc4893cddc1ba1e1db3b Added a bigger wxMMedia2 demonstration: wxMultimediaBoard: it is a sort 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 --- diff --git a/utils/wxMMedia2/board/Makefile.in b/utils/wxMMedia2/board/Makefile.in new file mode 100644 index 0000000000..c2d3ac1c61 --- /dev/null +++ b/utils/wxMMedia2/board/Makefile.in @@ -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 index 0000000000..890cc6b53b --- /dev/null +++ b/utils/wxMMedia2/board/eject.xpm @@ -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 index 0000000000..95d8d67686 --- /dev/null +++ b/utils/wxMMedia2/board/mmbman.cpp @@ -0,0 +1,308 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: mmbman.cpp +// Purpose: Multimedia Board manager +// Author: Guilhem Lavaux, +// 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 index 0000000000..7a31081f72 --- /dev/null +++ b/utils/wxMMedia2/board/mmbman.h @@ -0,0 +1,82 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: mmbman.h +// Purpose: Multimedia Board manager +// Author: Guilhem Lavaux, +// 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 index 0000000000..c0144f26aa --- /dev/null +++ b/utils/wxMMedia2/board/mmboard.cpp @@ -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 index 0000000000..df2590bbb1 --- /dev/null +++ b/utils/wxMMedia2/board/mmboard.h @@ -0,0 +1,57 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: mmboard.h +// Purpose: Multimedia Board header +// Author: Guilhem Lavaux, +// 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 index 0000000000..2310c5d275 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 index 0000000000..409f27a843 --- /dev/null +++ b/utils/wxMMedia2/board/mondrian.xpm @@ -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 index 0000000000..2283f242ab --- /dev/null +++ b/utils/wxMMedia2/board/pause.xpm @@ -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 index 0000000000..5b7db49baf --- /dev/null +++ b/utils/wxMMedia2/board/play.xpm @@ -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 index 0000000000..2d159d0376 --- /dev/null +++ b/utils/wxMMedia2/board/stop.xpm @@ -0,0 +1,23 @@ +/* XPM */ +static char * stop_back_xpm[] = { +"13 15 5 1", +" c None", +". c #949594", +"+ c #000000", +"@ c #8E8E8E", +"# c #FFFFFF", +".............", +".++++++++++@#", +".++++++++++@#", +".++++++++++@#", +".++++++++++@#", +".++++++++++@#", +".++++++++++@#", +".++++++++++@#", +".++++++++++@#", +".++++++++++@#", +".++++++++++@#", +".++++++++++@#", +".++++++++++@#", +".+@@@@@@@@@@#", +".############"};