Video4Linux / PVR / KFIR unified panel
authorMohammed Adnène Trojette <adn@videolan.org>
Tue, 19 Aug 2003 21:16:09 +0000 (21:16 +0000)
committerMohammed Adnène Trojette <adn@videolan.org>
Tue, 19 Aug 2003 21:16:09 +0000 (21:16 +0000)
modules/gui/wxwindows/open.cpp
modules/gui/wxwindows/v4l.cpp [new file with mode: 0644]
modules/gui/wxwindows/wxwindows.h

index a6961ae..32f7e58 100644 (file)
@@ -2,7 +2,7 @@
  * open.cpp : wxWindows plugin for vlc
  *****************************************************************************
  * Copyright (C) 2000-2001 VideoLAN
- * $Id: open.cpp,v 1.36 2003/08/10 09:22:07 gbazin Exp $
+ * $Id: open.cpp,v 1.37 2003/08/19 21:16:09 adn Exp $
  *
  * Authors: Gildas Bazin <gbazin@netcourrier.com>
  *
@@ -79,6 +79,11 @@ enum
     NetPort1_Event, NetPort2_Event, NetPort3_Event,
     NetAddr1_Event, NetAddr2_Event, NetAddr3_Event,
 
+    VideoType_Event,
+    VideoDevice_Event,
+    VideoChannel_Event,
+    V4LSettings_Event,
+
     SubsFileEnable_Event,
     SubsFileSettings_Event,
 
@@ -97,7 +102,7 @@ BEGIN_EVENT_TABLE(OpenDialog, wxFrame)
 
     EVT_NOTEBOOK_PAGE_CHANGED(Notebook_Event, OpenDialog::OnPageChange)
 
-    EVT_TEXT(MRL_Event, OpenDialog::OnMRLChange) 
+    EVT_TEXT(MRL_Event, OpenDialog::OnMRLChange)
 
     /* Events generated by the file panel */
     EVT_TEXT(FileName_Event, OpenDialog::OnFilePanelChange)
@@ -124,6 +129,12 @@ BEGIN_EVENT_TABLE(OpenDialog, wxFrame)
     EVT_TEXT(NetAddr2_Event, OpenDialog::OnNetPanelChange)
     EVT_TEXT(NetAddr3_Event, OpenDialog::OnNetPanelChange)
 
+    /* Events generated by the v4l panel */
+    EVT_RADIOBOX(VideoType_Event, OpenDialog::OnV4LTypeChange)
+    EVT_TEXT(VideoDevice_Event, OpenDialog::OnV4LPanelChange)
+    EVT_SPINCTRL(VideoChannel_Event, OpenDialog::OnV4LPanelChange)
+    EVT_BUTTON(V4LSettings_Event, OpenDialog::OnV4LSettingsChange)
+
     /* Events generated by the subtitle file buttons */
     EVT_CHECKBOX(SubsFileEnable_Event, OpenDialog::OnSubsFileEnable)
     EVT_BUTTON(SubsFileSettings_Event, OpenDialog::OnSubsFileSettings)
