From: Mohammed Adnène Trojette Date: Tue, 19 Aug 2003 21:16:09 +0000 (+0000) Subject: Video4Linux / PVR / KFIR unified panel X-Git-Tag: 0.7.0~1098 X-Git-Url: https://git.sesse.net/?a=commitdiff_plain;h=84c6ecb2b20340071acfd3c4802aa2a399273666;p=vlc Video4Linux / PVR / KFIR unified panel --- diff --git a/modules/gui/wxwindows/open.cpp b/modules/gui/wxwindows/open.cpp index a6961ae462..32f7e588a1 100644 --- a/modules/gui/wxwindows/open.cpp +++ b/modules/gui/wxwindows/open.cpp @@ -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 * @@ -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 index 0000000000..f54d5df9f9 --- /dev/null +++ b/modules/gui/wxwindows/v4l.cpp @@ -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 + * + * 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 /* malloc(), free() */ +#include /* ENOMEM */ +#include /* strerror() */ +#include + +#include + +#ifdef WIN32 /* mingw32 hack */ +#undef Yield +#undef CreateDialog +#endif + +/* Let vlc take care of the i18n stuff */ +#define WXINTL_NO_GETTEXT_MACRO + +#include +#include +#include +#include +#include +#include +#include + +#include + +#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(); +} + diff --git a/modules/gui/wxwindows/wxwindows.h b/modules/gui/wxwindows/wxwindows.h index 893ff254d9..1664e82813 100644 --- a/modules/gui/wxwindows/wxwindows.h +++ b/modules/gui/wxwindows/wxwindows.h @@ -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 * @@ -33,15 +33,6 @@ 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; } - } + } }