X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=activex%2Fvlccontrol2.cpp;h=39a789df2c5b4092626856a20092cecc7ce60356;hb=232de8ce8d78d6b53465b171863a92f3dcbfc336;hp=d60e71266de8ed15fc3174788c5d20e433a0f520;hpb=2dfa55bd53357dc8bfcb6c94ec9a204dc9d3fe65;p=vlc diff --git a/activex/vlccontrol2.cpp b/activex/vlccontrol2.cpp index d60e71266d..39a789df2c 100644 --- a/activex/vlccontrol2.cpp +++ b/activex/vlccontrol2.cpp @@ -29,6 +29,7 @@ #include #include +#include using namespace std; @@ -87,7 +88,7 @@ STDMETHODIMP VLCAudio::GetTypeInfo(UINT iTInfo, LCID lcid, LPTYPEINFO* ppTInfo) return E_NOTIMPL; }; -STDMETHODIMP VLCAudio::GetIDsOfNames(REFIID riid, LPOLESTR* rgszNames, +STDMETHODIMP VLCAudio::GetIDsOfNames(REFIID riid, LPOLESTR* rgszNames, UINT cNames, LCID lcid, DISPID* rgDispID) { if( SUCCEEDED(loadTypeInfo()) ) @@ -190,7 +191,8 @@ STDMETHODIMP VLCAudio::put_volume(long volume) libvlc_audio_set_volume(p_libvlc, volume, &ex); if( libvlc_exception_raised(&ex) ) { - _p_instance->setErrorInfo(IID_IVLCAudio, libvlc_exception_get_message(&ex)); + _p_instance->setErrorInfo(IID_IVLCAudio, + libvlc_exception_get_message(&ex)); libvlc_exception_clear(&ex); return E_FAIL; } @@ -211,12 +213,13 @@ STDMETHODIMP VLCAudio::get_track(long* track) libvlc_exception_t ex; libvlc_exception_init(&ex); - libvlc_input_t *p_input = libvlc_playlist_get_input(p_libvlc, &ex); - *track = libvlc_audio_get_track(p_input, &ex); - libvlc_input_free(p_input); + libvlc_media_instance_t *p_md = libvlc_playlist_get_media_instance(p_libvlc, &ex); + *track = libvlc_audio_get_track(p_md, &ex); + libvlc_media_instance_release(p_md); if( libvlc_exception_raised(&ex) ) { - _p_instance->setErrorInfo(IID_IVLCAudio, libvlc_exception_get_message(&ex)); + _p_instance->setErrorInfo(IID_IVLCAudio, + libvlc_exception_get_message(&ex)); libvlc_exception_clear(&ex); return E_FAIL; } @@ -234,12 +237,13 @@ STDMETHODIMP VLCAudio::put_track(long track) libvlc_exception_t ex; libvlc_exception_init(&ex); - libvlc_input_t *p_input = libvlc_playlist_get_input(p_libvlc, &ex); - libvlc_audio_set_track(p_input, track, &ex); - libvlc_input_free(p_input); + libvlc_media_instance_t *p_md = libvlc_playlist_get_media_instance(p_libvlc, &ex); + libvlc_audio_set_track(p_md, track, &ex); + libvlc_media_instance_release(p_md); if( libvlc_exception_raised(&ex) ) { - _p_instance->setErrorInfo(IID_IVLCAudio, libvlc_exception_get_message(&ex)); + _p_instance->setErrorInfo(IID_IVLCAudio, + libvlc_exception_get_message(&ex)); libvlc_exception_clear(&ex); return E_FAIL; } @@ -248,7 +252,7 @@ STDMETHODIMP VLCAudio::put_track(long track) return hr; }; -STDMETHODIMP VLCAudio::get_channel(BSTR *channel) +STDMETHODIMP VLCAudio::get_channel(long *channel) { if( NULL == channel ) return E_POINTER; @@ -257,53 +261,32 @@ STDMETHODIMP VLCAudio::get_channel(BSTR *channel) HRESULT hr = _p_instance->getVLC(&p_libvlc); if( SUCCEEDED(hr) ) { - char *psz_channel = NULL; libvlc_exception_t ex; libvlc_exception_init(&ex); - psz_channel = libvlc_audio_get_channel(p_libvlc, &ex); - if( ! libvlc_exception_raised(&ex) ) + *channel = libvlc_audio_get_channel(p_libvlc, &ex); + if( libvlc_exception_raised(&ex) ) { - if( NULL == psz_channel ) - return E_OUTOFMEMORY; - - *channel = BSTRFromCStr(CP_UTF8, psz_channel); - free( psz_channel ); - psz_channel = NULL; - return (NULL == *channel) ? E_OUTOFMEMORY : NOERROR; + _p_instance->setErrorInfo(IID_IVLCAudio, + libvlc_exception_get_message(&ex)); + libvlc_exception_clear(&ex); + return E_FAIL; } - if( psz_channel ) free( psz_channel ); - psz_channel = NULL; - _p_instance->setErrorInfo(IID_IVLCAudio, - libvlc_exception_get_message(&ex)); - libvlc_exception_clear(&ex); - return E_FAIL; + return NOERROR; } return hr; }; -STDMETHODIMP VLCAudio::put_channel(BSTR channel) +STDMETHODIMP VLCAudio::put_channel(long channel) { - if( NULL == channel ) - return E_POINTER; - - if( 0 == SysStringLen(channel) ) - return E_INVALIDARG; - libvlc_instance_t* p_libvlc; HRESULT hr = _p_instance->getVLC(&p_libvlc); if( SUCCEEDED(hr) ) { - char *psz_channel = NULL; libvlc_exception_t ex; libvlc_exception_init(&ex); - psz_channel = CStrFromBSTR(CP_UTF8, channel); - if( NULL == psz_channel ) - return E_OUTOFMEMORY; - - libvlc_audio_set_channel(p_libvlc, psz_channel, &ex); - CoTaskMemFree(psz_channel); + libvlc_audio_set_channel(p_libvlc, channel, &ex); if( libvlc_exception_raised(&ex) ) { _p_instance->setErrorInfo(IID_IVLCAudio, @@ -328,7 +311,8 @@ STDMETHODIMP VLCAudio::toggleMute() libvlc_audio_toggle_mute(p_libvlc, &ex); if( libvlc_exception_raised(&ex) ) { - _p_instance->setErrorInfo(IID_IVLCAudio, libvlc_exception_get_message(&ex)); + _p_instance->setErrorInfo(IID_IVLCAudio, + libvlc_exception_get_message(&ex)); libvlc_exception_clear(&ex); return E_FAIL; } @@ -394,7 +378,7 @@ STDMETHODIMP VLCInput::GetTypeInfo(UINT iTInfo, LCID lcid, LPTYPEINFO* ppTInfo) return E_NOTIMPL; }; -STDMETHODIMP VLCInput::GetIDsOfNames(REFIID riid, LPOLESTR* rgszNames, +STDMETHODIMP VLCInput::GetIDsOfNames(REFIID riid, LPOLESTR* rgszNames, UINT cNames, LCID lcid, DISPID* rgDispID) { if( SUCCEEDED(loadTypeInfo()) ) @@ -428,11 +412,11 @@ STDMETHODIMP VLCInput::get_length(double* length) libvlc_exception_t ex; libvlc_exception_init(&ex); - libvlc_input_t *p_input = libvlc_playlist_get_input(p_libvlc, &ex); + libvlc_media_instance_t *p_md = libvlc_playlist_get_media_instance(p_libvlc, &ex); if( ! libvlc_exception_raised(&ex) ) { - *length = (double)libvlc_input_get_length(p_input, &ex); - libvlc_input_free(p_input); + *length = (double)libvlc_media_instance_get_length(p_md, &ex); + libvlc_media_instance_release(p_md); if( ! libvlc_exception_raised(&ex) ) { return NOERROR; @@ -457,11 +441,11 @@ STDMETHODIMP VLCInput::get_position(double* position) libvlc_exception_t ex; libvlc_exception_init(&ex); - libvlc_input_t *p_input = libvlc_playlist_get_input(p_libvlc, &ex); + libvlc_media_instance_t *p_md = libvlc_playlist_get_media_instance(p_libvlc, &ex); if( ! libvlc_exception_raised(&ex) ) { - *position = libvlc_input_get_position(p_input, &ex); - libvlc_input_free(p_input); + *position = libvlc_media_instance_get_position(p_md, &ex); + libvlc_media_instance_release(p_md); if( ! libvlc_exception_raised(&ex) ) { return NOERROR; @@ -483,11 +467,11 @@ STDMETHODIMP VLCInput::put_position(double position) libvlc_exception_t ex; libvlc_exception_init(&ex); - libvlc_input_t *p_input = libvlc_playlist_get_input(p_libvlc, &ex); + libvlc_media_instance_t *p_md = libvlc_playlist_get_media_instance(p_libvlc, &ex); if( ! libvlc_exception_raised(&ex) ) { - libvlc_input_set_position(p_input, position, &ex); - libvlc_input_free(p_input); + libvlc_media_instance_set_position(p_md, position, &ex); + libvlc_media_instance_release(p_md); if( ! libvlc_exception_raised(&ex) ) { return NOERROR; @@ -512,11 +496,11 @@ STDMETHODIMP VLCInput::get_time(double* time) libvlc_exception_t ex; libvlc_exception_init(&ex); - libvlc_input_t *p_input = libvlc_playlist_get_input(p_libvlc, &ex); + libvlc_media_instance_t *p_md = libvlc_playlist_get_media_instance(p_libvlc, &ex); if( ! libvlc_exception_raised(&ex) ) { - *time = (double)libvlc_input_get_time(p_input, &ex); - libvlc_input_free(p_input); + *time = (double)libvlc_media_instance_get_time(p_md, &ex); + libvlc_media_instance_release(p_md); if( ! libvlc_exception_raised(&ex) ) { return NOERROR; @@ -538,11 +522,11 @@ STDMETHODIMP VLCInput::put_time(double time) libvlc_exception_t ex; libvlc_exception_init(&ex); - libvlc_input_t *p_input = libvlc_playlist_get_input(p_libvlc, &ex); + libvlc_media_instance_t *p_md = libvlc_playlist_get_media_instance(p_libvlc, &ex); if( ! libvlc_exception_raised(&ex) ) { - libvlc_input_set_time(p_input, (vlc_int64_t)time, &ex); - libvlc_input_free(p_input); + libvlc_media_instance_set_time(p_md, (vlc_int64_t)time, &ex); + libvlc_media_instance_release(p_md); if( ! libvlc_exception_raised(&ex) ) { return NOERROR; @@ -567,11 +551,11 @@ STDMETHODIMP VLCInput::get_state(long* state) libvlc_exception_t ex; libvlc_exception_init(&ex); - libvlc_input_t *p_input = libvlc_playlist_get_input(p_libvlc, &ex); + libvlc_media_instance_t *p_md = libvlc_playlist_get_media_instance(p_libvlc, &ex); if( ! libvlc_exception_raised(&ex) ) { - *state = libvlc_input_get_state(p_input, &ex); - libvlc_input_free(p_input); + *state = libvlc_media_instance_get_state(p_md, &ex); + libvlc_media_instance_release(p_md); if( ! libvlc_exception_raised(&ex) ) { return NOERROR; @@ -597,11 +581,11 @@ STDMETHODIMP VLCInput::get_rate(double* rate) libvlc_exception_t ex; libvlc_exception_init(&ex); - libvlc_input_t *p_input = libvlc_playlist_get_input(p_libvlc, &ex); + libvlc_media_instance_t *p_md = libvlc_playlist_get_media_instance(p_libvlc, &ex); if( ! libvlc_exception_raised(&ex) ) { - *rate = libvlc_input_get_rate(p_input, &ex); - libvlc_input_free(p_input); + *rate = libvlc_media_instance_get_rate(p_md, &ex); + libvlc_media_instance_release(p_md); if( ! libvlc_exception_raised(&ex) ) { return NOERROR; @@ -623,11 +607,11 @@ STDMETHODIMP VLCInput::put_rate(double rate) libvlc_exception_t ex; libvlc_exception_init(&ex); - libvlc_input_t *p_input = libvlc_playlist_get_input(p_libvlc, &ex); + libvlc_media_instance_t *p_md = libvlc_playlist_get_media_instance(p_libvlc, &ex); if( ! libvlc_exception_raised(&ex) ) { - libvlc_input_set_rate(p_input, rate, &ex); - libvlc_input_free(p_input); + libvlc_media_instance_set_rate(p_md, rate, &ex); + libvlc_media_instance_release(p_md); if( ! libvlc_exception_raised(&ex) ) { return NOERROR; @@ -645,6 +629,7 @@ STDMETHODIMP VLCInput::get_fps(double* fps) if( NULL == fps ) return E_POINTER; + *fps = 0.0; libvlc_instance_t* p_libvlc; HRESULT hr = _p_instance->getVLC(&p_libvlc); if( SUCCEEDED(hr) ) @@ -652,11 +637,11 @@ STDMETHODIMP VLCInput::get_fps(double* fps) libvlc_exception_t ex; libvlc_exception_init(&ex); - libvlc_input_t *p_input = libvlc_playlist_get_input(p_libvlc, &ex); + libvlc_media_instance_t *p_md = libvlc_playlist_get_media_instance(p_libvlc, &ex); if( ! libvlc_exception_raised(&ex) ) { - *fps = libvlc_input_get_fps(p_input, &ex); - libvlc_input_free(p_input); + *fps = libvlc_media_instance_get_fps(p_md, &ex); + libvlc_media_instance_release(p_md); if( ! libvlc_exception_raised(&ex) ) { return NOERROR; @@ -681,11 +666,11 @@ STDMETHODIMP VLCInput::get_hasVout(VARIANT_BOOL* hasVout) libvlc_exception_t ex; libvlc_exception_init(&ex); - libvlc_input_t *p_input = libvlc_playlist_get_input(p_libvlc, &ex); + libvlc_media_instance_t *p_md = libvlc_playlist_get_media_instance(p_libvlc, &ex); if( ! libvlc_exception_raised(&ex) ) { - *hasVout = libvlc_input_has_vout(p_input, &ex) ? VARIANT_TRUE : VARIANT_FALSE; - libvlc_input_free(p_input); + *hasVout = libvlc_media_instance_has_vout(p_md, &ex) ? VARIANT_TRUE : VARIANT_FALSE; + libvlc_media_instance_release(p_md); if( ! libvlc_exception_raised(&ex) ) { return NOERROR; @@ -759,7 +744,7 @@ STDMETHODIMP VLCLog::GetTypeInfo(UINT iTInfo, LCID lcid, LPTYPEINFO* ppTInfo) return E_NOTIMPL; }; -STDMETHODIMP VLCLog::GetIDsOfNames(REFIID riid, LPOLESTR* rgszNames, +STDMETHODIMP VLCLog::GetIDsOfNames(REFIID riid, LPOLESTR* rgszNames, UINT cNames, LCID lcid, DISPID* rgDispID) { if( SUCCEEDED(loadTypeInfo()) ) @@ -874,6 +859,89 @@ STDMETHODIMP VLCLog::put_verbosity(long verbosity) /*******************************************************************************/ +/* STL forward iterator used by VLCEnumIterator class to implement IEnumVARIANT */ + +class VLCMessageSTLIterator +{ + +public: + + VLCMessageSTLIterator(IVLCMessageIterator* iter) : iter(iter), msg(NULL) + { + // get first message + operator++(); + }; + + VLCMessageSTLIterator(const VLCMessageSTLIterator& other) + { + iter = other.iter; + if( iter ) + iter->AddRef(); + msg = other.msg; + if( msg ) + msg->AddRef(); + }; + + virtual ~VLCMessageSTLIterator() + { + if( msg ) + msg->Release(); + + if( iter ) + iter->Release(); + }; + + // we only need prefix ++ operator + VLCMessageSTLIterator& operator++() + { + VARIANT_BOOL hasNext = VARIANT_FALSE; + if( iter ) + { + iter->get_hasNext(&hasNext); + + if( msg ) + { + msg->Release(); + msg = NULL; + } + if( VARIANT_TRUE == hasNext ) { + iter->next(&msg); + } + } + return *this; + }; + + VARIANT operator*() const + { + VARIANT v; + VariantInit(&v); + if( msg ) + { + if( SUCCEEDED(msg->QueryInterface(IID_IDispatch, (LPVOID*)&V_DISPATCH(&v))) ) + { + V_VT(&v) = VT_DISPATCH; + } + } + return v; + }; + + bool operator==(const VLCMessageSTLIterator& other) const + { + return msg == other.msg; + }; + + bool operator!=(const VLCMessageSTLIterator& other) const + { + return msg != other.msg; + }; + +private: + IVLCMessageIterator* iter; + IVLCMessage* msg; +}; + +//////////////////////////////////////////////////////////////////////////////////////////////////////////// + VLCMessages::~VLCMessages() { if( _p_typeinfo ) @@ -929,7 +997,7 @@ STDMETHODIMP VLCMessages::GetTypeInfo(UINT iTInfo, LCID lcid, LPTYPEINFO* ppTInf return E_NOTIMPL; }; -STDMETHODIMP VLCMessages::GetIDsOfNames(REFIID riid, LPOLESTR* rgszNames, +STDMETHODIMP VLCMessages::GetIDsOfNames(REFIID riid, LPOLESTR* rgszNames, UINT cNames, LCID lcid, DISPID* rgDispID) { if( SUCCEEDED(loadTypeInfo()) ) @@ -956,9 +1024,16 @@ STDMETHODIMP VLCMessages::get__NewEnum(LPUNKNOWN* _NewEnum) if( NULL == _NewEnum ) return E_POINTER; - // TODO - *_NewEnum = NULL; - return E_NOTIMPL; + IVLCMessageIterator* iter = NULL; + iterator(&iter); + + *_NewEnum= new VLCEnumIterator + (VLCMessageSTLIterator(iter), VLCMessageSTLIterator(NULL)); + + return *_NewEnum ? S_OK : E_OUTOFMEMORY; }; STDMETHODIMP VLCMessages::clear() @@ -1088,7 +1163,7 @@ STDMETHODIMP VLCMessageIterator::GetTypeInfo(UINT iTInfo, LCID lcid, LPTYPEINFO* return E_NOTIMPL; }; -STDMETHODIMP VLCMessageIterator::GetIDsOfNames(REFIID riid, LPOLESTR* rgszNames, +STDMETHODIMP VLCMessageIterator::GetIDsOfNames(REFIID riid, LPOLESTR* rgszNames, UINT cNames, LCID lcid, DISPID* rgDispID) { if( SUCCEEDED(loadTypeInfo()) ) @@ -1219,7 +1294,7 @@ STDMETHODIMP VLCMessage::GetTypeInfo(UINT iTInfo, LCID lcid, LPTYPEINFO* ppTInfo return E_NOTIMPL; }; -STDMETHODIMP VLCMessage::GetIDsOfNames(REFIID riid, LPOLESTR* rgszNames, +STDMETHODIMP VLCMessage::GetIDsOfNames(REFIID riid, LPOLESTR* rgszNames, UINT cNames, LCID lcid, DISPID* rgDispID) { if( SUCCEEDED(loadTypeInfo()) ) @@ -1379,7 +1454,7 @@ STDMETHODIMP VLCPlaylistItems::GetTypeInfo(UINT iTInfo, LCID lcid, LPTYPEINFO* p return E_NOTIMPL; }; -STDMETHODIMP VLCPlaylistItems::GetIDsOfNames(REFIID riid, LPOLESTR* rgszNames, +STDMETHODIMP VLCPlaylistItems::GetIDsOfNames(REFIID riid, LPOLESTR* rgszNames, UINT cNames, LCID lcid, DISPID* rgDispID) { if( SUCCEEDED(loadTypeInfo()) ) @@ -1528,7 +1603,7 @@ STDMETHODIMP VLCPlaylist::GetTypeInfo(UINT iTInfo, LCID lcid, LPTYPEINFO* ppTInf return E_NOTIMPL; }; -STDMETHODIMP VLCPlaylist::GetIDsOfNames(REFIID riid, LPOLESTR* rgszNames, +STDMETHODIMP VLCPlaylist::GetIDsOfNames(REFIID riid, LPOLESTR* rgszNames, UINT cNames, LCID lcid, DISPID* rgDispID) { if( SUCCEEDED(loadTypeInfo()) ) @@ -1667,11 +1742,11 @@ STDMETHODIMP VLCPlaylist::add(BSTR uri, VARIANT name, VARIANT options, long* ite } *item = libvlc_playlist_add_extended(p_libvlc, - psz_uri, - psz_name, - i_options, - const_cast(ppsz_options), - &ex); + psz_uri, + psz_name, + i_options, + const_cast(ppsz_options), + &ex); VLCControl::FreeTargetOptions(ppsz_options, i_options); CoTaskMemFree(psz_uri); @@ -1934,7 +2009,7 @@ STDMETHODIMP VLCVideo::GetTypeInfo(UINT iTInfo, LCID lcid, LPTYPEINFO* ppTInfo) return E_NOTIMPL; }; -STDMETHODIMP VLCVideo::GetIDsOfNames(REFIID riid, LPOLESTR* rgszNames, +STDMETHODIMP VLCVideo::GetIDsOfNames(REFIID riid, LPOLESTR* rgszNames, UINT cNames, LCID lcid, DISPID* rgDispID) { if( SUCCEEDED(loadTypeInfo()) ) @@ -1968,11 +2043,11 @@ STDMETHODIMP VLCVideo::get_fullscreen(VARIANT_BOOL* fullscreen) libvlc_exception_t ex; libvlc_exception_init(&ex); - libvlc_input_t *p_input = libvlc_playlist_get_input(p_libvlc, &ex); + libvlc_media_instance_t *p_md = libvlc_playlist_get_media_instance(p_libvlc, &ex); if( ! libvlc_exception_raised(&ex) ) { - *fullscreen = libvlc_get_fullscreen(p_input, &ex) ? VARIANT_TRUE : VARIANT_FALSE; - libvlc_input_free(p_input); + *fullscreen = libvlc_get_fullscreen(p_md, &ex) ? VARIANT_TRUE : VARIANT_FALSE; + libvlc_media_instance_release(p_md); if( ! libvlc_exception_raised(&ex) ) { return NOERROR; @@ -1994,11 +2069,11 @@ STDMETHODIMP VLCVideo::put_fullscreen(VARIANT_BOOL fullscreen) libvlc_exception_t ex; libvlc_exception_init(&ex); - libvlc_input_t *p_input = libvlc_playlist_get_input(p_libvlc, &ex); + libvlc_media_instance_t *p_md = libvlc_playlist_get_media_instance(p_libvlc, &ex); if( ! libvlc_exception_raised(&ex) ) { - libvlc_set_fullscreen(p_input, VARIANT_FALSE != fullscreen, &ex); - libvlc_input_free(p_input); + libvlc_set_fullscreen(p_md, VARIANT_FALSE != fullscreen, &ex); + libvlc_media_instance_release(p_md); if( ! libvlc_exception_raised(&ex) ) { return NOERROR; @@ -2023,11 +2098,11 @@ STDMETHODIMP VLCVideo::get_width(long* width) libvlc_exception_t ex; libvlc_exception_init(&ex); - libvlc_input_t *p_input = libvlc_playlist_get_input(p_libvlc, &ex); + libvlc_media_instance_t *p_md = libvlc_playlist_get_media_instance(p_libvlc, &ex); if( ! libvlc_exception_raised(&ex) ) { - *width = libvlc_video_get_width(p_input, &ex); - libvlc_input_free(p_input); + *width = libvlc_video_get_width(p_md, &ex); + libvlc_media_instance_release(p_md); if( ! libvlc_exception_raised(&ex) ) { return NOERROR; @@ -2052,11 +2127,11 @@ STDMETHODIMP VLCVideo::get_height(long* height) libvlc_exception_t ex; libvlc_exception_init(&ex); - libvlc_input_t *p_input = libvlc_playlist_get_input(p_libvlc, &ex); + libvlc_media_instance_t *p_md = libvlc_playlist_get_media_instance(p_libvlc, &ex); if( ! libvlc_exception_raised(&ex) ) { - *height = libvlc_video_get_height(p_input, &ex); - libvlc_input_free(p_input); + *height = libvlc_video_get_height(p_md, &ex); + libvlc_media_instance_release(p_md); if( ! libvlc_exception_raised(&ex) ) { return NOERROR; @@ -2081,12 +2156,12 @@ STDMETHODIMP VLCVideo::get_aspectRatio(BSTR* aspect) libvlc_exception_t ex; libvlc_exception_init(&ex); - libvlc_input_t *p_input = libvlc_playlist_get_input(p_libvlc, &ex); + libvlc_media_instance_t *p_md = libvlc_playlist_get_media_instance(p_libvlc, &ex); if( ! libvlc_exception_raised(&ex) ) { - char *psz_aspect = libvlc_video_get_aspect_ratio(p_input, &ex); + char *psz_aspect = libvlc_video_get_aspect_ratio(p_md, &ex); - libvlc_input_free(p_input); + libvlc_media_instance_release(p_md); if( ! libvlc_exception_raised(&ex) ) { if( NULL == psz_aspect ) @@ -2119,23 +2194,153 @@ STDMETHODIMP VLCVideo::put_aspectRatio(BSTR aspect) HRESULT hr = _p_instance->getVLC(&p_libvlc); if( SUCCEEDED(hr) ) { - char *psz_aspect = NULL; libvlc_exception_t ex; libvlc_exception_init(&ex); - libvlc_input_t *p_input = libvlc_playlist_get_input(p_libvlc, &ex); + libvlc_media_instance_t *p_md = libvlc_playlist_get_media_instance(p_libvlc, &ex); if( ! libvlc_exception_raised(&ex) ) { - psz_aspect = CStrFromBSTR(CP_UTF8, aspect); + char *psz_aspect = CStrFromBSTR(CP_UTF8, aspect); if( NULL == psz_aspect ) { return E_OUTOFMEMORY; } - libvlc_video_set_aspect_ratio(p_input, psz_aspect, &ex); + libvlc_video_set_aspect_ratio(p_md, psz_aspect, &ex); CoTaskMemFree(psz_aspect); - libvlc_input_free(p_input); + libvlc_media_instance_release(p_md); + if( libvlc_exception_raised(&ex) ) + { + _p_instance->setErrorInfo(IID_IVLCVideo, + libvlc_exception_get_message(&ex)); + libvlc_exception_clear(&ex); + return E_FAIL; + } + } + return NOERROR; + } + return hr; +}; + +STDMETHODIMP VLCVideo::get_subtitle(long* spu) +{ + if( NULL == spu ) + return E_POINTER; + + libvlc_instance_t* p_libvlc; + HRESULT hr = _p_instance->getVLC(&p_libvlc); + if( SUCCEEDED(hr) ) + { + libvlc_exception_t ex; + libvlc_exception_init(&ex); + + libvlc_media_instance_t *p_md = libvlc_playlist_get_media_instance(p_libvlc, &ex); + if( ! libvlc_exception_raised(&ex) ) + { + *spu = libvlc_video_get_spu(p_md, &ex); + libvlc_media_instance_release(p_md); + if( ! libvlc_exception_raised(&ex) ) + { + return NOERROR; + } + } + _p_instance->setErrorInfo(IID_IVLCVideo, libvlc_exception_get_message(&ex)); + libvlc_exception_clear(&ex); + return E_FAIL; + } + return hr; +}; + +STDMETHODIMP VLCVideo::put_subtitle(long spu) +{ + libvlc_instance_t* p_libvlc; + HRESULT hr = _p_instance->getVLC(&p_libvlc); + if( SUCCEEDED(hr) ) + { + libvlc_exception_t ex; + libvlc_exception_init(&ex); + + libvlc_media_instance_t *p_md = libvlc_playlist_get_media_instance(p_libvlc, &ex); + libvlc_video_set_spu(p_md, spu, &ex); + libvlc_media_instance_release(p_md); + if( libvlc_exception_raised(&ex) ) + { + _p_instance->setErrorInfo(IID_IVLCVideo, libvlc_exception_get_message(&ex)); + libvlc_exception_clear(&ex); + return E_FAIL; + } + return NOERROR; + } + return hr; +}; + +STDMETHODIMP VLCVideo::get_crop(BSTR* geometry) +{ + if( NULL == geometry ) + return E_POINTER; + + libvlc_instance_t* p_libvlc; + HRESULT hr = _p_instance->getVLC(&p_libvlc); + if( SUCCEEDED(hr) ) + { + libvlc_exception_t ex; + libvlc_exception_init(&ex); + + libvlc_media_instance_t *p_md = libvlc_playlist_get_media_instance(p_libvlc, &ex); + if( ! libvlc_exception_raised(&ex) ) + { + char *psz_geometry = libvlc_video_get_crop_geometry(p_md, &ex); + + libvlc_media_instance_release(p_md); + if( ! libvlc_exception_raised(&ex) ) + { + if( NULL == psz_geometry ) + return E_OUTOFMEMORY; + + *geometry = BSTRFromCStr(CP_UTF8, psz_geometry); + free( psz_geometry ); + psz_geometry = NULL; + return (NULL == geometry) ? E_OUTOFMEMORY : NOERROR; + } + if( psz_geometry ) free( psz_geometry ); + psz_geometry = NULL; + } + _p_instance->setErrorInfo(IID_IVLCVideo, libvlc_exception_get_message(&ex)); + libvlc_exception_clear(&ex); + return E_FAIL; + } + return hr; +}; + +STDMETHODIMP VLCVideo::put_crop(BSTR geometry) +{ + if( NULL == geometry ) + return E_POINTER; + + if( 0 == SysStringLen(geometry) ) + return E_INVALIDARG; + + libvlc_instance_t* p_libvlc; + HRESULT hr = _p_instance->getVLC(&p_libvlc); + if( SUCCEEDED(hr) ) + { + libvlc_exception_t ex; + libvlc_exception_init(&ex); + + libvlc_media_instance_t *p_md = libvlc_playlist_get_media_instance(p_libvlc, &ex); + if( ! libvlc_exception_raised(&ex) ) + { + char *psz_geometry = CStrFromBSTR(CP_UTF8, geometry); + if( NULL == psz_geometry ) + { + return E_OUTOFMEMORY; + } + + libvlc_video_set_crop_geometry(p_md, psz_geometry, &ex); + + CoTaskMemFree(psz_geometry); + libvlc_media_instance_release(p_md); if( libvlc_exception_raised(&ex) ) { _p_instance->setErrorInfo(IID_IVLCVideo, @@ -2149,6 +2354,165 @@ STDMETHODIMP VLCVideo::put_aspectRatio(BSTR aspect) return hr; }; +STDMETHODIMP VLCVideo::get_teletext(long* page) +{ + if( NULL == page ) + return E_POINTER; + + libvlc_instance_t* p_libvlc; + HRESULT hr = _p_instance->getVLC(&p_libvlc); + if( SUCCEEDED(hr) ) + { + libvlc_exception_t ex; + libvlc_exception_init(&ex); + + libvlc_media_instance_t *p_md = libvlc_playlist_get_media_instance(p_libvlc, &ex); + if( ! libvlc_exception_raised(&ex) ) + { + *page = libvlc_video_get_teletext(p_md, &ex); + libvlc_media_instance_release(p_md); + if( ! libvlc_exception_raised(&ex) ) + { + return NOERROR; + } + } + _p_instance->setErrorInfo(IID_IVLCVideo, libvlc_exception_get_message(&ex)); + libvlc_exception_clear(&ex); + return E_FAIL; + } + return hr; +}; + +STDMETHODIMP VLCVideo::put_teletext(long page) +{ + libvlc_instance_t* p_libvlc; + HRESULT hr = _p_instance->getVLC(&p_libvlc); + if( SUCCEEDED(hr) ) + { + libvlc_exception_t ex; + libvlc_exception_init(&ex); + + libvlc_media_instance_t *p_md = libvlc_playlist_get_media_instance(p_libvlc, &ex); + libvlc_video_set_teletext(p_md, page, &ex); + libvlc_media_instance_release(p_md); + if( libvlc_exception_raised(&ex) ) + { + _p_instance->setErrorInfo(IID_IVLCVideo, libvlc_exception_get_message(&ex)); + libvlc_exception_clear(&ex); + return E_FAIL; + } + return NOERROR; + } + return hr; +}; + +STDMETHODIMP VLCVideo::takeSnapshot(LPPICTUREDISP* picture) +{ + if( NULL == picture ) + return E_POINTER; + + libvlc_instance_t* p_libvlc; + HRESULT hr = _p_instance->getVLC(&p_libvlc); + if( SUCCEEDED(hr) ) + { + libvlc_exception_t ex; + libvlc_exception_init(&ex); + + libvlc_media_instance_t *p_md = libvlc_playlist_get_media_instance(p_libvlc, &ex); + if( ! libvlc_exception_raised(&ex) ) + { + static int uniqueId = 0; + TCHAR path[MAX_PATH+1]; + + int pathlen = GetTempPath(MAX_PATH-24, path); + if( (0 == pathlen) || (pathlen > (MAX_PATH-24)) ) + return E_FAIL; + + /* check temp directory path by openning it */ + { + HANDLE dirHandle = CreateFile(path, + GENERIC_READ, + FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_SHARE_DELETE, + NULL, + OPEN_EXISTING, + FILE_FLAG_BACKUP_SEMANTICS, NULL); + if( INVALID_HANDLE_VALUE == dirHandle ) + { + _p_instance->setErrorInfo(IID_IVLCVideo, + "Invalid temporary directory for snapshot images, check values of TMP, TEMP envars."); + return E_FAIL; + } + else + { + BY_HANDLE_FILE_INFORMATION bhfi; + BOOL res = GetFileInformationByHandle(dirHandle, &bhfi); + CloseHandle(dirHandle); + if( !res || !(bhfi.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) ) + { + _p_instance->setErrorInfo(IID_IVLCVideo, + "Invalid temporary directory for snapshot images, check values of TMP, TEMP envars."); + return E_FAIL; + } + } + } + + TCHAR filepath[MAX_PATH+1]; + + _stprintf(filepath, TEXT("%sAXVLC%lXS%lX.bmp"), + path, GetCurrentProcessId(), ++uniqueId); + +#ifdef _UNICODE + /* reuse path storage for UTF8 string */ + char *psz_filepath = (char *)path; + WCHAR* wpath = filepath; +#else + char *psz_filepath = path; + /* first convert to unicode using current code page */ + WCHAR wpath[MAX_PATH+1]; + if( 0 == MultiByteToWideChar(CP_ACP, 0, filepath, -1, wpath, sizeof(wpath)/sizeof(WCHAR)) ) + return E_FAIL; +#endif + /* convert to UTF8 */ + pathlen = WideCharToMultiByte(CP_UTF8, 0, wpath, -1, psz_filepath, sizeof(path), NULL, NULL); + // fail if path is 0 or too short (i.e pathlen is the same as storage size) + if( (0 == pathlen) || (sizeof(path) == pathlen) ) + return E_FAIL; + + /* take snapshot into file */ + libvlc_video_take_snapshot(p_md, psz_filepath, &ex); + libvlc_media_instance_release(p_md); + if( ! libvlc_exception_raised(&ex) ) + { + hr = E_FAIL; + /* open snapshot file */ + HANDLE snapPic = LoadImage(NULL, filepath, IMAGE_BITMAP,0, 0, LR_CREATEDIBSECTION|LR_LOADFROMFILE); + if( snapPic ) + { + PICTDESC snapDesc; + + snapDesc.cbSizeofstruct = sizeof(PICTDESC); + snapDesc.picType = PICTYPE_BITMAP; + snapDesc.bmp.hbitmap = (HBITMAP)snapPic; + snapDesc.bmp.hpal = NULL; + + hr = OleCreatePictureIndirect(&snapDesc, IID_IPictureDisp, TRUE, (LPVOID*)picture); + if( FAILED(hr) ) + { + *picture = NULL; + DeleteObject(snapPic); + } + } + DeleteFile(filepath); + return hr; + } + } + _p_instance->setErrorInfo(IID_IVLCVideo, libvlc_exception_get_message(&ex)); + libvlc_exception_clear(&ex); + return E_FAIL; + } + return hr; +}; + STDMETHODIMP VLCVideo::toggleFullscreen() { libvlc_instance_t* p_libvlc; @@ -2158,11 +2522,11 @@ STDMETHODIMP VLCVideo::toggleFullscreen() libvlc_exception_t ex; libvlc_exception_init(&ex); - libvlc_input_t *p_input = libvlc_playlist_get_input(p_libvlc, &ex); + libvlc_media_instance_t *p_md = libvlc_playlist_get_media_instance(p_libvlc, &ex); if( ! libvlc_exception_raised(&ex) ) { - libvlc_toggle_fullscreen(p_input, &ex); - libvlc_input_free(p_input); + libvlc_toggle_fullscreen(p_md, &ex); + libvlc_media_instance_release(p_md); if( ! libvlc_exception_raised(&ex) ) { return NOERROR; @@ -2252,7 +2616,7 @@ STDMETHODIMP VLCControl2::GetTypeInfo(UINT iTInfo, LCID lcid, LPTYPEINFO* ppTInf return E_NOTIMPL; }; -STDMETHODIMP VLCControl2::GetIDsOfNames(REFIID riid, LPOLESTR* rgszNames, +STDMETHODIMP VLCControl2::GetIDsOfNames(REFIID riid, LPOLESTR* rgszNames, UINT cNames, LCID lcid, DISPID* rgDispID) { if( SUCCEEDED(loadTypeInfo()) ) @@ -2347,14 +2711,14 @@ STDMETHODIMP VLCControl2::get_StartTime(long *seconds) return S_OK; }; - + STDMETHODIMP VLCControl2::put_StartTime(long seconds) { _p_instance->setStartTime(seconds); return NOERROR; }; - + STDMETHODIMP VLCControl2::get_VersionInfo(BSTR *version) { if( NULL == version ) @@ -2364,13 +2728,13 @@ STDMETHODIMP VLCControl2::get_VersionInfo(BSTR *version) if( NULL != versionStr ) { *version = BSTRFromCStr(CP_UTF8, versionStr); - + return NULL == *version ? E_OUTOFMEMORY : NOERROR; } *version = NULL; return E_FAIL; }; - + STDMETHODIMP VLCControl2::get_Visible(VARIANT_BOOL *isVisible) { if( NULL == isVisible ) @@ -2403,6 +2767,21 @@ STDMETHODIMP VLCControl2::put_Volume(long volume) return NOERROR; }; +STDMETHODIMP VLCControl2::get_BackColor(OLE_COLOR *backcolor) +{ + if( NULL == backcolor ) + return E_POINTER; + + *backcolor = _p_instance->getBackColor(); + return NOERROR; +}; + +STDMETHODIMP VLCControl2::put_BackColor(OLE_COLOR backcolor) +{ + _p_instance->setBackColor(backcolor); + return NOERROR; +}; + STDMETHODIMP VLCControl2::get_audio(IVLCAudio** obj) { if( NULL == obj )