]>
git.saurik.com Git - wxWidgets.git/blob - contrib/samples/mmedia/mmboard.cpp
1 /////////////////////////////////////////////////////////////////////////////
3 // Purpose: Multimedia Library sample
4 // Author: Guilhem Lavaux (created from minimal by J. Smart)
8 // Copyright: (c) Guilhem Lavaux
9 // Licence: wxWindows licence
10 /////////////////////////////////////////////////////////////////////////////
12 // ============================================================================
14 // ============================================================================
16 // ----------------------------------------------------------------------------
18 // ----------------------------------------------------------------------------
20 // For compilers that support precompilation, includes "wx/wx.h".
21 #include "wx/wxprec.h"
27 // for all others, include the necessary headers (this file is usually all you
28 // need because it includes almost all "standard" wxWidgets headers
33 // ----------------------------------------------------------------------------
35 // ----------------------------------------------------------------------------
36 // the application icon
37 #if defined(__WXGTK__) || defined(__WXX11__) || defined(__WXMOTIF__) || defined(__WXMAC__)
38 #include "mondrian.xpm"
41 // include multimedia classes
42 #include "wx/mmedia/sndbase.h"
44 #include "wx/mmedia/sndwin.h"
47 #include "wx/mmedia/sndoss.h"
48 #include "wx/mmedia/sndesd.h"
51 #include "wx/statline.h"
52 #include "wx/stattext.h"
54 // include personnal classes
63 // ----------------------------------------------------------------------------
65 // ----------------------------------------------------------------------------
67 // Main Multimedia Board frame
68 class MMBoardFrame
: public wxFrame
72 MMBoardFrame(const wxString
& title
, const wxPoint
& pos
, const wxSize
& size
);
77 void OnQuit(wxCommandEvent
& event
);
78 void OnAbout(wxCommandEvent
& event
);
79 void OnOpen(wxCommandEvent
& event
);
80 void OnPlay(wxCommandEvent
& event
);
81 void OnStop(wxCommandEvent
& event
);
82 void OnPause(wxCommandEvent
& event
);
83 void OnEject(wxCommandEvent
& event
);
84 void OnRefreshInfo(wxEvent
& event
);
85 void OnSetPosition(wxCommandEvent
& event
);
87 void OpenVideoWindow();
88 void CloseVideoWindow();
91 // any class wishing to process wxWidgets events must use this macro
95 void UpdateMMedInfo();
96 void UpdateInfoText();
98 MMBoardFile
*m_opened_file
;
100 wxSlider
*m_positionSlider
;
101 wxBitmapButton
*m_playButton
, *m_pauseButton
, *m_stopButton
, *m_ejectButton
;
102 wxStaticText
*m_fileType
, *m_infoText
;
103 wxWindow
*m_video_window
;
108 wxTimer
*m_refreshTimer
;
111 // ----------------------------------------------------------------------------
113 // ----------------------------------------------------------------------------
115 // IDs for the controls and the menu commands
122 MMBoard_PositionSlider
,
125 MMBoard_ResumeButton
,
131 // ----------------------------------------------------------------------------
132 // event tables and other macros for wxWidgets
133 // ----------------------------------------------------------------------------
135 BEGIN_EVENT_TABLE(MMBoardFrame
, wxFrame
)
136 EVT_MENU(MMBoard_Quit
, MMBoardFrame::OnQuit
)
137 EVT_MENU(MMBoard_About
, MMBoardFrame::OnAbout
)
138 EVT_MENU(MMBoard_Open
, MMBoardFrame::OnOpen
)
139 EVT_BUTTON(MMBoard_PlayButton
, MMBoardFrame::OnPlay
)
140 EVT_BUTTON(MMBoard_StopButton
, MMBoardFrame::OnStop
)
141 EVT_BUTTON(MMBoard_PauseButton
, MMBoardFrame::OnPause
)
142 EVT_BUTTON(MMBoard_EjectButton
, MMBoardFrame::OnEject
)
143 EVT_SLIDER(MMBoard_PositionSlider
, MMBoardFrame::OnSetPosition
)
144 EVT_CUSTOM(wxEVT_TIMER
, MMBoard_RefreshInfo
, MMBoardFrame::OnRefreshInfo
)
147 // ---------------------------------------------------------------------------
148 // Main board application launcher
149 // ---------------------------------------------------------------------------
151 IMPLEMENT_APP(MMBoardApp
)
153 // ============================================================================
155 // ============================================================================
157 // ----------------------------------------------------------------------------
158 // the application class
159 // ----------------------------------------------------------------------------
161 bool MMBoardApp::OnInit()
163 // create the main application window
164 MMBoardFrame
*frame
= new MMBoardFrame(_T("Multimedia Board"),
165 wxPoint(50, 50), wxSize(450, 340));
167 // and show it (the frames, unlike simple controls, are not shown when
168 // created initially)
171 m_caps
= TestMultimediaCaps();
174 wxMessageBox(_T("Your system has no multimedia capabilities. We are exiting now."), _T("Major error !"), wxOK
| wxICON_ERROR
, NULL
);
179 msg
.Printf(_T("Detected : %s%s%s"), (m_caps
& MM_SOUND_OSS
) ? _T("OSS ") : _T(""),
180 (m_caps
& MM_SOUND_ESD
) ? _T("ESD ") : _T(""),
181 (m_caps
& MM_SOUND_WIN
) ? _T("WIN") : _T(""));
183 wxMessageBox(msg
, _T("Good !"), wxOK
| wxICON_INFORMATION
, NULL
);
185 // success: wxApp::OnRun() will be called which will enter the main message
186 // loop and the application will run. If we returned false here, the
187 // application would exit immediately.
191 wxUint8
MMBoardApp::TestMultimediaCaps()
199 // We test the Windows sound support.
201 dev
= new wxSoundStreamWin();
202 if (dev
->GetError() == wxSOUND_NOERROR
)
203 caps
|= MM_SOUND_WIN
;
206 #elif defined __UNIX__
207 // We now test the ESD support
209 dev
= new wxSoundStreamESD();
210 if (dev
->GetError() == wxSOUND_NOERROR
)
211 caps
|= MM_SOUND_ESD
;
214 // We test the OSS (Open Sound System) support.
215 // WARNING: There is a conflict between ESD and ALSA. We may be interrested
216 // in disabling the auto detection of OSS is ESD has been detected.
218 if (!(caps
& MM_SOUND_ESD
)) {
221 dev
= new wxSoundStreamOSS();
222 if (dev
->GetError() == wxSOUND_NOERROR
)
223 caps
|= MM_SOUND_OSS
;
234 // ----------------------------------------------------------------------------
236 // ----------------------------------------------------------------------------
239 MMBoardFrame::MMBoardFrame(const wxString
& title
, const wxPoint
& pos
, const wxSize
& size
)
240 : wxFrame((wxFrame
*)NULL
, wxID_ANY
, title
, pos
, size
)
243 // we need this in order to allow the about menu relocation, since ABOUT is
244 // not the default id of the about menu
245 wxApp::s_macAboutMenuItemId
= MMBoard_About
;
248 // set the frame icon
249 SetIcon(wxICON(mondrian
));
252 wxMenu
*menuFile
= new wxMenu(wxEmptyString
, wxMENU_TEAROFF
);
254 // the "About" item should be in the help menu
255 wxMenu
*helpMenu
= new wxMenu
;
256 helpMenu
->Append(MMBoard_About
, wxT("&About...\tCtrl-A"), wxT("Show about dialog"));
258 menuFile
->Append(MMBoard_Open
, wxT("&Open\tAlt-O"), wxT("Open file"));
259 menuFile
->AppendSeparator();
260 menuFile
->Append(MMBoard_Quit
, wxT("E&xit\tAlt-X"), wxT("Quit this program"));
262 // now append the freshly created menu to the menu bar...
263 wxMenuBar
*menuBar
= new wxMenuBar();
264 menuBar
->Append(menuFile
, wxT("&File"));
265 menuBar
->Append(helpMenu
, wxT("&Help"));
267 // ... and attach this menu bar to the frame
271 // create a status bar just for fun (by default with 1 pane only)
273 SetStatusText(wxT("Welcome to wxWidgets!"));
274 #endif // wxUSE_STATUSBAR
277 m_opened_file
= NULL
;
279 m_panel
= new wxPanel(this, wxID_ANY
);
281 // Initialize main slider
282 m_positionSlider
= new wxSlider( m_panel
, MMBoard_PositionSlider
, 0, 0, 60,
283 wxDefaultPosition
, wxSize(300, wxDefaultCoord
),
284 wxSL_HORIZONTAL
| wxSL_AUTOTICKS
);
285 m_positionSlider
->SetPageSize(60); // 60 secs
286 m_positionSlider
->Disable();
288 // Initialize info panel
289 wxPanel
*infoPanel
= new wxPanel( m_panel
, wxID_ANY
);
290 infoPanel
->SetBackgroundColour(*wxBLACK
);
291 infoPanel
->SetForegroundColour(*wxWHITE
);
293 wxBoxSizer
*infoSizer
= new wxBoxSizer(wxVERTICAL
);
295 m_fileType
= new wxStaticText(infoPanel
, wxID_ANY
, wxEmptyString
);
297 wxStaticLine
*line
= new wxStaticLine(infoPanel
, wxID_ANY
);
298 #endif // wxUSE_STATLINE
299 m_infoText
= new wxStaticText(infoPanel
, wxID_ANY
, wxEmptyString
);
303 infoSizer
->Add(m_fileType
, 0, wxGROW
| wxALL
, 1);
305 infoSizer
->Add(line
, 0, wxGROW
| wxCENTRE
, 20);
306 #endif // wxUSE_STATLINE
307 infoSizer
->Add(m_infoText
, 0, wxGROW
| wxALL
, 1);
309 infoPanel
->SetSizer(infoSizer
);
311 // Bitmap button panel
312 wxBoxSizer
*buttonSizer
= new wxBoxSizer(wxHORIZONTAL
);
314 wxBitmap
play_bmp(play_back_xpm
);
315 wxBitmap
stop_bmp(stop_back_xpm
);
316 wxBitmap
eject_bmp(eject_xpm
);
317 wxBitmap
pause_bmp(pause_xpm
);
319 m_playButton
= new wxBitmapButton(m_panel
, MMBoard_PlayButton
, play_bmp
);
320 m_playButton
->Disable();
321 m_pauseButton
= new wxBitmapButton(m_panel
, MMBoard_PauseButton
, pause_bmp
);
322 m_pauseButton
->Disable();
323 m_stopButton
= new wxBitmapButton(m_panel
, MMBoard_StopButton
, stop_bmp
);
324 m_stopButton
->Disable();
325 m_ejectButton
= new wxBitmapButton(m_panel
, MMBoard_EjectButton
, eject_bmp
);
326 m_ejectButton
->Disable();
328 buttonSizer
->Add(m_playButton
, 0, wxALL
, 2);
329 buttonSizer
->Add(m_pauseButton
, 0, wxALL
, 2);
330 buttonSizer
->Add(m_stopButton
, 0, wxALL
, 2);
331 buttonSizer
->Add(m_ejectButton
, 0, wxALL
, 2);
334 m_sizer
= new wxBoxSizer(wxVERTICAL
);
336 m_sizer
->Add(new wxStaticLine(m_panel
, wxID_ANY
), 0, wxGROW
| wxCENTRE
, 0);
337 #endif // wxUSE_STATLINE
338 m_sizer
->Add(m_positionSlider
, 0, wxCENTRE
| wxGROW
| wxALL
, 2);
340 m_sizer
->Add(new wxStaticLine(m_panel
, wxID_ANY
), 0, wxGROW
| wxCENTRE
, 0);
341 #endif // wxUSE_STATLINE
342 m_sizer
->Add(buttonSizer
, 0, wxALL
, 0);
344 m_sizer
->Add(new wxStaticLine(m_panel
, wxID_ANY
), 0, wxGROW
| wxCENTRE
, 0);
345 #endif // wxUSE_STATLINE
346 m_sizer
->Add(infoPanel
, 1, wxCENTRE
| wxGROW
, 0);
348 m_panel
->SetSizer(m_sizer
);
350 m_sizer
->SetSizeHints(this);
353 m_refreshTimer
= new wxTimer(this, MMBoard_RefreshInfo
);
356 m_video_window
= NULL
;
359 m_opened_file
= NULL
;
362 MMBoardFrame::~MMBoardFrame()
365 delete m_opened_file
;
367 delete m_refreshTimer
;
370 void MMBoardFrame::OpenVideoWindow()
375 m_video_window
= new wxWindow(m_panel
, wxID_ANY
, wxDefaultPosition
, wxSize(200, 200));
376 m_video_window
->SetBackgroundColour(*wxBLACK
);
377 m_sizer
->Prepend(m_video_window
, 2, wxGROW
| wxSHRINK
| wxCENTRE
, 1);
382 void MMBoardFrame::CloseVideoWindow()
387 m_sizer
->Detach( m_video_window
);
388 delete m_video_window
;
389 m_video_window
= NULL
;
396 void MMBoardFrame::OnQuit(wxCommandEvent
& WXUNUSED(event
))
398 // true is to force the frame to close
402 void MMBoardFrame::OnAbout(wxCommandEvent
& WXUNUSED(event
))
405 msg
.Printf( wxT("wxWidgets Multimedia board v1.0a, wxMMedia v2.0a:\n")
406 wxT("an example of the capabilities of the wxWidgets multimedia classes.\n")
407 wxT("Copyright 1999, 2000, Guilhem Lavaux.\n"));
409 wxMessageBox(msg
, _T("About MMBoard"), wxOK
| wxICON_INFORMATION
, this);
412 void MMBoardFrame::OnOpen(wxCommandEvent
& WXUNUSED(event
))
414 wxString selected_file
;
417 if (!m_opened_file
->IsStopped()) {
418 wxCommandEvent event2
;
421 delete m_opened_file
;
424 // select a file to be opened
426 selected_file
= wxLoadFileSelector(_T("multimedia"), _T("*"), NULL
, this);
427 #endif // wxUSE_FILEDLG
428 if (selected_file
.empty())
431 m_opened_file
= MMBoardManager::Open(selected_file
);
433 // Change the range values of the slider.
436 length
= m_opened_file
->GetLength();
437 m_positionSlider
->SetRange(0, length
.hours
* 3600 + length
.minutes
* 60 + length
.seconds
);
443 SetStatusText(selected_file
, 2);
444 #endif // wxUSE_STATUSBAR
449 // Enable a few buttons
450 m_playButton
->Enable();
451 m_ejectButton
->Enable();
452 m_positionSlider
->Enable();
454 if (m_opened_file
->NeedWindow()) {
456 m_opened_file
->SetWindow(m_video_window
);
461 void MMBoardFrame::UpdateInfoText()
463 wxString infotext1
, infotext2
;
466 infotext1
= wxT("File type:\n\t");
467 infotext1
+= m_opened_file
->GetStringType() + wxT("\n");
469 infotext2
= wxT("File informations:\n\n");
470 infotext2
+= m_opened_file
->GetStringInformation();
472 infotext1
= wxT("File type: \n\tNo file opened");
473 infotext2
= wxT("File informations:\nNo information\n\n\n\n\n");
476 m_fileType
->SetLabel(infotext1
);
477 m_infoText
->SetLabel(infotext2
);
480 void MMBoardFrame::UpdateMMedInfo()
482 MMBoardTime current
, length
;
485 current
= m_opened_file
->GetPosition();
486 length
= m_opened_file
->GetLength();
488 current
.hours
= current
.minutes
= current
.seconds
= 0;
493 // We refresh the status bar
494 wxString temp_string
;
495 temp_string
.Printf(wxT("%02d:%02d / %02d:%02d"), current
.hours
* 60 + current
.minutes
,
496 current
.seconds
, length
.hours
* 60 + length
.minutes
, length
.seconds
);
497 SetStatusText(temp_string
, 1);
500 #endif // wxUSE_STATUSBAR
502 // We set the slider position
503 m_positionSlider
->SetValue(current
.hours
* 3600 + current
.minutes
* 60 + current
.seconds
);
506 // ----------------------------------------------------------------------------
507 // Playing management, refreshers, ...
509 void MMBoardFrame::OnRefreshInfo(wxEvent
& WXUNUSED(event
))
513 if (m_opened_file
->IsStopped())
515 m_refreshTimer
->Stop();
516 m_playButton
->Enable();
517 m_stopButton
->Disable();
518 m_pauseButton
->Disable();
522 void MMBoardFrame::OnPlay(wxCommandEvent
& WXUNUSED(event
))
524 m_stopButton
->Enable();
525 m_pauseButton
->Enable();
526 m_playButton
->Disable();
528 if (m_opened_file
->IsPaused())
530 m_opened_file
->Resume();
534 m_refreshTimer
->Start(1000, false);
536 m_opened_file
->Play();
538 m_stopButton
->Enable();
539 m_pauseButton
->Enable();
540 m_playButton
->Disable();
543 void MMBoardFrame::OnStop(wxCommandEvent
& WXUNUSED(event
))
545 m_opened_file
->Stop();
546 m_refreshTimer
->Stop();
548 m_stopButton
->Disable();
549 m_playButton
->Enable();
554 void MMBoardFrame::OnPause(wxCommandEvent
& WXUNUSED(event
))
556 m_opened_file
->Pause();
558 m_playButton
->Enable();
559 m_pauseButton
->Disable();
562 void MMBoardFrame::OnEject(wxCommandEvent
& WXUNUSED(event
))
564 m_opened_file
->Stop();
566 delete m_opened_file
;
567 m_opened_file
= NULL
;
569 m_playButton
->Disable();
570 m_pauseButton
->Disable();
571 m_stopButton
->Disable();
572 m_ejectButton
->Disable();
573 m_positionSlider
->Disable();
579 void MMBoardFrame::OnSetPosition(wxCommandEvent
& WXUNUSED(event
))
584 itime
= m_positionSlider
->GetValue();
585 btime
.seconds
= itime
% 60;
586 btime
.minutes
= (itime
/ 60) % 60;
587 btime
.hours
= itime
/ 3600;
588 m_opened_file
->SetPosition(btime
);