X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=activex%2Fvlccontrol2.cpp;h=cba86e86d41b8e119b9c26e166ec0eed90e21c23;hb=ab7704a5f1a886fd8d016218ba2e60d1a60851a6;hp=addee00639ffbb863cacbc881810dfcb5e8c4902;hpb=0459ac1dfb23f64a228fc0631e6ed54c36f604d7;p=vlc diff --git a/activex/vlccontrol2.cpp b/activex/vlccontrol2.cpp index addee00639..cba86e86d4 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,10 +213,13 @@ STDMETHODIMP VLCAudio::get_track(long* track) libvlc_exception_t ex; libvlc_exception_init(&ex); - *track = libvlc_audio_get_track(p_libvlc, &ex); + 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; } @@ -232,10 +237,13 @@ STDMETHODIMP VLCAudio::put_track(long track) libvlc_exception_t ex; libvlc_exception_init(&ex); - libvlc_audio_set_track(p_libvlc, track, &ex); + 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; } @@ -244,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; @@ -253,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 = SysAllocStringByteLen(psz_channel, strlen(psz_channel)); - free( psz_channel ); - psz_channel = NULL; - return NOERROR; + _p_instance->setErrorInfo(IID_IVLCAudio, + libvlc_exception_get_message(&ex)); + libvlc_exception_clear(&ex); + return E_FAIL; } - if( psz_channel ) free( psz_channel ); - _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, @@ -324,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; } @@ -390,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()) ) @@ -424,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; @@ -453,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; @@ -479,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; @@ -508,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; @@ -534,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; @@ -563,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; @@ -593,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; @@ -619,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; @@ -641,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) ) @@ -648,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; @@ -677,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; @@ -755,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()) ) @@ -870,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 ) @@ -925,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()) ) @@ -952,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() @@ -1084,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()) ) @@ -1215,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()) ) @@ -1375,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()) ) @@ -1524,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()) ) @@ -1663,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); @@ -1930,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()) ) @@ -1964,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; @@ -1990,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; @@ -2019,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; @@ -2048,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; @@ -2077,23 +2156,24 @@ 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 ) return E_OUTOFMEMORY; - *aspect = SysAllocStringByteLen(psz_aspect, strlen(psz_aspect)); + *aspect = BSTRFromCStr(CP_UTF8, psz_aspect); free( psz_aspect ); psz_aspect = NULL; - return NOERROR; + return (NULL == *aspect) ? E_OUTOFMEMORY : NOERROR; } if( psz_aspect ) free( psz_aspect ); + psz_aspect = NULL; } _p_instance->setErrorInfo(IID_IVLCVideo, libvlc_exception_get_message(&ex)); libvlc_exception_clear(&ex); @@ -2114,23 +2194,22 @@ 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, @@ -2144,6 +2223,296 @@ STDMETHODIMP VLCVideo::put_aspectRatio(BSTR aspect) 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, + libvlc_exception_get_message(&ex)); + libvlc_exception_clear(&ex); + return E_FAIL; + } + } + return NOERROR; + } + 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, 0, 0, &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; @@ -2153,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; @@ -2247,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()) ) @@ -2342,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 ) @@ -2358,14 +2727,14 @@ STDMETHODIMP VLCControl2::get_VersionInfo(BSTR *version) const char *versionStr = VLC_Version(); if( NULL != versionStr ) { - *version = BSTRFromCStr(_p_instance->getCodePage(), 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 ) @@ -2398,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 ) @@ -2467,4 +2851,3 @@ STDMETHODIMP VLCControl2::get_video(IVLCVideo** obj) } return E_OUTOFMEMORY; }; -