]> git.sesse.net Git - vlc/blob - modules/gui/wxwindows/v4l.cpp
- Updated French translation (still a lot of work to do...)
[vlc] / modules / gui / wxwindows / v4l.cpp
1 /*****************************************************************************
2  * v4l.cpp : wxWindows plugin for vlc
3  *****************************************************************************
4  * Copyright (C) 2000-2001 VideoLAN
5  * $Id: v4l.cpp,v 1.3 2003/11/23 18:31:54 alexis Exp $
6  *
7  * Authors: Mohammed Adnène Trojette <adn@via.ecp.fr>
8  *
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.
13  *
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.
18  *
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  *****************************************************************************/
23
24 /*****************************************************************************
25  * Preamble
26  *****************************************************************************/
27 #include <stdlib.h>                                      /* malloc(), free() */
28 #include <errno.h>                                                 /* ENOMEM */
29 #include <string.h>                                            /* strerror() */
30 #include <stdio.h>
31
32 #include <vlc/vlc.h>
33
34 #ifdef WIN32                                                 /* mingw32 hack */
35 #undef Yield
36 #undef CreateDialog
37 #endif
38
39 /* Let vlc take care of the i18n stuff */
40 #define WXINTL_NO_GETTEXT_MACRO
41
42 #include <wx/wxprec.h>
43 #include <wx/wx.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>
49
50 #include <vlc/intf.h>
51
52 #include "wxwindows.h"
53
54 #ifndef wxRB_SINGLE
55 #   define wxRB_SINGLE 0
56 #endif
57
58 /*****************************************************************************
59  * Event Table.
60  *****************************************************************************/
61
62 /* IDs for the controls and the menu commands */
63 enum
64 {
65     MRL_Event,
66
67     Size_Event,
68     Norm_Event,
69     Frequency_Event,
70
71     AudioDevice_Event, ADevLocation, AudioChannel_Event,
72
73     Bitrate_Event, MaxBitrate_Event
74 };
75
76 BEGIN_EVENT_TABLE(V4LDialog, wxDialog)
77     /* Button events */
78     EVT_BUTTON(wxID_OK, V4LDialog::OnOk)
79     EVT_BUTTON(wxID_CANCEL, V4LDialog::OnCancel)
80
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)
88
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)
93
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)
99
100 END_EVENT_TABLE()
101
102 /*****************************************************************************
103  * Constructor.
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 )
108 {
109     /* Initializations */
110     p_intf = _p_intf;
111     p_parent = _p_parent;
112     SetIcon( *p_intf->p_sys->p_icon );
113
114     /* Create a panel to put everything in */
115     wxPanel *panel = new wxPanel( this, -1 );
116     panel->SetAutoLayout( TRUE );
117
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,
123                                                         wxHORIZONTAL );
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")) );
131
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 );
135
136     /* Create the common panel */
137     wxPanel *common_panel = CommonPanel( panel );
138
139     /* Create the audio panel */
140     wxPanel *audio_panel = AudioPanel( panel );
141
142     /* Create the bitrate panel */
143     wxPanel *bitrate_panel = BitratePanel( panel );
144
145     /* Separation */
146     wxStaticLine *static_line = new wxStaticLine( panel, wxID_OK );
147
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,
152                                             wxU(_("Cancel")) );
153
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 |
167                       wxALL, 5 );
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 );
173 }
174
175 V4LDialog::~V4LDialog()
176 {
177 }
178
179 wxArrayString V4LDialog::GetOptions()
180 {
181    return SeparateEntries( mrl_combo->GetValue() );
182 }
183
184 /*****************************************************************************
185  * Private methods.
186  *****************************************************************************/
187 void V4LDialog::UpdateMRL()
188 {
189     wxString audio;
190     if( audio_checkbox->IsChecked() )
191         {
192             audio = wxT(":adev=")
193                     + audio_device->GetLineText(0)
194                     + wxString::Format( wxT(":audio=%d"),
195                         audio_channel->GetValue() );
196         }
197
198     wxString common;
199     {
200         if( size_checkbox->IsChecked() )
201         {
202             common += wxT(":size=")
203                 + size_combo->GetValue();
204         }
205
206         if( norm_checkbox->IsChecked() )
207         {
208             common += wxT(":norm=")
209                     + norm_combo->GetValue();
210         }
211
212         if( frequency_checkbox->IsChecked() )
213         {
214             common += wxString::Format( wxT(":frequency=%d"),
215                                         frequency->GetValue() );
216         }
217
218     }
219
220     wxString rate;
221     {
222         if( bitrate_checkbox->IsChecked() )
223         {
224             rate += wxString::Format( wxT(":bitrate=%d"),
225                                       bitrate->GetValue() );
226         }
227
228         if( maxbitrate_checkbox->IsChecked() )
229         {
230             rate += wxString::Format( wxT(":maxbitrate=%d"),
231                                       maxbitrate->GetValue() );
232         }
233     }
234
235     if( !audio.IsEmpty() || !common.IsEmpty() || !rate.IsEmpty() )
236         mrl_combo->SetValue( audio + common + rate);
237     else
238         mrl_combo->SetValue( wxT("") );
239 }
240
241 wxPanel *V4LDialog::CommonPanel( wxWindow* parent )
242 {
243     wxPanel *panel = new wxPanel( parent, -1, wxDefaultPosition,
244                                   wxSize(200, 200) );
245
246     wxStaticBox *panel_box = new wxStaticBox( panel, -1,
247                                    wxU(_("Common Options")) );
248     wxStaticBoxSizer *panel_sizer = new wxStaticBoxSizer( panel_box,
249                                                           wxVERTICAL );
250
251     wxFlexGridSizer *subpanel_sizer;
252
253     common_subpanel = new wxPanel( panel, -1 );
254
255     subpanel_sizer = new wxFlexGridSizer( 2, 3, 20 );
256
257     static const wxString size_array[] =
258     {
259         wxT("subqcif"),
260         wxT("qsif"),
261         wxT("qcif"),
262         wxT("sif"),
263         wxT("cif"),
264         wxT("vga"),
265     };
266
267     size_checkbox = new wxCheckBox( common_subpanel,
268                                     Size_Event,
269                                     wxU(_("Size")) );
270     size_combo = new wxComboBox( common_subpanel, Size_Event, wxT(""),
271                                  wxPoint(20,25), wxSize( 120, -1),
272                                  WXSIZEOF(size_array), size_array,
273                                  wxCB_READONLY );
274     size_combo->SetSelection(5);
275
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 );
280
281     static const wxString norm_array[] =
282     {
283         wxT("pal"),
284         wxT("secam"),
285         wxT("ntsc")
286     };
287
288     norm_checkbox = new wxCheckBox( common_subpanel,
289                                      Norm_Event,
290                                      wxU(_("Norm")) );
291     norm_combo = new wxComboBox( common_subpanel, Norm_Event, wxT(""),
292                                  wxPoint(20,25), wxSize( 120, -1),
293                                  WXSIZEOF(norm_array), norm_array,
294                                  wxCB_READONLY );
295     norm_combo->SetSelection(1);
296
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 );
301
302     frequency_checkbox = new wxCheckBox( common_subpanel,
303                                          Frequency_Event,
304                                          wxU(_("Frequency")) );
305     frequency = new wxSpinCtrl( common_subpanel, Frequency_Event );
306     frequency->SetToolTip( wxU(_("The frequency in kHz" )) );
307
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 );
312
313     common_subpanel->SetSizerAndFit( subpanel_sizer );
314
315     /* Stuff everything into the main panel */
316     panel_sizer->Add( common_subpanel, 1,
317                       wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL | wxALL, 5 );
318
319     panel->SetSizerAndFit( panel_sizer );
320
321     /* Update panel */
322     size_combo->Disable();
323     norm_combo->Disable();
324     frequency->Disable();
325
326     return panel;
327 }
328
329 wxPanel *V4LDialog::AudioPanel( wxWindow* parent )
330 {
331     wxPanel *panel = new wxPanel( parent, -1, wxDefaultPosition,
332                                   wxSize(200, 200) );
333
334     wxStaticBox *panel_box = new wxStaticBox( panel, -1,
335                                    wxU(_("Audio Options")) );
336     wxStaticBoxSizer *panel_sizer = new wxStaticBoxSizer( panel_box,
337                                                           wxVERTICAL );
338
339     wxStaticText *label;
340     wxFlexGridSizer *subpanel_sizer;
341
342     audio_subpanel = new wxPanel( panel, -1 );
343
344     subpanel_sizer = new wxFlexGridSizer( 2, 2, 20 );
345
346     audio_checkbox = new wxCheckBox( audio_subpanel,
347                                      AudioDevice_Event,
348                                      wxU(_("Audio Device")) );
349     audio_device = new wxTextCtrl( audio_subpanel, AudioDevice_Event,
350                                    wxT("/dev/dsp"),
351                                    wxDefaultPosition, wxSize( 120, -1 ),
352                                    wxTE_PROCESS_ENTER);
353     label = new wxStaticText( audio_subpanel, -1, wxU(_("Channel")) );
354     audio_channel = new wxSpinCtrl( audio_subpanel, AudioChannel_Event );
355
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 );
362
363     audio_subpanel->SetSizerAndFit( subpanel_sizer );
364
365     /* Stuff everything into the main panel */
366     panel_sizer->Add( audio_subpanel, 1,
367                       wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL | wxALL, 5 );
368
369     panel->SetSizerAndFit( panel_sizer );
370
371     /* Update panel */
372     audio_device->Disable();
373     audio_channel->Disable();
374
375     return panel;
376 }
377
378 wxPanel *V4LDialog::BitratePanel( wxWindow* parent )
379 {
380     wxPanel *panel = new wxPanel( parent, -1, wxDefaultPosition,
381                                   wxSize(200, 200) );
382
383     wxStaticBox *panel_box = new wxStaticBox( panel, -1,
384                                    wxU(_("Bitrate Options")) );
385     wxStaticBoxSizer *panel_sizer = new wxStaticBoxSizer( panel_box,
386                                                           wxVERTICAL );
387
388     wxFlexGridSizer *subpanel_sizer;
389
390     bitrate_subpanel = new wxPanel( panel, -1 );
391
392     subpanel_sizer = new wxFlexGridSizer( 2, 2, 20 );
393
394     bitrate_checkbox = new wxCheckBox( bitrate_subpanel,
395                                        Bitrate_Event,
396                                        wxU(_("Bitrate")) );
397     bitrate = new wxSpinCtrl( bitrate_subpanel, Bitrate_Event );
398
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 );
403
404     maxbitrate_checkbox = new wxCheckBox( bitrate_subpanel,
405                                           MaxBitrate_Event,
406                                           wxU(_("Maximum Bitrate")) );
407     maxbitrate = new wxSpinCtrl( bitrate_subpanel, MaxBitrate_Event );
408
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 );
413
414     bitrate_subpanel->SetSizerAndFit( subpanel_sizer );
415
416     /* Stuff everything into the main panel */
417     panel_sizer->Add( bitrate_subpanel, 1,
418                       wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL | wxALL, 5 );
419
420     panel->SetSizerAndFit( panel_sizer );
421
422     /* Update panel */
423     bitrate->Disable();
424     maxbitrate->Disable();
425
426     return panel;
427 }
428
429
430 /*****************************************************************************
431  * Events methods.
432  *****************************************************************************/
433 void V4LDialog::OnOk( wxCommandEvent& WXUNUSED(event) )
434 {
435     mrl_combo->Append( mrl_combo->GetValue() );
436     EndModal( wxID_OK );
437 }
438
439 void V4LDialog::OnCancel( wxCommandEvent& WXUNUSED(event) )
440 {
441     EndModal( wxID_CANCEL );
442 }
443
444 void V4LDialog::OnMRLChange( wxCommandEvent& event )
445 {
446     //mrl = event.GetString();
447 }
448
449 /******************************************************************************
450  * Common panel event methods.
451  ******************************************************************************/
452 void V4LDialog::OnSizeEnable( wxCommandEvent& event )
453 {
454     UpdateMRL();
455     size_combo->Enable( event.GetInt() );
456 }
457
458 void V4LDialog::OnSize( wxCommandEvent& event )
459 {
460     UpdateMRL();
461 }
462
463 void V4LDialog::OnNormEnable( wxCommandEvent& event )
464 {
465     norm_combo->Enable( event.GetInt() );
466     UpdateMRL();
467 }
468
469 void V4LDialog::OnNorm( wxCommandEvent& event )
470 {
471     UpdateMRL();
472 }
473
474 void V4LDialog::OnFrequencyEnable( wxCommandEvent& event )
475 {
476     frequency->SetRange( 0, 1200000 );
477     frequency->SetValue( 479250 );
478     frequency->Enable( event.GetInt() );
479     UpdateMRL();
480 }
481
482 void V4LDialog::OnFrequency( wxCommandEvent& event )
483 {
484     UpdateMRL();
485 }
486
487 /*****************************************************************************
488  * Audio panel event methods.
489  *****************************************************************************/
490 void V4LDialog::OnAudioEnable( wxCommandEvent& event )
491 {
492     audio_device->SetValue( wxU( "/dev/dsp" ) );
493     audio_channel->SetRange( 0, 255 );
494     audio_channel->SetValue( 0 );
495
496     audio_device->Enable( event.GetInt() );
497     audio_channel->Enable( event.GetInt() );
498     UpdateMRL();
499 }
500
501 void V4LDialog::OnAudioChannel( wxCommandEvent& event )
502 {
503     UpdateMRL();
504 }
505
506 /******************************************************************************
507  * Bitrate panel event methods.
508  ******************************************************************************/
509 void V4LDialog::OnBitrateEnable( wxCommandEvent& event )
510 {
511     bitrate->SetRange( 0, 10000 );
512     bitrate->SetValue( 3000 );
513     bitrate->Enable( event.GetInt() );
514     UpdateMRL();
515 }
516
517 void V4LDialog::OnBitrate( wxCommandEvent& event )
518 {
519     UpdateMRL();
520 }
521
522 void V4LDialog::OnMaxBitrateEnable( wxCommandEvent& event )
523 {
524     maxbitrate->SetRange( 0, 10000 );
525     maxbitrate->SetValue( 3000 );
526     maxbitrate->Enable( event.GetInt() );
527     UpdateMRL();
528 }
529
530 void V4LDialog::OnMaxBitrate( wxCommandEvent& event )
531 {
532     UpdateMRL();
533 }