📄 vlccontrol.cpp
字号:
else { // coerce object into a string and parse it VARIANT v_name; VariantInit(&v_name); hr = VariantChangeType(&v_name, options, 0, VT_BSTR); if( SUCCEEDED(hr) ) { hr = parseStringOptions(codePage, V_BSTR(&v_name), cOptions, cOptionCount); VariantClear(&v_name); } } } else if( V_ISARRAY(options) ) { // array parameter SAFEARRAY *array = V_ISBYREF(options) ? *V_ARRAYREF(options) : V_ARRAY(options); if( SafeArrayGetDim(array) != 1 ) return E_INVALIDARG; long lBound = 0; long uBound = 0; SafeArrayGetLBound(array, 1, &lBound); SafeArrayGetUBound(array, 1, &uBound); // have we got any options if( uBound >= lBound ) { VARTYPE vType; hr = SafeArrayGetVartype(array, &vType); if( FAILED(hr) ) return hr; long pos; // marshall options into an array of C strings if( VT_VARIANT == vType ) { *cOptions = (char **)CoTaskMemAlloc(sizeof(char *)*(uBound-lBound+1)); if( NULL == *cOptions ) return E_OUTOFMEMORY; ZeroMemory(*cOptions, sizeof(char *)*(uBound-lBound+1)); for(pos=lBound; (pos<=uBound) && SUCCEEDED(hr); ++pos ) { VARIANT option; hr = SafeArrayGetElement(array, &pos, &option); if( SUCCEEDED(hr) ) { if( VT_BSTR == V_VT(&option) ) { char *cOption = CStrFromBSTR(codePage, V_BSTR(&option)); (*cOptions)[pos-lBound] = cOption; if( NULL == cOption ) hr = ( SysStringLen(V_BSTR(&option)) > 0 ) ? E_OUTOFMEMORY : E_INVALIDARG; } else hr = E_INVALIDARG; VariantClear(&option); } } } else if( VT_BSTR == vType ) { *cOptions = (char **)CoTaskMemAlloc(sizeof(char *)*(uBound-lBound+1)); if( NULL == *cOptions ) return E_OUTOFMEMORY; ZeroMemory(*cOptions, sizeof(char *)*(uBound-lBound+1)); for(pos=lBound; (pos<=uBound) && SUCCEEDED(hr); ++pos ) { BSTR option; hr = SafeArrayGetElement(array, &pos, &option); if( SUCCEEDED(hr) ) { char *cOption = CStrFromBSTR(codePage, option); (*cOptions)[pos-lBound] = cOption; if( NULL == cOption ) hr = ( SysStringLen(option) > 0 ) ? E_OUTOFMEMORY : E_INVALIDARG; SysFreeString(option); } } } else { // unsupported type return E_INVALIDARG; } *cOptionCount = pos-lBound; if( FAILED(hr) ) { // free already processed elements FreeTargetOptions(*cOptions, *cOptionCount); } } else { // empty array *cOptions = NULL; *cOptionCount = 0; return NOERROR; } } else if( VT_UNKNOWN == V_VT(options) ) { // coerce object into a string and parse it VARIANT v_name; VariantInit(&v_name); hr = VariantChangeType(&v_name, options, 0, VT_BSTR); if( SUCCEEDED(hr) ) { hr = parseStringOptions(codePage, V_BSTR(&v_name), cOptions, cOptionCount); VariantClear(&v_name); } } else if( VT_BSTR == V_VT(options) ) { hr = parseStringOptions(codePage, V_BSTR(options), cOptions, cOptionCount); } return hr;};/*** use VARIANT rather than a SAFEARRAY as argument type** for compatibility with some scripting language (JScript)*/STDMETHODIMP VLCControl::addTarget(BSTR uri, VARIANT options, enum VLCPlaylistMode mode, int position){ if( 0 == SysStringLen(uri) ) return E_INVALIDARG; libvlc_instance_t *p_libvlc; HRESULT hr = _p_instance->getVLC(&p_libvlc); if( SUCCEEDED(hr) ) { char *cUri = CStrFromBSTR(CP_UTF8, uri); if( NULL == cUri ) return E_OUTOFMEMORY; int cOptionsCount; char **cOptions; if( FAILED(CreateTargetOptions(CP_UTF8, &options, &cOptions, &cOptionsCount)) ) return E_INVALIDARG; libvlc_exception_t ex; libvlc_exception_init(&ex); position = libvlc_playlist_add_extended(p_libvlc, cUri, cUri, cOptionsCount, const_cast<const char**>(cOptions), &ex); FreeTargetOptions(cOptions, cOptionsCount); CoTaskMemFree(cUri); if( libvlc_exception_raised(&ex) ) { _p_instance->setErrorInfo(IID_IVLCPlaylist, libvlc_exception_get_message(&ex)); libvlc_exception_clear(&ex); if( mode & VLCPlayListAppendAndGo ) _p_instance->fireOnStopEvent(); return E_FAIL; } if( mode & VLCPlayListAppendAndGo ) _p_instance->fireOnPlayEvent(); return NOERROR; } return hr;};STDMETHODIMP VLCControl::get_PlaylistIndex(int *index){ if( NULL == index ) return E_POINTER; *index = 0; libvlc_instance_t *p_libvlc; HRESULT result = _p_instance->getVLC(&p_libvlc); if( SUCCEEDED(result) ) { libvlc_exception_t ex; libvlc_exception_init(&ex); *index = libvlc_playlist_get_current_index(p_libvlc, &ex); if( libvlc_exception_raised(&ex) ) { _p_instance->setErrorInfo(IID_IVLCControl, libvlc_exception_get_message(&ex)); libvlc_exception_clear(&ex); return E_FAIL; } return NOERROR; } return result;};STDMETHODIMP VLCControl::get_PlaylistCount(int *count){ if( NULL == count ) return E_POINTER; *count = 0; libvlc_instance_t* p_libvlc; HRESULT result = _p_instance->getVLC(&p_libvlc); if( SUCCEEDED(result) ) { libvlc_exception_t ex; libvlc_exception_init(&ex); *count = libvlc_playlist_items_count(p_libvlc, &ex); if( libvlc_exception_raised(&ex) ) { _p_instance->setErrorInfo(IID_IVLCControl, libvlc_exception_get_message(&ex)); libvlc_exception_clear(&ex); return E_FAIL; } return NOERROR; } return result;};STDMETHODIMP VLCControl::playlistNext(void){ libvlc_instance_t* p_libvlc; HRESULT result = _p_instance->getVLC(&p_libvlc); if( SUCCEEDED(result) ) { libvlc_exception_t ex; libvlc_exception_init(&ex); libvlc_playlist_next(p_libvlc, &ex); if( libvlc_exception_raised(&ex) ) { _p_instance->setErrorInfo(IID_IVLCControl, libvlc_exception_get_message(&ex)); libvlc_exception_clear(&ex); return E_FAIL; } return NOERROR; } return result;};STDMETHODIMP VLCControl::playlistPrev(void){ libvlc_instance_t* p_libvlc; HRESULT result = _p_instance->getVLC(&p_libvlc); if( SUCCEEDED(result) ) { libvlc_exception_t ex; libvlc_exception_init(&ex); libvlc_playlist_prev(p_libvlc, &ex); if( libvlc_exception_raised(&ex) ) { _p_instance->setErrorInfo(IID_IVLCControl, libvlc_exception_get_message(&ex)); libvlc_exception_clear(&ex); return E_FAIL; } return NOERROR; } return result;};STDMETHODIMP VLCControl::playlistClear(void){ libvlc_instance_t* p_libvlc; HRESULT result = _p_instance->getVLC(&p_libvlc); if( SUCCEEDED(result) ) { libvlc_exception_t ex; libvlc_exception_init(&ex); libvlc_playlist_clear(p_libvlc, &ex); if( libvlc_exception_raised(&ex) ) { _p_instance->setErrorInfo(IID_IVLCControl, libvlc_exception_get_message(&ex)); libvlc_exception_clear(&ex); return E_FAIL; } return NOERROR; } return result;};STDMETHODIMP VLCControl::get_VersionInfo(BSTR *version){ if( NULL == version ) return E_POINTER; const char *versionStr = libvlc_get_version(); if( NULL != versionStr ) { *version = BSTRFromCStr(CP_UTF8, versionStr); return (NULL == *version) ? E_OUTOFMEMORY : NOERROR; } *version = NULL; return E_FAIL;};STDMETHODIMP VLCControl::get_MRL(BSTR *mrl){ if( NULL == mrl ) return E_POINTER; *mrl = SysAllocStringLen(_p_instance->getMRL(), SysStringLen(_p_instance->getMRL())); return NOERROR;};STDMETHODIMP VLCControl::put_MRL(BSTR mrl){ _p_instance->setMRL(mrl); return S_OK;};STDMETHODIMP VLCControl::get_AutoPlay(VARIANT_BOOL *autoplay){ if( NULL == autoplay ) return E_POINTER; *autoplay = _p_instance->getAutoPlay() ? VARIANT_TRUE: VARIANT_FALSE; return S_OK;};STDMETHODIMP VLCControl::put_AutoPlay(VARIANT_BOOL autoplay){ _p_instance->setAutoPlay((VARIANT_FALSE != autoplay) ? TRUE: FALSE); return S_OK;};STDMETHODIMP VLCControl::get_AutoLoop(VARIANT_BOOL *autoloop){ if( NULL == autoloop ) return E_POINTER; *autoloop = _p_instance->getAutoLoop() ? VARIANT_TRUE: VARIANT_FALSE; return S_OK;};STDMETHODIMP VLCControl::put_AutoLoop(VARIANT_BOOL autoloop){ _p_instance->setAutoLoop((VARIANT_FALSE != autoloop) ? TRUE: FALSE); return S_OK;};
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -