⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 vlccontrol.cpp

📁 VLC Player Source Code
💻 CPP
📖 第 1 页 / 共 3 页
字号:
        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 + -