[vlc-devel] [PATCH 03/12] ActiveX: switch to vlc_player

Sergey Radionov rsatom at gmail.com
Sat Apr 21 18:07:44 CEST 2012


---
 activex/plugin.cpp |  110 +++++++--------------------------------------------
 activex/plugin.h   |   71 ++++++++++++++--------------------
 2 files changed, 44 insertions(+), 137 deletions(-)

diff --git a/activex/plugin.cpp b/activex/plugin.cpp
index 05922b2..02d9735 100644
--- a/activex/plugin.cpp
+++ b/activex/plugin.cpp
@@ -221,9 +221,6 @@ VLCPlugin::VLCPlugin(VLCPluginClass *p_class, LPUNKNOWN pUnkOuter) :
     _p_class(p_class),
     _i_ref(1UL),
     _p_libvlc(NULL),
-    _p_mlist(NULL),
-    _p_mplayer(NULL),
-    _i_midx(-1),
     _i_codepage(CP_ACP),
     _b_usermode(TRUE)
 {
@@ -307,16 +304,14 @@ VLCPlugin::~VLCPlugin()
     SysFreeString(_bstr_mrl);
     SysFreeString(_bstr_baseurl);
 
-    if( _p_mplayer )
+    if( vlc_player::is_open() )
     {
         if( isPlaying() )
             playlist_stop();
 
         player_unregister_events();
-        libvlc_media_player_release(_p_mplayer);
-        _p_mplayer=NULL;
     }
-    if( _p_mlist )   { libvlc_media_list_release(_p_mlist); _p_mlist=NULL; }
+
     if( _p_libvlc )  { libvlc_release(_p_libvlc); _p_libvlc=NULL; }
 
     _p_class->Release();
@@ -536,7 +531,10 @@ void VLCPlugin::initVLC()
     if( !_p_libvlc )
         return;
 
-    _p_mlist = libvlc_media_list_new(_p_libvlc);
+    if( !vlc_player::open(_p_libvlc) )
+        return;
+
+    set_player_window();
 
     // initial playlist item
     if( SysStringLen(_bstr_mrl) > 0 )
@@ -752,9 +750,9 @@ HRESULT VLCPlugin::onActivateInPlace(LPMSG, HWND hwndParent, LPCRECT lprcPosRect
         if( FAILED(result) )
             return result;
 
-        if( get_autoplay() && playlist_select(0) )
+        if( get_autoplay() )
         {
-            libvlc_media_player_play(_p_mplayer);
+            vlc_player::play(0);
             fireOnPlayEvent();
         }
     }
@@ -844,9 +842,9 @@ void VLCPlugin::setTime(int seconds)
     if( seconds != _i_time )
     {
         setStartTime(_i_time);
-        if( NULL != _p_mplayer )
+        if( vlc_player::is_open() )
         {
-            libvlc_media_player_set_time(_p_mplayer, _i_time);
+            vlc_player::set_time(_i_time);
         }
     }
 };
