You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

251 lines
8.2 KiB

/*****************************************************************************
* stream.cpp : wxWindows plugin for vlc
*****************************************************************************
* Copyright (C) 2000-2004 VideoLAN
* $Id$
*
* Authors: Clément Stenac <zorglub@videolan.org>
*
* 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>
#include <vlc/intf.h>
#include "wxwindows.h"
#include <wx/statline.h>
#define STREAM_INTRO N_( "Stream with VLC in three steps." )
#define STREAM_STEP1 N_( "Step 1: Select what to stream." )
#define STREAM_STEP2 N_( "Step 2: Define streaming method." )
#define STREAM_STEP3 N_( "Step 3: Start streaming." )
/*****************************************************************************
* Event Table.
*****************************************************************************/
/* IDs for the controls and the menu commands */
enum
{
Open_Event,
Sout_Event,
Start_Event,
Close_Event
};
BEGIN_EVENT_TABLE(StreamDialog, wxFrame)
/* Button events */
EVT_BUTTON(wxID_OK, StreamDialog::OnClose)
EVT_BUTTON(Open_Event,StreamDialog::OnOpen)
EVT_BUTTON(Sout_Event,StreamDialog::OnSout)
EVT_BUTTON(Start_Event,StreamDialog::OnStart)
/* Hide the window when the user closes the window */
EVT_CLOSE(StreamDialog::OnClose)
END_EVENT_TABLE()
/*****************************************************************************
* Constructor.
*****************************************************************************/
StreamDialog::StreamDialog( intf_thread_t *_p_intf, wxWindow *p_parent ):
wxFrame( p_parent, -1, wxU(_("Stream")), wxDefaultPosition,
wxDefaultSize, wxDEFAULT_FRAME_STYLE )
{
/* Initializations */
p_intf = _p_intf;
SetIcon( *p_intf->p_sys->p_icon );
SetAutoLayout( TRUE );
p_open_dialog = NULL;
p_sout_dialog = NULL;
/* Create a panel to put everything in */
wxPanel *panel = new wxPanel( this, -1 );
panel->SetAutoLayout( TRUE );
wxStaticText *intro_label = new wxStaticText( panel,
-1 , wxU(_( STREAM_INTRO )));
wxStaticText *step1_label = new wxStaticText( panel,
-1 , wxU(_( STREAM_STEP1 )));
step2_label = new wxStaticText( panel,
-1 , wxU(_( STREAM_STEP2 )));
step3_label = new wxStaticText( panel,
-1 , wxU(_( STREAM_STEP3 )));
wxButton *open_button = new wxButton( panel,
Open_Event, wxU(_("Open...")));
sout_button = new wxButton( panel,
Sout_Event, wxU(_("Choose...")));
start_button = new wxButton( panel,
Start_Event, wxU(_("Start!")));
step2_label->Disable();
step3_label->Disable();
sout_button->Disable();
start_button->Disable();
/* Place everything in sizers */
wxBoxSizer *main_sizer = new wxBoxSizer( wxVERTICAL );
wxBoxSizer *panel_sizer = new wxBoxSizer( wxVERTICAL );
wxBoxSizer *step1_sizer = new wxBoxSizer( wxHORIZONTAL );
wxBoxSizer *step2_sizer = new wxBoxSizer( wxHORIZONTAL );
wxBoxSizer *step3_sizer = new wxBoxSizer( wxHORIZONTAL );
step1_sizer->Add( step1_label, 1, wxALL | wxEXPAND | wxALIGN_LEFT, 10 );
step1_sizer->Add( open_button, 1, wxALL | wxEXPAND | wxALIGN_RIGHT, 10 );
step2_sizer->Add( step2_label, 1, wxALL | wxEXPAND | wxALIGN_LEFT, 10 );
step2_sizer->Add( sout_button, 1, wxALL | wxEXPAND | wxALIGN_RIGHT, 10 );
step3_sizer->Add( step3_label, 1, wxALL | wxEXPAND | wxLEFT, 10 );
step3_sizer->Add( start_button, 1, wxALL | wxEXPAND | wxLEFT, 10 );
panel_sizer->Add( intro_label, 0, wxEXPAND | wxALL, 10 );
panel_sizer->Add( new wxStaticLine( panel, 0), 0,
wxEXPAND | wxLEFT | wxRIGHT, 2 );
panel_sizer->Add( step1_sizer, 0, wxEXPAND, 10 );
panel_sizer->Add( new wxStaticLine( panel, 0), 0,
wxEXPAND | wxLEFT | wxRIGHT, 2 );
panel_sizer->Add( step2_sizer, 0, wxEXPAND, 10 );
panel_sizer->Add( new wxStaticLine( panel, 0), 0,
wxEXPAND | wxLEFT | wxRIGHT, 2 );
panel_sizer->Add( step3_sizer, 0, wxEXPAND, 10 );
panel_sizer->Layout();
panel->SetSizerAndFit( panel_sizer );
main_sizer->Add( panel, 1, wxEXPAND, 0 );
main_sizer->Layout();
SetSizerAndFit( main_sizer );
}
/*****************************************************************************
* Destructor.
*****************************************************************************/
StreamDialog::~StreamDialog()
{
if( p_open_dialog ) delete p_open_dialog;
if( p_sout_dialog ) delete p_sout_dialog;
}
void StreamDialog::OnOpen( wxCommandEvent& event )
{
if( !p_open_dialog )
{
p_open_dialog =
new OpenDialog( p_intf, this, FILE_ACCESS, 1 , OPEN_STREAM );
}
if( p_open_dialog)
{
p_open_dialog->Show();
p_open_dialog->Enable();
mrl = p_open_dialog->mrl;
sout_button->Enable();
step2_label->Enable();
}
}
void StreamDialog::OnSout( wxCommandEvent& event )
{
/* Show/hide the sout dialog */
if( p_sout_dialog == NULL )
p_sout_dialog = new SoutDialog( p_intf, this );
if( p_sout_dialog && p_sout_dialog->ShowModal() == wxID_OK )
{
sout_mrl = p_sout_dialog->GetOptions();
start_button->Enable();
step3_label->Enable();
}
}
void StreamDialog::OnStart( wxCommandEvent& event )
{
/* Update the playlist */
playlist_t *p_playlist =
(playlist_t *)vlc_object_find( p_intf, VLC_OBJECT_PLAYLIST,
FIND_ANYWHERE );
if( p_playlist == NULL ) return;
for( int i = 0; i < (int)p_open_dialog->mrl.GetCount(); i++ )
{
playlist_item_t *p_item = playlist_ItemNew( p_intf,
(const char *)p_open_dialog->mrl[i].mb_str(),
(const char *)p_open_dialog->mrl[i].mb_str() );
int i_options = 0;
/* Count the input options */
while( i + i_options + 1 < (int)p_open_dialog->mrl.GetCount() &&
((const char *)p_open_dialog->mrl[i + i_options + 1].
mb_str())[0] == ':' )
{
i_options++;
}
/* Insert options */
for( int j = 0; j < i_options; j++ )
{
playlist_ItemAddOption( p_item ,
p_open_dialog->mrl[i + j + 1].mb_str() );
}
/* Get the options from the stream output dialog */
if( sout_mrl.GetCount() )
{
for( int j = 0; j < (int)sout_mrl.GetCount(); j++ )
{
playlist_ItemAddOption( p_item , sout_mrl[j].mb_str() );
}
}
playlist_AddItem( p_playlist, p_item,
PLAYLIST_APPEND | (i ? 0 : PLAYLIST_GO),
PLAYLIST_END );
msg_Dbg( p_intf,"playings %s",
(const char *)p_open_dialog->mrl[i].mb_str() );
i += i_options;
}
vlc_object_release( p_playlist );
Hide();
}
void StreamDialog::OnClose( wxCommandEvent& event )
{
Hide();
}