]> git.sesse.net Git - vlc/blob - modules/gui/wxwindows/v4l.cpp
a1422a8b39bbb31b2143b6a4b4f405a04ada5f80
[vlc] / modules / gui / wxwindows / v4l.cpp
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 $
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 #include <wx/combobox.h>
40 #include <wx/statline.h>
41
42 #include <vlc/intf.h>
43
44 #include "wxwindows.h"
45
46 #ifndef wxRB_SINGLE
47 #   define wxRB_SINGLE 0
48 #endif
49
50 /*****************************************************************************
51  * Event Table.
52  *****************************************************************************/
53
54 /* IDs for the controls and the menu commands */
55 enum
56 {
57     MRL_Event,
58
59     Size_Event,
60     Norm_Event,
61     FrequencyEnable_Event,Frequency_Event,
62
63     AudioDevice_Event, ADevLocation, AudioChannel_Event,
64
65     BitrateEnable_Event, MaxBitrateEnable_Event,
66     Bitrate_Event, MaxBitrate_Event
67 };
68
69 BEGIN_EVENT_TABLE(V4LDialog, wxDialog)
70     /* Button events */
71     EVT_BUTTON(wxID_OK, V4LDialog::OnOk)
72     EVT_BUTTON(wxID_CANCEL, V4LDialog::OnCancel)
73
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)
81
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)
86
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)
92
93 END_EVENT_TABLE()
94
95 /*****************************************************************************
96  * Constructor.
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 )
101 {
102     /* Initializations */
103     p_intf = _p_intf;
104     p_parent = _p_parent;
105     SetIcon( *p_intf->p_sys->p_icon );
106
107     /* Create a panel to put everything in */
108     wxPanel *panel = new wxPanel( this, -1 );
109     panel->SetAutoLayout( TRUE );
110
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,
116                                                         wxHORIZONTAL );
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")) );
124
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 );
128
129     /* Create the common panel */
130     wxPanel *common_panel = CommonPanel( panel );
131
132     /* Create the audio panel */
133     wxPanel *audio_panel = AudioPanel( panel );
134
135     /* Create the bitrate panel */
136     wxPanel *bitrate_panel = BitratePanel( panel );
137
138     /* Separation */
139     wxStaticLine *static_line = new wxStaticLine( panel, wxID_OK );
140
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,
145                                             wxU(_("Cancel")) );
146
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 |
160                       wxALL, 5 );
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 );
166 }
167
168 V4LDialog::~V4LDialog()
169 {
170 }
171
172 wxArrayString V4LDialog::GetOptions()
173 {
174    return SeparateEntries( mrl_combo->GetValue() );
175 }
176
177 /*****************************************************************************
178  * Private methods.
179  *****************************************************************************/
180 void V4LDialog::UpdateMRL()
181 {
182     wxString audio;
183     if( audio_checkbox->IsChecked() )
184         {
185             audio = wxT(":adev=")
186                     + audio_device->GetLineText(0)
187                     + wxString::Format( wxT(":audio=%d"),
188                         audio_channel->GetValue() );
189         }
190
191     wxString common;
192     {
193         if( size_checkbox->IsChecked() )
194         {
195             common += wxT(":size=")
196                 + size_combo->GetValue();
197         }
198
199         if( norm_checkbox->IsChecked() )
200         {
201             common += wxT(":norm=")
202                     + norm_combo->GetValue();
203         }
204
205         if( frequency_checkbox->IsChecked() )
206         {
207             common += wxString::Format( wxT(":frequency=%d"),
208                                         frequency->GetValue() );
209         }
210
211     }
212
213     wxString rate;
214     {
215         if( bitrate_checkbox->IsChecked() )
216         {
217             rate += wxString::Format( wxT(":bitrate=%d"),
218                                       bitrate->GetValue() );
219         }
220
221         if( maxbitrate_checkbox->IsChecked() )
222         {
223             rate += wxString::Format( wxT(":maxbitrate=%d"),
224                                       maxbitrate->GetValue() );
225         }
226     }
227
228     if( !audio.IsEmpty() || !common.IsEmpty() || !rate.IsEmpty() )
229         mrl_combo->SetValue( audio + common + rate);
230     else
231         mrl_combo->SetValue( wxT("") );
232 }
233
234 wxPanel *V4LDialog::CommonPanel( wxWindow* parent )
235 {
236     wxPanel *panel = new wxPanel( parent, -1, wxDefaultPosition,
237                                   wxSize(200, 200) );
238
239     wxStaticBox *panel_box = new wxStaticBox( panel, -1,
240                                    wxU(_("Common options")) );
241     wxStaticBoxSizer *panel_sizer = new wxStaticBoxSizer( panel_box,
242                                                           wxVERTICAL );
243
244     wxFlexGridSizer *subpanel_sizer;
245
246     common_subpanel = new wxPanel( panel, -1 );
247
248     subpanel_sizer = new wxFlexGridSizer( 2, 3, 20 );
249
250     static const wxString size_array[] =
251     {
252         wxT("subqcif"),
253         wxT("qsif"),
254         wxT("qcif"),
255         wxT("sif"),
256         wxT("cif"),
257         wxT("vga"),
258     };
259
260     size_checkbox = new wxCheckBox( common_subpanel,
261                                     Size_Event,
262                                     wxU(_("Size")) );
263     size_combo = new wxComboBox( common_subpanel, Size_Event, wxT(""),
264                                  wxPoint(20,25), wxSize( 120, -1),
265                                  WXSIZEOF(size_array), size_array,
266                                  wxCB_READONLY );
267     size_combo->SetSelection(5);
268
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 );
273
274     static const wxString norm_array[] =
275     {
276         wxT("pal"),
277         wxT("secam"),
278         wxT("ntsc")
279     };
280
281     norm_checkbox = new wxCheckBox( common_subpanel,
282                                      Norm_Event,
283                                      wxU(_("Norm")) );
284     norm_combo = new wxComboBox( common_subpanel, Norm_Event, wxT(""),
285                                  wxPoint(20,25), wxSize( 120, -1),
286                                  WXSIZEOF(norm_array), norm_array,
287                                  wxCB_READONLY );
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 );
294
295     frequency_checkbox = new wxCheckBox( common_subpanel,
296                                          FrequencyEnable_Event,
297                                          wxU(_("Frequency (kHz)")) );
298     frequency = new wxSpinCtrl( common_subpanel, Frequency_Event,
299                                 wxT("479250") );
300     frequency->SetToolTip( wxU(_("The channel frequency in kHz" )) );
301
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 );
306
307     common_subpanel->SetSizerAndFit( subpanel_sizer );
308
309     /* Stuff everything into the main panel */
310     panel_sizer->Add( common_subpanel, 1,
311                       wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL | wxALL, 5 );
312
313     panel->SetSizerAndFit( panel_sizer );
314
315     /* Update panel */
316     size_combo->Disable();
317     norm_combo->Disable();
318     frequency->Disable();
319
320     return panel;
321 }
322
323 wxPanel *V4LDialog::AudioPanel( wxWindow* parent )
324 {
325     wxPanel *panel = new wxPanel( parent, -1, wxDefaultPosition,
326                                   wxSize(200, 200) );
327
328     wxStaticBox *panel_box = new wxStaticBox( panel, -1,
329                                    wxU(_("Audio options")) );
330     wxStaticBoxSizer *panel_sizer = new wxStaticBoxSizer( panel_box,
331                                                           wxVERTICAL );
332
333     wxStaticText *label;
334     wxFlexGridSizer *subpanel_sizer;
335
336     audio_subpanel = new wxPanel( panel, -1 );
337
338     subpanel_sizer = new wxFlexGridSizer( 2, 2, 20 );
339
340     audio_checkbox = new wxCheckBox( audio_subpanel,
341                                      AudioDevice_Event,
342                                      wxU(_("Audio device")) );
343     audio_device = new wxTextCtrl( audio_subpanel, ADevLocation,
344                                    wxT("/dev/dsp"),
345                                    wxDefaultPosition, wxSize( 120, -1 ),
346                                    wxTE_PROCESS_ENTER);
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,
350                                     wxT("1") );
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 );
359
360     audio_subpanel->SetSizerAndFit( subpanel_sizer );
361
362     /* Stuff everything into the main panel */
363     panel_sizer->Add( audio_subpanel, 1,
364                       wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL | wxALL, 5 );
365
366     panel->SetSizerAndFit( panel_sizer );
367
368     /* Update panel */
369     audio_device->Disable();
370     audio_channel->Disable();
371
372     return panel;
373 }
374
375 wxPanel *V4LDialog::BitratePanel( wxWindow* parent )
376 {
377     wxPanel *panel = new wxPanel( parent, -1, wxDefaultPosition,
378                                   wxSize(200, 200) );
379
380     wxStaticBox *panel_box = new wxStaticBox( panel, -1,
381                                    wxU(_("Bitrate options")) );
382     wxStaticBoxSizer *panel_sizer = new wxStaticBoxSizer( panel_box,
383                                                           wxVERTICAL );
384
385     wxFlexGridSizer *subpanel_sizer;
386
387     bitrate_subpanel = new wxPanel( panel, -1 );
388
389     subpanel_sizer = new wxFlexGridSizer( 2, 2, 20 );
390
391     bitrate_checkbox = new wxCheckBox( bitrate_subpanel,
392                                        BitrateEnable_Event,
393                                        wxU(_("Bitrate")) );
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 );
400
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")) );
406
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 );
411
412     bitrate_subpanel->SetSizerAndFit( subpanel_sizer );
413
414     /* Stuff everything into the main panel */
415     panel_sizer->Add( bitrate_subpanel, 1,
416                       wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL | wxALL, 5 );
417
418     panel->SetSizerAndFit( panel_sizer );
419
420     /* Update panel */
421     bitrate->Disable();
422     maxbitrate->Disable();
423
424     return panel;
425 }
426
427
428 /*****************************************************************************
429  * Events methods.
430  *****************************************************************************/
431 void V4LDialog::OnOk( wxCommandEvent& WXUNUSED(event) )
432 {
433     mrl_combo->Append( mrl_combo->GetValue() );
434     EndModal( wxID_OK );
435 }
436
437 void V4LDialog::OnCancel( wxCommandEvent& WXUNUSED(event) )
438 {
439     EndModal( wxID_CANCEL );
440 }
441
442 void V4LDialog::OnMRLChange( wxCommandEvent& event )
443 {
444     //mrl = event.GetString();
445 }
446
447 /******************************************************************************
448  * Common panel event methods.
449  ******************************************************************************/
450 void V4LDialog::OnSizeEnable( wxCommandEvent& event )
451 {
452     UpdateMRL();
453     size_combo->Enable( event.GetInt() );
454 }
455
456 void V4LDialog::OnSize( wxCommandEvent& event )
457 {
458     UpdateMRL();
459 }
460
461 void V4LDialog::OnNormEnable( wxCommandEvent& event )
462 {
463     norm_combo->Enable( event.GetInt() );
464     UpdateMRL();
465 }
466
467 void V4LDialog::OnNorm( wxCommandEvent& event )
468 {
469     UpdateMRL();
470 }
471
472 void V4LDialog::OnFrequencyEnable( wxCommandEvent& event )
473 {
474     frequency->SetRange( 0, 1200000 );
475     frequency->Enable( event.GetInt() );
476     UpdateMRL();
477 }
478
479 void V4LDialog::OnFrequency( wxCommandEvent& event )
480 {
481     UpdateMRL();
482 }
483
484 /*****************************************************************************
485  * Audio panel event methods.
486  *****************************************************************************/
487 void V4LDialog::OnAudioEnable( wxCommandEvent& event )
488 {
489     audio_channel->SetRange( 0, 255 );
490
491     audio_device->Enable( event.GetInt() );
492     audio_channel->Enable( event.GetInt() );
493     UpdateMRL();
494 }
495
496 void V4LDialog::OnAudioChange( wxCommandEvent& event )
497 {
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->Enable( event.GetInt() );
513     UpdateMRL();
514 }
515
516 void V4LDialog::OnBitrate( wxCommandEvent& event )
517 {
518     UpdateMRL();
519 }
520
521 void V4LDialog::OnMaxBitrateEnable( wxCommandEvent& event )
522 {
523     maxbitrate->SetRange( 0, 10000 );
524     maxbitrate->Enable( event.GetInt() );
525     UpdateMRL();
526 }
527
528 void V4LDialog::OnMaxBitrate( wxCommandEvent& event )
529 {
530     UpdateMRL();
531 }