plugin.h
上传用户:kjfoods
上传日期:2020-07-06
资源大小:29949k
文件大小:11k
源码类别:

midi

开发平台:

Unix_Linux

  1. /*****************************************************************************
  2.  * plugin.h: ActiveX control for VLC
  3.  *****************************************************************************
  4.  * Copyright (C) 2005 the VideoLAN team
  5.  *
  6.  * Authors: Damien Fouilleul <Damien.Fouilleul@laposte.net>
  7.  *
  8.  * This program is free software; you can redistribute it and/or modify
  9.  * it under the terms of the GNU General Public License as published by
  10.  * the Free Software Foundation; either version 2 of the License, or
  11.  * (at your option) any later version.
  12.  *
  13.  * This program is distributed in the hope that it will be useful,
  14.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  15.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  16.  * GNU General Public License for more details.
  17.  *
  18.  * You should have received a copy of the GNU General Public License
  19.  * along with this program; if not, write to the Free Software
  20.  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
  21.  *****************************************************************************/
  22. #ifndef __PLUGIN_H__
  23. #define __PLUGIN_H__
  24. #include <ole2.h>
  25. #include <olectl.h>
  26. #include <vlc/vlc.h>
  27. extern "C" const GUID CLSID_VLCPlugin;
  28. extern "C" const GUID CLSID_VLCPlugin2;
  29. extern "C" const GUID LIBID_AXVLC;
  30. extern "C" const GUID DIID_DVLCEvents;
  31. class VLCPluginClass : public IClassFactory
  32. {
  33. public:
  34.     VLCPluginClass(LONG *p_class_ref, HINSTANCE hInstance, REFCLSID rclsid);
  35.     /* IUnknown methods */
  36.     STDMETHODIMP QueryInterface(REFIID riid, void **ppv);
  37.     STDMETHODIMP_(ULONG) AddRef(void);
  38.     STDMETHODIMP_(ULONG) Release(void);
  39.     /* IClassFactory methods */
  40.     STDMETHODIMP CreateInstance(LPUNKNOWN pUnkOuter, REFIID riid, void **ppv);
  41.     STDMETHODIMP LockServer(BOOL fLock);
  42.     REFCLSID getClassID(void) { return (REFCLSID)_classid; };
  43.     LPCTSTR getInPlaceWndClassName(void) const { return TEXT("VLC Plugin In-Place"); };
  44.     HINSTANCE getHInstance(void) const { return _hinstance; };
  45.     LPPICTURE getInPlacePict(void) const
  46.         { if( NULL != _inplace_picture) _inplace_picture->AddRef(); return _inplace_picture; };
  47. protected:
  48.     virtual ~VLCPluginClass();
  49. private:
  50.     LPLONG      _p_class_ref;
  51.     HINSTANCE   _hinstance;
  52.     CLSID       _classid;
  53.     ATOM        _inplace_wndclass_atom;
  54.     LPPICTURE   _inplace_picture;
  55. };
  56. class VLCPlugin : public IUnknown
  57. {
  58. public:
  59.     VLCPlugin(VLCPluginClass *p_class, LPUNKNOWN pUnkOuter);
  60.     /* IUnknown methods */
  61.     STDMETHODIMP QueryInterface(REFIID riid, void **ppv);
  62.     STDMETHODIMP_(ULONG) AddRef(void);
  63.     STDMETHODIMP_(ULONG) Release(void);
  64.     /* custom methods */
  65.     HRESULT getTypeLib(LCID lcid, ITypeLib **pTL) { return LoadRegTypeLib(LIBID_AXVLC, 1, 0, lcid, pTL); };
  66.     REFCLSID getClassID(void) { return _p_class->getClassID(); };
  67.     REFIID getDispEventID(void) { return (REFIID)DIID_DVLCEvents; };
  68.     /*
  69.     ** persistant properties
  70.     */
  71.     void setMRL(BSTR mrl)
  72.     {
  73.         SysFreeString(_bstr_mrl);
  74.         _bstr_mrl = SysAllocStringLen(mrl, SysStringLen(mrl));
  75.         setDirty(TRUE);
  76.     };
  77.     const BSTR getMRL(void) { return _bstr_mrl; };
  78.     inline void setAutoPlay(BOOL autoplay)
  79.     {
  80.         _b_autoplay = autoplay;
  81.         setDirty(TRUE);
  82.     };
  83.     inline BOOL getAutoPlay(void) { return _b_autoplay; };
  84.     inline void setAutoLoop(BOOL autoloop)
  85.     {
  86.         _b_autoloop = autoloop;
  87.         setDirty(TRUE);
  88.     };
  89.     inline BOOL getAutoLoop(void) { return _b_autoloop;};
  90.     inline void setShowToolbar(BOOL showtoolbar)
  91.     {
  92.         _b_toolbar = showtoolbar;
  93.         setDirty(TRUE);
  94.     };
  95.     inline BOOL getShowToolbar(void) { return _b_toolbar;};
  96.     void setVolume(int volume);
  97.     int getVolume(void) { return _i_volume; };
  98.     void setBackColor(OLE_COLOR backcolor);
  99.     OLE_COLOR getBackColor(void) { return _i_backcolor; };
  100.     void setVisible(BOOL fVisible);
  101.     BOOL getVisible(void) { return _b_visible; };
  102.     BOOL isVisible(void) { return _b_visible || (! _b_usermode); };
  103.     inline void setStartTime(int time)
  104.     {
  105.         _i_time = time;
  106.         setDirty(TRUE);
  107.     };
  108.     inline int getStartTime(void) { return _i_time; };
  109.     void setTime(int time);
  110.     int  getTime(void) { return _i_time; };
  111.     void setBaseURL(BSTR url)
  112.     {
  113.         SysFreeString(_bstr_baseurl);
  114.         _bstr_baseurl = SysAllocStringLen(url, SysStringLen(url));
  115.         setDirty(TRUE);
  116.     };
  117.     const BSTR getBaseURL(void) { return _bstr_baseurl; };
  118.     // control size in HIMETRIC
  119.     inline void setExtent(const SIZEL& extent)
  120.     {
  121.         _extent = extent;
  122.         setDirty(TRUE);
  123.     };
  124.     const SIZEL& getExtent(void) { return _extent; };
  125.     // transient properties
  126.     inline void setMute(BOOL mute) { _b_mute = mute; };
  127.     inline void setPicture(LPPICTURE pict)
  128.     {
  129.         if( NULL != _p_pict )
  130.             _p_pict->Release();
  131.         if( NULL != pict )
  132.             _p_pict->AddRef();
  133.         _p_pict = pict;
  134.     };
  135.     inline LPPICTURE getPicture(void)
  136.     {
  137.         if( NULL != _p_pict )
  138.             _p_pict->AddRef();
  139.         return _p_pict;
  140.     };
  141.     BOOL hasFocus(void);
  142.     void setFocus(BOOL fFocus);
  143.     inline UINT getCodePage(void) { return _i_codepage; };
  144.     inline void setCodePage(UINT cp)
  145.     {
  146.         // accept new codepage only if it works on this system
  147.         size_t mblen = WideCharToMultiByte(cp,
  148.                 0, L"test", -1, NULL, 0, NULL, NULL);
  149.         if( mblen > 0 )
  150.             _i_codepage = cp;
  151.     };
  152.     inline BOOL isUserMode(void) { return _b_usermode; };
  153.     inline void setUserMode(BOOL um) { _b_usermode = um; };
  154.     inline BOOL isDirty(void) { return _b_dirty; };
  155.     inline void setDirty(BOOL dirty) { _b_dirty = dirty; };
  156.     inline BOOL isRunning(void) { return NULL != _p_libvlc; };
  157.     HRESULT getVLC(libvlc_instance_t** pp_libvlc)
  158.     {
  159.         if( !isRunning() )
  160.             initVLC();
  161.         *pp_libvlc = _p_libvlc;
  162.         return _p_libvlc?S_OK:E_FAIL;
  163.     }
  164.     HRESULT getMD(libvlc_media_player_t **pp_md)
  165.     {
  166.         *pp_md = _p_mplayer;
  167.         return _p_mplayer?S_OK:E_FAIL;
  168.     }
  169.     void setErrorInfo(REFIID riid, const char *description);
  170.     // control geometry within container
  171.     RECT getPosRect(void) { return _posRect; };
  172.     inline HWND getInPlaceWindow(void) const { return _inplacewnd; };
  173.     BOOL isInPlaceActive(void);
  174.     /*
  175.     ** container events
  176.     */
  177.     HRESULT onInit(void);
  178.     HRESULT onLoad(void);
  179.     HRESULT onActivateInPlace(LPMSG lpMesg, HWND hwndParent, LPCRECT lprcPosRect, LPCRECT lprcClipRect);
  180.     HRESULT onInPlaceDeactivate(void);
  181.     HRESULT onAmbientChanged(LPUNKNOWN pContainer, DISPID dispID);
  182.     HRESULT onClose(DWORD dwSaveOption);
  183.     void onPositionChange(LPCRECT lprcPosRect, LPCRECT lprcClipRect);
  184.     void onDraw(DVTARGETDEVICE * ptd, HDC hicTargetDev,
  185.             HDC hdcDraw, LPCRECTL lprcBounds, LPCRECTL lprcWBounds);
  186.     void onPaint(HDC hdc, const RECT &bounds, const RECT &pr);
  187.     /*
  188.     ** control events
  189.     */
  190.     void freezeEvents(BOOL freeze);
  191.     void firePropChangedEvent(DISPID dispid);
  192.     void fireOnPlayEvent(void);
  193.     void fireOnPauseEvent(void);
  194.     void fireOnStopEvent(void);
  195.     // controlling IUnknown interface
  196.     LPUNKNOWN pUnkOuter;
  197.     /*
  198.     ** libvlc interface
  199.     */
  200.     bool isPlaying(libvlc_exception_t *ex)
  201.     {
  202.         return _p_mplayer && libvlc_media_player_is_playing(_p_mplayer,ex);
  203.     }
  204.     int  playlist_get_current_index(libvlc_exception_t *) { return _i_midx; }
  205.     int  playlist_add_extended_untrusted(const char *, int, const char **, libvlc_exception_t *);
  206.     void playlist_delete_item(int idx, libvlc_exception_t *ex)
  207.     {
  208.         if( _p_mlist )
  209.             libvlc_media_list_remove_index(_p_mlist,idx,ex);
  210.     }
  211.     void playlist_clear(libvlc_exception_t *ex)
  212.     {
  213.         if( !_p_libvlc )
  214.             return;
  215.         if( _p_mlist )
  216.             libvlc_media_list_release(_p_mlist);
  217.         _p_mlist = libvlc_media_list_new(_p_libvlc,ex);
  218.     }
  219.     int  playlist_count(libvlc_exception_t *ex)
  220.     {
  221.          int r = 0;
  222.          if( !_p_mlist )
  223.              return 0;
  224.          libvlc_media_list_lock(_p_mlist);
  225.          r = libvlc_media_list_count(_p_mlist,ex);
  226.          libvlc_media_list_unlock(_p_mlist);
  227.          return r;
  228.     }
  229.     void playlist_pause(libvlc_exception_t *ex)
  230.     {
  231.         if( isPlaying(ex) )
  232.             libvlc_media_player_pause(_p_mplayer,ex);
  233.     }
  234.     void playlist_play(libvlc_exception_t *ex)
  235.     {
  236.         if( !_p_libvlc )
  237.             initVLC();
  238.         if( _p_mplayer||playlist_select(0,ex) )
  239.             libvlc_media_player_play(_p_mplayer,ex);
  240.     }
  241.     void playlist_play_item(int idx,libvlc_exception_t *ex)
  242.     {
  243.         if( !_p_libvlc )
  244.             initVLC();
  245.         if( playlist_select(idx,ex) )
  246.             libvlc_media_player_play(_p_mplayer,ex);
  247.     }
  248.     void playlist_stop(libvlc_exception_t *ex)
  249.     {
  250.         if( _p_mplayer )
  251.             libvlc_media_player_stop(_p_mplayer,ex);
  252.     }
  253.     void playlist_next(libvlc_exception_t *ex)
  254.     {
  255.         if( playlist_select( _i_midx+1, ex) )
  256.             libvlc_media_player_play(_p_mplayer,ex);
  257.     }
  258.     void playlist_prev(libvlc_exception_t *ex)
  259.     {
  260.         if( playlist_select( _i_midx-1, ex) )
  261.             libvlc_media_player_play(_p_mplayer,ex);
  262.     }
  263. protected:
  264.     virtual ~VLCPlugin();
  265. private:
  266.     void initVLC();
  267.     bool playlist_select(int i,libvlc_exception_t *);
  268.     void set_player_window(libvlc_exception_t *);
  269.     //implemented interfaces
  270.     class VLCOleObject *vlcOleObject;
  271.     class VLCOleControl *vlcOleControl;
  272.     class VLCOleInPlaceObject *vlcOleInPlaceObject;
  273.     class VLCOleInPlaceActiveObject *vlcOleInPlaceActiveObject;
  274.     class VLCPersistStreamInit *vlcPersistStreamInit;
  275.     class VLCPersistStorage *vlcPersistStorage;
  276.     class VLCPersistPropertyBag *vlcPersistPropertyBag;
  277.     class VLCProvideClassInfo *vlcProvideClassInfo;
  278.     class VLCConnectionPointContainer *vlcConnectionPointContainer;
  279.     class VLCObjectSafety *vlcObjectSafety;
  280.     class VLCControl *vlcControl;
  281.     class VLCControl2 *vlcControl2;
  282.     class VLCViewObject *vlcViewObject;
  283.     class VLCDataObject *vlcDataObject;
  284.     class VLCSupportErrorInfo *vlcSupportErrorInfo;
  285.     // in place activated window (Plugin window)
  286.     HWND _inplacewnd;
  287.     VLCPluginClass* _p_class;
  288.     ULONG _i_ref;
  289.     libvlc_instance_t     *_p_libvlc;
  290.     libvlc_media_list_t   *_p_mlist;
  291.     libvlc_media_player_t *_p_mplayer;
  292.     int  _i_midx;
  293.     UINT _i_codepage;
  294.     BOOL _b_usermode;
  295.     RECT _posRect;
  296.     LPPICTURE _p_pict;
  297.     // persistable properties
  298.     BSTR _bstr_baseurl;
  299.     BSTR _bstr_mrl;
  300.     BOOL _b_autoplay;
  301.     BOOL _b_autoloop;
  302.     BOOL _b_toolbar;
  303.     BOOL _b_visible;
  304.     BOOL _b_mute;
  305.     int  _i_volume;
  306.     int  _i_time;
  307.     SIZEL _extent;
  308.     OLE_COLOR _i_backcolor;
  309.     // indicates whether properties needs persisting
  310.     BOOL _b_dirty;
  311. };
  312. #endif