📄 vlccontrol.cpp
字号:
{ libvlc_toggle_fullscreen(p_md, NULL); libvlc_media_player_release(p_md); } } } } return result;};STDMETHODIMP VLCControl::get_Length(int *seconds){ if( NULL == seconds ) return E_POINTER; *seconds = 0; libvlc_instance_t* p_libvlc; HRESULT result = _p_instance->getVLC(&p_libvlc); if( SUCCEEDED(result) ) { libvlc_exception_t ex; libvlc_exception_init(&ex); libvlc_media_player_t *p_md; p_md = libvlc_playlist_get_media_player(p_libvlc, &ex); if( ! libvlc_exception_raised(&ex) ) { *seconds = (double)libvlc_media_player_get_length(p_md, &ex); libvlc_media_player_release(p_md); if( ! libvlc_exception_raised(&ex) ) { return NOERROR; } } _p_instance->setErrorInfo(IID_IVLCControl, libvlc_exception_get_message(&ex)); libvlc_exception_clear(&ex); return E_FAIL; } return result;};STDMETHODIMP VLCControl::playFaster(void){ int32_t rate = 2; HRESULT result = E_UNEXPECTED; if( !_p_instance->isRunning() ) return result; libvlc_instance_t* p_libvlc; result = _p_instance->getVLC(&p_libvlc); if( SUCCEEDED(result) ) { libvlc_exception_t ex; libvlc_exception_init(&ex); libvlc_media_player_t *p_md; p_md = libvlc_playlist_get_media_player(p_libvlc, &ex); if( ! libvlc_exception_raised(&ex) ) { libvlc_media_player_set_rate(p_md, rate, &ex); libvlc_media_player_release(p_md); if( ! libvlc_exception_raised(&ex) ) { return NOERROR; } } _p_instance->setErrorInfo(IID_IVLCControl, libvlc_exception_get_message(&ex)); libvlc_exception_clear(&ex); return E_FAIL; } return result;};STDMETHODIMP VLCControl::playSlower(void){ float rate = 0.5; HRESULT result = E_UNEXPECTED; if( !_p_instance->isRunning() ) return result; libvlc_instance_t* p_libvlc; result = _p_instance->getVLC(&p_libvlc); if( SUCCEEDED(result) ) { libvlc_exception_t ex; libvlc_exception_init(&ex); libvlc_media_player_t *p_md; p_md = libvlc_playlist_get_media_player(p_libvlc, &ex); if( ! libvlc_exception_raised(&ex) ) { libvlc_media_player_set_rate(p_md, rate, &ex); libvlc_media_player_release(p_md); if( ! libvlc_exception_raised(&ex) ) { return NOERROR; } } _p_instance->setErrorInfo(IID_IVLCControl, libvlc_exception_get_message(&ex)); libvlc_exception_clear(&ex); return E_FAIL; } return result;};STDMETHODIMP VLCControl::get_Volume(int *volume){ if( NULL == volume ) return E_POINTER; *volume = _p_instance->getVolume(); return NOERROR;};STDMETHODIMP VLCControl::put_Volume(int volume){ _p_instance->setVolume(volume); return NOERROR;};STDMETHODIMP VLCControl::toggleMute(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_audio_toggle_mute(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::setVariable(BSTR name, VARIANT value){ libvlc_instance_t* p_libvlc; HRESULT result = _p_instance->getVLC(&p_libvlc); if( SUCCEEDED(result) ) { _p_instance->setErrorInfo(IID_IVLCControl, "setVariable() is an unsafe interface to use. " "It has been removed because of security implications." ); } return E_FAIL;};STDMETHODIMP VLCControl::getVariable(BSTR name, VARIANT *value){ libvlc_instance_t* p_libvlc; HRESULT result = _p_instance->getVLC(&p_libvlc); if( SUCCEEDED(result) ) { _p_instance->setErrorInfo(IID_IVLCControl, "getVariable() is an unsafe interface to use. " "It has been removed because of security implications." ); } return E_FAIL;};void VLCControl::FreeTargetOptions(char **cOptions, int cOptionCount){ // clean up if( NULL != cOptions ) { for( int pos=0; pos<cOptionCount; ++pos ) { char *cOption = cOptions[pos]; if( NULL != cOption ) CoTaskMemFree(cOption); else break; } CoTaskMemFree(cOptions); }};static HRESULT parseStringOptions(int codePage, BSTR bstr, char*** cOptions, int *cOptionCount){ HRESULT hr = E_INVALIDARG; if( SysStringLen(bstr) > 0 ) { hr = E_OUTOFMEMORY; char *s = CStrFromBSTR(codePage, bstr); char *val = s; if( val ) { long capacity = 16; char **options = (char **)CoTaskMemAlloc(capacity*sizeof(char *)); if( options ) { int nOptions = 0; char *end = val + strlen(val); while( val < end ) { // skip leading blanks while( (val < end) && ((*val == ' ' ) || (*val == '\t')) ) ++val; char *start = val; // skip till we get a blank character while( (val < end) && (*val != ' ' ) && (*val != '\t') ) { char c = *(val++); if( ('\'' == c) || ('"' == c) ) { // skip till end of string while( (val < end) && (*(val++) != c ) ); } } if( val > start ) { if( nOptions == capacity ) { capacity += 16; char **moreOptions = (char **)CoTaskMemRealloc(options, capacity*sizeof(char*)); if( ! moreOptions ) { /* failed to allocate more memory */ CoTaskMemFree(s); /* return what we got so far */ *cOptionCount = nOptions; *cOptions = options; return NOERROR; } options = moreOptions; } *(val++) = '\0'; options[nOptions] = (char *)CoTaskMemAlloc(val-start); if( options[nOptions] ) { memcpy(options[nOptions], start, val-start); ++nOptions; } else { /* failed to allocate memory */ CoTaskMemFree(s); /* return what we got so far */ *cOptionCount = nOptions; *cOptions = options; return NOERROR; } } else // must be end of string break; } *cOptionCount = nOptions; *cOptions = options; hr = NOERROR; } CoTaskMemFree(s); } } return hr;}HRESULT VLCControl::CreateTargetOptions(int codePage, VARIANT *options, char ***cOptions, int *cOptionCount){ HRESULT hr = E_INVALIDARG; if( VT_ERROR == V_VT(options) ) { if( DISP_E_PARAMNOTFOUND == V_ERROR(options) ) { // optional parameter not set *cOptions = NULL; *cOptionCount = 0; return NOERROR; } } else if( (VT_EMPTY == V_VT(options)) || (VT_NULL == V_VT(options)) ) { // null parameter *cOptions = NULL; *cOptionCount = 0; return NOERROR; } else if( VT_DISPATCH == V_VT(options) ) { // if object is a collection, retrieve enumerator VARIANT colEnum; V_VT(&colEnum) = VT_UNKNOWN; hr = GetObjectProperty(V_DISPATCH(options), DISPID_NEWENUM, colEnum); if( SUCCEEDED(hr) ) { IEnumVARIANT *enumVar; hr = V_UNKNOWN(&colEnum)->QueryInterface(IID_IEnumVARIANT, (LPVOID *)&enumVar); if( SUCCEEDED(hr) ) { long pos = 0; long capacity = 16; VARIANT option; *cOptions = (char **)CoTaskMemAlloc(capacity*sizeof(char *)); if( NULL != *cOptions ) { ZeroMemory(*cOptions, sizeof(char *)*capacity); while( SUCCEEDED(hr) && (S_OK == enumVar->Next(1, &option, NULL)) ) { if( VT_BSTR == V_VT(&option) ) { char *cOption = CStrFromBSTR(codePage, V_BSTR(&option)); (*cOptions)[pos] = cOption; if( NULL != cOption ) { ++pos; if( pos == capacity ) { char **moreOptions = (char **)CoTaskMemRealloc(*cOptions, (capacity+16)*sizeof(char *)); if( NULL != moreOptions ) { ZeroMemory(moreOptions+capacity, sizeof(char *)*16); capacity += 16; *cOptions = moreOptions; } else hr = E_OUTOFMEMORY; } } else hr = ( SysStringLen(V_BSTR(&option)) > 0 ) ? E_OUTOFMEMORY : E_INVALIDARG; } else hr = E_INVALIDARG; VariantClear(&option); } *cOptionCount = pos; if( FAILED(hr) ) { // free already processed elements FreeTargetOptions(*cOptions, *cOptionCount); } } else hr = E_OUTOFMEMORY; enumVar->Release(); } }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -