1 /*****************************************************************************
2 * v4l.cpp : wxWindows plugin for vlc
3 *****************************************************************************
4 * Copyright (C) 2000-2001 VideoLAN
5 * $Id: v4l.cpp,v 1.2 2003/08/20 19:17:29 adn Exp $
7 * Authors: Mohammed Adnène Trojette <adn@via.ecp.fr>
9 * This program is free software; you can redistribute it and/or modify
10 * it under the terms of the GNU General Public License as published by
11 * the Free Software Foundation; either version 2 of the License, or
12 * (at your option) any later version.
14 * This program is distributed in the hope that it will be useful,
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 * GNU General Public License for more details.
19 * You should have received a copy of the GNU General Public License
20 * along with this program; if not, write to the Free Software
21 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111, USA.
22 *****************************************************************************/
24 /*****************************************************************************
26 *****************************************************************************/
27 #include <stdlib.h> /* malloc(), free() */
28 #include <errno.h> /* ENOMEM */
29 #include <string.h> /* strerror() */
34 #ifdef WIN32 /* mingw32 hack */
39 /* Let vlc take care of the i18n stuff */
40 #define WXINTL_NO_GETTEXT_MACRO
42 #include <wx/wxprec.h>
44 #include <wx/notebook.h>
45 #include <wx/textctrl.h>
46 #include <wx/combobox.h>
47 #include <wx/spinctrl.h>
48 #include <wx/statline.h>
52 #include "wxwindows.h"
55 # define wxRB_SINGLE 0
58 /*****************************************************************************
60 *****************************************************************************/
62 /* IDs for the controls and the menu commands */
71 AudioDevice_Event, ADevLocation, AudioChannel_Event,
73 Bitrate_Event, MaxBitrate_Event
76 BEGIN_EVENT_TABLE(V4LDialog, wxDialog)
78 EVT_BUTTON(wxID_OK, V4LDialog::OnOk)
79 EVT_BUTTON(wxID_CANCEL, V4LDialog::OnCancel)
81 /* Events generated by the common panel */
82 EVT_CHECKBOX(Size_Event, V4LDialog::OnSizeEnable)
83 EVT_COMBOBOX(Size_Event, V4LDialog::OnSize)
84 EVT_CHECKBOX(Norm_Event, V4LDialog::OnNormEnable)
85 EVT_COMBOBOX(Norm_Event, V4LDialog::OnNorm)
86 EVT_CHECKBOX(Frequency_Event, V4LDialog::OnFrequencyEnable)
87 EVT_COMBOBOX(Frequency_Event, V4LDialog::OnFrequency)
89 /* Events generated by the audio panel */
90 EVT_CHECKBOX(AudioDevice_Event, V4LDialog::OnAudioEnable)
91 EVT_TEXT(ADevLocation, V4LDialog::OnAudioEnable)
92 EVT_SPINCTRL(AudioChannel_Event, V4LDialog::OnAudioChannel)
94 /* Events generated by the bitrate panel */
95 EVT_CHECKBOX(Bitrate_Event, V4LDialog::OnBitrateEnable)
96 EVT_SPINCTRL(Bitrate_Event, V4LDialog::OnBitrate)
97 EVT_CHECKBOX(MaxBitrate_Event, V4LDialog::OnMaxBitrateEnable)
98 EVT_SPINCTRL(MaxBitrate_Event, V4LDialog::OnMaxBitrate)
102 /*****************************************************************************
104 *****************************************************************************/
105 V4LDialog::V4LDialog( intf_thread_t *_p_intf, wxWindow* _p_parent ):
106 wxDialog( _p_parent, -1, wxU(_("Video Device Advanced Options")),
107 wxDefaultPosition, wxDefaultSize, wxDEFAULT_FRAME_STYLE )
109 /* Initializations */
111 p_parent = _p_parent;
112 SetIcon( *p_intf->p_sys->p_icon );
114 /* Create a panel to put everything in */
115 wxPanel *panel = new wxPanel( this, -1 );
116 panel->SetAutoLayout( TRUE );
118 /* Create MRL combobox */
119 wxBoxSizer *mrl_sizer_sizer = new wxBoxSizer( wxHORIZONTAL );
120 wxStaticBox *mrl_box = new wxStaticBox( panel, -1,
121 wxU(_("Video Device MRL")) );
122 wxStaticBoxSizer *mrl_sizer = new wxStaticBoxSizer( mrl_box,
124 wxStaticText *mrl_label = new wxStaticText( panel, -1,
125 wxU(_("Destination Target:")));
126 mrl_combo = new wxComboBox( panel, MRL_Event, wxT(""),
127 wxPoint(20,25), wxSize(200, -1), 0, NULL );
128 mrl_combo->SetToolTip( wxU(_("You can use this field directly by typing "
129 "the full MRL you want to open.\n""Alternatively, the field will be "
130 "filled automatically when you use the controls below")) );
132 mrl_sizer->Add( mrl_label, 0, wxALL | wxALIGN_CENTER, 5 );
133 mrl_sizer->Add( mrl_combo, 1, wxALL | wxALIGN_CENTER, 5 );
134 mrl_sizer_sizer->Add( mrl_sizer, 1, wxEXPAND | wxALL, 5 );
136 /* Create the common panel */
137 wxPanel *common_panel = CommonPanel( panel );
139 /* Create the audio panel */
140 wxPanel *audio_panel = AudioPanel( panel );
142 /* Create the bitrate panel */
143 wxPanel *bitrate_panel = BitratePanel( panel );
146 wxStaticLine *static_line = new wxStaticLine( panel, wxID_OK );
148 /* Create the buttons */
149 wxButton *ok_button = new wxButton( panel, wxID_OK, wxU(_("OK")) );
150 ok_button->SetDefault();
151 wxButton *cancel_button = new wxButton( panel, wxID_CANCEL,
154 /* Place everything in sizers */
155 wxBoxSizer *button_sizer = new wxBoxSizer( wxHORIZONTAL );
156 button_sizer->Add( ok_button, 0, wxALL, 5 );
157 button_sizer->Add( cancel_button, 0, wxALL, 5 );
158 button_sizer->Layout();
159 wxBoxSizer *main_sizer = new wxBoxSizer( wxVERTICAL );
160 wxBoxSizer *panel_sizer = new wxBoxSizer( wxVERTICAL );
161 panel_sizer->Add( mrl_sizer_sizer, 0, wxEXPAND, 5 );
162 panel_sizer->Add( common_panel, 1, wxEXPAND | wxALL, 5 );
163 panel_sizer->Add( audio_panel, 1, wxEXPAND | wxALL, 5 );
164 panel_sizer->Add( bitrate_panel, 1, wxEXPAND | wxALL, 5 );
165 panel_sizer->Add( static_line, 0, wxEXPAND | wxALL, 5 );
166 panel_sizer->Add( button_sizer, 0, wxALIGN_LEFT | wxALIGN_BOTTOM |
168 panel_sizer->Layout();
169 panel->SetSizerAndFit( panel_sizer );
170 main_sizer->Add( panel, 1, wxGROW, 0 );
171 main_sizer->Layout();
172 SetSizerAndFit( main_sizer );
175 V4LDialog::~V4LDialog()
179 wxArrayString V4LDialog::GetOptions()
181 return SeparateEntries( mrl_combo->GetValue() );
184 /*****************************************************************************
186 *****************************************************************************/
187 void V4LDialog::UpdateMRL()
190 if( audio_checkbox->IsChecked() )
192 audio = wxT(":adev=")
193 + audio_device->GetLineText(0)
194 + wxString::Format( wxT(":audio=%d"),
195 audio_channel->GetValue() );
200 if( size_checkbox->IsChecked() )
202 common += wxT(":size=")
203 + size_combo->GetValue();
206 if( norm_checkbox->IsChecked() )
208 common += wxT(":norm=")
209 + norm_combo->GetValue();
212 if( frequency_checkbox->IsChecked() )
214 common += wxString::Format( wxT(":frequency=%d"),
215 frequency->GetValue() );
222 if( bitrate_checkbox->IsChecked() )
224 rate += wxString::Format( wxT(":bitrate=%d"),
225 bitrate->GetValue() );
228 if( maxbitrate_checkbox->IsChecked() )
230 rate += wxString::Format( wxT(":maxbitrate=%d"),
231 maxbitrate->GetValue() );
235 if( !audio.IsEmpty() || !common.IsEmpty() || !rate.IsEmpty() )
236 mrl_combo->SetValue( audio + common + rate);
238 mrl_combo->SetValue( wxT("") );
241 wxPanel *V4LDialog::CommonPanel( wxWindow* parent )
243 wxPanel *panel = new wxPanel( parent, -1, wxDefaultPosition,
246 wxStaticBox *panel_box = new wxStaticBox( panel, -1,
247 wxU(_("Common Options")) );
248 wxStaticBoxSizer *panel_sizer = new wxStaticBoxSizer( panel_box,
251 wxFlexGridSizer *subpanel_sizer;
253 common_subpanel = new wxPanel( panel, -1 );
255 subpanel_sizer = new wxFlexGridSizer( 2, 3, 20 );
257 static const wxString size_array[] =
267 size_checkbox = new wxCheckBox( common_subpanel,
270 size_combo = new wxComboBox( common_subpanel, Size_Event, wxT(""),
271 wxPoint(20,25), wxSize( 120, -1),
272 WXSIZEOF(size_array), size_array,
274 size_combo->SetSelection(5);
276 subpanel_sizer->Add( size_checkbox, 0, wxALIGN_LEFT |
277 wxALIGN_CENTER_VERTICAL );
278 subpanel_sizer->Add( size_combo, 0, wxALIGN_RIGHT |
279 wxALIGN_CENTER_VERTICAL );
281 static const wxString norm_array[] =
288 norm_checkbox = new wxCheckBox( common_subpanel,
291 norm_combo = new wxComboBox( common_subpanel, Norm_Event, wxT(""),
292 wxPoint(20,25), wxSize( 120, -1),
293 WXSIZEOF(norm_array), norm_array,
295 norm_combo->SetSelection(1);
297 subpanel_sizer->Add( norm_checkbox, 0, wxALIGN_LEFT |
298 wxALIGN_CENTER_VERTICAL );
299 subpanel_sizer->Add( norm_combo, 0, wxALIGN_RIGHT |
300 wxALIGN_CENTER_VERTICAL );
302 frequency_checkbox = new wxCheckBox( common_subpanel,
304 wxU(_("Frequency")) );
305 frequency = new wxSpinCtrl( common_subpanel, Frequency_Event );
306 frequency->SetToolTip( wxU(_("The frequency in KHz" )) );
308 subpanel_sizer->Add( frequency_checkbox, 0, wxALIGN_LEFT |
309 wxALIGN_CENTER_VERTICAL );
310 subpanel_sizer->Add( frequency, 0, wxALIGN_RIGHT |
311 wxALIGN_CENTER_VERTICAL );
313 common_subpanel->SetSizerAndFit( subpanel_sizer );
315 /* Stuff everything into the main panel */
316 panel_sizer->Add( common_subpanel, 1,
317 wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL | wxALL, 5 );
319 panel->SetSizerAndFit( panel_sizer );
322 size_combo->Disable();
323 norm_combo->Disable();
324 frequency->Disable();
329 wxPanel *V4LDialog::AudioPanel( wxWindow* parent )
331 wxPanel *panel = new wxPanel( parent, -1, wxDefaultPosition,
334 wxStaticBox *panel_box = new wxStaticBox( panel, -1,
335 wxU(_("Audio Options")) );
336 wxStaticBoxSizer *panel_sizer = new wxStaticBoxSizer( panel_box,
340 wxFlexGridSizer *subpanel_sizer;
342 audio_subpanel = new wxPanel( panel, -1 );
344 subpanel_sizer = new wxFlexGridSizer( 2, 2, 20 );
346 audio_checkbox = new wxCheckBox( audio_subpanel,
348 wxU(_("Audio Device")) );
349 audio_device = new wxTextCtrl( audio_subpanel, AudioDevice_Event,
351 wxDefaultPosition, wxSize( 120, -1 ),
353 label = new wxStaticText( audio_subpanel, -1, wxU(_("Channel")) );
354 audio_channel = new wxSpinCtrl( audio_subpanel, AudioChannel_Event );
356 subpanel_sizer->Add( audio_checkbox, 0, wxALIGN_RIGHT |
357 wxALIGN_CENTER_VERTICAL );
358 subpanel_sizer->Add( audio_device, 1, wxALIGN_RIGHT );
359 subpanel_sizer->Add( label, 0, wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL );
360 subpanel_sizer->Add( audio_channel, 0, wxALIGN_RIGHT |
361 wxALIGN_CENTER_VERTICAL );
363 audio_subpanel->SetSizerAndFit( subpanel_sizer );
365 /* Stuff everything into the main panel */
366 panel_sizer->Add( audio_subpanel, 1,
367 wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL | wxALL, 5 );
369 panel->SetSizerAndFit( panel_sizer );
372 audio_device->Disable();
373 audio_channel->Disable();
378 wxPanel *V4LDialog::BitratePanel( wxWindow* parent )
380 wxPanel *panel = new wxPanel( parent, -1, wxDefaultPosition,
383 wxStaticBox *panel_box = new wxStaticBox( panel, -1,
384 wxU(_("Bitrate Options")) );
385 wxStaticBoxSizer *panel_sizer = new wxStaticBoxSizer( panel_box,
388 wxFlexGridSizer *subpanel_sizer;
390 bitrate_subpanel = new wxPanel( panel, -1 );
392 subpanel_sizer = new wxFlexGridSizer( 2, 2, 20 );
394 bitrate_checkbox = new wxCheckBox( bitrate_subpanel,
397 bitrate = new wxSpinCtrl( bitrate_subpanel, Bitrate_Event );
399 subpanel_sizer->Add( bitrate_checkbox, 0, wxALIGN_LEFT |
400 wxALIGN_CENTER_VERTICAL );
401 subpanel_sizer->Add( bitrate, 0, wxALIGN_RIGHT |
402 wxALIGN_CENTER_VERTICAL );
404 maxbitrate_checkbox = new wxCheckBox( bitrate_subpanel,
406 wxU(_("Maximum Bitrate")) );
407 maxbitrate = new wxSpinCtrl( bitrate_subpanel, MaxBitrate_Event );
409 subpanel_sizer->Add( maxbitrate_checkbox, 0, wxALIGN_LEFT |
410 wxALIGN_CENTER_VERTICAL );
411 subpanel_sizer->Add( maxbitrate, 0, wxALIGN_RIGHT |
412 wxALIGN_CENTER_VERTICAL );
414 bitrate_subpanel->SetSizerAndFit( subpanel_sizer );
416 /* Stuff everything into the main panel */
417 panel_sizer->Add( bitrate_subpanel, 1,
418 wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL | wxALL, 5 );
420 panel->SetSizerAndFit( panel_sizer );
424 maxbitrate->Disable();
430 /*****************************************************************************
432 *****************************************************************************/
433 void V4LDialog::OnOk( wxCommandEvent& WXUNUSED(event) )
435 mrl_combo->Append( mrl_combo->GetValue() );
439 void V4LDialog::OnCancel( wxCommandEvent& WXUNUSED(event) )
441 EndModal( wxID_CANCEL );
444 void V4LDialog::OnMRLChange( wxCommandEvent& event )
446 //mrl = event.GetString();
449 /******************************************************************************
450 * Common panel event methods.
451 ******************************************************************************/
452 void V4LDialog::OnSizeEnable( wxCommandEvent& event )
455 size_combo->Enable( event.GetInt() );
458 void V4LDialog::OnSize( wxCommandEvent& event )
463 void V4LDialog::OnNormEnable( wxCommandEvent& event )
465 norm_combo->Enable( event.GetInt() );
469 void V4LDialog::OnNorm( wxCommandEvent& event )
474 void V4LDialog::OnFrequencyEnable( wxCommandEvent& event )
476 frequency->SetRange( 0, 1200000 );
477 frequency->SetValue( 479250 );
478 frequency->Enable( event.GetInt() );
482 void V4LDialog::OnFrequency( wxCommandEvent& event )
487 /*****************************************************************************
488 * Audio panel event methods.
489 *****************************************************************************/
490 void V4LDialog::OnAudioEnable( wxCommandEvent& event )
492 audio_device->SetValue( wxU( "/dev/dsp" ) );
493 audio_channel->SetRange( 0, 255 );
494 audio_channel->SetValue( 0 );
496 audio_device->Enable( event.GetInt() );
497 audio_channel->Enable( event.GetInt() );
501 void V4LDialog::OnAudioChannel( wxCommandEvent& event )
506 /******************************************************************************
507 * Bitrate panel event methods.
508 ******************************************************************************/
509 void V4LDialog::OnBitrateEnable( wxCommandEvent& event )
511 bitrate->SetRange( 0, 10000 );
512 bitrate->SetValue( 3000 );
513 bitrate->Enable( event.GetInt() );
517 void V4LDialog::OnBitrate( wxCommandEvent& event )
522 void V4LDialog::OnMaxBitrateEnable( wxCommandEvent& event )
524 maxbitrate->SetRange( 0, 10000 );
525 maxbitrate->SetValue( 3000 );
526 maxbitrate->Enable( event.GetInt() );
530 void V4LDialog::OnMaxBitrate( wxCommandEvent& event )