[vlc-devel] [PATCH 1/2] Add a 'Play and stop once' feature to the Qt interface

David Sferruzza david.sferruzza at gmail.com
Tue Jul 15 10:08:26 CEST 2014


This is a patch for #10732
Work document: https://gist.github.com/dsferruzza/8e9079a329975f3579e9
---
 modules/gui/qt4/input_manager.cpp | 12 ++++++++++++
 modules/gui/qt4/input_manager.hpp |  2 ++
 modules/gui/qt4/menus.cpp         |  9 +++++++++
 src/libvlc-module.c               |  6 ++++++
 src/playlist/thread.c             |  7 +++++++
 5 files changed, 36 insertions(+)

diff --git a/modules/gui/qt4/input_manager.cpp b/modules/gui/qt4/input_manager.cpp
index f72b3b3..d69233a 100644
--- a/modules/gui/qt4/input_manager.cpp
+++ b/modules/gui/qt4/input_manager.cpp
@@ -1097,6 +1097,7 @@ void MainInputManager::customEvent( QEvent *event )
 void MainInputManager::stop()
 {
    playlist_Stop( THEPL );
+   var_SetBool( THEPL, "play-and-stop-once", false );
 }
 
 void MainInputManager::next()
@@ -1205,6 +1206,17 @@ bool MainInputManager::getPlayExitState()
     return var_InheritBool( THEPL, "play-and-exit" );
 }
 
+void MainInputManager::activatePlayStopOnce( bool b_exit )
+{
+    var_Create( THEPL, "play-and-stop-once", VLC_VAR_BOOL );
+    var_SetBool( THEPL, "play-and-stop-once", b_exit );
+}
+
+bool MainInputManager::getPlayStopOnceState()
+{
+    return var_InheritBool( THEPL, "play-and-stop-once" );
+}
+
 bool MainInputManager::hasEmptyPlaylist()
 {
     playlist_Lock( THEPL );
diff --git a/modules/gui/qt4/input_manager.hpp b/modules/gui/qt4/input_manager.hpp
index dac3bc3..6932a77 100644
--- a/modules/gui/qt4/input_manager.hpp
+++ b/modules/gui/qt4/input_manager.hpp
@@ -268,6 +268,7 @@ public:
     audio_output_t *getAout();
 
     bool getPlayExitState();
+    bool getPlayStopOnceState();
     bool hasEmptyPlaylist();
 
     void requestVoutUpdate() { return im->UpdateVout(); }
@@ -298,6 +299,7 @@ public slots:
     void prev();
     void prevOrReset();
     void activatePlayQuit( bool );
+    void activatePlayStopOnce( bool );
 
     void loopRepeatLoopStatus();
 
diff --git a/modules/gui/qt4/menus.cpp b/modules/gui/qt4/menus.cpp
index a29333b..584cc6e 100644
--- a/modules/gui/qt4/menus.cpp
+++ b/modules/gui/qt4/menus.cpp
@@ -826,6 +826,15 @@ void VLCMenuBar::PopupMenuPlaylistEntries( QMenu *menu,
         action->setEnabled( false );
     action->setData( ACTION_DELETE_ON_REBUILD );
 
+    /* Stop after current track */
+    action = addMIMStaticEntry( p_intf, menu, qtr( "Stop &after current track" ),
+            "", SLOT( activatePlayStopOnce( bool ) ), true );
+    action->setCheckable( true );
+    action->setChecked( THEMIM->getPlayStopOnceState() );
+    if( !p_input )
+        action->setEnabled( false );
+    action->setData( ACTION_DELETE_ON_REBUILD );
+
     /* Next / Previous */
     bool bPlaylistEmpty = THEMIM->hasEmptyPlaylist();
     action = addMIMStaticEntry( p_intf, menu, qtr( "Pre&vious" ),
diff --git a/src/libvlc-module.c b/src/libvlc-module.c
index f0ee030..429732e 100644
--- a/src/libvlc-module.c
+++ b/src/libvlc-module.c
@@ -1136,6 +1136,10 @@ static const char *const ppsz_prefres[] = {
 #define PAS_LONGTEXT N_( \
     "Stop the playlist after each played playlist item." )
 
+#define PASO_TEXT N_("Play and stop once")
+#define PASO_LONGTEXT N_( \
+    "Stop the playlist after the next played playlist item." )
+
 #define PAE_TEXT N_("Play and exit")
 #define PAE_LONGTEXT N_( \
     "Exit if there are no more items in the playlist." )
@@ -2628,6 +2632,8 @@ vlc_module_begin ()
     add_string( "bookmark10", NULL,
               BOOKMARK10_TEXT, BOOKMARK_LONGTEXT, false )
 
+    add_bool( "play-and-stop-once", 0, PASO_TEXT, PASO_LONGTEXT, false )
+
 #define HELP_TEXT \
     N_("print help for VLC (can be combined with --advanced and " \
        "--help-verbose)")
diff --git a/src/playlist/thread.c b/src/playlist/thread.c
index a6ecbdb..dedf3b0 100644
--- a/src/playlist/thread.c
+++ b/src/playlist/thread.c
@@ -359,6 +359,7 @@ static playlist_item_t *NextItem( playlist_t *p_playlist )
         bool b_loop = var_GetBool( p_playlist, "loop" );
         bool b_repeat = var_GetBool( p_playlist, "repeat" );
         bool b_playstop = var_InheritBool( p_playlist, "play-and-stop" );
+        bool b_playstoponce = var_InheritBool( p_playlist, "play-and-stop-once" );
 
         /* Repeat and play/stop */
         if( b_repeat && get_current_status_item( p_playlist ) )
@@ -371,6 +372,12 @@ static playlist_item_t *NextItem( playlist_t *p_playlist )
             msg_Dbg( p_playlist,"stopping (play and stop)" );
             return NULL;
         }
+        else if( b_playstoponce )
+        {
+            msg_Dbg( p_playlist, "stopping (play and stop once)" );
+            var_SetBool( p_playlist, "play-and-stop-once", false );
+            return NULL;
+        }
 
         /* */
         if( get_current_status_item( p_playlist ) )
-- 
1.9.1




More information about the vlc-devel mailing list