X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=modules%2Fgui%2Fwxwindows%2Fopen.cpp;h=e789766d457d47faf89ce04a18bcc7a7beeb5ccf;hb=a90a19a6b0468ea9fedadc27cfc1118d70295263;hp=f0a25e619287e386a13ab34a83ab6f69961438c0;hpb=cb55dfe4d52b6e7a49b8d484cc3430a042522436;p=vlc diff --git a/modules/gui/wxwindows/open.cpp b/modules/gui/wxwindows/open.cpp index f0a25e6192..e789766d45 100644 --- a/modules/gui/wxwindows/open.cpp +++ b/modules/gui/wxwindows/open.cpp @@ -2,9 +2,9 @@ * open.cpp : wxWindows plugin for vlc ***************************************************************************** * Copyright (C) 2000-2004 VideoLAN - * $Id: open.cpp,v 1.68 2004/02/08 18:17:22 gbazin Exp $ + * $Id$ * - * Authors: Gildas Bazin + * Authors: Gildas Bazin * * 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 @@ -37,6 +37,8 @@ #include +#include + #include "wxwindows.h" #include "preferences_widgets.h" @@ -61,6 +63,7 @@ enum DiscDevice_Event, DiscTitle_Event, DiscChapter_Event, + DiscSub_Event, NetType_Event, NetRadio1_Event, NetRadio2_Event, NetRadio3_Event, NetRadio4_Event, @@ -68,21 +71,19 @@ 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, + + CachingEnable_Event, + CachingChange_Event, + + AdvancedOptions_Event }; -BEGIN_EVENT_TABLE(OpenDialog, wxFrame) +BEGIN_EVENT_TABLE(OpenDialog, wxDialog) /* Button events */ EVT_BUTTON(wxID_OK, OpenDialog::OnOk) EVT_BUTTON(wxID_CANCEL, OpenDialog::OnCancel) @@ -103,6 +104,8 @@ BEGIN_EVENT_TABLE(OpenDialog, wxFrame) EVT_SPINCTRL(DiscTitle_Event, OpenDialog::OnDiscPanelChange) EVT_TEXT(DiscChapter_Event, OpenDialog::OnDiscPanelChange) EVT_SPINCTRL(DiscChapter_Event, OpenDialog::OnDiscPanelChange) + EVT_TEXT(DiscSub_Event, OpenDialog::OnDiscPanelChange) + EVT_SPINCTRL(DiscSub_Event, OpenDialog::OnDiscPanelChange) /* Events generated by the net panel */ EVT_RADIOBUTTON(NetRadio1_Event, OpenDialog::OnNetTypeChange) @@ -120,14 +123,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) @@ -136,6 +131,11 @@ BEGIN_EVENT_TABLE(OpenDialog, wxFrame) EVT_CHECKBOX(SoutEnable_Event, OpenDialog::OnSoutEnable) EVT_BUTTON(SoutSettings_Event, OpenDialog::OnSoutSettings) + /* Events generated by the caching button */ + EVT_CHECKBOX(CachingEnable_Event, OpenDialog::OnCachingEnable) + EVT_TEXT(CachingChange_Event, OpenDialog::OnCachingChange) + EVT_SPINCTRL(CachingChange_Event, OpenDialog::OnCachingChange) + /* Hide the window when the user closes the window */ EVT_CLOSE(OpenDialog::OnCancel) @@ -156,30 +156,54 @@ 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(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,15 +221,140 @@ AutoBuiltPanel::AutoBuiltPanel( wxWindow *parent, OpenDialog *dialog, } while( p_item->i_type != CONFIG_HINT_END && p_item++ ); + if( b_advanced ) + { + 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, ((wxString)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 */ + wxPanel *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 buttons */ + wxButton *ok_button = + new wxButton( p_advanced_dialog, wxID_OK, wxU(_("OK")) ); + ok_button->SetDefault(); + wxButton *cancel_button = + new wxButton( p_advanced_dialog, wxID_CANCEL, wxU(_("Cancel")) ); + 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(); + sizer->Add( button_sizer, 0, wxALL, 0 ); + + sizer->SetMinSize( 400, -1 ); + p_advanced_dialog->SetSizerAndFit( sizer ); + } + this->SetSizerAndFit( sizer ); } +void AutoBuiltPanel::OnAdvanced( wxCommandEvent& event ) +{ + if( p_advanced_dialog->ShowModal() == wxID_OK ) + { + 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 += (i ? wxT(" :") : 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. *****************************************************************************/ OpenDialog::OpenDialog( intf_thread_t *_p_intf, wxWindow *_p_parent, int i_access_method, int i_arg ): - wxFrame( _p_parent, -1, wxU(_("Open...")), wxDefaultPosition, + wxDialog( _p_parent, -1, wxU(_("Open...")), wxDefaultPosition, wxDefaultSize, wxDEFAULT_FRAME_STYLE ) { OpenDialog( _p_intf, _p_parent, i_access_method, i_arg, OPEN_NORMAL ); @@ -213,7 +362,7 @@ OpenDialog::OpenDialog( intf_thread_t *_p_intf, wxWindow *_p_parent, OpenDialog::OpenDialog( intf_thread_t *_p_intf, wxWindow *_p_parent, int i_access_method, int i_arg, int _i_method ): - wxFrame( _p_parent, -1, wxU(_("Open...")), wxDefaultPosition, + wxDialog( _p_parent, -1, wxU(_("Open...")), wxDefaultPosition, wxDefaultSize, wxDEFAULT_FRAME_STYLE ) { /* Initializations */ @@ -225,9 +374,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; @@ -243,7 +389,7 @@ OpenDialog::OpenDialog( intf_thread_t *_p_intf, wxWindow *_p_parent, wxStaticBoxSizer *mrl_sizer = new wxStaticBoxSizer( mrl_box, wxHORIZONTAL ); wxStaticText *mrl_label = new wxStaticText( panel, -1, - wxU(_("Open :")) ); + wxU(_("Open:")) ); mrl_combo = new wxComboBox( panel, MRL_Event, wxT(""), wxPoint(20,25), wxSize(120, -1), 0, NULL ); @@ -261,20 +407,17 @@ OpenDialog::OpenDialog( intf_thread_t *_p_intf, wxWindow *_p_parent, wxU(_("Alternatively, you can build an MRL using one of the " "following predefined targets:")) ); - wxFlexGridSizer *sout_sizer = NULL; - wxStaticLine *static_line = NULL; + wxFlexGridSizer *common_opt_sizer = new wxFlexGridSizer( 5, 1, 20 ); if( i_method == OPEN_NORMAL ) { /* Create Stream Output checkox */ - sout_sizer = new wxFlexGridSizer( 2, 1, 20 ); - - sout_checkbox = new wxCheckBox( panel, SoutEnable_Event, wxU(_("Stream output")) ); sout_checkbox->SetToolTip( wxU(_("Use VLC as a server of streams")) ); - sout_sizer->Add( sout_checkbox, 0, - wxALIGN_RIGHT | wxALIGN_CENTER_VERTICAL ); + common_opt_sizer->Add( sout_checkbox, 0, + wxALIGN_RIGHT | wxALIGN_CENTER_VERTICAL ); + sout_button = new wxButton( panel, SoutSettings_Event, wxU(_("Settings...")) ); sout_button->Disable(); @@ -288,13 +431,29 @@ OpenDialog::OpenDialog( intf_thread_t *_p_intf, wxWindow *_p_parent, } if( psz_sout ) free( psz_sout ); - sout_sizer->Add( sout_button, 1, wxALIGN_LEFT | - wxALIGN_CENTER_VERTICAL ); + common_opt_sizer->Add( sout_button, 1, wxALIGN_LEFT | + wxALIGN_CENTER_VERTICAL ); - /* Separation */ - static_line = new wxStaticLine( panel, wxID_OK ); + common_opt_sizer->Add( new wxPanel( this, -1 ), 1, + wxALIGN_RIGHT | wxALIGN_CENTER_VERTICAL ); } + /* Create caching options */ + caching_checkbox = new wxCheckBox( panel, CachingEnable_Event, + wxU(_("Caching")) ); + caching_checkbox->SetToolTip( wxU(_("Change the default caching value " + "(in milliseconds)")) ); + common_opt_sizer->Add( caching_checkbox, 0, + wxALIGN_RIGHT | wxALIGN_CENTER_VERTICAL ); + caching_value = new wxSpinCtrl( panel, CachingChange_Event ); + caching_value->SetRange( 0, 1000000 ); + caching_value->Disable(); + common_opt_sizer->Add( caching_value, 0, + wxALIGN_RIGHT | wxALIGN_CENTER_VERTICAL ); + + /* 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(); @@ -311,18 +470,45 @@ 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 == V4L_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_shortname ), + 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_shortname ), + i_access_method == CAPTURE_ACCESS ); + } + + p_module = config_FindModule( VLC_OBJECT(p_intf), "dvb" ); 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 ) ); + notebook->AddPage( autopanel, wxU( p_module->psz_shortname ), + i_access_method == CAPTURE_ACCESS ); + } + + p_module = config_FindModule( VLC_OBJECT(p_intf), "dshow" ); + 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_shortname ), + i_access_method == CAPTURE_ACCESS ); } /* Update Disc panel */ @@ -333,12 +519,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 ); @@ -353,11 +533,8 @@ OpenDialog::OpenDialog( intf_thread_t *_p_intf, wxWindow *_p_parent, panel_sizer->Add( mrl_sizer_sizer, 0, wxEXPAND, 5 ); panel_sizer->Add( label, 0, wxEXPAND | wxALL, 5 ); panel_sizer->Add( notebook_sizer, 1, wxEXPAND | wxALL, 5 ); - if( i_method == OPEN_NORMAL) - { - panel_sizer->Add( sout_sizer, 0, wxALIGN_LEFT | wxALL, 5 ); - panel_sizer->Add( static_line, 0, wxEXPAND | wxALL, 5 ); - } + panel_sizer->Add( common_opt_sizer, 0, wxALIGN_LEFT | wxALL, 5 ); + panel_sizer->Add( static_line, 0, wxEXPAND | wxALL, 5 ); panel_sizer->Add( button_sizer, 0, wxALIGN_LEFT | wxALL, 5 ); panel_sizer->Layout(); panel->SetSizerAndFit( panel_sizer ); @@ -370,18 +547,14 @@ 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; } int OpenDialog::Show( int i_access_method, int i_arg ) { - int i_ret; notebook->SetSelection( i_access_method ); - i_ret = wxFrame::Show(); + int i_ret = wxDialog::Show(); Raise(); SetFocus(); i_open_arg = i_arg; @@ -390,8 +563,7 @@ int OpenDialog::Show( int i_access_method, int i_arg ) int OpenDialog::Show() { - int i_ret; - i_ret = wxFrame::Show(); + int i_ret = wxDialog::Show(); Raise(); SetFocus(); return i_ret; @@ -421,7 +593,7 @@ wxPanel *OpenDialog::FilePanel( wxWindow* parent ) wxFlexGridSizer *subsfile_sizer = new wxFlexGridSizer( 2, 1, 20 ); subsfile_checkbox = new wxCheckBox( panel, SubsFileEnable_Event, wxU(_("Subtitle options")) ); - subsfile_checkbox->SetToolTip( wxU(_("Force options for seperate subtitle files.")) ); + subsfile_checkbox->SetToolTip( wxU(_("Force options for separate subtitle files.")) ); subsfile_sizer->Add( subsfile_checkbox, 0, wxALIGN_RIGHT | wxALIGN_CENTER_VERTICAL ); subsfile_button = new wxButton( panel, SubsFileSettings_Event, @@ -456,11 +628,10 @@ wxPanel *OpenDialog::DiscPanel( wxWindow* parent ) static const wxString disc_type_array[] = { - wxU(_("DVD (menus support)")), + wxU(_("DVD (menus)")), wxU(_("DVD")), wxU(_("VCD")), - wxU(_("Audio CD")) - + wxU(_("Audio CD")), }; disc_type = new wxRadioBox( panel, DiscType_Event, wxU(_("Disc type")), @@ -480,7 +651,6 @@ wxPanel *OpenDialog::DiscPanel( wxWindow* parent ) disc_title_label = new wxStaticText( panel, -1, wxU(_("Title")) ); disc_title = new wxSpinCtrl( panel, DiscTitle_Event ); - sizer->Add( disc_title_label, 0, wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL ); sizer->Add( disc_title, 1, wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL ); @@ -489,6 +659,15 @@ wxPanel *OpenDialog::DiscPanel( wxWindow* parent ) sizer->Add( disc_chapter_label, 0, wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL ); sizer->Add( disc_chapter, 1, wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL ); + + disc_sub_label = new wxStaticText( panel, -1, wxU(_("Subtitles track")) ); + disc_sub = new wxSpinCtrl( panel, DiscSub_Event ); + sizer->Add( disc_sub_label, 0, wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL ); + sizer->Add( disc_sub, 1, wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL ); + disc_sub->SetRange( -1, 255 ); + i_disc_sub = config_GetInt( p_intf, "spu-channel" ); + disc_sub->SetValue( i_disc_sub ); + sizer_row->Add( sizer, 0, wxEXPAND | wxALL, 5 ); panel->SetSizerAndFit( sizer_row ); @@ -598,65 +777,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 ); @@ -664,92 +784,94 @@ void OpenDialog::UpdateMRL() void OpenDialog::UpdateMRL( int i_access_method ) { - wxString demux, mrltemp; + wxString mrltemp, caching_name; i_current_access_method = i_access_method; switch( i_access_method ) { case FILE_ACCESS: - //mrltemp = wxT("file") + demux + wxT(":") + file_combo->GetValue(); mrltemp = file_combo->GetValue(); + caching_name = wxT("file-caching"); break; + case DISC_ACCESS: - i_disc_type_selection = disc_type->GetSelection(); + i_disc_type_selection = disc_type->GetSelection(); - switch ( i_disc_type_selection ) + switch ( i_disc_type_selection ) { - case 0: - disc_chapter->Enable(); - disc_chapter_label->Enable(); - mrltemp = wxT("dvd://") - + disc_device->GetValue() - + wxString::Format( wxT("@%d:%d"), - disc_title->GetValue(), - disc_chapter->GetValue() ); - break; - case 1: - disc_chapter->Enable(); - disc_chapter_label->Enable(); - mrltemp = wxT("dvdsimple://") - + disc_device->GetValue() - + wxString::Format( wxT("@%d:%d"), - disc_title->GetValue(), - disc_chapter->GetValue() ); - break; - case 2: - disc_chapter->Disable(); - disc_chapter_label->Disable(); + case 0: /* DVD with menus */ + case 1: /* DVD without menus */ + if( i_disc_type_selection == 0 ) + { + mrltemp = wxT("dvd://") + disc_device->GetValue(); + caching_name = wxT("dvdnav-caching"); + } + else + { + mrltemp = wxT("dvdsimple://") + disc_device->GetValue(); + caching_name = wxT("dvdread-caching"); + } + + if( i_disc_title > 0 ) + { + mrltemp += wxString::Format( wxT("@%d"), i_disc_title ); + + if( i_disc_chapter > 0 ) + mrltemp += wxString::Format( wxT(":%d"), i_disc_chapter ); + } + + if( i_disc_sub >= 0 ) + mrltemp += wxString::Format( wxT(" :spu-channel=%d"), + i_disc_sub ); + break; + + case 2: /* VCD of some sort */ #ifdef HAVE_VCDX - if ( disc_title->GetValue() ) - mrltemp = wxT("vcdx://") - + disc_device->GetValue() - + wxString::Format( wxT("@%c%d"), + mrltemp = wxT("vcdx://") + disc_device->GetValue(); + if( i_disc_title > 0 ) + mrltemp += wxString::Format( wxT("@%c%d"), config_GetInt( p_intf, "vcdx-PBC" ) - ? 'P' : 'E', - disc_title->GetValue() - ); - else - mrltemp = wxT("vcdx://") - + disc_device->GetValue(); + ? 'P' : 'E', i_disc_title ); #else - mrltemp = wxT("vcd://") - + disc_device->GetValue() - + wxString::Format( wxT("@%d"), - disc_title->GetValue() ); + mrltemp = wxT("vcd://") + disc_device->GetValue(); + if( i_disc_title > 0 ) + mrltemp += wxString::Format( wxT("@%d"), i_disc_title ); #endif - break; - case 3: - disc_chapter->Disable(); - disc_chapter_label->Disable(); -#ifdef HAVE_CDDAX - if ( disc_title->GetValue() ) - mrltemp = wxT("cddax://") - + disc_device->GetValue() - + wxString::Format( wxT("@T%d"), - disc_title->GetValue() ); - else - mrltemp = wxT("cddax://") - + disc_device->GetValue(); + if( i_disc_sub >= 0 ) + mrltemp += wxString::Format( wxT(" :spu-channel=%d"), + i_disc_sub ); + + caching_name = wxT("vcd-caching"); + break; + + case 3: /* CD-DA */ + mrltemp = +#ifdef HAVE_CDDAX + wxT("cddax://") #else - mrltemp = wxT("cdda://") - + disc_device->GetValue() - + wxString::Format( wxT("@%d"), - disc_title->GetValue() ); + wxT("cdda://") #endif - break; - default: ; - msg_Err( p_intf, "invalid selection (%d)", - disc_type->GetSelection() ); + + disc_device->GetValue(); + if( i_disc_title > 0 ) + mrltemp += wxString::Format( wxT("@%d"), i_disc_title ); + + caching_name = wxT("cdda-caching"); + break; + + default: + msg_Err( p_intf, "invalid selection (%d)", + disc_type->GetSelection() ); } break; + case NET_ACCESS: switch( i_net_type ) { case 0: - mrltemp = wxT("udp") + demux + wxT("://"); + mrltemp = wxT("udp://"); if ( net_ipv6->GetValue() ) { mrltemp += wxT("@[::]"); @@ -759,10 +881,12 @@ void OpenDialog::UpdateMRL( int i_access_method ) { mrltemp += wxString::Format( wxT("@:%d"), i_net_ports[0] ); } + + caching_name = wxT("udp-caching"); break; case 1: - mrltemp = wxT("udp") + demux + wxT("://@"); + mrltemp = wxT("udp://@"); if ((net_addrs[1]->GetLineText(0).Find (':') != -1) && (net_addrs[1]->GetLineText(0)[0u] != '[')) { @@ -778,50 +902,32 @@ void OpenDialog::UpdateMRL( int i_access_method ) { mrltemp += wxString::Format( wxT(":%d"), i_net_ports[1] ); } + + caching_name = wxT("udp-caching"); break; case 2: /* http access */ - if( net_addrs[2]->GetLineText(0).Find(wxT("http://")) ) - { - mrltemp = wxT("http") + demux + wxT("://"); - } + if( net_addrs[2]->GetLineText(0).Find(wxT("://")) == -1 ) + mrltemp = wxT("http://"); + mrltemp += net_addrs[2]->GetLineText(0); + + caching_name = wxT("http-caching"); break; case 3: /* RTSP access */ if( net_addrs[3]->GetLineText(0).Find(wxT("rtsp://")) != 0 ) { - mrltemp = wxT("rtsp") + demux + wxT("://"); + mrltemp = wxT("rtsp://"); } mrltemp += net_addrs[3]->GetLineText(0); - break; - } - break; -#ifndef WIN32 - 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]; + caching_name = wxT("rtsp-caching"); + break; } - break; -#endif default: { @@ -837,7 +943,13 @@ void OpenDialog::UpdateMRL( int i_access_method ) for( int i=0; i < (int)input_panel->config_array.GetCount(); i++ ) { ConfigControl *control = input_panel->config_array.Item(i); - mrltemp += wxT(" :") + control->GetName() + wxT("="); + + mrltemp += wxT(" :"); + + if( control->GetType() == CONFIG_ITEM_BOOL && + !control->GetIntValue() ) mrltemp += wxT("no-"); + + mrltemp += control->GetName(); switch( control->GetType() ) { @@ -845,23 +957,43 @@ void OpenDialog::UpdateMRL( int i_access_method ) case CONFIG_ITEM_FILE: case CONFIG_ITEM_DIRECTORY: case CONFIG_ITEM_MODULE: - mrltemp += wxT("\"") + control->GetPszValue() + wxT("\""); + mrltemp += wxT("=\"") + control->GetPszValue() + wxT("\""); break; case CONFIG_ITEM_INTEGER: - case CONFIG_ITEM_BOOL: mrltemp += - wxString::Format( wxT("%i"), control->GetIntValue() ); + wxString::Format( wxT("=%i"), control->GetIntValue() ); break; case CONFIG_ITEM_FLOAT: mrltemp += - wxString::Format( wxT("%f"), control->GetFloatValue()); + wxString::Format(wxT("=%f"), control->GetFloatValue()); 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; } + if( caching_name.size() ) + { + if( caching_value->IsEnabled() ) + { + mrltemp += wxT(" :") + caching_name + + wxString::Format( wxT("=%d"), i_caching ); + } + else + { + int i_value = config_GetInt( p_intf, caching_name.mb_str() ); + caching_value->SetValue( i_value ); + } + } + mrl_combo->SetValue( mrltemp ); } @@ -877,6 +1009,7 @@ void OpenDialog::OnOk( wxCommandEvent& WXUNUSED(event) ) if( i_method == OPEN_STREAM ) { + if( IsModal() ) EndModal( wxID_OK ); Hide(); return; } @@ -925,21 +1058,22 @@ void OpenDialog::OnOk( wxCommandEvent& WXUNUSED(event) ) if( b_start ) { - int i_pos = playlist_GetPositionById( p_playlist , i_id ); - playlist_Command( p_playlist, PLAYLIST_GOTO, i_pos ); + playlist_Control( p_playlist, PLAYLIST_ITEMPLAY , p_item ); } } - //TogglePlayButton( PLAYING_S ); - vlc_object_release( p_playlist ); Hide(); + + if( IsModal() ) EndModal( wxID_OK ); } void OpenDialog::OnCancel( wxCommandEvent& WXUNUSED(event) ) { Hide(); + + if( IsModal() ) EndModal( wxID_CANCEL ); } void OpenDialog::OnPageChange( wxNotebookEvent& event ) @@ -993,6 +1127,10 @@ void OpenDialog::OnFileBrowse( wxCommandEvent& WXUNUSED(event) ) *****************************************************************************/ void OpenDialog::OnDiscPanelChange( wxCommandEvent& event ) { + if( event.GetId() == DiscTitle_Event ) i_disc_title = event.GetInt(); + if( event.GetId() == DiscChapter_Event ) i_disc_chapter = event.GetInt(); + if( event.GetId() == DiscSub_Event ) i_disc_sub = event.GetInt(); + UpdateMRL( DISC_ACCESS ); } @@ -1028,78 +1166,69 @@ void OpenDialog::OnDiscDeviceChange( wxCommandEvent& event ) void OpenDialog::OnDiscTypeChange( wxCommandEvent& WXUNUSED(event) ) { char *psz_device = NULL; - int i_selection = 1; /* Default Title/Track selection number*/ switch( disc_type->GetSelection() ) { - case 0: /* DVD with menues */ - i_selection=0; - /* Fall through... */ - - case 1: /* DVD of some sort */ - { + case 0: /* DVD with menus */ + case 1: /* DVD without menus */ + disc_sub->Enable(); disc_sub_label->Enable(); + disc_chapter->Enable(); disc_chapter_label->Enable(); + disc_title_label->SetLabel ( wxU(_("Title")) ); psz_device = config_GetPsz( p_intf, "dvd" ); if( !b_disc_device_changed ) { - disc_device->SetValue( psz_device ? wxL2U(psz_device) : wxT("") ); - disc_title_label->SetLabel ( wxU(_("Title")) ); + if( psz_device ) disc_device->SetValue( wxL2U(psz_device) ); + else disc_device->SetValue( wxT("") ); } - disc_title->SetRange( i_selection, 255 ); - disc_title->SetValue( i_selection ); + disc_title->SetRange( 0, 255 ); + disc_chapter->SetRange( 0, 255 ); break; - } case 2: /* VCD of some sort */ + disc_sub->Enable(); disc_sub_label->Enable(); + disc_chapter->Disable(); disc_chapter_label->Disable(); psz_device = config_GetPsz( p_intf, "vcd" ); if( !b_disc_device_changed ) { - disc_device->SetValue( psz_device ? wxL2U(psz_device) : wxT("") ); + if( psz_device ) disc_device->SetValue( wxL2U(psz_device) ); + else disc_device->SetValue( wxT("") ); } - /* There are at most 98, tracks in a VCD, 999 Segments, 500 entries - I don't know what the limit is for LIDs, 999 is probably safe - though. - - FIXME: it would be better however to get the information for - this particular Media possibly from the General Info area. - */ #ifdef HAVE_VCDX disc_title_label->SetLabel ( config_GetInt( p_intf, "vcdx-PBC" ) ? wxT("Playback LID") : wxT("Entry") ); - disc_title->SetRange( 0, 999 ); - i_selection = 0; #else disc_title_label->SetLabel ( wxU(_("Track")) ); - disc_title->SetRange( 1, 98 ); #endif - disc_title->SetValue( i_selection ); + disc_title->SetRange( 0, 999 ); break; case 3: /* CD-DA */ + disc_sub->Disable(); disc_sub_label->Disable(); + disc_chapter->Disable(); disc_chapter_label->Disable(); + disc_title_label->SetLabel ( wxU(_("Track")) ); psz_device = config_GetPsz( p_intf, "cd-audio" ); if( !b_disc_device_changed ) { - disc_device->SetValue( psz_device ? wxL2U(psz_device) : wxT("") ); + if( psz_device ) disc_device->SetValue( wxL2U(psz_device) ); + else disc_device->SetValue( wxT("") ); } - disc_title_label->SetLabel ( wxU(_("Track")) ); -#ifdef HAVE_CDDAX - i_selection = 0; -#endif - /* There are at most 99 tracks in a CD-DA */ - disc_title->SetRange( i_selection, 99 ); - disc_title->SetValue( i_selection ); + + /* There are at most 99 tracks in a CD-DA */ + disc_title->SetRange( 0, 99 ); break; + default: msg_Err( p_intf, "invalid Disc type selection (%d)", - disc_type->GetSelection() ); + disc_type->GetSelection() ); break; } - if( psz_device ) free( psz_device ); + disc_title->SetValue( 0 ); i_disc_title = 0; + disc_chapter->SetValue( 0 ); i_disc_chapter = 0; - disc_chapter->SetRange( 1, 255 ); - disc_chapter->SetValue( 1 ); + if( psz_device ) free( psz_device ); UpdateMRL( DISC_ACCESS ); } @@ -1132,53 +1261,6 @@ void OpenDialog::OnNetTypeChange( wxCommandEvent& event ) UpdateMRL( NET_ACCESS ); } -#ifndef WIN32 -/***************************************************************************** - * v4l panel event methods. - *****************************************************************************/ -void OpenDialog::OnV4LPanelChange( wxCommandEvent& WXUNUSED(event) ) -{ - UpdateMRL( V4L_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( 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 ); -} -#endif - /***************************************************************************** * Subtitles file event methods. *****************************************************************************/ @@ -1201,10 +1283,17 @@ void OpenDialog::OnSubsFileSettings( wxCommandEvent& WXUNUSED(event) ) if( subsfile_dialog->encoding_combo ) subsfile_mrl.Add( wxString(wxT("subsdec-encoding=")) + subsfile_dialog->encoding_combo->GetValue() ); - subsfile_mrl.Add( wxString::Format( wxT("sub-delay=%i"), - subsfile_dialog->delay_spinctrl->GetValue() ) ); + subsfile_mrl.Add( wxString::Format(wxT("subsdec-align=%i"), + (int)subsfile_dialog->align_combo->GetClientData( + subsfile_dialog->align_combo->GetSelection()) ) ); + + subsfile_mrl.Add( wxString::Format( wxT("freetype-rel-fontsize=%i"), + (int)subsfile_dialog->size_combo->GetClientData( + subsfile_dialog->size_combo->GetSelection()) ) ); subsfile_mrl.Add( wxString::Format( wxT("sub-fps=%i"), subsfile_dialog->fps_spinctrl->GetValue() ) ); + subsfile_mrl.Add( wxString::Format( wxT("sub-delay=%i"), + subsfile_dialog->delay_spinctrl->GetValue() ) ); } } @@ -1228,6 +1317,22 @@ void OpenDialog::OnSoutSettings( wxCommandEvent& WXUNUSED(event) ) } } +/***************************************************************************** + * Caching event methods. + *****************************************************************************/ +void OpenDialog::OnCachingEnable( wxCommandEvent& event ) +{ + caching_value->Enable( event.GetInt() != 0 ); + i_caching = caching_value->GetValue(); + UpdateMRL(); +} + +void OpenDialog::OnCachingChange( wxCommandEvent& event ) +{ + i_caching = event.GetInt(); + UpdateMRL(); +} + /***************************************************************************** * Utility functions. *****************************************************************************/ @@ -1256,8 +1361,6 @@ wxArrayString SeparateEntries( wxString entries ) { /* Finished the quotes mode */ entry.RemoveLast(); - if( !entry.IsEmpty() ) entries_array.Add( entry ); - entry.Empty(); b_quotes_mode = VLC_FALSE; } else if( !b_quotes_mode && entry.Last() != wxT('\"') )