@@ -155,6 +166,7 @@ OpenDialog::OpenDialog( intf_thread_t *_p_intf, wxWindow *_p_parent,
     p_parent = _p_parent;
     SetIcon( *p_intf->p_sys->p_icon );
     file_dialog = NULL;
+    v4l_dialog = NULL;
     sout_dialog = NULL;
     subsfile_dialog = NULL;
     demuxdump_dialog = NULL;
@@ -261,6 +273,9 @@ OpenDialog::OpenDialog( intf_thread_t *_p_intf, wxWindow *_p_parent,
                        i_access_method == SAT_ACCESS );
 #endif
 
+    notebook->AddPage( V4LPanel( notebook ), wxU(_("Video For Linux")),
+                       i_access_method == V4L_ACCESS );
+
     /* Update Disc panel */
     wxCommandEvent dummy_event;
     OnDiscTypeChange( dummy_event );
@@ -269,6 +284,10 @@ OpenDialog::OpenDialog( intf_thread_t *_p_intf, wxWindow *_p_parent,
     dummy_event.SetId( NetRadio1_Event );
     OnNetTypeChange( dummy_event );
 
+    /* Update v4l panel */
+    dummy_event.SetId( VideoType_Event );
+    OnV4LTypeChange( dummy_event );
+
     /* Update MRL */
     wxNotebookEvent event( wxEVT_NULL, 0, i_access_method );
     OnPageChange( event );
@@ -298,6 +317,7 @@ OpenDialog::~OpenDialog()
 {
     /* Clean up */
     if( file_dialog ) delete file_dialog;
+    if( v4l_dialog ) delete v4l_dialog;
     if( sout_dialog ) delete sout_dialog;
     if( subsfile_dialog ) delete subsfile_dialog;
     if( demuxdump_dialog ) delete demuxdump_dialog;
@@ -513,6 +533,61 @@ wxPanel *OpenDialog::NetPanel( wxWindow* parent )
     return panel;
 }
 
+wxPanel *OpenDialog::V4LPanel( wxWindow* parent )
+{
+    wxPanel *panel = new wxPanel( parent, -1, wxDefaultPosition,
+                                  wxSize(200, 200) );
+
+    wxBoxSizer *sizer_row = new wxBoxSizer( wxVERTICAL );
+    wxFlexGridSizer *sizer = new wxFlexGridSizer( 1, 4, 20 );
+
+    static const wxString video_type_array[] =
+    {
+        wxU(_("WebCam")),
+        wxU(_("TV Card")),
+        wxU(_("PVR")),
+        wxU(_("Kfir")),
+    };
+
+    video_type = new wxRadioBox( panel, VideoType_Event,
+            wxU(_("Video Device Type")),
+            wxDefaultPosition, wxDefaultSize,
+            WXSIZEOF(video_type_array), video_type_array,
+            WXSIZEOF(video_type_array), wxRA_SPECIFY_COLS );
+
+    sizer_row->Add( video_type, 0, wxEXPAND | wxALL, 5 );
+
+
+    /* Video Options */
+    wxFlexGridSizer *video_sizer = new wxFlexGridSizer( 4, 2, 20 );
+    wxStaticText *label = new wxStaticText( panel, -1, wxU(_("Video Device")) );
+    video_device = new wxTextCtrl( panel, VideoDevice_Event, wxT(""),
+                                  wxDefaultPosition, wxDefaultSize,
+                                  wxTE_PROCESS_ENTER);
+
+    video_sizer->Add( label, 0, wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL );
+    video_sizer->Add( video_device, 1, wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL );
+
+    label = new wxStaticText( panel, -1, wxU(_("Channel")) );
+    video_channel = new wxSpinCtrl( panel, VideoChannel_Event );
+
+    video_sizer->Add( label, 0, wxALIGN_LEFT | wxALIGN_CENTER_HORIZONTAL );
+    video_sizer->Add( video_channel, 1, wxALIGN_LEFT | wxALIGN_CENTER_HORIZONTAL );
+    sizer->Add( video_sizer, 0, wxEXPAND | wxALL, 5 );
+
+    wxBoxSizer *v4lbutton_sizer = new wxBoxSizer( wxHORIZONTAL );
+    v4l_button = new wxButton( panel, V4LSettings_Event,
+                            wxU(_("Advanced Settings...")) );
+
+    v4lbutton_sizer->Add( v4l_button, 0, wxALIGN_RIGHT, 5 );
+
+    sizer_row->Add( sizer, 0, wxEXPAND | wxALL, 5 );
+    sizer_row->Add( v4lbutton_sizer, 0, wxEXPAND | wxALL, 5 );
+
+    panel->SetSizerAndFit( sizer_row );
+    return panel;
+}
+
 wxPanel *OpenDialog::SatPanel( wxWindow* parent )
 {
     wxPanel *panel = new wxPanel( parent, -1, wxDefaultPosition,
@@ -576,7 +651,7 @@ void OpenDialog::UpdateMRL( int i_access_method )
             break;
 
         case 2:
-            /* http access */     
+            /* http access */
             mrltemp = wxT("http") + demux + wxT("://") +
                       net_addrs[2]->GetLineText(0);
             break;
@@ -585,6 +660,28 @@ void OpenDialog::UpdateMRL( int i_access_method )
     case SAT_ACCESS:
         mrltemp = wxT("satellite") + demux + wxT("://");
         break;
+
+    case V4L_ACCESS:
+        mrltemp = ( video_type->GetSelection() == 0 ? wxT("v4l") :
+                    video_type->GetSelection() == 1 ? wxT("v4l") :
+                    video_type->GetSelection() == 2 ? wxT("pvr") :
+                                                      wxT("kfir") )
+            + demux + wxT(":")
+            + video_device->GetLineText( 0 );
+
+        if( video_type->GetSelection() == 1 )
+        {
+            mrltemp += wxString::Format( wxT(":channel=%d"),
+                                         video_channel->GetValue() );
+        }
+
+        if ( /* v4l_dialog != NULL && */ !v4l_mrl.IsEmpty() )
+        {
+            mrltemp += v4l_mrl[0];
+        }
+
+        break;
+
     default:
         break;
     }
@@ -605,7 +702,7 @@ void OpenDialog::OnOk( wxCommandEvent& WXUNUSED(event) )
     /* Update the playlist */
     playlist_t *p_playlist =
         (playlist_t *)vlc_object_find( p_intf, VLC_OBJECT_PLAYLIST,
-                                      FIND_ANYWHERE );
+                                       FIND_ANYWHERE );
     if( p_playlist == NULL ) return;
 
     for( int i = 0; i < (int)mrl.GetCount(); i++ )
@@ -629,7 +726,7 @@ void OpenDialog::OnOk( wxCommandEvent& WXUNUSED(event) )
             ppsz_options[j] = strdup( mrl[i + j  + 1].mb_str() );
         }
 
-       i_total_options = i_options;
+        i_total_options = i_options;
 
         /* Get the options from the subtitles dialog */
         if( subsfile_checkbox->IsChecked() && subsfile_mrl.GetCount() )
@@ -646,6 +743,22 @@ void OpenDialog::OnOk( wxCommandEvent& WXUNUSED(event) )
             i_total_options += subsfile_mrl.GetCount();
         }
 
