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

📄 vlccontrol.cpp

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