[vlc-devel] [PATCH 3/3] WIP: gui:qt: add a dialog to select the renderer to use

Steve Lhomme robux4 at gmail.com
Thu Apr 21 11:54:46 CEST 2016


On Thu, Apr 21, 2016 at 10:50 AM, Hugo Beauzée-Luyssen <hugo at beauzee.fr> wrote:
> On 04/19/2016 05:45 PM, Thomas Guillem wrote:
>>
>> From: Steve Lhomme <robux4 at videolabs.io>
>>
>> limited to the first and only renderer discovery service we have for now
>> ---
>>   include/vlc_interface.h                       |   1 +
>>   include/vlc_intf_strings.h                    |   1 +
>>   modules/gui/qt/Makefile.am                    |   5 +
>>   modules/gui/qt/actions_manager.cpp            |   3 +
>>   modules/gui/qt/actions_manager.hpp            |   1 +
>>   modules/gui/qt/components/controller.cpp      |   4 +
>>   modules/gui/qt/components/controller.hpp      |  13 +-
>>   modules/gui/qt/dialogs/renderer.cpp           | 241
>> ++++++++++++++++++++++++++
>>   modules/gui/qt/dialogs/renderer.hpp           |  70 ++++++++
>>   modules/gui/qt/dialogs_provider.cpp           |   8 +
>>   modules/gui/qt/dialogs_provider.hpp           |   3 +
>>   modules/gui/qt/menus.cpp                      |   5 +
>>   modules/gui/qt/pixmaps/toolbar/chromecast.png | Bin 0 -> 286 bytes
>>   modules/gui/qt/ui/renderer.ui                 |  54 ++++++
>>   modules/gui/qt/vlc.qrc                        |   1 +
>>   15 files changed, 407 insertions(+), 3 deletions(-)
>>   create mode 100644 modules/gui/qt/dialogs/renderer.cpp
>>   create mode 100644 modules/gui/qt/dialogs/renderer.hpp
>>   create mode 100644 modules/gui/qt/pixmaps/toolbar/chromecast.png
>>   create mode 100644 modules/gui/qt/ui/renderer.ui
>>
>> diff --git a/include/vlc_interface.h b/include/vlc_interface.h
>> index 108384b..6368d54 100644
>> --- a/include/vlc_interface.h
>> +++ b/include/vlc_interface.h
>> @@ -129,6 +129,7 @@ typedef enum vlc_intf_dialog {
>>       INTF_DIALOG_PREFS,
>>       INTF_DIALOG_BOOKMARKS,
>>       INTF_DIALOG_EXTENDED,
>> +    INTF_DIALOG_RENDERER,
>>
>>       INTF_DIALOG_POPUPMENU = 20,
>>       INTF_DIALOG_AUDIOPOPUPMENU,
>> diff --git a/include/vlc_intf_strings.h b/include/vlc_intf_strings.h
>> index 25c57b3..02f2257 100644
>> --- a/include/vlc_intf_strings.h
>> +++ b/include/vlc_intf_strings.h
>> @@ -58,6 +58,7 @@
>>   #define I_MENU_GOTOTIME N_("Jump to Specific &Time")
>>   #define I_MENU_BOOKMARK N_("Custom &Bookmarks")
>>   #define I_MENU_VLM N_("&VLM Configuration")
>> +#define I_MENU_RENDERER N_("&Renderer Output")
>>
>>   #define I_MENU_ABOUT N_("&About")
>>
>> diff --git a/modules/gui/qt/Makefile.am b/modules/gui/qt/Makefile.am
>> index b48e4ee..2043938 100644
>> --- a/modules/gui/qt/Makefile.am
>> +++ b/modules/gui/qt/Makefile.am
>> @@ -67,6 +67,7 @@ libqt_plugin_la_SOURCES = \
>>         dialogs/podcast_configuration.cpp
>> dialogs/podcast_configuration.hpp \
>>         dialogs/extensions.cpp dialogs/extensions.hpp \
>>         dialogs/fingerprintdialog.cpp dialogs/fingerprintdialog.hpp \
>> +       dialogs/renderer.cpp dialogs/renderer.hpp \
>>         components/extended_panels.cpp components/extended_panels.hpp \
>>         components/info_panels.cpp components/info_panels.hpp \
>>         components/info_widgets.cpp components/info_widgets.hpp \
>> @@ -166,6 +167,7 @@ nodist_libqt_plugin_la_SOURCES = \
>>         dialogs/firstrun.moc.cpp \
>>         dialogs/extensions.moc.cpp \
>>         dialogs/fingerprintdialog.moc.cpp \
>> +       dialogs/renderer.moc.cpp \
>>         components/extended_panels.moc.cpp \
>>         components/info_panels.moc.cpp \
>>         components/info_widgets.moc.cpp \
>> @@ -223,6 +225,7 @@ nodist_libqt_plugin_la_SOURCES += \
>>         ui/about.h \
>>         ui/update.h \
>>         ui/fingerprintdialog.h \
>> +       ui/renderer.h \
>>         ui/sout.h
>>
>>   # User interface compilation
>> @@ -260,6 +263,7 @@ libqt_plugin_la_UI = \
>>         ui/streampanel.ui \
>>         ui/messages_panel.ui \
>>         ui/about.ui \
>> +       ui/renderer.ui \
>>         ui/update.ui \
>>         ui/sout.ui \
>>         ui/vlm.ui \
>> @@ -362,6 +366,7 @@ DEPS_res = \
>>         pixmaps/toolbar/atob.png \
>>         pixmaps/toolbar/atob_noa.png \
>>         pixmaps/toolbar/atob_nob.png \
>> +       pixmaps/toolbar/chromecast.png \
>>         pixmaps/toolbar/defullscreen.png \
>>         pixmaps/toolbar/dvd_menu.png \
>>         pixmaps/toolbar/dvd_next.png \
>> diff --git a/modules/gui/qt/actions_manager.cpp
>> b/modules/gui/qt/actions_manager.cpp
>> index eff40d9..89f5d22 100644
>> --- a/modules/gui/qt/actions_manager.cpp
>> +++ b/modules/gui/qt/actions_manager.cpp
>> @@ -93,6 +93,9 @@ void ActionsManager::doAction( int id_action )
>>               if( p_intf->p_sys->p_mi )
>>
>> p_intf->p_sys->p_mi->getFullscreenControllerWidget()->toggleFullwidth();
>>               break;
>> +        case RENDERER_ACTION:
>> +            THEDP->rendererDialog(); break;
>> +            break;
>>           default:
>>               msg_Warn( p_intf, "Action not supported: %i", id_action );
>>               break;
>> diff --git a/modules/gui/qt/actions_manager.hpp
>> b/modules/gui/qt/actions_manager.hpp
>> index 20c10e0..cb3943a 100644
>> --- a/modules/gui/qt/actions_manager.hpp
>> +++ b/modules/gui/qt/actions_manager.hpp
>> @@ -59,6 +59,7 @@ typedef enum actionType_e
>>       LOOP_ACTION,
>>       INFO_ACTION,
>>       OPEN_SUB_ACTION,
>> +    RENDERER_ACTION,
>>   } actionType_e;
>>
>>   class ActionsManager : public QObject, public Singleton<ActionsManager>
>> diff --git a/modules/gui/qt/components/controller.cpp
>> b/modules/gui/qt/components/controller.cpp
>> index dbb15a8..198e497 100644
>> --- a/modules/gui/qt/components/controller.cpp
>> +++ b/modules/gui/qt/components/controller.cpp
>> @@ -474,6 +474,10 @@ QWidget *AbstractController::createWidget(
>> buttonType_e button, int options )
>>           CONNECT_MAP_SET( play, PLAY_ACTION );
>>           }
>>           break;
>> +    case RENDERER_BUTTON:{
>> +        NORMAL_BUTTON( RENDERER );
>> +        }
>> +        break;
>>       case ASPECT_RATIO_COMBOBOX:
>>           widget = new AspectRatioComboBox( p_intf );
>>           widget->setMinimumHeight( 26 );
>> diff --git a/modules/gui/qt/components/controller.hpp
>> b/modules/gui/qt/components/controller.hpp
>> index 6ac5b14..2a39c93 100644
>> --- a/modules/gui/qt/components/controller.hpp
>> +++ b/modules/gui/qt/components/controller.hpp
>> @@ -35,7 +35,11 @@
>>   #include <QSizeGrip>
>>
>>   #define MAIN_TB1_DEFAULT "64;39;64;38;65"
>> +#if defined(ENABLE_SOUT)
>> +#define MAIN_TB2_DEFAULT
>> "0-2;64;3;1;4;64;7;9;64;10;20;19;64-4;37;26;65;35-4"
>> +#else
>>   #define MAIN_TB2_DEFAULT
>> "0-2;64;3;1;4;64;7;9;64;10;20;19;64-4;37;65;35-4"
>> +#endif
>>   #define ADV_TB_DEFAULT "12;11;13;14"
>>   #define INPT_TB_DEFAULT "43;33-4;44"
>>   #define FSC_TB_DEFAULT "0-2;64;3;1;4;64;37;64;38;64;8;65;25;35-4;34"
>> @@ -81,6 +85,7 @@ typedef enum buttonType_e
>>       NEXT_BUTTON,
>>       OPEN_SUB_BUTTON,
>>       FULLWIDTH_BUTTON,
>> +    RENDERER_BUTTON,
>>       BUTTON_MAX,
>>
>>       SPLITTER = 0x20,
>> @@ -110,7 +115,7 @@ static const char* const nameL[BUTTON_MAX] = {
>> N_("Play"), N_("Stop"), N_("Open"
>>       N_("Record"), N_("A→B Loop"), N_("Frame By Frame"), N_("Trickplay
>> Reverse"),
>>       N_("Step backward" ), N_("Step forward"), N_("Quit"), N_("Random"),
>>       N_("Loop / Repeat"), N_("Information"), N_("Previous"), N_("Next"),
>> -    N_("Open subtitles"), N_("Dock fullscreen controller")
>> +    N_("Open subtitles"), N_("Dock fullscreen controller"), N_("Renderer
>> output")
>>   };
>>   static const char* const tooltipL[BUTTON_MAX] = { I_PLAY_TOOLTIP,
>>       N_("Stop playback"), N_("Open a medium"),
>> @@ -124,7 +129,8 @@ static const char* const tooltipL[BUTTON_MAX] = {
>> I_PLAY_TOOLTIP,
>>       N_("Random"), N_("Change the loop and repeat modes"),
>> N_("Information"),
>>       N_("Previous media in the playlist"), N_("Next media in the
>> playlist"),
>>       N_("Open subtitle file"),
>> -    N_("Dock/undock fullscreen controller to/from bottom of screen")
>> +    N_("Dock/undock fullscreen controller to/from bottom of screen"),
>> +    N_("Select a Renderer device to output video/audio")
>>   };
>>   static const QString iconL[BUTTON_MAX] ={ ":/toolbar/play_b",
>> ":/toolbar/stop_b",
>>       ":/toolbar/eject", ":/toolbar/previous_b", ":/toolbar/next_b",
>> @@ -134,7 +140,8 @@ static const QString iconL[BUTTON_MAX] ={
>> ":/toolbar/play_b", ":/toolbar/stop_b"
>>       ":/toolbar/frame", ":/toolbar/reverse", ":/toolbar/skip_back",
>>       ":/toolbar/skip_fw", ":/toolbar/clear",
>> ":/buttons/playlist/shuffle_on",
>>       ":/buttons/playlist/repeat_all", ":/menu/info",
>> -    ":/toolbar/previous_b", ":/toolbar/next_b", ":/toolbar/eject",
>> ":/toolbar/space"
>> +    ":/toolbar/previous_b", ":/toolbar/next_b", ":/toolbar/eject",
>> ":/toolbar/space",
>> +    ":/toolbar/chromecast"
>>   };
>>
>>   enum
>> diff --git a/modules/gui/qt/dialogs/renderer.cpp
>> b/modules/gui/qt/dialogs/renderer.cpp
>> new file mode 100644
>> index 0000000..84df157
>> --- /dev/null
>> +++ b/modules/gui/qt/dialogs/renderer.cpp
>> @@ -0,0 +1,241 @@
>>
>> +/*****************************************************************************
>> + * renderer.cpp : Renderer output dialog
>> +
>> ****************************************************************************
>> + * Copyright (C) 2015-2016 the VideoLAN team
>> + *
>> + * $Id$
>
>
> SVN relicate

We don't want these anymore ? It's automatically updated in git too.

>> + *
>> + * Authors: Steve Lhomme <robux4 at videolabs.io>
>> + *
>> + * 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., 51 Franklin Street, Fifth Floor, Boston MA
>> 02110-1301, USA.
>> +
>> *****************************************************************************/
>> +
>> +#ifdef HAVE_CONFIG_H
>> +# include "config.h"
>> +#endif
>> +
>> +#include <QListWidget>
>> +#include <QListWidgetItem>
>> +#include <sstream>
>> +
>> +#include <vlc_common.h>
>> +#include <vlc_access.h>
>> +#include <vlc_renderer_discovery.h>
>> +#include <vlc_url.h>
>> +
>> +#include "dialogs/renderer.hpp"
>> +
>> +class RendererItem : public QListWidgetItem
>> +{
>> +public:
>> +    RendererItem(vlc_renderer_item *obj)
>> +        : QListWidgetItem( vlc_renderer_item_flags(obj) &
>> VLC_RENDERER_CAN_VIDEO ? QIcon( ":/sidebar/movie" ) : QIcon(
>> ":/sidebar/music" ),
>> +                           qfu( vlc_renderer_item_name(obj) ))
>> +    {
>> +        m_obj = vlc_renderer_item_hold(obj);
>> +    }
>> +    ~RendererItem()
>> +    {
>> +        vlc_renderer_item_release(m_obj);
>> +    }
>> +
>> +protected:
>> +    vlc_renderer_item* m_obj;
>> +
>> +    friend class RendererDialog;
>> +};
>> +
>> +extern "C" void renderer_event_received( const vlc_event_t * p_event,
>> void * user_data )
>
>
> Is the extern "C" required?

No, I'll put it in the class like it's done in addons_manager.

>> +{
>> +    RendererDialog *p_this =
>> reinterpret_cast<RendererDialog*>(user_data);
>> +    p_this->discoveryEventReceived( p_event );
>> +}
>> +
>> +RendererDialog::RendererDialog( intf_thread_t *_p_intf )
>> +               : QVLCDialog( (QWidget*)_p_intf->p_sys->p_mi, _p_intf )
>> +               , p_rd( NULL )
>> +               , b_rd_started( false )
>> +{
>> +    setWindowTitle( qtr( "Renderer Output" ) );
>> +    setWindowRole( "vlc-renderer" );
>> +
>> +    /* Build Ui */
>> +    ui.setupUi( this );
>> +
>> +    CONNECT( ui.buttonBox, accepted(), this, accept() );
>> +    CONNECT( ui.buttonBox, rejected(), this, onReject() );
>> +    CONNECT( ui.receiversListWidget, itemDoubleClicked(QListWidgetItem*),
>> this, accept());
>> +
>> +    QVLCTools::restoreWidgetPosition( p_intf, "Renderer", this, QSize(
>> 400 , 440 ) );
>> +}
>> +
>> +RendererDialog::~RendererDialog()
>> +{
>> +    if ( p_rd != NULL )
>> +        vlc_rd_release( p_rd );
>> +}
>> +
>> +void RendererDialog::onReject()
>> +{
>> +    setSout( NULL );
>> +
>> +    QVLCDialog::reject();
>> +}
>> +
>> +void RendererDialog::close()
>> +{
>> +    QVLCTools::saveWidgetPosition( p_intf, "Renderer", this );
>> +
>> +    QVLCDialog::close();
>> +}
>> +
>> +void RendererDialog::setVisible(bool visible)
>> +{
>> +    QVLCDialog::setVisible(visible);
>> +
>> +    if (visible)
>> +    {
>> +        /* SD subnodes */
>> +        char **ppsz_longnames;
>> +        char **ppsz_names;
>> +        if( vlc_rd_get_names( THEPL, &ppsz_names, &ppsz_longnames ) !=
>> VLC_SUCCESS )
>> +            return;
>> +
>> +        char **ppsz_name = ppsz_names, **ppsz_longname = ppsz_longnames;
>> +        for( ; *ppsz_name; ppsz_name++, ppsz_longname++ )
>> +        {
>> +            /* TODO launch all discovery services for renderers */
>> +            msg_Dbg( p_intf, "starting renderer discovery service %s",
>> *ppsz_longname );
>> +            if ( p_rd == NULL )
>> +            {
>> +                p_rd = vlc_rd_new( VLC_OBJECT(p_intf), *ppsz_name );
>> +                if( !p_rd )
>> +                    msg_Err( p_intf, "Could not start renderer discovery
>> services" );
>> +            }
>> +            break;
>> +        }
>> +        free( ppsz_names );
>> +        free( ppsz_longnames );
>> +
>> +        if ( p_rd != NULL )
>> +        {
>> +            int row = -1;
>> +            char *psz_renderer = var_InheritString( THEPL, "sout" );
>> +            if ( psz_renderer != NULL )
>> +            {
>> +                for ( row = 0 ; row < ui.receiversListWidget->count();
>> row++ )
>> +                {
>> +                    RendererItem *rowItem =
>> reinterpret_cast<RendererItem*>( ui.receiversListWidget->item( row ) );
>> +                    if ( isItemSout( psz_renderer, rowItem->m_obj ) )
>> +                        break;
>> +                }
>> +                if ( row == ui.receiversListWidget->count() )
>> +                    row = -1;
>> +                free( psz_renderer );
>> +            }
>> +            ui.receiversListWidget->setCurrentRow( row );
>> +
>> +            if ( !b_rd_started )
>> +            {
>> +                vlc_event_manager_t *em = vlc_rd_event_manager( p_rd );
>> +                vlc_event_attach( em, vlc_RendererDiscoveryItemAdded,
>> renderer_event_received, this );
>> +                vlc_event_attach( em, vlc_RendererDiscoveryItemRemoved,
>> renderer_event_received, this );
>> +
>> +                b_rd_started = vlc_rd_start( p_rd ) == VLC_SUCCESS;
>> +                if ( !b_rd_started )
>> +                {
>> +                    vlc_event_detach( em, vlc_RendererDiscoveryItemAdded,
>> renderer_event_received, this);
>> +                    vlc_event_detach( em,
>> vlc_RendererDiscoveryItemRemoved, renderer_event_received, this);
>> +                }
>> +            }
>> +        }
>> +    }
>> +    else
>> +    {
>> +        if ( p_rd != NULL )
>> +        {
>> +            if ( b_rd_started )
>> +            {
>> +                vlc_event_manager_t *em = vlc_rd_event_manager( p_rd );
>> +                vlc_event_detach( em, vlc_RendererDiscoveryItemAdded,
>> renderer_event_received, this);
>> +                vlc_event_detach( em, vlc_RendererDiscoveryItemRemoved,
>> renderer_event_received, this);
>> +
>> +                vlc_rd_stop( p_rd );
>> +                b_rd_started = false;
>> +            }
>> +        }
>> +    }
>> +}
>> +
>> +void RendererDialog::accept()
>> +{
>> +    /* get the selected one in the listview if any */
>> +    QListWidgetItem *current = ui.receiversListWidget->currentItem();
>> +    if (current != NULL)
>> +    {
>> +        RendererItem *rowItem = reinterpret_cast<RendererItem*>(current);
>> +        msg_Dbg( p_intf, "selecting Renderer %s",
>> vlc_renderer_item_name(rowItem->m_obj) );
>> +
>> +        setSout( rowItem->m_obj );
>> +    }
>> +
>> +    QVLCDialog::accept();
>> +}
>> +
>> +void RendererDialog::discoveryEventReceived( const vlc_event_t * p_event
>> )
>> +{
>> +    if ( p_event->type == vlc_RendererDiscoveryItemAdded )
>> +    {
>> +        vlc_renderer_item *p_item =
>> p_event->u.renderer_discovery_item_added.p_new_item;
>> +
>> +        int row = 0;
>> +        for ( ; row < ui.receiversListWidget->count(); row++ )
>> +        {
>> +            RendererItem *rowItem = reinterpret_cast<RendererItem*>(
>> ui.receiversListWidget->item( row ) );
>> +            if ( !strcmp( vlc_renderer_item_sout( p_item ),
>> vlc_renderer_item_sout( rowItem->m_obj ) ) )
>
>
> Wouldn't it be clearer to use isItemSout?

Yes.

>> +                return;
>> +        }
>> +
>> +        RendererItem *newItem = new RendererItem(p_item);
>> +        ui.receiversListWidget->addItem( newItem );
>> +
>> +        char *psz_renderer = var_InheritString( THEPL, "sout" );
>> +        if ( psz_renderer != NULL )
>> +        {
>> +            if ( isItemSout( psz_renderer, p_item ) )
>> +                ui.receiversListWidget->setCurrentItem( newItem );
>> +            free( psz_renderer );
>> +        }
>> +    }
>> +}
>> +
>> +void RendererDialog::setSout( const vlc_renderer_item *p_item )
>> +{
>> +    const char *psz_old_sout = var_GetString( THEPL, "sout" );
>
>
> This is leaking

We don't even need to get the old value anyway.

>> +    if( !psz_old_sout )
>> +        psz_old_sout = "";
>> +    const char *psz_sout = p_item ? vlc_renderer_item_sout( p_item ) :
>> "";
>> +
>> +    if ( !strcmp( psz_old_sout, psz_sout ) )
>> +        return;
>> +
>> +    msg_Err( p_intf, "starting sout: '%s'", psz_sout );
>> +    var_SetString( THEPL, "sout", psz_sout );
>> +}
>> +
>> +bool RendererDialog::isItemSout( const char *psz_sout, const
>> vlc_renderer_item *p_item )
>> +{
>> +    return strcmp( psz_sout, vlc_renderer_item_sout( p_item ) ) == 0;
>> +}
>> diff --git a/modules/gui/qt/dialogs/renderer.hpp
>> b/modules/gui/qt/dialogs/renderer.hpp
>> new file mode 100644
>> index 0000000..f6048d1
>> --- /dev/null
>> +++ b/modules/gui/qt/dialogs/renderer.hpp
>> @@ -0,0 +1,70 @@
>>
>> +/*****************************************************************************
>> + * renderer.hpp : Renderer output dialog
>> +
>> ****************************************************************************
>> + * Copyright ( C ) 2015 the VideoLAN team
>> + * $Id$
>> + *
>> + * Authors: Steve Lhomme <robux4 at videolabs.io>
>> + *
>> + * 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., 51 Franklin Street, Fifth Floor, Boston MA
>> 02110-1301, USA.
>> +
>> *****************************************************************************/
>> +
>> +#ifndef QVLC_RENDERER_DIALOG_H_
>> +#define QVLC_RENDERER_DIALOG_H_ 1
>> +
>> +#include "util/qvlcframe.hpp"
>> +#include "util/singleton.hpp"
>> +#include "ui/renderer.h"
>> +
>> +#include <QMutex>
>> +#include <QAtomicInt>
>
>
> These 2 header don't seem required
>
>> +
>> +class QPushButton;
>> +class QTreeWidget;
>> +class QTreeWidgetItem;
>
>
> Same for these forward declarations

Indeed.

>> +class MsgEvent;
>> +
>> +class RendererDialog : public QVLCDialog, public
>> Singleton<RendererDialog>
>> +{
>> +    Q_OBJECT
>> +
>> +public:
>> +    void discoveryEventReceived( const vlc_event_t * p_event );
>> +    void setVisible(bool visible);
>> +
>> +private:
>> +    RendererDialog( intf_thread_t * );
>> +    virtual ~RendererDialog();
>> +
>> +    Ui::rendererWidget ui;
>> +    void sinkMessage( const MsgEvent * );
>> +
>> +private slots:
>> +    void accept();
>> +    void onReject();
>> +    void close();
>> +
>> +private:
>> +
>> +    friend class          Singleton<RendererDialog>;
>> +    vlc_renderer_discovery *p_rd;
>> +    bool                  b_rd_started;
>> +    void                  setSout( const vlc_renderer_item *p_item );
>> +
>> +    static bool           isItemSout( const char *psz_sout, const
>> vlc_renderer_item *p_item );
>> +};
>> +
>> +
>> +#endif
>> diff --git a/modules/gui/qt/dialogs_provider.cpp
>> b/modules/gui/qt/dialogs_provider.cpp
>> index 0eade63..00a8382 100644
>> --- a/modules/gui/qt/dialogs_provider.cpp
>> +++ b/modules/gui/qt/dialogs_provider.cpp
>> @@ -57,6 +57,7 @@
>>   #include "dialogs/external.hpp"
>>   #include "dialogs/epg.hpp"
>>   #include "dialogs/errors.hpp"
>> +#include "dialogs/renderer.hpp"
>>
>>   #include <QEvent>
>>   #include <QApplication>
>> @@ -153,6 +154,8 @@ void DialogsProvider::customEvent( QEvent *event )
>>              bookmarksDialog(); break;
>>           case INTF_DIALOG_EXTENDED:
>>              extendedDialog(); break;
>> +        case INTF_DIALOG_RENDERER:
>> +           rendererDialog(); break;
>>           case INTF_DIALOG_SENDKEY:
>>              sendKey( de->i_arg ); break;
>>   #ifdef ENABLE_VLM
>> @@ -234,6 +237,11 @@ void DialogsProvider::extendedDialog()
>>           extDialog->hide();
>>   }
>>
>> +void DialogsProvider::rendererDialog()
>> +{
>> +    RendererDialog::getInstance( p_intf )->toggleVisible();
>
>
> There should be a matching killInstance call somewhere

The destructor is already called on exit. But I see who's responsible
for that in the debugger.

>> +}
>> +
>>   void DialogsProvider::synchroDialog()
>>   {
>>       ExtendedDialog *extDialog = ExtendedDialog::getInstance(p_intf );
>> diff --git a/modules/gui/qt/dialogs_provider.hpp
>> b/modules/gui/qt/dialogs_provider.hpp
>> index 01faa11..8de4fb5 100644
>> --- a/modules/gui/qt/dialogs_provider.hpp
>> +++ b/modules/gui/qt/dialogs_provider.hpp
>> @@ -124,6 +124,9 @@ public slots:
>>       void mediaCodecDialog();
>>       void prefsDialog();
>>       void extendedDialog();
>> +#if defined(ENABLE_SOUT)
>> +    void rendererDialog();
>> +#endif
>>       void synchroDialog();
>>       void messagesDialog();
>>       void sendKey( int key );
>> diff --git a/modules/gui/qt/menus.cpp b/modules/gui/qt/menus.cpp
>> index 5555f0e..09a8892 100644
>> --- a/modules/gui/qt/menus.cpp
>> +++ b/modules/gui/qt/menus.cpp
>> @@ -428,6 +428,11 @@ QMenu *VLCMenuBar::ToolsMenu( intf_thread_t *p_intf,
>> QMenu *menu )
>>           "Ctrl+Shift+W" );
>>   #endif
>>
>> +#if defined(ENABLE_SOUT)
>> +    addDPStaticEntry( menu, qtr( I_MENU_RENDERER ), "", SLOT(
>> rendererDialog() ),
>> +        "Ctrl+Shift+R" );
>> +#endif
>> +
>>       addDPStaticEntry( menu, qtr( "Program Guide" ), "", SLOT(
>> epgDialog() ),
>>           "" );
>>
>> diff --git a/modules/gui/qt/pixmaps/toolbar/chromecast.png
>> b/modules/gui/qt/pixmaps/toolbar/chromecast.png
>> new file mode 100644
>> index
>> 0000000000000000000000000000000000000000..ac2929586cdfbcaa82af6b1709579b8c75dc1830
>> GIT binary patch
>> literal 286
>> zcmeAS at N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE)4%caKYZ?lYt_f1s;*b
>> z3=G`DAk4 at xYmNj^kiEpy*OmP~4>OmEN&bf;ia?>&o-U3d7N^f%QtW186gc|v{wcQE
>> z2^*qBW<PB at n6yn+;xCW*lLJ{B^*h`S>L+aZ&A4TrZ@}c2izIALbIrbT*Z4=m14D!V
>> zGaHXvuV~ocQ_3g2K+jB5%v?Z~(LQ21gNWky`~TzFGLoi?e(2`3;@He!XK-A=d&(uI
>> zWflwN;x{<_i*)Fa+;{Pqdf1D^o>OygzB=ook=)O?ub`uPy1OS&l5tn_6?g9FD+MkO
>> b)|Rr?w(DPiQ8J|#=xhd0S3j3^P6<r_#RX|s
>>
>> literal 0
>> HcmV?d00001
>>
>> diff --git a/modules/gui/qt/ui/renderer.ui b/modules/gui/qt/ui/renderer.ui
>> new file mode 100644
>> index 0000000..67e7eda
>> --- /dev/null
>> +++ b/modules/gui/qt/ui/renderer.ui
>> @@ -0,0 +1,54 @@
>> +<?xml version="1.0" encoding="UTF-8"?>
>> +<ui version="4.0">
>> + <class>rendererWidget</class>
>> + <widget class="QWidget" name="rendererWidget">
>> +  <property name="geometry">
>> +   <rect>
>> +    <x>0</x>
>> +    <y>0</y>
>> +    <width>570</width>
>> +    <height>440</height>
>> +   </rect>
>> +  </property>
>> +  <property name="windowTitle">
>> +   <string>Renderer Output</string>
>> +  </property>
>> +  <layout class="QVBoxLayout" name="verticalLayout_2">
>> +   <item>
>> +    <widget class="QLabel" name="label">
>> +     <property name="text">
>> +      <string>Available Renderers</string>
>> +     </property>
>> +    </widget>
>> +   </item>
>> +   <item>
>> +    <widget class="QListWidget" name="receiversListWidget">
>> +     <property name="sizePolicy">
>> +      <sizepolicy hsizetype="Expanding" vsizetype="Expanding">
>> +       <horstretch>0</horstretch>
>> +       <verstretch>1</verstretch>
>> +      </sizepolicy>
>> +     </property>
>> +    </widget>
>> +   </item>
>> +   <item>
>> +    <widget class="QDialogButtonBox" name="buttonBox">
>> +     <property name="sizePolicy">
>> +      <sizepolicy hsizetype="Expanding" vsizetype="Expanding">
>> +       <horstretch>0</horstretch>
>> +       <verstretch>0</verstretch>
>> +      </sizepolicy>
>> +     </property>
>> +     <property name="orientation">
>> +      <enum>Qt::Horizontal</enum>
>> +     </property>
>> +     <property name="standardButtons">
>> +      <set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set>
>> +     </property>
>> +    </widget>
>> +   </item>
>> +  </layout>
>> + </widget>
>> + <resources/>
>> + <connections/>
>> +</ui>
>> diff --git a/modules/gui/qt/vlc.qrc b/modules/gui/qt/vlc.qrc
>> index 20954cd..25dd853 100644
>> --- a/modules/gui/qt/vlc.qrc
>> +++ b/modules/gui/qt/vlc.qrc
>> @@ -42,6 +42,7 @@
>>           <file alias="previous_b">pixmaps/previous.png</file>
>>           <file alias="eject">pixmaps/eject.png</file>
>>           <file alias="fullscreen">pixmaps/toolbar/fullscreen.png</file>
>> +        <file alias="chromecast">pixmaps/toolbar/chromecast.png</file>
>>           <file
>> alias="defullscreen">pixmaps/toolbar/defullscreen.png</file>
>>           <file alias="extended">pixmaps/toolbar/extended_16px.png</file>
>>           <file alias="playlist">pixmaps/playlist/playlist.png</file>
>>
>
> _______________________________________________
> vlc-devel mailing list
> To unsubscribe or modify your subscription options:
> https://mailman.videolan.org/listinfo/vlc-devel


More information about the vlc-devel mailing list