+        /* Get the options from the v4l dialog */
+/*        if( v4l_mrl.GetCount() )
+        {
+            ppsz_options = (char **)realloc( ppsz_options, sizeof(char *) *
+                               (i_total_options + v4l_mrl.GetCount()) );
+
+            for( int j = 0; j < (int)v4l_mrl.GetCount(); j++ )
+            {
+                ppsz_options[i_total_options + j] =
+                    strdup( v4l_mrl[j].mb_str() );
+            }
+
+            i_total_options += v4l_mrl.GetCount();
+
+        }
+*/
         /* Get the options from the stream output dialog */
         if( sout_checkbox->IsChecked() && sout_mrl.GetCount() )
         {
@@ -659,6 +772,7 @@ void OpenDialog::OnOk( wxCommandEvent& WXUNUSED(event) )
             }
 
             i_total_options += sout_mrl.GetCount();
+
         }
 
         playlist_Add( p_playlist, (const char *)mrl[i].mb_str(),
@@ -813,6 +927,52 @@ void OpenDialog::OnNetTypeChange( wxCommandEvent& event )
     UpdateMRL( NET_ACCESS );
 }
 
+/*****************************************************************************
+ * v4l panel event methods.
+ *****************************************************************************/
+void OpenDialog::OnV4LPanelChange( wxCommandEvent& WXUNUSED(event) )
+{
+    UpdateMRL( V4L_ACCESS );
+}
+
+void OpenDialog::OnV4LTypeChange( wxCommandEvent& WXUNUSED(event) )
+{
+    video_device->SetValue( wxU( "/dev/video" ) );
+
+    v4l_button->Enable();
+    video_channel->Disable();
+
+    switch( video_type->GetSelection() )
+    {
+        case 1:
+            video_channel->Enable();
+            video_channel->SetRange( 0, 255 );
+            video_channel->SetValue( 0 );
+           break;
+        case 3:
+            v4l_button->Disable();
+            break;
+        default:
+            break;
+    }
+
+    UpdateMRL( V4L_ACCESS );
+}
+
+void OpenDialog::OnV4LSettingsChange( wxCommandEvent& WXUNUSED(event) )
+{
+    /* Show/hide the open dialog */
+    if( v4l_dialog == NULL )
+        v4l_dialog = new V4LDialog( p_intf, this );
+
+    if( v4l_dialog && v4l_dialog->ShowModal() == wxID_OK )
+    {
+        v4l_mrl = v4l_dialog->GetOptions();
+    }
+
+    UpdateMRL( V4L_ACCESS );
+}
+
 /*****************************************************************************
  * Subtitles file event methods.
  *****************************************************************************/
