1 /*****************************************************************************
2 * v4l.cpp : wxWindows plugin for vlc
3 *****************************************************************************
4 * Copyright (C) 2000-2003 VideoLAN
5 * $Id: v4l.cpp,v 1.7 2004/01/25 03:29:02 hartman 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 #include <wx/combobox.h>
40 #include <wx/statline.h>
44 #include "wxwindows.h"
47 # define wxRB_SINGLE 0
50 /*****************************************************************************
52 *****************************************************************************/
54 /* IDs for the controls and the menu commands */
61 FrequencyEnable_Event,Frequency_Event,
63 AudioDevice_Event, ADevLocation, AudioChannel_Event,
65 BitrateEnable_Event, MaxBitrateEnable_Event,
66 Bitrate_Event, MaxBitrate_Event
69 BEGIN_EVENT_TABLE(V4LDialog, wxDialog)
71 EVT_BUTTON(wxID_OK, V4LDialog::OnOk)
72 EVT_BUTTON(wxID_CANCEL, V4LDialog::OnCancel)
74 /* Events generated by the common panel */
75 EVT_CHECKBOX(Size_Event, V4LDialog::OnSizeEnable)
76 EVT_COMBOBOX(Size_Event, V4LDialog::OnSize)
77 EVT_CHECKBOX(Norm_Event, V4LDialog::OnNormEnable)
78 EVT_COMBOBOX(Norm_Event, V4LDialog::OnNorm)
79 EVT_CHECKBOX(FrequencyEnable_Event, V4LDialog::OnFrequencyEnable)
80 EVT_SPINCTRL(Frequency_Event, V4LDialog::OnFrequency)
82 /* Events generated by the audio panel */
83 EVT_CHECKBOX(AudioDevice_Event, V4LDialog::OnAudioEnable)
84 EVT_TEXT(ADevLocation, V4LDialog::OnAudioChange)
85 EVT_SPINCTRL(AudioChannel_Event, V4LDialog::OnAudioChannel)
87 /* Events generated by the bitrate panel */
88 EVT_CHECKBOX(BitrateEnable_Event, V4LDialog::OnBitrateEnable)
89 EVT_SPINCTRL(Bitrate_Event, V4LDialog::OnBitrate)
90 EVT_CHECKBOX(MaxBitrateEnable_Event, V4LDialog::OnMaxBitrateEnable)
91 EVT_SPINCTRL(MaxBitrate_Event, V4LDialog::OnMaxBitrate)
95 /*****************************************************************************
97 *****************************************************************************/
98 V4LDialog::V4LDialog( intf_thread_t *_p_intf, wxWindow* _p_parent ):
99 wxDialog( _p_parent, -1, wxU(_("Advanced video device options")),
100 wxDefaultPosition, wxDefaultSize, wxDEFAULT_FRAME_STYLE )
102 /* Initializations */
104 p_parent = _p_parent;
105 SetIcon( *p_intf->p_sys->p_icon );
107 /* Create a panel to put everything in */
108 wxPanel *panel = new wxPanel( this, -1 );
109 panel->SetAutoLayout( TRUE );
111 /* Create MRL combobox */
112 wxBoxSizer *mrl_sizer_sizer = new wxBoxSizer( wxHORIZONTAL );
113 wxStaticBox *mrl_box = new wxStaticBox( panel, -1,
114 wxU(_("Video device MRL")) );
115 wxStaticBoxSizer *mrl_sizer = new wxStaticBoxSizer( mrl_box,
117 wxStaticText *mrl_label = new wxStaticText( panel, -1,
118 wxU(_("Destination target:")));
119 mrl_combo = new wxComboBox( panel, MRL_Event, wxT(""),
120 wxPoint(20,25), wxSize(200, -1), 0, NULL );
121 mrl_combo->SetToolTip( wxU(_("You can use this field directly by typing "
122 "the full MRL you want to open.\n Alternatively, the field will be "
123 "filled automatically when you use the controls below")) );
125 mrl_sizer->Add( mrl_label, 0, wxALL | wxALIGN_CENTER, 5 );
126 mrl_sizer->Add( mrl_combo, 1, wxALL | wxALIGN_CENTER, 5 );
127 mrl_sizer_sizer->Add( mrl_sizer, 1, wxEXPAND | wxALL, 5 );
129 /* Create the common panel */
130 wxPanel *common_panel = CommonPanel( panel );
132 /* Create the audio panel */
133 wxPanel *audio_panel = AudioPanel( panel );
135 /* Create the bitrate panel */
136 wxPanel *bitrate_panel = BitratePanel( panel );
139 wxStaticLine *static_line = new wxStaticLine( panel, wxID_OK );
141 /* Create the buttons */
142 wxButton *ok_button = new wxButton( panel, wxID_OK, wxU(_("OK")) );
143 ok_button->SetDefault();
144 wxButton *cancel_button = new wxButton( panel, wxID_CANCEL,
147 /* Place everything in sizers */
148 wxBoxSizer *button_sizer = new wxBoxSizer( wxHORIZONTAL );
149 button_sizer->Add( ok_button, 0, wxALL, 5 );
150 button_sizer->Add( cancel_button, 0, wxALL, 5 );
151 button_sizer->Layout();
152 wxBoxSizer *main_sizer = new wxBoxSizer( wxVERTICAL );
153 wxBoxSizer *panel_sizer = new wxBoxSizer( wxVERTICAL );
154 panel_sizer->Add( mrl_sizer_sizer, 0, wxEXPAND, 5 );
155 panel_sizer->Add( common_panel, 1, wxEXPAND | wxALL, 5 );
156 panel_sizer->Add( audio_panel, 1, wxEXPAND | wxALL, 5 );
157 panel_sizer->Add( bitrate_panel, 1, wxEXPAND | wxALL, 5 );
158 panel_sizer->Add( static_line, 0, wxEXPAND | wxALL, 5 );
159 panel_sizer->Add( button_sizer, 0, wxALIGN_LEFT | wxALIGN_BOTTOM |
161 panel_sizer->Layout();
162 panel->SetSizerAndFit( panel_sizer );
163 main_sizer->Add( panel, 1, wxGROW, 0 );
164 main_sizer->Layout();
165 SetSizerAndFit( main_sizer );
168 V4LDialog::~V4LDialog()
172 wxArrayString V4LDialog::GetOptions()
174 return SeparateEntries( mrl_combo->GetValue() );
177 /*****************************************************************************
179 *****************************************************************************/
180 void V4LDialog::UpdateMRL()
183 if( audio_checkbox->IsChecked() )
185 audio = wxT(":adev=")
186 + audio_device->GetLineText(0)
187 + wxString::Format( wxT(":audio=%d"),
188 audio_channel->GetValue() );
193 if( size_checkbox->IsChecked() )
195 common += wxT(":size=")
196 + size_combo->GetValue();
199 if( norm_checkbox->IsChecked() )
201 common += wxT(":norm=")
202 + norm_combo->GetValue();
205 if( frequency_checkbox->IsChecked() )
207 common += wxString::Format( wxT(":frequency=%d"),
208 frequency->GetValue() );
215 if( bitrate_checkbox->IsChecked() )
217 rate += wxString::Format( wxT(":bitrate=%d"),
218 bitrate->GetValue() );
221 if( maxbitrate_checkbox->IsChecked() )
223 rate += wxString::Format( wxT(":maxbitrate=%d"),
224 maxbitrate->GetValue() );
228 if( !audio.IsEmpty() || !common.IsEmpty() || !rate.IsEmpty() )
229 mrl_combo->SetValue( audio + common + rate);
231 mrl_combo->SetValue( wxT("") );
234 wxPanel *V4LDialog::CommonPanel( wxWindow* parent )
236 wxPanel *panel = new wxPanel( parent, -1, wxDefaultPosition,
239 wxStaticBox *panel_box = new wxStaticBox( panel, -1,
240 wxU(_("Common options")) );
241 wxStaticBoxSizer *panel_sizer = new wxStaticBoxSizer( panel_box,
244 wxFlexGridSizer *subpanel_sizer;
246 common_subpanel = new wxPanel( panel, -1 );
248 subpanel_sizer = new wxFlexGridSizer( 2, 3, 20 );
250 static const wxString size_array[] =
260 size_checkbox = new wxCheckBox( common_subpanel,
263 size_combo = new wxComboBox( common_subpanel, Size_Event, wxT(""),
264 wxPoint(20,25), wxSize( 120, -1),
265 WXSIZEOF(size_array), size_array,
267 size_combo->SetSelection(5);
269 subpanel_sizer->Add( size_checkbox, 0, wxALIGN_LEFT |
270 wxALIGN_CENTER_VERTICAL );
271 subpanel_sizer->Add( size_combo, 0, wxALIGN_RIGHT |
272 wxALIGN_CENTER_VERTICAL );
274 static const wxString norm_array[] =
281 norm_checkbox = new wxCheckBox( common_subpanel,
284 norm_combo = new wxComboBox( common_subpanel, Norm_Event, wxT(""),
285 wxPoint(20,25), wxSize( 120, -1),
286 WXSIZEOF(norm_array), norm_array,
288 norm_combo->SetSelection(1);
289 norm_combo->SetToolTip( wxU(_( "Standard of the analog signal" )) );
290 subpanel_sizer->Add( norm_checkbox, 0, wxALIGN_LEFT |
291 wxALIGN_CENTER_VERTICAL );
292 subpanel_sizer->Add( norm_combo, 0, wxALIGN_RIGHT |
293 wxALIGN_CENTER_VERTICAL );
295 frequency_checkbox = new wxCheckBox( common_subpanel,
296 FrequencyEnable_Event,
297 wxU(_("Frequency (kHz)")) );
298 frequency = new wxSpinCtrl( common_subpanel, Frequency_Event,
300 frequency->SetToolTip( wxU(_("The channel frequency in kHz" )) );
302 subpanel_sizer->Add( frequency_checkbox, 0, wxALIGN_LEFT |
303 wxALIGN_CENTER_VERTICAL );
304 subpanel_sizer->Add( frequency, 0, wxALIGN_RIGHT |
305 wxALIGN_CENTER_VERTICAL );
307 common_subpanel->SetSizerAndFit( subpanel_sizer );
309 /* Stuff everything into the main panel */
310 panel_sizer->Add( common_subpanel, 1,
311 wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL | wxALL, 5 );
313 panel->SetSizerAndFit( panel_sizer );
316 size_combo->Disable();
317 norm_combo->Disable();
318 frequency->Disable();
323 wxPanel *V4LDialog::AudioPanel( wxWindow* parent )
325 wxPanel *panel = new wxPanel( parent, -1, wxDefaultPosition,
328 wxStaticBox *panel_box = new wxStaticBox( panel, -1,
329 wxU(_("Audio options")) );
330 wxStaticBoxSizer *panel_sizer = new wxStaticBoxSizer( panel_box,
334 wxFlexGridSizer *subpanel_sizer;
336 audio_subpanel = new wxPanel( panel, -1 );
338 subpanel_sizer = new wxFlexGridSizer( 2, 2, 20 );
340 audio_checkbox = new wxCheckBox( audio_subpanel,
342 wxU(_("Audio device")) );
343 audio_device = new wxTextCtrl( audio_subpanel, ADevLocation,
345 wxDefaultPosition, wxSize( 120, -1 ),
347 audio_device->SetToolTip( wxU(_("Audio device")) );
348 label = new wxStaticText( audio_subpanel, -1, wxU(_("Channel")) );
349 audio_channel = new wxSpinCtrl( audio_subpanel, AudioChannel_Event,
351 audio_channel->SetToolTip( wxU(_("Usually 0 is for mono "
352 "and 1 for stereo")) );
353 subpanel_sizer->Add( audio_checkbox, 0, wxALIGN_RIGHT |
354 wxALIGN_CENTER_VERTICAL );
355 subpanel_sizer->Add( audio_device, 1, wxALIGN_RIGHT );
356 subpanel_sizer->Add( label, 0, wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL );
357 subpanel_sizer->Add( audio_channel, 0, wxALIGN_RIGHT |
358 wxALIGN_CENTER_VERTICAL );
360 audio_subpanel->SetSizerAndFit( subpanel_sizer );
362 /* Stuff everything into the main panel */
363 panel_sizer->Add( audio_subpanel, 1,
364 wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL | wxALL, 5 );
366 panel->SetSizerAndFit( panel_sizer );
369 audio_device->Disable();
370 audio_channel->Disable();
375 wxPanel *V4LDialog::BitratePanel( wxWindow* parent )
377 wxPanel *panel = new wxPanel( parent, -1, wxDefaultPosition,
380 wxStaticBox *panel_box = new wxStaticBox( panel, -1,
381 wxU(_("Bitrate options")) );
382 wxStaticBoxSizer *panel_sizer = new wxStaticBoxSizer( panel_box,
385 wxFlexGridSizer *subpanel_sizer;
387 bitrate_subpanel = new wxPanel( panel, -1 );
389 subpanel_sizer = new wxFlexGridSizer( 2, 2, 20 );
391 bitrate_checkbox = new wxCheckBox( bitrate_subpanel,
394 bitrate = new wxSpinCtrl( bitrate_subpanel, Bitrate_Event, wxT("3000") );
395 bitrate->SetToolTip( wxU(_("The average bitrate of the stream")) );
396 subpanel_sizer->Add( bitrate_checkbox, 0, wxALIGN_LEFT |
397 wxALIGN_CENTER_VERTICAL );
398 subpanel_sizer->Add( bitrate, 0, wxALIGN_RIGHT |
399 wxALIGN_CENTER_VERTICAL );
401 maxbitrate_checkbox = new wxCheckBox( bitrate_subpanel,
402 MaxBitrateEnable_Event,
403 wxU(_("Maximum bitrate")) );
404 maxbitrate = new wxSpinCtrl( bitrate_subpanel, MaxBitrate_Event, wxT("3000") );
405 maxbitrate->SetToolTip( wxU(_("The maximum bitrate of the stream")) );
407 subpanel_sizer->Add( maxbitrate_checkbox, 0, wxALIGN_LEFT |
408 wxALIGN_CENTER_VERTICAL );
409 subpanel_sizer->Add( maxbitrate, 0, wxALIGN_RIGHT |
410 wxALIGN_CENTER_VERTICAL );
412 bitrate_subpanel->SetSizerAndFit( subpanel_sizer );
414 /* Stuff everything into the main panel */
415 panel_sizer->Add( bitrate_subpanel, 1,
416 wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL | wxALL, 5 );
418 panel->SetSizerAndFit( panel_sizer );
422 maxbitrate->Disable();
428 /*****************************************************************************
430 *****************************************************************************/
431 void V4LDialog::OnOk( wxCommandEvent& WXUNUSED(event) )
433 mrl_combo->Append( mrl_combo->GetValue() );
437 void V4LDialog::OnCancel( wxCommandEvent& WXUNUSED(event) )
439 EndModal( wxID_CANCEL );
442 void V4LDialog::OnMRLChange( wxCommandEvent& event )
444 //mrl = event.GetString();
447 /******************************************************************************
448 * Common panel event methods.
449 ******************************************************************************/
450 void V4LDialog::OnSizeEnable( wxCommandEvent& event )
453 size_combo->Enable( event.GetInt() );
456 void V4LDialog::OnSize( wxCommandEvent& event )
461 void V4LDialog::OnNormEnable( wxCommandEvent& event )
463 norm_combo->Enable( event.GetInt() );
467 void V4LDialog::OnNorm( wxCommandEvent& event )
472 void V4LDialog::OnFrequencyEnable( wxCommandEvent& event )
474 frequency->SetRange( 0, 1200000 );
475 frequency->Enable( event.GetInt() );
479 void V4LDialog::OnFrequency( wxCommandEvent& event )
484 /*****************************************************************************
485 * Audio panel event methods.
486 *****************************************************************************/
487 void V4LDialog::OnAudioEnable( wxCommandEvent& event )
489 audio_channel->SetRange( 0, 255 );
491 audio_device->Enable( event.GetInt() );
492 audio_channel->Enable( event.GetInt() );
496 void V4LDialog::OnAudioChange( wxCommandEvent& event )
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->Enable( event.GetInt() );
516 void V4LDialog::OnBitrate( wxCommandEvent& event )
521 void V4LDialog::OnMaxBitrateEnable( wxCommandEvent& event )
523 maxbitrate->SetRange( 0, 10000 );
524 maxbitrate->Enable( event.GetInt() );
528 void V4LDialog::OnMaxBitrate( wxCommandEvent& event )