1 /*****************************************************************************
2 * sout.cpp : Stream output dialog ( old-style )
3 ****************************************************************************
4 * Copyright (C) 2007-2008 the VideoLAN team
5 * Copyright (C) 2007 Société des arts technologiques
6 * Copyright (C) 2007 Savoir-faire Linux
10 * Authors: Clément Stenac <zorglub@videolan.org>
11 * Jean-Baptiste Kempf <jb@videolan.org>
12 * Jean-François Massol <jf.massol -at- gmail.com>
13 * Pierre-Luc Beaudoin <pierre-luc.beaudoin@savoirfairelinux.com>
15 * This program is free software; you can redistribute it and/or modify
16 * it under the terms of the GNU General Public License as published by
17 * the Free Software Foundation; either version 2 of the License, or
18 * ( at your option ) any later version.
20 * This program is distributed in the hope that it will be useful,
21 * but WITHOUT ANY WARRANTY; without even the implied warranty of
22 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
23 * GNU General Public License for more details.
25 * You should have received a copy of the GNU General Public License
26 * along with this program; if not, write to the Free Software
27 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
28 *****************************************************************************/
34 #include "dialogs/sout.hpp"
35 #include "util/qt_dirs.hpp"
36 #include "components/sout/sout_widgets.hpp"
39 #include <QFileDialog>
40 #include <QToolButton>
42 SoutDialog* SoutDialog::instance = NULL;
44 SoutDialog::SoutDialog( QWidget *parent, intf_thread_t *_p_intf, QString inputMRL )
45 : QVLCDialog( parent, _p_intf )
47 setWindowTitle( qtr( "Stream Output" ) );
51 ui.inputBox->setMRL( inputMRL );
52 ui.helpEdit->setPlainText( "This dialog will allow you to stream or convert "
53 "your media, locally, on your private network or on the "
55 "You should start by checking that your input matches what you "
56 "want and go on with the \"Next\" button.\n" );
58 ui.mrlEdit->setToolTip ( qtr( "Stream output string.\n"
59 "This is automatically generated "
60 "when you change the above settings,\n"
61 "but you can change it manually." ) ) ;
64 /* This needs Qt4.5 to be cool */
65 ui.destTab->setTabsClosable( true );
67 closeTabButton = new QToolButton( this );
68 ui.destTab->setCornerWidget( closeTabButton );
69 closeTabButton->hide();
70 closeTabButton->setAutoRaise( true );
71 closeTabButton->setIcon( QIcon( ":/clear" ) );
72 BUTTONACT( closeTabButton, closeTab() );
74 CONNECT( ui.destTab, currentChanged( int ), this, tabChanged( int ) );
75 ui.destTab->setTabIcon( 0, QIcon( ":/playlist_add" ) );
77 ui.destBox->addItem( qtr( "File" ) );
78 ui.destBox->addItem( "HTTP" );
79 ui.destBox->addItem( "MMS" );
80 ui.destBox->addItem( "UDP" );
81 ui.destBox->addItem( "RTP" );
82 ui.destBox->addItem( "IceCast" );
84 BUTTONACT( ui.addButton, addDest() );
86 // /* Connect everything to the updateMRL function */
87 #define CB( x ) CONNECT( ui.x, toggled( bool ), this, updateMRL() );
88 #define CT( x ) CONNECT( ui.x, textChanged( const QString ), this, updateMRL() );
89 #define CS( x ) CONNECT( ui.x, valueChanged( int ), this, updateMRL() );
90 #define CC( x ) CONNECT( ui.x, currentIndexChanged( int ), this, updateMRL() );
93 CB( soutAll ); CB( soutKeep ); CS( ttl ); CT( sapName ); CT( sapGroup );
95 CONNECT( ui.profileSelect, optionsChanged(), this, updateMRL() );
97 okButton = new QPushButton( qtr( "&Stream" ) );
98 QPushButton *cancelButton = new QPushButton( qtr( "&Cancel" ) );
100 okButton->setDefault( true );
101 ui.acceptButtonBox->addButton( okButton, QDialogButtonBox::AcceptRole );
102 ui.acceptButtonBox->addButton( cancelButton, QDialogButtonBox::RejectRole );
104 BUTTONACT( okButton, ok() );
105 BUTTONACT( cancelButton, cancel() );
107 BUTTONACT( ui.nextButton, next() );
108 BUTTONACT( ui.nextButton2, next() );
109 BUTTONACT( ui.prevButton, prev() );
110 BUTTONACT( ui.prevButton2, prev() );
113 void SoutDialog::next()
115 ui.toolBox->setCurrentIndex( ui.toolBox->currentIndex() + 1 );
118 void SoutDialog::prev()
120 ui.toolBox->setCurrentIndex( ui.toolBox->currentIndex() - 1 );
123 void SoutDialog::tabChanged( int i )
125 closeTabButton->setVisible( (i != 0) );
128 void SoutDialog::closeTab()
130 int i = ui.destTab->currentIndex();
133 QWidget *temp = ui.destTab->currentWidget();
134 ui.destTab->removeTab( i );
139 void SoutDialog::addDest( )
142 switch( ui.destBox->currentIndex() )
146 FileDestBox *fdb = new FileDestBox( this );
147 index = ui.destTab->addTab( fdb, "File" );
148 CONNECT( fdb, mrlUpdated(), this, updateMRL() );
153 HTTPDestBox *hdb = new HTTPDestBox( this );
154 index = ui.destTab->addTab( hdb, "HTTP" );
155 CONNECT( hdb, mrlUpdated(), this, updateMRL() );
160 MMSHDestBox *mdb = new MMSHDestBox( this );
161 index = ui.destTab->addTab( mdb, "MMSH" );
162 CONNECT( mdb, mrlUpdated(), this, updateMRL() );
167 UDPDestBox *udb = new UDPDestBox( this );
168 index = ui.destTab->addTab( udb, "UDP" );
169 CONNECT( udb, mrlUpdated(), this, updateMRL() );
174 RTPDestBox *rdb = new RTPDestBox( this );
175 index = ui.destTab->addTab( rdb, "RTP" );
176 CONNECT( rdb, mrlUpdated(), this, updateMRL() );
181 ICEDestBox *idb = new ICEDestBox( this );
182 index = ui.destTab->addTab( idb, "Icecast" );
183 CONNECT( idb, mrlUpdated(), this, updateMRL() );
187 ui.destTab->setCurrentIndex( index );
191 void SoutDialog::ok()
193 mrl = ui.mrlEdit->toPlainText();
197 void SoutDialog::cancel()
203 void SoutDialog::updateMRL()
205 QString qs_mux = ui.profileSelect->getMux();
207 SoutMrl smrl( ":sout=#" );
208 if( !ui.profileSelect->getTranscode().isEmpty() )
210 smrl.begin( ui.profileSelect->getTranscode() );
216 if( ui.destTab->count() >= 3 ||
217 ( ui.destTab->count() == 2 && ui.localOutput->isChecked() ) )
221 smrl.begin( "duplicate" );
223 for( int i = 1; i < ui.destTab->count(); i++ )
225 VirtualDestBox *vdb = qobject_cast<VirtualDestBox *>(ui.destTab->widget( i ));
226 QString tempMRL = vdb->getMRL( qs_mux );
228 if( tempMRL.isEmpty() ) continue;
230 smrl.option( "dst", tempMRL );
233 smrl.begin( tempMRL);
237 if( ui.localOutput->isChecked() )
240 smrl.option( "dst", "display" );
243 smrl.begin( "display" );
248 if ( multi ) smrl.end();
252 /* FIXME, deal with SAP
253 sout.b_sap = ui.sap->isChecked();
254 sout.psz_group = strdup( qtu( ui.sapGroup->text() ) );
255 sout.psz_name = strdup( qtu( ui.sapName->text() ) ); */
257 if( ui.soutAll->isChecked() ) mrl.append( " :sout-all" );
259 if( ui.soutKeep->isChecked() ) mrl.append( " :sout-keep" );
261 ui.mrlEdit->setPlainText( mrl );