]>
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 #pragma implementation "mmboard.cpp"
23 // For compilers that support precompilation, includes "wx/wx.h".
24 #include "wx/wxprec.h"
30 // for all others, include the necessary headers (this file is usually all you
31 // need because it includes almost all "standard" wxWindows headers
36 // ----------------------------------------------------------------------------
38 // ----------------------------------------------------------------------------
39 // the application icon
40 #if defined(__WXGTK__) || defined(__WXX11__) || defined(__WXMOTIF__) || defined(__WXMAC__)
41 #include "mondrian.xpm"
44 // include multimedia classes
45 #include "wx/mmedia/sndbase.h"
47 #include "wx/mmedia/sndwin.h"
50 #include "wx/mmedia/sndoss.h"
51 #include "wx/mmedia/sndesd.h"
54 #include "wx/statline.h"
55 #include "wx/stattext.h"
57 // include personnal classes
66 // ----------------------------------------------------------------------------
68 // ----------------------------------------------------------------------------
70 // Main Multimedia Board frame
71 class MMBoardFrame
: public wxFrame
75 MMBoardFrame(const wxString
& title
, const wxPoint
& pos
, const wxSize
& size
);
80 void OnQuit(wxCommandEvent
& event
);
81 void OnAbout(wxCommandEvent
& event
);
82 void OnOpen(wxCommandEvent
& event
);
83 void OnPlay(wxCommandEvent
& event
);
84 void OnStop(wxCommandEvent
& event
);
85 void OnPause(wxCommandEvent
& event
);
86 void OnEject(wxCommandEvent
& event
);
87 void OnRefreshInfo(wxEvent
& event
);
88 void OnSetPosition(wxCommandEvent
& event
);
90 void OpenVideoWindow();
91 void CloseVideoWindow();
94 // any class wishing to process wxWindows events must use this macro
98 void UpdateMMedInfo();
99 void UpdateInfoText();
101 MMBoardFile
*m_opened_file
;
103 wxSlider
*m_positionSlider
;
104 wxBitmapButton
*m_playButton
, *m_pauseButton
, *m_stopButton
, *m_ejectButton
;
105 wxStaticText
*m_fileType
, *m_infoText
;
106 wxWindow
*m_video_window
;
111 wxTimer
*m_refreshTimer
;
114 // ----------------------------------------------------------------------------
116 // ----------------------------------------------------------------------------
118 // IDs for the controls and the menu commands
125 MMBoard_PositionSlider
,
128 MMBoard_ResumeButton
,
134 // ----------------------------------------------------------------------------
135 // event tables and other macros for wxWindows
136 // ----------------------------------------------------------------------------
138 BEGIN_EVENT_TABLE(MMBoardFrame
, wxFrame
)
139 EVT_MENU(MMBoard_Quit
, MMBoardFrame::OnQuit
)
140 EVT_MENU(MMBoard_About
, MMBoardFrame::OnAbout
)
141 EVT_MENU(MMBoard_Open
, MMBoardFrame::OnOpen
)
142 EVT_BUTTON(MMBoard_PlayButton
, MMBoardFrame::OnPlay
)
143 EVT_BUTTON(MMBoard_StopButton
, MMBoardFrame::OnStop
)
144 EVT_BUTTON(MMBoard_PauseButton
, MMBoardFrame::OnPause
)
145 EVT_BUTTON(MMBoard_EjectButton
, MMBoardFrame::OnEject
)
146 EVT_SLIDER(MMBoard_PositionSlider
, MMBoardFrame::OnSetPosition
)
147 EVT_CUSTOM(wxEVT_TIMER
, MMBoard_RefreshInfo
, MMBoardFrame::OnRefreshInfo
)
150 // ---------------------------------------------------------------------------
151 // Main board application launcher
152 // ---------------------------------------------------------------------------
154 IMPLEMENT_APP(MMBoardApp
)
156 // ============================================================================
158 // ============================================================================
160 // ----------------------------------------------------------------------------
161 // the application class
162 // ----------------------------------------------------------------------------
164 bool MMBoardApp::OnInit()
166 // create the main application window
167 MMBoardFrame
*frame
= new MMBoardFrame("Multimedia Board",
168 wxPoint(50, 50), wxSize(450, 340));
170 // and show it (the frames, unlike simple controls, are not shown when
171 // created initially)
174 m_caps
= TestMultimediaCaps();
177 wxMessageBox("Your system has no multimedia capabilities. We are exiting now.", "Major error !", wxOK
| wxICON_ERROR
, NULL
);
182 msg
.Printf("Detected : %s%s%s", (m_caps
& MM_SOUND_OSS
) ? "OSS " : "",
183 (m_caps
& MM_SOUND_ESD
) ? "ESD " : "",
184 (m_caps
& MM_SOUND_WIN
) ? "WIN" : "");
186 wxMessageBox(msg
, "Good !", wxOK
| wxICON_INFORMATION
, NULL
);
188 // success: wxApp::OnRun() will be called which will enter the main message
189 // loop and the application will run. If we returned FALSE here, the
190 // application would exit immediately.
194 wxUint8
MMBoardApp::TestMultimediaCaps()
202 // We now test the ESD support
204 dev
= new wxSoundStreamESD();
205 if (dev
->GetError() == wxSOUND_NOERROR
)
206 caps
|= MM_SOUND_ESD
;
209 // We test the OSS (Open Sound System) support.
210 // WARNING: There is a conflict between ESD and ALSA. We may be interrested
211 // in disabling the auto detection of OSS is ESD has been detected.
213 if (!(caps
& MM_SOUND_ESD
)) {
216 dev
= new wxSoundStreamOSS();
217 if (dev
->GetError() == wxSOUND_NOERROR
)
218 caps
|= MM_SOUND_OSS
;
227 // We test the Windows sound support.
229 dev
= new wxSoundStreamWin();
230 if (dev
->GetError() == wxSOUND_NOERROR
)
231 caps
|= MM_SOUND_WIN
;
238 // ----------------------------------------------------------------------------
240 // ----------------------------------------------------------------------------
243 MMBoardFrame::MMBoardFrame(const wxString
& title
, const wxPoint
& pos
, const wxSize
& size
)
244 : wxFrame((wxFrame
*)NULL
, -1, title
, pos
, size
)
247 // we need this in order to allow the about menu relocation, since ABOUT is
248 // not the default id of the about menu
249 wxApp::s_macAboutMenuItemId
= MMBoard_About
;
252 // set the frame icon
253 SetIcon(wxICON(mondrian
));
256 wxMenu
*menuFile
= new wxMenu(wxT(""), wxMENU_TEAROFF
);
258 // the "About" item should be in the help menu
259 wxMenu
*helpMenu
= new wxMenu
;
260 helpMenu
->Append(MMBoard_About
, wxT("&About...\tCtrl-A"), wxT("Show about dialog"));
262 menuFile
->Append(MMBoard_Open
, wxT("&Open\tAlt-O"), wxT("Open file"));
263 menuFile
->AppendSeparator();
264 menuFile
->Append(MMBoard_Quit
, wxT("E&xit\tAlt-X"), wxT("Quit this program"));
266 // now append the freshly created menu to the menu bar...
267 wxMenuBar
*menuBar
= new wxMenuBar();
268 menuBar
->Append(menuFile
, wxT("&File"));
269 menuBar
->Append(helpMenu
, wxT("&Help"));
271 // ... and attach this menu bar to the frame
275 // create a status bar just for fun (by default with 1 pane only)
277 SetStatusText(wxT("Welcome to wxWindows!"));
278 #endif // wxUSE_STATUSBAR
281 m_opened_file
= NULL
;
283 m_panel
= new wxPanel(this, -1);
285 // Initialize main slider
286 m_positionSlider
= new wxSlider( m_panel
, MMBoard_PositionSlider
, 0, 0, 60,
287 wxDefaultPosition
, wxSize(300, -1),
288 wxSL_HORIZONTAL
| wxSL_AUTOTICKS
);
289 m_positionSlider
->SetPageSize(60); // 60 secs
290 m_positionSlider
->Enable(FALSE
);
292 // Initialize info panel
293 wxPanel
*infoPanel
= new wxPanel( m_panel
, -1);
294 infoPanel
->SetBackgroundColour(*wxBLACK
);
295 infoPanel
->SetForegroundColour(*wxWHITE
);
297 wxBoxSizer
*infoSizer
= new wxBoxSizer(wxVERTICAL
);
299 m_fileType
= new wxStaticText(infoPanel
, -1, wxT(""));
300 wxStaticLine
*line
= new wxStaticLine(infoPanel
, -1);
301 m_infoText
= new wxStaticText(infoPanel
, -1, "");
305 infoSizer
->Add(m_fileType
, 0, wxGROW
| wxALL
, 1);
306 infoSizer
->Add(line
, 0, wxGROW
| wxCENTRE
, 20);
307 infoSizer
->Add(m_infoText
, 0, wxGROW
| wxALL
, 1);
309 infoPanel
->SetSizer(infoSizer
);
310 infoPanel
->SetAutoLayout(TRUE
);
312 // Bitmap button panel
313 wxBoxSizer
*buttonSizer
= new wxBoxSizer(wxHORIZONTAL
);
315 wxBitmap
play_bmp(play_back_xpm
);
316 wxBitmap
stop_bmp(stop_back_xpm
);
317 wxBitmap
eject_bmp(eject_xpm
);
318 wxBitmap
pause_bmp(pause_xpm
);
320 m_playButton
= new wxBitmapButton(m_panel
, MMBoard_PlayButton
, play_bmp
);
321 m_playButton
->Enable(FALSE
);
322 m_pauseButton
= new wxBitmapButton(m_panel
, MMBoard_PauseButton
, pause_bmp
);
323 m_pauseButton
->Enable(FALSE
);
324 m_stopButton
= new wxBitmapButton(m_panel
, MMBoard_StopButton
, stop_bmp
);
325 m_stopButton
->Enable(FALSE
);
326 m_ejectButton
= new wxBitmapButton(m_panel
, MMBoard_EjectButton
, eject_bmp
);
327 m_ejectButton
->Enable(FALSE
);
329 buttonSizer
->Add(m_playButton
, 0, wxALL
, 2);
330 buttonSizer
->Add(m_pauseButton
, 0, wxALL
, 2);
331 buttonSizer
->Add(m_stopButton
, 0, wxALL
, 2);
332 buttonSizer
->Add(m_ejectButton
, 0, wxALL
, 2);
335 m_sizer
= new wxBoxSizer(wxVERTICAL
);
336 m_sizer
->Add(new wxStaticLine(m_panel
, -1), 0, wxGROW
| wxCENTRE
, 0);
337 m_sizer
->Add(m_positionSlider
, 0, wxCENTRE
| wxGROW
| wxALL
, 2);
338 m_sizer
->Add(new wxStaticLine(m_panel
, -1), 0, wxGROW
| wxCENTRE
, 0);
339 m_sizer
->Add(buttonSizer
, 0, wxALL
, 0);
340 m_sizer
->Add(new wxStaticLine(m_panel
, -1), 0, wxGROW
| wxCENTRE
, 0);
341 m_sizer
->Add(infoPanel
, 1, wxCENTRE
| wxGROW
, 0);
343 m_panel
->SetSizer(m_sizer
);
344 m_panel
->SetAutoLayout(TRUE
);
346 m_sizer
->SetSizeHints(this);
349 m_refreshTimer
= new wxTimer(this, MMBoard_RefreshInfo
);
352 m_video_window
= NULL
;
355 m_opened_file
= NULL
;
358 MMBoardFrame::~MMBoardFrame()
361 delete m_opened_file
;
363 delete m_refreshTimer
;
366 void MMBoardFrame::OpenVideoWindow()
371 m_video_window
= new wxWindow(m_panel
, -1, wxDefaultPosition
, wxSize(200, 200));
372 m_video_window
->SetBackgroundColour(*wxBLACK
);
373 m_sizer
->Prepend(m_video_window
, 2, wxGROW
| wxSHRINK
| wxCENTRE
, 1);
378 void MMBoardFrame::CloseVideoWindow()
383 m_sizer
->Remove(m_video_window
);
384 delete m_video_window
;
385 m_video_window
= NULL
;
392 void MMBoardFrame::OnQuit(wxCommandEvent
& WXUNUSED(event
))
394 // TRUE is to force the frame to close
398 void MMBoardFrame::OnAbout(wxCommandEvent
& WXUNUSED(event
))
401 msg
.Printf( wxT("wxWindows Multimedia board v1.0a, wxMMedia v2.0a:\n")
402 wxT("an example of the capabilities of the wxWindows multimedia classes.\n")
403 wxT("Copyright 1999, 2000, Guilhem Lavaux.\n"));
405 wxMessageBox(msg
, "About MMBoard", wxOK
| wxICON_INFORMATION
, this);
408 void MMBoardFrame::OnOpen(wxCommandEvent
& WXUNUSED(event
))
410 wxString selected_file
;
413 if (!m_opened_file
->IsStopped()) {
414 wxCommandEvent event2
;
417 delete m_opened_file
;
420 // select a file to be opened
421 selected_file
= wxLoadFileSelector("multimedia", "*", NULL
, this);
422 if (selected_file
.IsNull())
425 m_opened_file
= MMBoardManager::Open(selected_file
);
427 // Change the range values of the slider.
430 length
= m_opened_file
->GetLength();
431 m_positionSlider
->SetRange(0, length
.hours
* 3600 + length
.minutes
* 60 + length
.seconds
);
436 SetStatusText(selected_file
, 2);
441 // Enable a few buttons
442 m_playButton
->Enable(TRUE
);
443 m_ejectButton
->Enable(TRUE
);
444 m_positionSlider
->Enable(TRUE
);
446 if (m_opened_file
->NeedWindow()) {
448 m_opened_file
->SetWindow(m_video_window
);
453 void MMBoardFrame::UpdateInfoText()
455 wxString infotext1
, infotext2
;
458 infotext1
= wxT("File type:\n\t");
459 infotext1
+= m_opened_file
->GetStringType() + wxT("\n");
461 infotext2
= wxT("File informations:\n\n");
462 infotext2
+= m_opened_file
->GetStringInformation();
464 infotext1
= wxT("File type: \n\tNo file opened");
465 infotext2
= wxT("File informations:\nNo information\n\n\n\n\n");
468 m_fileType
->SetLabel(infotext1
);
469 m_infoText
->SetLabel(infotext2
);
472 void MMBoardFrame::UpdateMMedInfo()
474 wxString temp_string
;
475 MMBoardTime current
, length
;
478 current
= m_opened_file
->GetPosition();
479 length
= m_opened_file
->GetLength();
481 current
.hours
= current
.minutes
= current
.seconds
= 0;
485 // We refresh the status bar
486 temp_string
.Printf(wxT("%02d:%02d / %02d:%02d"), current
.hours
* 60 + current
.minutes
,
487 current
.seconds
, length
.hours
* 60 + length
.minutes
, length
.seconds
);
488 SetStatusText(temp_string
, 1);
490 // We set the slider position
491 m_positionSlider
->SetValue(current
.hours
* 3600 + current
.minutes
* 60 + current
.seconds
);
494 // ----------------------------------------------------------------------------
495 // Playing management, refreshers, ...
497 void MMBoardFrame::OnRefreshInfo(wxEvent
& WXUNUSED(event
))
501 if (m_opened_file
->IsStopped()) {
502 m_refreshTimer
->Stop();
503 m_playButton
->Enable(TRUE
);
504 m_stopButton
->Enable(FALSE
);
505 m_pauseButton
->Enable(FALSE
);
509 void MMBoardFrame::OnPlay(wxCommandEvent
& WXUNUSED(event
))
511 m_stopButton
->Enable(TRUE
);
512 m_pauseButton
->Enable(TRUE
);
513 m_playButton
->Enable(FALSE
);
515 if (m_opened_file
->IsPaused()) {
516 m_opened_file
->Resume();
520 m_refreshTimer
->Start(1000, FALSE
);
522 m_opened_file
->Play();
524 m_stopButton
->Enable(TRUE
);
525 m_pauseButton
->Enable(TRUE
);
526 m_playButton
->Enable(FALSE
);
529 void MMBoardFrame::OnStop(wxCommandEvent
& WXUNUSED(event
))
531 m_opened_file
->Stop();
532 m_refreshTimer
->Stop();
534 m_stopButton
->Enable(FALSE
);
535 m_playButton
->Enable(TRUE
);
540 void MMBoardFrame::OnPause(wxCommandEvent
& WXUNUSED(event
))
542 m_opened_file
->Pause();
544 m_playButton
->Enable(TRUE
);
545 m_pauseButton
->Enable(FALSE
);
548 void MMBoardFrame::OnEject(wxCommandEvent
& WXUNUSED(event
))
550 m_opened_file
->Stop();
552 delete m_opened_file
;
553 m_opened_file
= NULL
;
555 m_playButton
->Enable(FALSE
);
556 m_pauseButton
->Enable(FALSE
);
557 m_stopButton
->Enable(FALSE
);
558 m_ejectButton
->Enable(FALSE
);
559 m_positionSlider
->Enable(FALSE
);
565 void MMBoardFrame::OnSetPosition(wxCommandEvent
& WXUNUSED(event
))
570 itime
= m_positionSlider
->GetValue();
571 btime
.seconds
= itime
% 60;
572 btime
.minutes
= (itime
/ 60) % 60;
573 btime
.hours
= itime
/ 3600;
574 m_opened_file
->SetPosition(btime
);