diff --git a/modules/gui/wxwindows/v4l.cpp b/modules/gui/wxwindows/v4l.cpp
new file mode 100644 (file)
index 0000000..f54d5df
--- /dev/null
@@ -0,0 +1,436 @@
+/*****************************************************************************
+ * v4l.cpp : wxWindows plugin for vlc
+ *****************************************************************************
+ * Copyright (C) 2000-2001 VideoLAN
+ * $Id: v4l.cpp,v 1.1 2003/08/19 21:16:09 adn Exp $
+ *
+ * Authors: Mohammed Adnène Trojette <adn@via.ecp.fr>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111, USA.
+ *****************************************************************************/
+
+/*****************************************************************************
+ * Preamble
+ *****************************************************************************/
+#include <stdlib.h>                                      /* malloc(), free() */
+#include <errno.h>                                                 /* ENOMEM */
+#include <string.h>                                            /* strerror() */
+#include <stdio.h>
+
+#include <vlc/vlc.h>
+
+#ifdef WIN32                                                 /* mingw32 hack */
+#undef Yield
+#undef CreateDialog
+#endif
+
+/* Let vlc take care of the i18n stuff */
+#define WXINTL_NO_GETTEXT_MACRO
+
+#include <wx/wxprec.h>
+#include <wx/wx.h>
+#include <wx/notebook.h>
+#include <wx/textctrl.h>
+#include <wx/combobox.h>
+#include <wx/spinctrl.h>
+#include <wx/statline.h>
+
+#include <vlc/intf.h>
+
+#include "wxwindows.h"
+
+#ifndef wxRB_SINGLE
+#   define wxRB_SINGLE 0
+#endif
+
+enum
+{
+    AUDIO_DEV=0,
+    AUDIO_CHAN,
+    SIZE,
+    NORM,
+    FREQUENCY
+};
+
+/*****************************************************************************
+ * Event Table.
+ *****************************************************************************/
+
+/* IDs for the controls and the menu commands */
+enum
+{
+    MRL_Event,
+
+    AudioDevice_Event, ADevLocation, AudioChannel_Event,
+
+    Size_Event,
+    Norm_Event,
+    Frequency_Event
+};
+
+BEGIN_EVENT_TABLE(V4LDialog, wxDialog)
+    /* Button events */
+    EVT_BUTTON(wxID_OK, V4LDialog::OnOk)
+    EVT_BUTTON(wxID_CANCEL, V4LDialog::OnCancel)
+
+    /* Events generated by the audio panel */
+    EVT_CHECKBOX(AudioDevice_Event, V4LDialog::OnAudioEnable)
+    EVT_TEXT(ADevLocation, V4LDialog::OnAudioEnable)
+    EVT_SPINCTRL(AudioChannel_Event, V4LDialog::OnAudioChannel)
+
+    /* Events generated by the audio panel */
+    EVT_CHECKBOX(Size_Event, V4LDialog::OnSizeEnable)
+    EVT_COMBOBOX(Size_Event, V4LDialog::OnSize)
+    EVT_CHECKBOX(Norm_Event, V4LDialog::OnNormEnable)
+    EVT_COMBOBOX(Norm_Event, V4LDialog::OnNorm)
+    EVT_CHECKBOX(Frequency_Event, V4LDialog::OnFrequencyEnable)
+    EVT_COMBOBOX(Frequency_Event, V4LDialog::OnFrequency)
+
+END_EVENT_TABLE()
+
+/*****************************************************************************
+ * Constructor.
+ *****************************************************************************/
+V4LDialog::V4LDialog( intf_thread_t *_p_intf, wxWindow* _p_parent ):
+    wxDialog( _p_parent, -1, wxU(_("Video Device Advanced Options")),
+             wxDefaultPosition, wxDefaultSize, wxDEFAULT_FRAME_STYLE )
+{
+    /* Initializations */
+    p_intf = _p_intf;
+    p_parent = _p_parent;
+    SetIcon( *p_intf->p_sys->p_icon );
+
+    /* Create a panel to put everything in */
+    wxPanel *panel = new wxPanel( this, -1 );
+    panel->SetAutoLayout( TRUE );
+
+    /* Create MRL combobox */
+    wxBoxSizer *mrl_sizer_sizer = new wxBoxSizer( wxHORIZONTAL );
+    wxStaticBox *mrl_box = new wxStaticBox( panel, -1,
+                               wxU(_("Video Device MRL")) );
+    wxStaticBoxSizer *mrl_sizer = new wxStaticBoxSizer( mrl_box,
+                                                        wxHORIZONTAL );
+    wxStaticText *mrl_label = new wxStaticText( panel, -1,
+                                                wxU(_("Destination Target:")));
+    mrl_combo = new wxComboBox( panel, MRL_Event, wxT(""),
+                                wxPoint(20,25), wxSize(200, -1), 0, NULL );
+    mrl_combo->SetToolTip( wxU(_("You can use this field directly by typing "
+        "the full MRL you want to open.\n""Alternatively, the field will be "
+        "filled automatically when you use the controls below")) );
+
+    mrl_sizer->Add( mrl_label, 0, wxALL | wxALIGN_CENTER, 5 );
+    mrl_sizer->Add( mrl_combo, 1, wxALL | wxALIGN_CENTER, 5 );
+    mrl_sizer_sizer->Add( mrl_sizer, 1, wxEXPAND | wxALL, 5 );
+
+    /* Create the audio panel */
+    wxPanel *audio_panel = AudioPanel( panel );
+
+    /* Create the size panel */
+    wxPanel *common_panel = CommonPanel( panel );
+
+    /* Separation */
+    wxStaticLine *static_line = new wxStaticLine( panel, wxID_OK );
+
+    /* Create the buttons */
+    wxButton *ok_button = new wxButton( panel, wxID_OK, wxU(_("OK")) );
+    ok_button->SetDefault();
+    wxButton *cancel_button = new wxButton( panel, wxID_CANCEL,
+                                            wxU(_("Cancel")) );
+
+    /* Place everything in sizers */
+    wxBoxSizer *button_sizer = new wxBoxSizer( wxHORIZONTAL );
+    button_sizer->Add( ok_button, 0, wxALL, 5 );
+    button_sizer->Add( cancel_button, 0, wxALL, 5 );
+    button_sizer->Layout();
+    wxBoxSizer *main_sizer = new wxBoxSizer( wxVERTICAL );
+    wxBoxSizer *panel_sizer = new wxBoxSizer( wxVERTICAL );
+    panel_sizer->Add( mrl_sizer_sizer, 0, wxEXPAND, 5 );
+    panel_sizer->Add( common_panel, 1, wxEXPAND | wxALL, 5 );
+    panel_sizer->Add( audio_panel, 1, wxEXPAND | wxALL, 5 );
+    panel_sizer->Add( static_line, 0, wxEXPAND | wxALL, 5 );
+    panel_sizer->Add( button_sizer, 0, wxALIGN_LEFT | wxALIGN_BOTTOM |
+                      wxALL, 5 );
+    panel_sizer->Layout();
+    panel->SetSizerAndFit( panel_sizer );
+    main_sizer->Add( panel, 1, wxGROW, 0 );
+    main_sizer->Layout();
+    SetSizerAndFit( main_sizer );
+}
+
+V4LDialog::~V4LDialog()
+{
+}
+
+wxArrayString V4LDialog::GetOptions()
+{
+   return SeparateEntries( mrl_combo->GetValue() );
+}
+
+/*****************************************************************************
+ * Private methods.
+ *****************************************************************************/
+void V4LDialog::UpdateMRL()
+{
+    wxString audio;
+    if( audio_checkbox->IsChecked() )
+        {
+            audio = wxT(":adev=")
+                    + audio_device->GetLineText(0)
+                    + wxString::Format( wxT(":audio=%d"),
+                        audio_channel->GetValue() );
+        }
+
+    wxString common;
+    {
+        if( size_checkbox->IsChecked() )
+        {
+        common += wxT(":size=")
+                + size_combo->GetValue();
+        }
+
+        if( norm_checkbox->IsChecked() )
+        {
+            common += wxT(":norm=")
+                    + norm_combo->GetValue();
+        }
+
+        if( frequency_checkbox->IsChecked() )
+        {
+            common += wxString::Format( wxT(":frequency=%d"),
+                                        frequency->GetValue() );
+        }
+
+    }
+
+    if( !audio.IsEmpty() || !common.IsEmpty() )
+        mrl_combo->SetValue( audio + common );
+    else
+        mrl_combo->SetValue( wxT("") );
+}
+
+wxPanel *V4LDialog::CommonPanel( wxWindow* parent )
+{
+    wxPanel *panel = new wxPanel( parent, -1, wxDefaultPosition,
+                                  wxSize(200, 200) );
+
+    wxStaticBox *panel_box = new wxStaticBox( panel, -1,
+                                   wxU(_("Common Options")) );
+    wxStaticBoxSizer *panel_sizer = new wxStaticBoxSizer( panel_box,
+                                                          wxVERTICAL );
+
+    wxFlexGridSizer *subpanel_sizer;
+
+    common_subpanel = new wxPanel( panel, -1 );
+
+    subpanel_sizer = new wxFlexGridSizer( 2, 3, 20 );
+
+    static const wxString size_array[] =
+    {
+        wxT("subqcif"),
+        wxT("qsif"),
+        wxT("qcif"),
+        wxT("sif"),
+        wxT("cif"),
+        wxT("vga")
+    };
+
+    size_checkbox = new wxCheckBox( common_subpanel,
+                                    Size_Event,
+                                    wxU(_("Size")) );
+    size_combo = new wxComboBox( common_subpanel, Size_Event, wxT(""),
+                                 wxPoint(20,25), wxSize( 120, -1),
+                                 WXSIZEOF(size_array), size_array,
+                                 wxCB_READONLY );
+    size_combo->SetSelection(5);
+
+    subpanel_sizer->Add( size_checkbox, 0, wxALIGN_LEFT |
+                         wxALIGN_CENTER_VERTICAL );
+    subpanel_sizer->Add( size_combo, 0, wxALIGN_RIGHT |
+                         wxALIGN_CENTER_VERTICAL );
+
+    static const wxString norm_array[] =
+    {
+        wxT("pal"),
+        wxT("secam"),
+        wxT("ntsc")
+    };
+
+    norm_checkbox = new wxCheckBox( common_subpanel,
+                                     Norm_Event,
+                                     wxU(_("Norm")) );
+    norm_combo = new wxComboBox( common_subpanel, Norm_Event, wxT(""),
+                                 wxPoint(20,25), wxSize( 120, -1),
+                                 WXSIZEOF(norm_array), norm_array,
+                                 wxCB_READONLY );
+    norm_combo->SetSelection(1);
+
+    subpanel_sizer->Add( norm_checkbox, 0, wxALIGN_LEFT |
+                         wxALIGN_CENTER_VERTICAL );
+    subpanel_sizer->Add( norm_combo, 0, wxALIGN_RIGHT |
+                         wxALIGN_CENTER_VERTICAL );
+
+    frequency_checkbox = new wxCheckBox( common_subpanel,
+                                         Frequency_Event,
+                                         wxU(_("Frequency")) );
+    frequency = new wxSpinCtrl( common_subpanel, Frequency_Event );
+    frequency->SetToolTip( wxU(_("The frequency in KHz" )) );
+
+    subpanel_sizer->Add( frequency_checkbox, 0, wxALIGN_LEFT |
+                         wxALIGN_CENTER_VERTICAL );
+    subpanel_sizer->Add( frequency, 0, wxALIGN_RIGHT |
+                         wxALIGN_CENTER_VERTICAL );
+
+    common_subpanel->SetSizerAndFit( subpanel_sizer );
+
+    /* Stuff everything into the main panel */
+    panel_sizer->Add( common_subpanel, 1,
+                      wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL | wxALL, 5 );
+
+    panel->SetSizerAndFit( panel_sizer );
+
+    /* Update panel */
+    size_combo->Disable();
+    norm_combo->Disable();
+    frequency->Disable();
+
+    return panel;
+}
+
+wxPanel *V4LDialog::AudioPanel( wxWindow* parent )
+{
+    wxPanel *panel = new wxPanel( parent, -1, wxDefaultPosition,
+                                  wxSize(200, 200) );
+
+    wxStaticBox *panel_box = new wxStaticBox( panel, -1,
+                                   wxU(_("Audio Options")) );
+    wxStaticBoxSizer *panel_sizer = new wxStaticBoxSizer( panel_box,
+                                                          wxVERTICAL );
+
+    wxStaticText *label;
+    wxFlexGridSizer *subpanel_sizer;
+
+    audio_subpanel = new wxPanel( panel, -1 );
+
+    subpanel_sizer = new wxFlexGridSizer( 2, 2, 20 );
+
+    audio_checkbox = new wxCheckBox( audio_subpanel,
+                                     AudioDevice_Event,
+                                     wxU(_("Audio Device")) );
+    audio_device = new wxTextCtrl( audio_subpanel, AudioDevice_Event,
+                                   wxT("/dev/dsp"),
+                                   wxDefaultPosition, wxSize( 120, -1 ),
+                                   wxTE_PROCESS_ENTER);
+    label = new wxStaticText( audio_subpanel, -1, wxU(_("Channel")) );
+    audio_channel = new wxSpinCtrl( audio_subpanel, AudioChannel_Event );
+
+    subpanel_sizer->Add( audio_checkbox, 0, wxALIGN_RIGHT |
+                                            wxALIGN_CENTER_VERTICAL );
+    subpanel_sizer->Add( audio_device, 1, wxALIGN_RIGHT );
+    subpanel_sizer->Add( label, 0, wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL );
+    subpanel_sizer->Add( audio_channel, 0, wxALIGN_RIGHT |
+                         wxALIGN_CENTER_VERTICAL );
+
+    audio_subpanel->SetSizerAndFit( subpanel_sizer );
+
+    /* Stuff everything into the main panel */
+    panel_sizer->Add( audio_subpanel, 1,
+                      wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL | wxALL, 5 );
+
+    panel->SetSizerAndFit( panel_sizer );
+
+    /* Update panel */
+    audio_device->Disable();
+    audio_channel->Disable();
+
+    return panel;
+}
+
+
+/*****************************************************************************
+ * Events methods.
+ *****************************************************************************/
+void V4LDialog::OnOk( wxCommandEvent& WXUNUSED(event) )
+{
+    mrl_combo->Append( mrl_combo->GetValue() );
+    EndModal( wxID_OK );
+}
+
+void V4LDialog::OnCancel( wxCommandEvent& WXUNUSED(event) )
+{
+    EndModal( wxID_CANCEL );
+}
+
+void V4LDialog::OnMRLChange( wxCommandEvent& event )
+{
+    //mrl = event.GetString();
+}
+
+/*****************************************************************************
+ * Audio panel event methods.
+ *****************************************************************************/
+void V4LDialog::OnAudioEnable( wxCommandEvent& event )
+{
+    audio_device->SetValue( wxU( "/dev/dsp" ) );
+    audio_channel->SetRange( 0, 255 );
+    audio_channel->SetValue( 0 );
+
+    audio_device->Enable( event.GetInt() );
+    audio_channel->Enable( event.GetInt() );
+    UpdateMRL();
+}
+
+void V4LDialog::OnAudioChannel( wxCommandEvent& event )
+{
+    UpdateMRL();
+}
+
+/******************************************************************************
+ * Common panel event methods.
+ ******************************************************************************/
+void V4LDialog::OnSizeEnable( wxCommandEvent& event )
+{
+    UpdateMRL();
+    size_combo->Enable( event.GetInt() );
+}
+
+void V4LDialog::OnSize( wxCommandEvent& event )
+{
+    UpdateMRL();
+}
+
+void V4LDialog::OnNormEnable( wxCommandEvent& event )
+{
+    norm_combo->Enable( event.GetInt() );
+    UpdateMRL();
+}
+
+void V4LDialog::OnNorm( wxCommandEvent& event )
+{
+    UpdateMRL();
+}
+
+void V4LDialog::OnFrequencyEnable( wxCommandEvent& event )
+{
+    frequency->SetRange( 0, 42000 );
+    frequency->SetValue( 7668 );
+    frequency->Enable( event.GetInt() );
+    UpdateMRL();
+}
+
+void V4LDialog::OnFrequency( wxCommandEvent& event )
+{
+    UpdateMRL();
+}
+
index 893ff25..1664e82 100644 (file)
@@ -2,7 +2,7 @@
  * wxwindows.h: private wxWindows interface description
  *****************************************************************************
  * Copyright (C) 1999, 2000 VideoLAN