@@ -1240,76 +1238,17 @@ static void handle_pausable_changed_event(const libvlc_event_t* event, void *par
 
 /* */
 
-bool VLCPlugin::playlist_select( int idx )
-{
-    //In some cases, libvlc may not have been initialized yet.
-    //So check it and initialize if needed (in getVLC())
-    libvlc_instance_t* p_libvlc;
-    HRESULT hr = getVLC(&p_libvlc);
-    if( FAILED(hr) || !p_libvlc)
-        return false;
-
-    if(!_p_mlist)
-        return false;//playlist does not exist, nothing to play...
-
-    libvlc_media_t *p_m = NULL;
-
-    assert(_p_mlist);
-
-    libvlc_media_list_lock(_p_mlist);
-
-    int count = libvlc_media_list_count(_p_mlist);
-
-    if( (idx < 0) || (idx >= count) )
-        goto bad_unlock;
-
-    _i_midx = idx;
-
-    p_m = libvlc_media_list_item_at_index(_p_mlist,_i_midx);
-    libvlc_media_list_unlock(_p_mlist);
-    if( !p_m )
-        return false;
-
-    if( _p_mplayer )
-    {
-        if( isPlaying() )
-            playlist_stop();
-        player_unregister_events();
-        _WindowsManager.LibVlcDetach();
-        libvlc_media_player_release( _p_mplayer );
-        _p_mplayer = NULL;
-    }
-
-    _p_mplayer = libvlc_media_player_new_from_media(p_m);
-    if( _p_mplayer )
-    {
-        // initial volume setting
-        libvlc_audio_set_volume(_p_mplayer, _i_volume);
-        if( _b_mute )
-            libvlc_audio_set_mute(_p_mplayer, TRUE);
-        set_player_window();
-        player_register_events();
-    }
-
-    libvlc_media_release(p_m);
-    return _p_mplayer ? true : false;
-
-bad_unlock:
-    libvlc_media_list_unlock(_p_mlist);
-    return false;
-}
-
 void VLCPlugin::set_player_window()
 {
-    _WindowsManager.LibVlcAttach(_p_mplayer);
+    _WindowsManager.LibVlcAttach(vlc_player::get_mp());
 }
 
 void VLCPlugin::player_register_events()
 {
     libvlc_event_manager_t *eventManager = NULL;
-    assert(_p_mplayer);
+    assert(vlc_player::is_open());
 
-    eventManager = libvlc_media_player_event_manager(_p_mplayer);
+    eventManager = libvlc_media_player_event_manager(vlc_player::get_mp());
     if(eventManager) {
         libvlc_event_attach(eventManager, libvlc_MediaPlayerNothingSpecial,
                             handle_input_state_event, this);
@@ -1346,9 +1285,9 @@ void VLCPlugin::player_register_events()
 void VLCPlugin::player_unregister_events()
 {
     libvlc_event_manager_t *eventManager = NULL;
-    assert(_p_mplayer);
+    assert(vlc_player::is_open());
 
-    eventManager = libvlc_media_player_event_manager(_p_mplayer);
+    eventManager = libvlc_media_player_event_manager(vlc_player::get_mp());
     if(eventManager) {
         libvlc_event_detach(eventManager, libvlc_MediaPlayerNothingSpecial,
                             handle_input_state_event, this);
@@ -1381,22 +1320,3 @@ void VLCPlugin::player_unregister_events()
                             handle_pausable_changed_event, this);
     }
 }
-
-int  VLCPlugin::playlist_add_extended_untrusted(const char *mrl, int optc, const char **optv)
-{
-    int item = -1;
-    libvlc_media_t *p_m = libvlc_media_new_location(_p_libvlc,mrl);
-    if( !p_m )
-        return -1;
-
-    for( int i = 0; i < optc; ++i )
-        libvlc_media_add_option_flag(p_m, optv[i], libvlc_media_option_unique);
-
-    libvlc_media_list_lock(_p_mlist);
-    if( libvlc_media_list_add_media(_p_mlist,p_m) == 0 )
-        item = libvlc_media_list_count(_p_mlist)-1;
-    libvlc_media_list_unlock(_p_mlist);
-    libvlc_media_release(p_m);
-
-    return item;
-}
diff --git a/activex/plugin.h b/activex/plugin.h
index 94883b8..6d503ba 100644
--- a/activex/plugin.h
+++ b/activex/plugin.h
@@ -33,6 +33,7 @@
 
 #include "../common/win32_fullscreen.h"
 #include "../common/vlc_player_options.h"
+#include "../common/vlc_player.h"
 
 extern "C" const GUID CLSID_VLCPlugin;
 extern "C" const GUID CLSID_VLCPlugin2;
@@ -75,7 +76,8 @@ private:
     LPPICTURE   _inplace_picture;
 };
 
-struct VLCPlugin : public IUnknown, private vlc_player_options
+struct VLCPlugin
+    : public IUnknown, private vlc_player_options, private vlc_player
 {
 public:
     VLCPlugin(VLCPluginClass *p_class, LPUNKNOWN pUnkOuter);
@@ -90,6 +92,12 @@ public:
     REFCLSID getClassID(void) { return _p_class->getClassID(); };
     REFIID getDispEventID(void) { return (REFIID)DIID_DVLCEvents; };
 
+    vlc_player& get_player()
+    {
+        if( !vlc_player::is_open() ) initVLC();
+        return *static_cast<vlc_player*>(this);
+    }
+
     vlc_player_options& get_options()
         { return *static_cast<vlc_player_options*>(this); }
     const vlc_player_options& get_options() const
@@ -212,10 +220,9 @@ public:
     }
     HRESULT getMD(libvlc_media_player_t **pp_md)
     {
-        *pp_md = _p_mplayer;
-        return _p_mplayer ? S_OK : E_FAIL;
+        *pp_md = get_player().get_mp();
+        return *pp_md ? S_OK : E_FAIL;
     }
-
     void setErrorInfo(REFIID riid, const char *description);
 
     // control geometry within container
@@ -223,7 +230,6 @@ public:
     inline HWND getInPlaceWindow(void) const { return _inplacewnd; };
     void toggleFullscreen();
 
-
     BOOL isInPlaceActive(void);
 
     /*
@@ -274,66 +280,51 @@ public:
     */
     bool isPlaying()
     {
-        return _p_mplayer && libvlc_media_player_is_playing(_p_mplayer);
+        return get_player().is_playing();
+    }
+    int playlist_get_current_index()
+    {
+        return get_player().current_item();
+    }
+    int playlist_add_extended_untrusted(const char *mrl, int optc, const char **optv)
+    {
+        return get_player().add_item(mrl, optc, optv);
     }
-    int  playlist_get_current_index() { return _i_midx; }
-    int  playlist_add_extended_untrusted(const char *, int, const char **);
     void playlist_delete_item(int idx)
     {
-        if( _p_mlist )
-        {
-            libvlc_media_list_lock(_p_mlist);
-            libvlc_media_list_remove_index(_p_mlist,idx);
-            libvlc_media_list_unlock(_p_mlist);
-        }
+        get_player().delete_item(idx);
     }
     void playlist_clear()
     {
-        if( !_p_libvlc )
-            return;
-        if( _p_mlist )
-            libvlc_media_list_release(_p_mlist);
-        _p_mlist = libvlc_media_list_new(_p_libvlc);
+        get_player().clear_items();
     }
     int  playlist_count()
     {
-         int r = 0;
-         if( !_p_mlist )
-             return 0;
-         libvlc_media_list_lock(_p_mlist);
-         r = libvlc_media_list_count(_p_mlist);
-         libvlc_media_list_unlock(_p_mlist);
-         return r;
+         return get_player().items_count();
     }
     void playlist_pause()
     {
-        if( isPlaying() )
-            libvlc_media_player_pause(_p_mplayer);
+        get_player().pause();
     }
     void playlist_play()
     {
-        if( _p_mplayer || playlist_select(0) )
-            libvlc_media_player_play(_p_mplayer);
+        get_player().play();
     }
     void playlist_play_item(int idx)
     {
-        if( playlist_select(idx) )
-            libvlc_media_player_play(_p_mplayer);
+        get_player().play(idx);
     }
     void playlist_stop()
     {
-        if( _p_mplayer )
-            libvlc_media_player_stop(_p_mplayer);
+        get_player().stop();
     }
     void playlist_next()
     {
-        if( playlist_select( _i_midx+1 ) )
-            libvlc_media_player_play(_p_mplayer);
+        get_player().next();
     }
     void playlist_prev()
     {
-        if( playlist_select( _i_midx-1 ) )
-            libvlc_media_player_play(_p_mplayer);
+        get_player().prev();
     }
 
 protected:
@@ -342,7 +333,6 @@ protected:
 
 private:
     void initVLC();
-    bool playlist_select(int i);
     void set_player_window();
     void player_register_events();
     void player_unregister_events();
@@ -373,9 +363,6 @@ private:
     ULONG _i_ref;
 
     libvlc_instance_t     *_p_libvlc;
-    libvlc_media_list_t   *_p_mlist;
-    libvlc_media_player_t *_p_mplayer;
-    int  _i_midx;
 
     UINT _i_codepage;
     BOOL _b_usermode;
-- 
1.7.7.1.msysgit.0




More information about the vlc-devel mailing list