Commit 8e843ea7 authored by Gildas Bazin's avatar Gildas Bazin

* modules/gui/wxwindows/*: removed the V4L specific code.

  The V4L panel is now created automatically with an "AutoBuiltPanel" class.
  (A few options are missing compared to the old panel but they need to be added
   to the V4L plugin, not the wxWindows code).
parent 7a8356f8
......@@ -19,7 +19,6 @@ SOURCES_wxwindows = \
subtitles.cpp \
bookmarks.cpp \
video.cpp \
v4l.cpp \
$(NULL)
EXTRA_DIST += \
......
......@@ -68,18 +68,13 @@ enum
NetAddr1_Event, NetAddr2_Event, NetAddr3_Event, NetAddr4_Event,
NetForceIPv6_Event,
#ifndef WIN32
VideoType_Event,
VideoDevice_Event,
VideoChannel_Event,
V4LSettings_Event,
#endif
SubsFileEnable_Event,
SubsFileSettings_Event,
SoutEnable_Event,
SoutSettings_Event,
AdvancedOptions_Event
};
BEGIN_EVENT_TABLE(OpenDialog, wxFrame)
......@@ -120,14 +115,6 @@ BEGIN_EVENT_TABLE(OpenDialog, wxFrame)
EVT_TEXT(NetAddr4_Event, OpenDialog::OnNetPanelChange)
EVT_CHECKBOX(NetForceIPv6_Event, OpenDialog::OnNetPanelChange)
#ifndef WIN32
/* 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)
#endif
/* Events generated by the subtitle file buttons */
EVT_CHECKBOX(SubsFileEnable_Event, OpenDialog::OnSubsFileEnable)
EVT_BUTTON(SubsFileSettings_Event, OpenDialog::OnSubsFileSettings)
......@@ -156,30 +143,55 @@ public:
virtual ~AutoBuiltPanel() {}
void UpdateAdvancedMRL();
wxString name;
ArrayOfConfigControls config_array;
ArrayOfConfigControls advanced_config_array;
wxComboBox *p_advanced_mrl_combo;
private:
intf_thread_t *p_intf;
OpenDialog *p_open_dialog;
void OnAdvanced( wxCommandEvent& event );
wxDialog *p_advanced_dialog;
DECLARE_EVENT_TABLE();
};
void AutoBuildCallback( void *p_data )
BEGIN_EVENT_TABLE(AutoBuiltPanel, wxPanel)
EVT_BUTTON(wxID_OK, AutoBuiltPanel::OnAdvanced)
EVT_BUTTON(AdvancedOptions_Event, AutoBuiltPanel::OnAdvanced)
END_EVENT_TABLE()
static void AutoBuildCallback( void *p_data )
{
((OpenDialog *)p_data)->UpdateMRL();
}
static void AutoBuildAdvancedCallback( void *p_data )
{
((AutoBuiltPanel *)p_data)->UpdateAdvancedMRL();
}
AutoBuiltPanel::AutoBuiltPanel( wxWindow *parent, OpenDialog *dialog,
intf_thread_t *_p_intf,
const module_t *p_module )
: wxPanel( parent, -1, wxDefaultPosition, wxSize(200, 200) ),
name( wxU(p_module->psz_object_name) ), p_intf( _p_intf )
: wxPanel( parent, -1, wxDefaultPosition, wxDefaultSize ),
name( wxU(p_module->psz_object_name) ),
p_advanced_mrl_combo( NULL ),
p_intf( _p_intf ), p_open_dialog( dialog ), p_advanced_dialog( NULL )
{
wxBoxSizer *sizer = new wxBoxSizer( wxVERTICAL );
module_config_t *p_item = p_module->p_config;
bool b_advanced = false;
if( p_item ) do
{
if( !(p_item->i_type & CONFIG_HINT) && p_item->b_advanced )
b_advanced = true;
if( p_item->i_type & CONFIG_HINT || p_item->b_advanced )
continue;
......@@ -197,9 +209,129 @@ AutoBuiltPanel::AutoBuiltPanel( wxWindow *parent, OpenDialog *dialog,
}
while( p_item->i_type != CONFIG_HINT_END && p_item++ );
if( b_advanced )
{
wxPanel *dummy_panel = new wxPanel( this, -1 );
sizer->Add( dummy_panel, 1 );
wxButton *button =
new wxButton( this, AdvancedOptions_Event,
wxU(_("Advanced options...")) );
sizer->Add( button, 0, wxALL, 5 );
/* Build the advanced dialog */
p_advanced_dialog =
new wxDialog( this, -1, wxU(_("Advanced options")) + wxT(" (") +
wxU( p_module->psz_longname ) + wxT(")"),
wxDefaultPosition, wxDefaultSize,
wxDEFAULT_DIALOG_STYLE | wxRESIZE_BORDER );
wxBoxSizer *sizer = new wxBoxSizer( wxVERTICAL );
/* Create MRL combobox */
wxBoxSizer *mrl_sizer_sizer = new wxBoxSizer( wxHORIZONTAL );
wxStaticBox *mrl_box =
new wxStaticBox( p_advanced_dialog, -1,
wxU(_("Advanced options")) );
wxStaticBoxSizer *mrl_sizer =
new wxStaticBoxSizer( mrl_box, wxHORIZONTAL );
wxStaticText *mrl_label =
new wxStaticText( p_advanced_dialog, -1, wxU(_("Options:")) );
p_advanced_mrl_combo =
new wxComboBox( p_advanced_dialog, MRL_Event, wxT(""),
wxDefaultPosition, wxDefaultSize );
mrl_sizer->Add( mrl_label, 0, wxALL | wxALIGN_CENTER, 5 );
mrl_sizer->Add( p_advanced_mrl_combo, 1, wxALL | wxALIGN_CENTER, 5 );
mrl_sizer_sizer->Add( mrl_sizer, 1, wxEXPAND | wxALL, 5 );
sizer->Add( mrl_sizer_sizer, 0, wxEXPAND | wxALL, 2 );
/* Add advanced options to panel */
module_config_t *p_item = p_module->p_config;
if( p_item ) do
{
if( p_item->i_type & CONFIG_HINT || !p_item->b_advanced )
continue;
ConfigControl *control =
CreateConfigControl( VLC_OBJECT(p_intf), p_item,
p_advanced_dialog );
advanced_config_array.Add( control );
/* Don't add items that were not recognized */
if( control == NULL ) continue;
control->SetUpdateCallback( AutoBuildAdvancedCallback,
(void *)this );
sizer->Add( control, 0, wxEXPAND | wxALL, 2 );
}
while( p_item->i_type != CONFIG_HINT_END && p_item++ );
/* Separation */
dummy_panel = new wxPanel( p_advanced_dialog, -1 );
sizer->Add( dummy_panel, 1 );
wxStaticLine *static_line =
new wxStaticLine( p_advanced_dialog, wxID_OK );
sizer->Add( static_line, 0, wxEXPAND | wxALL, 5 );
/* Create OK button */
wxButton *ok_button =
new wxButton( p_advanced_dialog, wxID_OK, wxU(_("OK")) );
ok_button->SetDefault();
sizer->Add( ok_button, 0, wxALL, 5 );
sizer->SetMinSize( 400, -1 );
p_advanced_dialog->SetSizerAndFit( sizer );
}
this->SetSizerAndFit( sizer );
}
void AutoBuiltPanel::OnAdvanced( wxCommandEvent& event )
{
p_advanced_dialog->Show( !p_advanced_dialog->IsShown() );
UpdateAdvancedMRL();
p_open_dialog->UpdateMRL();
}
void AutoBuiltPanel::UpdateAdvancedMRL()
{
wxString mrltemp;
for( int i = 0; i < (int)advanced_config_array.GetCount(); i++ )
{
ConfigControl *control = advanced_config_array.Item(i);
mrltemp += wxT(":");
if( control->GetType() == CONFIG_ITEM_BOOL &&
!control->GetIntValue() ) mrltemp += wxT("no-");
mrltemp += control->GetName();
switch( control->GetType() )
{
case CONFIG_ITEM_STRING:
case CONFIG_ITEM_FILE:
case CONFIG_ITEM_DIRECTORY:
case CONFIG_ITEM_MODULE:
mrltemp += wxT("=\"") + control->GetPszValue() + wxT("\"");
break;
case CONFIG_ITEM_INTEGER:
mrltemp +=
wxString::Format( wxT("=%i"), control->GetIntValue() );
break;
case CONFIG_ITEM_FLOAT:
mrltemp +=
wxString::Format(wxT("=%f"), control->GetFloatValue());
break;
}
}
p_advanced_mrl_combo->SetValue( mrltemp );
}
/*****************************************************************************
* Constructor.
*****************************************************************************/
......@@ -225,9 +357,6 @@ OpenDialog::OpenDialog( intf_thread_t *_p_intf, wxWindow *_p_parent,
i_disc_type_selection = 0;
i_open_arg = i_arg;
#ifndef WIN32
v4l_dialog = NULL;
#endif
sout_dialog = NULL;
subsfile_dialog = NULL;
b_disc_device_changed = false;
......@@ -311,12 +440,28 @@ OpenDialog::OpenDialog( intf_thread_t *_p_intf, wxWindow *_p_parent,
i_access_method == DISC_ACCESS );
notebook->AddPage( NetPanel( notebook ), wxU(_("Network")),
i_access_method == NET_ACCESS );
#ifndef WIN32
notebook->AddPage( V4LPanel( notebook ), wxU(_("Video for Linux")),
i_access_method == CAPTURE_ACCESS );
#endif
module_t *p_module = config_FindModule( VLC_OBJECT(p_intf), "dshow" );
module_t *p_module = config_FindModule( VLC_OBJECT(p_intf), "v4l" );
if( p_module )
{
AutoBuiltPanel *autopanel =
new AutoBuiltPanel( notebook, this, p_intf, p_module );
input_tab_array.Add( autopanel );
notebook->AddPage( autopanel, wxU( p_module->psz_longname ),
i_access_method == CAPTURE_ACCESS );
}
p_module = config_FindModule( VLC_OBJECT(p_intf), "pvr" );
if( p_module )
{
AutoBuiltPanel *autopanel =
new AutoBuiltPanel( notebook, this, p_intf, p_module );
input_tab_array.Add( autopanel );
notebook->AddPage( autopanel, wxU( p_module->psz_longname ),
i_access_method == CAPTURE_ACCESS );
}
p_module = config_FindModule( VLC_OBJECT(p_intf), "dshow" );
if( p_module )
{
AutoBuiltPanel *autopanel =
......@@ -334,12 +479,6 @@ OpenDialog::OpenDialog( intf_thread_t *_p_intf, wxWindow *_p_parent,
dummy_event.SetId( NetRadio1_Event );
OnNetTypeChange( dummy_event );
#ifndef WIN32
/* Update v4l panel */
dummy_event.SetId( VideoType_Event );
OnV4LTypeChange( dummy_event );
#endif
/* Update MRL */
wxNotebookEvent event( wxEVT_NULL, 0, i_access_method );
OnPageChange( event );
......@@ -371,9 +510,6 @@ OpenDialog::~OpenDialog()
{
/* Clean up */
if( file_dialog ) delete file_dialog;
#ifndef WIN32
if( v4l_dialog ) delete v4l_dialog;
#endif
if( sout_dialog ) delete sout_dialog;
if( subsfile_dialog ) delete subsfile_dialog;
}
......@@ -599,65 +735,6 @@ wxPanel *OpenDialog::NetPanel( wxWindow* parent )
return panel;
}
#ifndef WIN32
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_device->SetToolTip( wxU(_("Device corresponding to your acquisition "
"card or your webcam")) );
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, wxT("0") );
video_channel->SetToolTip( wxU(_("Usually 0 is for tuner, 1 for composite "
"and 2 for svideo")) );
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;
}
#endif
void OpenDialog::UpdateMRL()
{
UpdateMRL( i_current_access_method );
......@@ -680,7 +757,7 @@ void OpenDialog::UpdateMRL( int i_access_method )
switch ( i_disc_type_selection )
{
case 0: /* DVD with menues */
case 0: /* DVD with menues */
disc_chapter->Enable();
disc_chapter_label->Enable();
mrltemp = wxT("dvd://")
......@@ -690,7 +767,7 @@ void OpenDialog::UpdateMRL( int i_access_method )
disc_chapter->GetValue() );
break;
case 1: /* DVD of some sort */
case 1: /* DVD of some sort */
disc_chapter->Enable();
disc_chapter_label->Enable();
mrltemp = wxT("dvdsimple://")
......@@ -700,15 +777,15 @@ void OpenDialog::UpdateMRL( int i_access_method )
disc_chapter->GetValue() );
break;
case 2: /* VCD of some sort */
{
/* The chapter object is used for subtitles */
case 2: /* VCD of some sort */
{
/* The chapter object is used for subtitles */
int i_subtitle = disc_chapter->GetValue();
config_PutInt( p_intf, "spu-channel", i_subtitle );
disc_chapter->Enable();
disc_chapter_label->Enable();
int i_subtitle = disc_chapter->GetValue();
config_PutInt( p_intf, "spu-channel", i_subtitle );
disc_chapter->Enable();
disc_chapter_label->Enable();
#ifdef HAVE_VCDX
if ( disc_title->GetValue() )
mrltemp = wxT("vcdx://")
......@@ -720,18 +797,18 @@ void OpenDialog::UpdateMRL( int i_access_method )
);
else
mrltemp = wxT("vcdx://")
+ disc_device->GetValue();
+ disc_device->GetValue();
#else
mrltemp = wxT("vcd://")
+ disc_device->GetValue()
+ wxString::Format( wxT("@%d"),
disc_title->GetValue() );
+ disc_device->GetValue()
+ wxString::Format( wxT("@%d"),
disc_title->GetValue() );
#endif
break;
}
}
case 3: /* CD-DA */
case 3: /* CD-DA */
disc_chapter->Disable();
disc_chapter_label->Disable();
#ifdef HAVE_CDDAX
......@@ -812,29 +889,6 @@ void OpenDialog::UpdateMRL( int i_access_method )
}
break;
#ifndef WIN32
case CAPTURE_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;
#endif
default:
{
int i_item = i_access_method - MAX_ACCESS;
......@@ -875,6 +929,13 @@ void OpenDialog::UpdateMRL( int i_access_method )
break;
}
}
if( input_panel->p_advanced_mrl_combo &&
input_panel->p_advanced_mrl_combo->GetValue() )
{
mrltemp += wxT(" ") +
input_panel->p_advanced_mrl_combo->GetValue();
}
}
break;
}
......@@ -947,8 +1008,6 @@ void OpenDialog::OnOk( wxCommandEvent& WXUNUSED(event) )
}
}
//TogglePlayButton( PLAYING_S );
vlc_object_release( p_playlist );
Hide();
......@@ -1068,9 +1127,9 @@ void OpenDialog::OnDiscTypeChange( wxCommandEvent& WXUNUSED(event) )
disc_title->SetRange( i_selection, 255 );
disc_title->SetValue( i_selection );
disc_chapter->SetRange( 1, 255 );
disc_chapter->SetValue( 1 );
disc_chapter_label->SetLabel ( wxU(_("Chapter")) );
disc_chapter->SetRange( 1, 255 );
disc_chapter->SetValue( 1 );
disc_chapter_label->SetLabel ( wxU(_("Chapter")) );
break;
......@@ -1102,7 +1161,7 @@ void OpenDialog::OnDiscTypeChange( wxCommandEvent& WXUNUSED(event) )
#endif
disc_title->SetValue( i_selection );
/* We use the chapter to set subtitle number */
/* We use the chapter to set subtitle number */
disc_chapter_label->SetLabel ( wxU(_("Subtitle")) );
disc_chapter->SetRange( -1, 4 );
disc_chapter->SetValue( config_GetInt( p_intf, "spu-channel" ) );
......@@ -1164,53 +1223,6 @@ void OpenDialog::OnNetTypeChange( wxCommandEvent& event )
UpdateMRL( NET_ACCESS );
}
#ifndef WIN32
/*****************************************************************************
* v4l panel event methods.
*****************************************************************************/
void OpenDialog::OnV4LPanelChange( wxCommandEvent& WXUNUSED(event) )
{
UpdateMRL( CAPTURE_ACCESS );
}
void OpenDialog::OnV4LTypeChange( wxCommandEvent& WXUNUSED(event) )
{
video_device->SetValue( wxT( "/dev/video" ) );
v4l_button->Enable();
video_channel->Disable();
switch( video_type->GetSelection() )
{
case 1:
video_channel->Enable();
video_channel->SetRange( 0, 255 );
break;
case 3:
v4l_button->Disable();
break;
default:
break;
}
UpdateMRL( CAPTURE_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( CAPTURE_ACCESS );
}
#endif
/*****************************************************************************
* Subtitles file event methods.
*****************************************************************************/
......
/*****************************************************************************
* v4l.cpp : wxWindows plugin for vlc
*****************************************************************************
* Copyright (C) 2000-2003 VideoLAN
* $Id$
*
* Authors: Mohammed Adnne 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
#include <wx/combobox.h>
#include <wx/statline.h>
#include <vlc/intf.h>
#include "wxwindows.h"
#ifndef wxRB_SINGLE
# define wxRB_SINGLE 0
#endif
/*****************************************************************************
* Event Table.
*****************************************************************************/
/* IDs for the controls and the menu commands */
enum
{
MRL_Event,
Size_Event,
Norm_Event,
FrequencyEnable_Event,Frequency_Event,
AudioDevice_Event, ADevLocation, AudioChannel_Event,
BitrateEnable_Event, MaxBitrateEnable_Event,
Bitrate_Event, MaxBitrate_Event
};
BEGIN_EVENT_TABLE(V4LDialog, wxDialog)
/* Button events */
EVT_BUTTON(wxID_OK, V4LDialog::OnOk)
EVT_BUTTON(wxID_CANCEL, V4LDialog::OnCancel)
/* Events generated by the common 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(FrequencyEnable_Event, V4LDialog::OnFrequencyEnable)
EVT_SPINCTRL(Frequency_Event, V4LDialog::OnFrequency)
/* Events generated by the audio panel */
EVT_CHECKBOX(AudioDevice_Event, V4LDialog::OnAudioEnable)
EVT_TEXT(ADevLocation, V4LDialog::OnAudioChange)
EVT_SPINCTRL(AudioChannel_Event, V4LDialog::OnAudioChannel)
/* Events generated by the bitrate panel */
EVT_CHECKBOX(BitrateEnable_Event, V4LDialog::OnBitrateEnable)
EVT_SPINCTRL(Bitrate_Event, V4LDialog::OnBitrate)