- * $Id: wxwindows.h,v 1.53 2003/08/16 21:05:14 zorglub Exp $
+ * $Id: wxwindows.h,v 1.54 2003/08/19 21:16:09 adn Exp $
  *
  * Authors: Gildas Bazin <gbazin@netcourrier.com>
  *
 
 DECLARE_LOCAL_EVENT_TYPE( wxEVT_DIALOG, 0 );
 
-enum
-{
-    FILE_ACCESS,
-    DISC_ACCESS,
-    NET_ACCESS,
-    SAT_ACCESS,
-    FILE_SIMPLE_ACCESS
-};
-
 class OpenDialog;
 class Playlist;
 class Messages;
@@ -159,8 +150,13 @@ private:
     void OnExit( wxCommandEvent& event );
     void OnAbout( wxCommandEvent& event );
 
+    void OnOpenFileSimple( wxCommandEvent& event );
+    void OnOpenFile( wxCommandEvent& event );
+    void OnOpenDisc( wxCommandEvent& event );
+    void OnOpenNet( wxCommandEvent& event );
+    void OnOpenSat( wxCommandEvent& event );
+    void OnOpenV4L( wxCommandEvent& event );
     void OnShowDialog( wxCommandEvent& event );
-
     void OnPlayStream( wxCommandEvent& event );
     void OnStopStream( wxCommandEvent& event );
     void OnSliderUpdate( wxScrollEvent& event );
