* vlccontrol.h: ActiveX control for VLC
*****************************************************************************
* Copyright (C) 2006 the VideoLAN team
+ * Copyright (C) 2010 M2X BV
*
* Authors: Damien Fouilleul <Damien.Fouilleul@laposte.net>
* Jean-Paul Saman <jpsaman _at_ m2x _dot_ nl>
#include <vlc/libvlc.h>
#include <ole2.h>
-class VLCAudio : public IVLCAudio
-{
+class VLCInterfaceBase {
public:
- VLCAudio(VLCPlugin *p_instance) :
- _p_instance(p_instance), _p_typeinfo(NULL) {};
- virtual ~VLCAudio();
-
- // IUnknown methods
- STDMETHODIMP QueryInterface(REFIID riid, void **ppv)
- {
- if( NULL == ppv )
- return E_POINTER;
- if( (IID_IUnknown == riid)
- || (IID_IDispatch == riid)
- || (IID_IVLCAudio == riid) )
- {
- AddRef();
- *ppv = reinterpret_cast<LPVOID>(this);
- return NOERROR;
- }
- // behaves as a standalone object
- return E_NOINTERFACE;
- };
-
- STDMETHODIMP_(ULONG) AddRef(void) { return _p_instance->pUnkOuter->AddRef(); };
- STDMETHODIMP_(ULONG) Release(void) { return _p_instance->pUnkOuter->Release(); };
-
- // IDispatch methods
- STDMETHODIMP GetTypeInfoCount(UINT*);
- STDMETHODIMP GetTypeInfo(UINT, LCID, LPTYPEINFO*);
- STDMETHODIMP GetIDsOfNames(REFIID,LPOLESTR*,UINT,LCID,DISPID*);
- STDMETHODIMP Invoke(DISPID,REFIID,LCID,WORD,DISPPARAMS*,VARIANT*,EXCEPINFO*,UINT*);
+ VLCInterfaceBase(VLCPlugin *p): _plug(p), _ti(NULL) { }
+ virtual ~VLCInterfaceBase() { if( _ti ) _ti->Release(); }
- // IVLCAudio methods
- STDMETHODIMP get_mute(VARIANT_BOOL*);
- STDMETHODIMP put_mute(VARIANT_BOOL);
- STDMETHODIMP get_volume(long*);
- STDMETHODIMP put_volume(long);
- STDMETHODIMP get_track(long*);
- STDMETHODIMP put_track(long);
- STDMETHODIMP get_count(long*);
- STDMETHODIMP get_channel(long*);
- STDMETHODIMP put_channel(long);
- STDMETHODIMP toggleMute();
- STDMETHODIMP description(long, BSTR*);
+ VLCPlugin *Instance() const { return _plug; }
+ HRESULT getVLC(libvlc_instance_t **pp) const { return _plug->getVLC(pp); }
+ HRESULT getMD(libvlc_media_player_t **pp) const { return _plug->getMD(pp); }
protected:
- HRESULT loadTypeInfo();
- HRESULT exception_bridge(libvlc_exception_t *ex);
+ HRESULT loadTypeInfo(REFIID riid);
+ ITypeInfo *TypeInfo() const { return _ti; }
+ STDMETHODIMP_(ULONG) AddRef(void) { return _plug->pUnkOuter->AddRef(); };
+ STDMETHODIMP_(ULONG) Release(void) { return _plug->pUnkOuter->Release(); };
private:
- VLCPlugin* _p_instance;
- ITypeInfo* _p_typeinfo;
-
+ VLCPlugin *_plug;
+ ITypeInfo *_ti;
};
-class VLCInput : public IVLCInput
+template<class T,class I>
+class VLCInterface: public I, private VLCInterfaceBase
{
-public:
-
- VLCInput(VLCPlugin *p_instance) :
- _p_instance(p_instance), _p_typeinfo(NULL) {};
- virtual ~VLCInput();
-
- // IUnknown methods
- STDMETHODIMP QueryInterface(REFIID riid, void **ppv)
- {
- if( NULL == ppv )
- return E_POINTER;
- if( (IID_IUnknown == riid)
- || (IID_IDispatch == riid)
- || (IID_IVLCInput == riid) )
- {
- AddRef();
- *ppv = reinterpret_cast<LPVOID>(this);
- return NOERROR;
- }
- // behaves as a standalone object
- return E_NOINTERFACE;
- };
-
- STDMETHODIMP_(ULONG) AddRef(void) { return _p_instance->pUnkOuter->AddRef(); };
- STDMETHODIMP_(ULONG) Release(void) { return _p_instance->pUnkOuter->Release(); };
-
- // IDispatch methods
- STDMETHODIMP GetTypeInfoCount(UINT*);
- STDMETHODIMP GetTypeInfo(UINT, LCID, LPTYPEINFO*);
- STDMETHODIMP GetIDsOfNames(REFIID,LPOLESTR*,UINT,LCID,DISPID*);
- STDMETHODIMP Invoke(DISPID,REFIID,LCID,WORD,DISPPARAMS*,VARIANT*,EXCEPINFO*,UINT*);
-
- // IVLCInput methods
- STDMETHODIMP get_length(double*);
- STDMETHODIMP get_position(double*);
- STDMETHODIMP put_position(double);
- STDMETHODIMP get_time(double*);
- STDMETHODIMP put_time(double);
- STDMETHODIMP get_state(long*);
- STDMETHODIMP get_rate(double*);
- STDMETHODIMP put_rate(double);
- STDMETHODIMP get_fps(double*);
- STDMETHODIMP get_hasVout(VARIANT_BOOL*);
-
-protected:
- HRESULT loadTypeInfo();
- HRESULT exception_bridge(libvlc_exception_t *ex);
-
private:
- VLCPlugin* _p_instance;
- ITypeInfo* _p_typeinfo;
+ typedef VLCInterfaceBase Base;
+ T *This() { return static_cast< T *>(this); }
+ const T *This() const { return static_cast<const T *>(this); }
-};
+ HRESULT loadTypeInfo()
+ {
+ return TypeInfo() ? NOERROR : Base::loadTypeInfo(_riid);
+ }
-class VLCMessage: public IVLCMessage
-{
public:
+ VLCInterface(VLCPlugin *p): Base(p) { }
+ VLCPlugin *Instance() const { return Base::Instance(); }
- VLCMessage(VLCPlugin *p_instance, struct libvlc_log_message_t &msg) :
- _p_instance(p_instance),
- _p_typeinfo(NULL),
- _refcount(1),
- _msg(msg) {};
- virtual ~VLCMessage();
+ HRESULT getVLC(libvlc_instance_t **pp) const { return Base::getVLC(pp); }
+ HRESULT getMD(libvlc_media_player_t **pp) const { return Base::getMD(pp); }
- // IUnknown methods
STDMETHODIMP QueryInterface(REFIID riid, void **ppv)
{
- if( NULL == ppv )
- return E_POINTER;
+ if( NULL == ppv ) return E_POINTER;
+
if( (IID_IUnknown == riid)
|| (IID_IDispatch == riid)
- || (IID_IVLCMessage == riid) )
+ || (_riid == riid) )
{
- AddRef();
- *ppv = reinterpret_cast<LPVOID>(this);
+ This()->AddRef();
+ *ppv = reinterpret_cast<LPVOID>(This());
return NOERROR;
}
// behaves as a standalone object
return E_NOINTERFACE;
- };
+ }
- STDMETHODIMP_(ULONG) AddRef(void) { return InterlockedIncrement(&_refcount); };
- STDMETHODIMP_(ULONG) Release(void)
+ STDMETHODIMP GetTypeInfoCount(UINT* pctInfo)
{
- ULONG refcount = InterlockedDecrement(&_refcount);
- if( 0 == refcount )
- {
- delete this;
- return 0;
- }
- return refcount;
- };
-
- // IDispatch methods
- STDMETHODIMP GetTypeInfoCount(UINT*);
- STDMETHODIMP GetTypeInfo(UINT, LCID, LPTYPEINFO*);
- STDMETHODIMP GetIDsOfNames(REFIID,LPOLESTR*,UINT,LCID,DISPID*);
- STDMETHODIMP Invoke(DISPID,REFIID,LCID,WORD,DISPPARAMS*,VARIANT*,EXCEPINFO*,UINT*);
-
- // IVLCMessage methods
- STDMETHODIMP get__Value(VARIANT *);
- STDMETHODIMP get_severity(long *);
- STDMETHODIMP get_type(BSTR *);
- STDMETHODIMP get_name(BSTR *);
- STDMETHODIMP get_header(BSTR *);
- STDMETHODIMP get_message(BSTR *);
-
-protected:
- HRESULT loadTypeInfo();
-
-private:
- VLCPlugin* _p_instance;
- ITypeInfo* _p_typeinfo;
- LONG _refcount;
-
- struct libvlc_log_message_t _msg;
-};
-
-class VLCLog;
-
-class VLCMessageIterator : public IVLCMessageIterator
-{
-public:
-
- VLCMessageIterator(VLCPlugin *p_instance, VLCLog* p_vlclog);
- virtual ~VLCMessageIterator();
-
- // IUnknown methods
- STDMETHODIMP QueryInterface(REFIID riid, void **ppv)
+ if( NULL == pctInfo )
+ return E_INVALIDARG;
+ *pctInfo = SUCCEEDED(loadTypeInfo()) ? 1 : 0;
+ return NOERROR;
+ }
+ STDMETHODIMP GetTypeInfo(UINT iTInfo, LCID lcid, LPTYPEINFO* ppTInfo)
{
- if( NULL == ppv )
- return E_POINTER;
- if( (IID_IUnknown == riid)
- || (IID_IDispatch == riid)
- || (IID_IVLCMessageIterator == riid) )
+ if( NULL == ppTInfo )
+ return E_INVALIDARG;
+
+ if( SUCCEEDED(loadTypeInfo()) )
{
- AddRef();
- *ppv = reinterpret_cast<LPVOID>(this);
+ (*ppTInfo = TypeInfo())->AddRef();
return NOERROR;
}
- // behaves as a standalone object
- return E_NOINTERFACE;
- };
+ *ppTInfo = NULL;
+ return E_NOTIMPL;
+ }
- STDMETHODIMP_(ULONG) AddRef(void) { return InterlockedIncrement(&_refcount); };
- STDMETHODIMP_(ULONG) Release(void)
+ STDMETHODIMP GetIDsOfNames(REFIID riid, LPOLESTR* rgszNames,
+ UINT cNames, LCID lcid, DISPID* rgDispID)
{
- ULONG refcount = InterlockedDecrement(&_refcount);
- if( 0 == refcount )
- {
- delete this;
- return 0;
- }
- return refcount;
- };
+ return FAILED(loadTypeInfo()) ? E_NOTIMPL :
+ DispGetIDsOfNames(TypeInfo(), rgszNames, cNames, rgDispID);
+ }
- // IDispatch methods
- STDMETHODIMP GetTypeInfoCount(UINT*);
- STDMETHODIMP GetTypeInfo(UINT, LCID, LPTYPEINFO*);
- STDMETHODIMP GetIDsOfNames(REFIID,LPOLESTR*,UINT,LCID,DISPID*);
- STDMETHODIMP Invoke(DISPID,REFIID,LCID,WORD,DISPPARAMS*,VARIANT*,EXCEPINFO*,UINT*);
-
- // IVLCMessageIterator methods
- STDMETHODIMP get_hasNext(VARIANT_BOOL*);
- STDMETHODIMP next(IVLCMessage**);
-
-protected:
- HRESULT loadTypeInfo();
- HRESULT exception_bridge(libvlc_exception_t *ex);
+ STDMETHODIMP Invoke(DISPID dispIdMember, REFIID riid,
+ LCID lcid, WORD wFlags, DISPPARAMS* pDispParams,
+ VARIANT* pVarResult, EXCEPINFO* pExcepInfo, UINT* puArgErr)
+ {
+ return FAILED(loadTypeInfo()) ? E_NOTIMPL :
+ DispInvoke(This(), TypeInfo(), dispIdMember, wFlags,
+ pDispParams, pVarResult, pExcepInfo, puArgErr);
+ }
+ STDMETHODIMP_(ULONG) AddRef(void) { return Base::AddRef(); };
+ STDMETHODIMP_(ULONG) Release(void) { return Base::Release(); };
private:
- VLCPlugin* _p_instance;
- ITypeInfo* _p_typeinfo;
- LONG _refcount;
-
- VLCLog* _p_vlclog;
- libvlc_log_iterator_t* _p_iter;
+ static REFIID _riid;
};
-class VLCMessages : public IVLCMessages
+class VLCAudio : public VLCInterface<VLCAudio,IVLCAudio>
{
public:
+ VLCAudio(VLCPlugin *p): VLCInterface<VLCAudio,IVLCAudio>(p) { }
- VLCMessages(VLCPlugin *p_instance, VLCLog *p_vlclog) :
- _p_vlclog(p_vlclog),
- _p_instance(p_instance),
- _p_typeinfo(NULL) {}
- virtual ~VLCMessages();
-
- // IUnknown methods
- STDMETHODIMP QueryInterface(REFIID riid, void **ppv)
- {
- if( NULL == ppv )
- return E_POINTER;
- if( (IID_IUnknown == riid)
- || (IID_IDispatch == riid)
- || (IID_IVLCMessages == riid) )
- {
- AddRef();
- *ppv = reinterpret_cast<LPVOID>(this);
- return NOERROR;
- }
- // behaves as a standalone object
- return E_NOINTERFACE;
- };
-
- STDMETHODIMP_(ULONG) AddRef(void) { return _p_instance->pUnkOuter->AddRef(); };
- STDMETHODIMP_(ULONG) Release(void) { return _p_instance->pUnkOuter->Release(); };
-
- // IDispatch methods
- STDMETHODIMP GetTypeInfoCount(UINT*);
- STDMETHODIMP GetTypeInfo(UINT, LCID, LPTYPEINFO*);
- STDMETHODIMP GetIDsOfNames(REFIID,LPOLESTR*,UINT,LCID,DISPID*);
- STDMETHODIMP Invoke(DISPID,REFIID,LCID,WORD,DISPPARAMS*,VARIANT*,EXCEPINFO*,UINT*);
-
- // IVLCMessages methods
- STDMETHODIMP get__NewEnum(LPUNKNOWN*);
- STDMETHODIMP clear();
+ // IVLCAudio methods
+ STDMETHODIMP get_mute(VARIANT_BOOL*);
+ STDMETHODIMP put_mute(VARIANT_BOOL);
+ STDMETHODIMP get_volume(long*);
+ STDMETHODIMP put_volume(long);
+ STDMETHODIMP get_track(long*);
+ STDMETHODIMP put_track(long);
STDMETHODIMP get_count(long*);
- STDMETHODIMP iterator(IVLCMessageIterator**);
-
-protected:
- HRESULT loadTypeInfo();
- HRESULT exception_bridge(libvlc_exception_t *ex);
-
- VLCLog* _p_vlclog;
-
-private:
- VLCPlugin* _p_instance;
- ITypeInfo* _p_typeinfo;
+ STDMETHODIMP get_channel(long*);
+ STDMETHODIMP put_channel(long);
+ STDMETHODIMP toggleMute();
+ STDMETHODIMP description(long, BSTR*);
};
-
-class VLCLog : public IVLCLog
+
+class VLCInput: public VLCInterface<VLCInput,IVLCInput>
{
public:
+ VLCInput(VLCPlugin *p): VLCInterface<VLCInput,IVLCInput>(p) { }
- friend class VLCMessages;
- friend class VLCMessageIterator;
-
- VLCLog(VLCPlugin *p_instance) :
- _p_log(NULL),
- _p_instance(p_instance),
- _p_typeinfo(NULL),
- _p_vlcmessages(NULL)
- {
- _p_vlcmessages = new VLCMessages(p_instance, this);
- };
- virtual ~VLCLog();
-
- // IUnknown methods
- STDMETHODIMP QueryInterface(REFIID riid, void **ppv)
- {
- if( NULL == ppv )
- return E_POINTER;
- if( (IID_IUnknown == riid)
- || (IID_IDispatch == riid)
- || (IID_IVLCLog == riid) )
- {
- AddRef();
- *ppv = reinterpret_cast<LPVOID>(this);
- return NOERROR;
- }
- // behaves as a standalone object
- return E_NOINTERFACE;
- };
-
- STDMETHODIMP_(ULONG) AddRef(void) { return _p_instance->pUnkOuter->AddRef(); };
- STDMETHODIMP_(ULONG) Release(void) { return _p_instance->pUnkOuter->Release(); };
-
- // IDispatch methods
- STDMETHODIMP GetTypeInfoCount(UINT*);
- STDMETHODIMP GetTypeInfo(UINT, LCID, LPTYPEINFO*);
- STDMETHODIMP GetIDsOfNames(REFIID,LPOLESTR*,UINT,LCID,DISPID*);
- STDMETHODIMP Invoke(DISPID,REFIID,LCID,WORD,DISPPARAMS*,VARIANT*,EXCEPINFO*,UINT*);
-
- // IVLCLog methods
- STDMETHODIMP get_messages(IVLCMessages**);
- STDMETHODIMP get_verbosity(long *);
- STDMETHODIMP put_verbosity(long);
-
-protected:
- HRESULT loadTypeInfo();
- HRESULT exception_bridge(libvlc_exception_t *ex);
-
- libvlc_log_t *_p_log;
-
-private:
- VLCPlugin* _p_instance;
- ITypeInfo* _p_typeinfo;
-
- VLCMessages* _p_vlcmessages;
+ // IVLCInput methods
+ STDMETHODIMP get_length(double*);
+ STDMETHODIMP get_position(double*);
+ STDMETHODIMP put_position(double);
+ STDMETHODIMP get_time(double*);
+ STDMETHODIMP put_time(double);
+ STDMETHODIMP get_state(long*);
+ STDMETHODIMP get_rate(double*);
+ STDMETHODIMP put_rate(double);
+ STDMETHODIMP get_fps(double*);
+ STDMETHODIMP get_hasVout(VARIANT_BOOL*);
};
-class VLCMarquee : public IVLCMarquee
+class VLCMarquee: public VLCInterface<VLCMarquee,IVLCMarquee>
{
public:
- VLCMarquee(VLCPlugin *p_instance) :
- _p_instance(p_instance), _p_typeinfo(NULL) {};
- virtual ~VLCMarquee();
-
- // IUnknown methods
- STDMETHODIMP QueryInterface(REFIID riid, void **ppv)
- {
- if( NULL == ppv )
- return E_POINTER;
- if( (IID_IUnknown == riid)
- || (IID_IDispatch == riid)
- || (IID_IVLCMarquee == riid) )
- {
- AddRef();
- *ppv = reinterpret_cast<LPVOID>(this);
- return NOERROR;
- }
- // behaves as a standalone object
- return E_NOINTERFACE;
- };
-
- STDMETHODIMP_(ULONG) AddRef(void) { return _p_instance->pUnkOuter->AddRef(); };
- STDMETHODIMP_(ULONG) Release(void) { return _p_instance->pUnkOuter->Release(); };
-
- // IDispatch methods
- STDMETHODIMP GetTypeInfoCount(UINT*);
- STDMETHODIMP GetTypeInfo(UINT, LCID, LPTYPEINFO*);
- STDMETHODIMP GetIDsOfNames(REFIID,LPOLESTR*,UINT,LCID,DISPID*);
- STDMETHODIMP Invoke(DISPID,REFIID,LCID,WORD,DISPPARAMS*,VARIANT*,EXCEPINFO*,UINT*);
+ VLCMarquee(VLCPlugin *p): VLCInterface<VLCMarquee,IVLCMarquee>(p) { }
// IVLCMarquee methods
STDMETHODIMP enable() { return do_put_int(libvlc_marquee_Enable, true); }
#undef PROP_INT
-protected:
- HRESULT loadTypeInfo();
- HRESULT exception_bridge(libvlc_exception_t *ex);
private:
- VLCPlugin* _p_instance;
- ITypeInfo* _p_typeinfo;
-
HRESULT do_put_int(unsigned idx, LONG val);
HRESULT do_get_int(unsigned idx, LONG *val);
};
-
-class VLCLogo : public IVLCLogo
+class VLCLogo: public VLCInterface<VLCLogo,IVLCLogo>
{
public:
- VLCLogo(VLCPlugin *p): _p_instance(p), _p_typeinfo(NULL) { }
- virtual ~VLCLogo() { if( _p_typeinfo ) _p_typeinfo->Release(); }
-
- // IUnknown methods
- STDMETHODIMP QueryInterface(REFIID riid, void **ppv)
- {
- if( NULL == ppv )
- return E_POINTER;
- if( (IID_IUnknown == riid)
- || (IID_IDispatch == riid)
- || (IID_IVLCLogo == riid) )
- {
- AddRef();
- *ppv = reinterpret_cast<LPVOID>(this);
- return NOERROR;
- }
- // behaves as a standalone object
- return E_NOINTERFACE;
- };
-
- STDMETHODIMP_(ULONG) AddRef(void) { return _p_instance->pUnkOuter->AddRef(); }
- STDMETHODIMP_(ULONG) Release(void) { return _p_instance->pUnkOuter->Release(); }
-
- // IDispatch methods
- STDMETHODIMP GetTypeInfoCount(UINT*);
- STDMETHODIMP GetTypeInfo(UINT, LCID, LPTYPEINFO*);
- STDMETHODIMP GetIDsOfNames(REFIID,LPOLESTR*,UINT,LCID,DISPID*);
- STDMETHODIMP Invoke(DISPID,REFIID,LCID,WORD,DISPPARAMS*,VARIANT*,EXCEPINFO*,UINT*);
+ VLCLogo(VLCPlugin *p): VLCInterface<VLCLogo,IVLCLogo>(p) { }
STDMETHODIMP enable() { return do_put_int(libvlc_logo_enable, true); }
STDMETHODIMP disable() { return do_put_int(libvlc_logo_enable, false); }
STDMETHODIMP get_position(BSTR* val);
STDMETHODIMP put_position(BSTR val);
-protected:
- HRESULT loadTypeInfo();
- HRESULT exception_bridge(libvlc_exception_t *ex);
-
private:
- VLCPlugin* _p_instance;
- ITypeInfo* _p_typeinfo;
-
HRESULT do_put_int(unsigned idx, LONG val);
HRESULT do_get_int(unsigned idx, LONG *val);
};
-class VLCPlaylistItems : public IVLCPlaylistItems
+class VLCDeinterlace: public VLCInterface<VLCDeinterlace,IVLCDeinterlace>
{
public:
- VLCPlaylistItems(VLCPlugin *p_instance) :
- _p_instance(p_instance), _p_typeinfo(NULL) {};
- virtual ~VLCPlaylistItems();
+ VLCDeinterlace(VLCPlugin *p):
+ VLCInterface<VLCDeinterlace,IVLCDeinterlace>(p) { }
- // IUnknown methods
- STDMETHODIMP QueryInterface(REFIID riid, void **ppv)
- {
- if( NULL == ppv )
- return E_POINTER;
- if( (IID_IUnknown == riid)
- || (IID_IDispatch == riid)
- || (IID_IVLCPlaylistItems == riid) )
- {
- AddRef();
- *ppv = reinterpret_cast<LPVOID>(this);
- return NOERROR;
- }
- // behaves as a standalone object
- return E_NOINTERFACE;
- };
-
- STDMETHODIMP_(ULONG) AddRef(void) { return _p_instance->pUnkOuter->AddRef(); };
- STDMETHODIMP_(ULONG) Release(void) { return _p_instance->pUnkOuter->Release(); };
+ STDMETHODIMP enable(BSTR val);
+ STDMETHODIMP disable();
+};
- // IDispatch methods
- STDMETHODIMP GetTypeInfoCount(UINT*);
- STDMETHODIMP GetTypeInfo(UINT, LCID, LPTYPEINFO*);
- STDMETHODIMP GetIDsOfNames(REFIID,LPOLESTR*,UINT,LCID,DISPID*);
- STDMETHODIMP Invoke(DISPID,REFIID,LCID,WORD,DISPPARAMS*,VARIANT*,EXCEPINFO*,UINT*);
+class VLCPlaylistItems: public VLCInterface<VLCPlaylistItems,IVLCPlaylistItems>
+{
+public:
+ VLCPlaylistItems(VLCPlugin *p):
+ VLCInterface<VLCPlaylistItems,IVLCPlaylistItems>(p) { }
// IVLCPlaylistItems methods
STDMETHODIMP get_count(long*);
STDMETHODIMP clear();
STDMETHODIMP remove(long);
-
-protected:
- HRESULT loadTypeInfo();
- HRESULT exception_bridge(libvlc_exception_t *ex);
-
-private:
- VLCPlugin* _p_instance;
- ITypeInfo* _p_typeinfo;
-
};
-class VLCPlaylist : public IVLCPlaylist
+class VLCPlaylist: public VLCInterface<VLCPlaylist,IVLCPlaylist>
{
public:
- VLCPlaylist(VLCPlugin *p_instance) :
- _p_instance(p_instance),
- _p_typeinfo(NULL),
- _p_vlcplaylistitems(NULL)
- {
- _p_vlcplaylistitems = new VLCPlaylistItems(p_instance);
- };
- virtual ~VLCPlaylist();
-
- // IUnknown methods
- STDMETHODIMP QueryInterface(REFIID riid, void **ppv)
- {
- if( NULL == ppv )
- return E_POINTER;
- if( (IID_IUnknown == riid)
- || (IID_IDispatch == riid)
- || (IID_IVLCPlaylist == riid) )
- {
- AddRef();
- *ppv = reinterpret_cast<LPVOID>(this);
- return NOERROR;
- }
- // behaves as a standalone object
- return E_NOINTERFACE;
- };
-
- STDMETHODIMP_(ULONG) AddRef(void) { return _p_instance->pUnkOuter->AddRef(); };
- STDMETHODIMP_(ULONG) Release(void) { return _p_instance->pUnkOuter->Release(); };
-
- // IDispatch methods
- STDMETHODIMP GetTypeInfoCount(UINT*);
- STDMETHODIMP GetTypeInfo(UINT, LCID, LPTYPEINFO*);
- STDMETHODIMP GetIDsOfNames(REFIID,LPOLESTR*,UINT,LCID,DISPID*);
- STDMETHODIMP Invoke(DISPID,REFIID,LCID,WORD,DISPPARAMS*,VARIANT*,EXCEPINFO*,UINT*);
+ VLCPlaylist(VLCPlugin *p):
+ VLCInterface<VLCPlaylist,IVLCPlaylist>(p),
+ _p_vlcplaylistitems(new VLCPlaylistItems(p)) { }
+ virtual ~VLCPlaylist() { delete _p_vlcplaylistitems; }
// IVLCPlaylist methods
STDMETHODIMP get_itemCount(long*);
STDMETHODIMP removeItem(long);
STDMETHODIMP get_items(IVLCPlaylistItems**);
-protected:
- HRESULT loadTypeInfo();
- HRESULT exception_bridge(libvlc_exception_t *ex);
-
private:
- VLCPlugin* _p_instance;
- ITypeInfo* _p_typeinfo;
-
VLCPlaylistItems* _p_vlcplaylistitems;
};
-class VLCSubtitle : public IVLCSubtitle
+class VLCSubtitle: public VLCInterface<VLCSubtitle,IVLCSubtitle>
{
public:
- VLCSubtitle(VLCPlugin *p_instance) :
- _p_instance(p_instance), _p_typeinfo(NULL) {};
- virtual ~VLCSubtitle();
-
- // IUnknown methods
- STDMETHODIMP QueryInterface(REFIID riid, void **ppv)
- {
- if( NULL == ppv )
- return E_POINTER;
- if( (IID_IUnknown == riid)
- || (IID_IDispatch == riid)
- || (IID_IVLCSubtitle == riid) )
- {
- AddRef();
- *ppv = reinterpret_cast<LPVOID>(this);
- return NOERROR;
- }
- // behaves as a standalone object
- return E_NOINTERFACE;
- };
-
- STDMETHODIMP_(ULONG) AddRef(void) { return _p_instance->pUnkOuter->AddRef(); };
- STDMETHODIMP_(ULONG) Release(void) { return _p_instance->pUnkOuter->Release(); };
-
- // IDispatch methods
- STDMETHODIMP GetTypeInfoCount(UINT*);
- STDMETHODIMP GetTypeInfo(UINT, LCID, LPTYPEINFO*);
- STDMETHODIMP GetIDsOfNames(REFIID,LPOLESTR*,UINT,LCID,DISPID*);
- STDMETHODIMP Invoke(DISPID,REFIID,LCID,WORD,DISPPARAMS*,VARIANT*,EXCEPINFO*,UINT*);
+ VLCSubtitle(VLCPlugin *p): VLCInterface<VLCSubtitle,IVLCSubtitle>(p) { }
// IVLCSubtitle methods
STDMETHODIMP get_track(long*);
STDMETHODIMP put_track(long);
STDMETHODIMP get_count(long*);
STDMETHODIMP description(long, BSTR*);
-
-protected:
- HRESULT loadTypeInfo();
- HRESULT exception_bridge(libvlc_exception_t *ex);
-
-private:
- VLCPlugin* _p_instance;
- ITypeInfo* _p_typeinfo;
-
};
-class VLCVideo : public IVLCVideo
+class VLCVideo: public VLCInterface<VLCVideo,IVLCVideo>
{
public:
- VLCVideo(VLCPlugin *p_instance) :
- _p_instance(p_instance),
- _p_typeinfo(NULL),
- _p_vlcmarquee(new VLCMarquee(p_instance)),
- _p_vlclogo(new VLCLogo(p_instance)) { }
- virtual ~VLCVideo();
-
- // IUnknown methods
- STDMETHODIMP QueryInterface(REFIID riid, void **ppv)
- {
- if( NULL == ppv )
- return E_POINTER;
- if( (IID_IUnknown == riid)
- || (IID_IDispatch == riid)
- || (IID_IVLCVideo == riid) )
- {
- AddRef();
- *ppv = reinterpret_cast<LPVOID>(this);
- return NOERROR;
- }
- // behaves as a standalone object
- return E_NOINTERFACE;
- };
-
- STDMETHODIMP_(ULONG) AddRef(void) { return _p_instance->pUnkOuter->AddRef(); };
- STDMETHODIMP_(ULONG) Release(void) { return _p_instance->pUnkOuter->Release(); };
-
- // IDispatch methods
- STDMETHODIMP GetTypeInfoCount(UINT*);
- STDMETHODIMP GetTypeInfo(UINT, LCID, LPTYPEINFO*);
- STDMETHODIMP GetIDsOfNames(REFIID,LPOLESTR*,UINT,LCID,DISPID*);
- STDMETHODIMP Invoke(DISPID,REFIID,LCID,WORD,DISPPARAMS*,VARIANT*,EXCEPINFO*,UINT*);
+ VLCVideo(VLCPlugin *p): VLCInterface<VLCVideo,IVLCVideo>(p),
+ _p_vlcmarquee(new VLCMarquee(p)), _p_vlclogo(new VLCLogo(p)),
+ _p_vlcdeint(new VLCDeinterlace(p)) { }
+ virtual ~VLCVideo() {
+ delete _p_vlcmarquee;
+ delete _p_vlclogo;
+ delete _p_vlcdeint;
+ }
// IVLCVideo methods
STDMETHODIMP get_fullscreen(VARIANT_BOOL*);
STDMETHODIMP put_teletext(long);
STDMETHODIMP get_marquee(IVLCMarquee**);
STDMETHODIMP get_logo(IVLCLogo**);
- STDMETHODIMP deinterlaceDisable();
- STDMETHODIMP deinterlaceEnable(BSTR);
+ STDMETHODIMP get_deinterlace(IVLCDeinterlace**);
STDMETHODIMP takeSnapshot(LPPICTUREDISP*);
STDMETHODIMP toggleFullscreen();
STDMETHODIMP toggleTeletext();
-protected:
- HRESULT loadTypeInfo();
- HRESULT exception_bridge(libvlc_exception_t *ex);
-
private:
- VLCPlugin* _p_instance;
- ITypeInfo* _p_typeinfo;
- VLCMarquee* _p_vlcmarquee;
- VLCLogo* _p_vlclogo;
+ IVLCMarquee *_p_vlcmarquee;
+ IVLCLogo *_p_vlclogo;
+ IVLCDeinterlace *_p_vlcdeint;
};
class VLCControl2 : public IVLCControl2
STDMETHODIMP get_audio(IVLCAudio**);
STDMETHODIMP get_input(IVLCInput**);
- STDMETHODIMP get_log(IVLCLog**);
STDMETHODIMP get_playlist(IVLCPlaylist**);
STDMETHODIMP get_subtitle(IVLCSubtitle**);
STDMETHODIMP get_video(IVLCVideo**);
HRESULT loadTypeInfo();
private:
- VLCPlugin* _p_instance;
- ITypeInfo* _p_typeinfo;
-
- VLCAudio* _p_vlcaudio;
- VLCInput* _p_vlcinput;
- VLCLog * _p_vlclog;
- VLCPlaylist* _p_vlcplaylist;
- VLCSubtitle* _p_vlcsubtitle;
- VLCVideo* _p_vlcvideo;
+ VLCPlugin *_p_instance;
+ ITypeInfo *_p_typeinfo;
+
+ IVLCAudio *_p_vlcaudio;
+ IVLCInput *_p_vlcinput;
+ IVLCPlaylist *_p_vlcplaylist;
+ IVLCSubtitle *_p_vlcsubtitle;
+ IVLCVideo *_p_vlcvideo;
};
#endif