@@ -240,6 +236,7 @@ public:
 };
 
 /* Open Dialog */
+class V4LDialog;
 class SoutDialog;
 class SubsFileDialog;
 class OpenDialog: public wxFrame
@@ -260,6 +257,7 @@ private:
     wxPanel *DiscPanel( wxWindow* parent );
     wxPanel *NetPanel( wxWindow* parent );
     wxPanel *SatPanel( wxWindow* parent );
+    wxPanel *V4LPanel( wxWindow* parent );
 
     void UpdateMRL( int i_access_method );
 
@@ -282,6 +280,11 @@ private:
     void OnNetPanelChange( wxCommandEvent& event );
     void OnNetTypeChange( wxCommandEvent& event );
 
+    /* Event handlers for the v4l page */
+    void OnV4LPanelChange( wxCommandEvent& event );
+    void OnV4LTypeChange( wxCommandEvent& event );
+    void OnV4LSettingsChange( wxCommandEvent& event );
+
     /* Event handlers for the stream output */
     void OnSubsFileEnable( wxCommandEvent& event );
     void OnSubsFileSettings( wxCommandEvent& WXUNUSED(event) );
@@ -325,6 +328,14 @@ private:
     int        i_net_ports[4];
     wxTextCtrl *net_addrs[4];
 
+    /* Controls for the v4l panel */
+    wxRadioBox *video_type;
+    wxTextCtrl *video_device;
+    wxSpinCtrl *video_channel;
+    wxButton *v4l_button;
+    V4LDialog *v4l_dialog;
+    wxArrayString v4l_mrl;
+
     /* Controls for the subtitles file */
     wxButton *subsfile_button;
     wxCheckBox *subsfile_checkbox;
@@ -344,6 +355,72 @@ private:
     wxFileDialog *demuxdump_dialog;
 };
 
+enum
+{
+    FILE_ACCESS = 0,
+    DISC_ACCESS,
+    NET_ACCESS,
+    SAT_ACCESS,
+    V4L_ACCESS,
+    FILE_SIMPLE_ACCESS
+};
+
+/* V4L Dialog */
+class V4LDialog: public wxDialog
+{
+public:
+    /* Constructor */
+    V4LDialog( intf_thread_t *p_intf, wxWindow *p_parent );
+    virtual ~V4LDialog();
+
+    wxArrayString GetOptions();
+
+private:
+    void UpdateMRL();
+    wxPanel *AudioPanel( wxWindow* parent );
+    wxPanel *CommonPanel( wxWindow* parent );
+    void    ParseMRL();
+
+    /* Event handlers (these functions should _not_ be virtual) */
+    void OnOk( wxCommandEvent& event );
+    void OnCancel( wxCommandEvent& event );
+    void OnMRLChange( wxCommandEvent& event );
+    void OnAudioEnable( wxCommandEvent& event );
+    void OnAudioChannel( wxCommandEvent& event );
+    void OnSizeEnable( wxCommandEvent& event );
+    void OnSize( wxCommandEvent& event );
+    void OnNormEnable( wxCommandEvent& event );
+    void OnNorm( wxCommandEvent& event );
+    void OnFrequencyEnable( wxCommandEvent& event );
+    void OnFrequency( wxCommandEvent& event );
+
+    DECLARE_EVENT_TABLE();
+
+    intf_thread_t *p_intf;
+    wxWindow *p_parent;
+
+    wxComboBox *mrl_combo;
+
+    int i_access_type;
+
+    /* Controls for the v4l advanced options */
+    wxPanel *common_subpanel;
+    wxPanel *common_panel;
+    wxCheckBox *size_checkbox;
+    wxComboBox *size_combo;
+    wxCheckBox *norm_checkbox;
+    wxComboBox *norm_combo;
+    wxCheckBox *frequency_checkbox;
+    wxSpinCtrl *frequency;
+
+    wxPanel *audio_subpanel;
+    wxPanel *audio_panel;
+    wxCheckBox *audio_checkbox;
+    wxTextCtrl *audio_device;
+    wxSpinCtrl *audio_channel;
+
+};
+
 /* Stream output Dialog */
 class SoutDialog: public wxDialog
 {
@@ -375,9 +452,9 @@ private:
     /* Event handlers for the net access output */
     void OnNetChange( wxCommandEvent& event );
 
-    /* Event specific to the sap address */
-    void OnSAPAddrChange( wxCommandEvent& event );
-    
+    /* Event specific to the announce address */
+    void OnAnnounceAddrChange( wxCommandEvent& event );
+
     /* Event handlers for the encapsulation panel */
     void OnEncapsulationChange( wxCommandEvent& event );
 
@@ -387,6 +464,7 @@ private:
 
     /* Event handlers for the misc panel */
     void OnSAPMiscChange( wxCommandEvent& event );
+    void OnSLPMiscChange( wxCommandEvent& event );
 
     DECLARE_EVENT_TABLE();
 
@@ -408,8 +486,9 @@ private:
     /* Controls for the SAP announces */
     wxPanel *misc_subpanels[1];
     wxCheckBox *sap_checkbox;
-    wxTextCtrl *sap_addr;
-                            
+    wxCheckBox *slp_checkbox;
+    wxTextCtrl *announce_addr;
+
     /* Controls for the encapsulation */
     wxRadioButton *encapsulation_radios[5];
     int i_encapsulation_type;
@@ -500,7 +579,7 @@ private:
     wxTextAttr *dbg_attr;
 
     wxFileDialog *save_log_dialog;
-    
+
     vlc_bool_t b_verbose;
 };
 
@@ -556,7 +635,7 @@ private:
     void OnClose( wxCommandEvent& event );
 
     DECLARE_EVENT_TABLE();
-   
+
     intf_thread_t *p_intf;
     wxTreeCtrl *fileinfo_tree;
     wxTreeItemId fileinfo_root;
@@ -674,5 +753,5 @@ static inline int ConvertHotkey( int i_hotkey )
         default:
             return 0;
         }
-    }             
+    }
 }