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

📄 avtransportservice.cpp

📁 Windows CE 6.0 Server 源码
💻 CPP
📖 第 1 页 / 共 2 页
字号:
                                                     BSTR* pRelTime,
                                                     BSTR* pAbsTime,
                                                     long* pRelCount,
                                                     long* pAbsCount)
{
    if(!pTrack || !pTrackDuration || !pTrackMetaData || !pTrackURI || !pTrackURI || !pRelTime || !pAbsTime || !pRelCount || !pAbsCount)
        return E_POINTER;


    PositionInfo PI;

    MAKE_INSTANCE_CALL_1(GetPositionInfo, &PI);


    // Set out args

    *pTrack = PI.nTrack;

    if(   !(*pTrackDuration = SysAllocString(PI.strTrackDuration))
       || !(*pTrackMetaData = SysAllocString(PI.strTrackMetaData))
       || !(*pTrackURI = SysAllocString(PI.strTrackURI))
       || !(*pRelTime = SysAllocString(PI.strRelTime))
       || !(*pAbsTime = SysAllocString(PI.strAbsTime)))
       return m_ErrReport.ReportError(ERROR_AV_OOM);

    *pRelCount = PI.nRelCount;

    *pAbsCount = PI.nAbsCount;


    return S_OK;
}


STDMETHODIMP AVTransportServiceImpl::GetDeviceCapabilities(unsigned long InstanceID,
                                                           BSTR* pPlayMedia,
                                                           BSTR* pRecMedia,
                                                           BSTR* pRecQualityModes)
{
    if(!pPlayMedia || !pRecMedia || !pRecQualityModes)
        return E_POINTER;


    DeviceCapabilities deviceCaps;

    MAKE_INSTANCE_CALL_1(GetDeviceCapabilities, &deviceCaps);


    // Set out args
    if(   !(*pPlayMedia       = SysAllocString(deviceCaps.strPossiblePlayMedia))
       || !(*pRecMedia        = SysAllocString(deviceCaps.strPossibleRecMedia))
       || !(*pRecQualityModes = SysAllocString(deviceCaps.strPossibleRecQualityModes))   )
       return m_ErrReport.ReportError(ERROR_AV_OOM);


    return S_OK;
}


STDMETHODIMP AVTransportServiceImpl::GetTransportSettings(unsigned long InstanceID,
                                                          BSTR* pPlayMode,
                                                          BSTR* pRecQualityMode)
{
    if(!pPlayMode || !pRecQualityMode)
        return E_POINTER;


    TransportSettings transportSettings;

    MAKE_INSTANCE_CALL_1(GetTransportSettings, &transportSettings);


    // Set out args
    if(   !(*pPlayMode       = SysAllocString(transportSettings.strPlayMode))
       || !(*pRecQualityMode = SysAllocString(transportSettings.strRecQualityMode))   )
       return m_ErrReport.ReportError(ERROR_AV_OOM);
    

    return S_OK;// was E_NOTIMPL;
}


STDMETHODIMP AVTransportServiceImpl::Stop(unsigned long InstanceID)
{
    MAKE_INSTANCE_CALL_0(Stop);

    return S_OK;
}


STDMETHODIMP AVTransportServiceImpl::Play(unsigned long InstanceID,
                                          BSTR Speed)
{
    // Convert arguments for call

    wstring strSpeed;

    if(!strSpeed.assign(Speed, SysStringLen(Speed)))
        return m_ErrReport.ReportError(ERROR_AV_OOM);


    MAKE_INSTANCE_CALL_1(Play, strSpeed);


    return S_OK;
}


STDMETHODIMP AVTransportServiceImpl::Pause(unsigned long InstanceID)
{
    MAKE_INSTANCE_CALL_0(Pause);

    return S_OK;
}


STDMETHODIMP AVTransportServiceImpl::Record(unsigned long InstanceID)
{
    MAKE_INSTANCE_CALL_0(Record);

    return S_OK;
}


STDMETHODIMP AVTransportServiceImpl::Seek(unsigned long InstanceID,
                                          BSTR Unit,
                                          BSTR Target)
{
    // Convert arguments for call

    wstring strUnit, strTarget;

    if(   !strUnit.assign(  Unit,   SysStringLen(Unit))
       || !strTarget.assign(Target, SysStringLen(Target))   )
        return m_ErrReport.ReportError(ERROR_AV_OOM);


    MAKE_INSTANCE_CALL_2(Seek, strUnit, strTarget);


    return S_OK;
}


STDMETHODIMP AVTransportServiceImpl::Next(unsigned long InstanceID)
{
    MAKE_INSTANCE_CALL_0(Next);

    return S_OK;
}


STDMETHODIMP AVTransportServiceImpl::Previous(unsigned long InstanceID)
{
    MAKE_INSTANCE_CALL_0(Previous);

    return S_OK;
}


STDMETHODIMP AVTransportServiceImpl::SetPlayMode(unsigned long InstanceID,
                                                 BSTR NewPlayMode)
{
    // Convert arguments for call

    wstring strNewPlayMode;

    if(!strNewPlayMode.assign(NewPlayMode, SysStringLen(NewPlayMode)))
        return m_ErrReport.ReportError(ERROR_AV_OOM);


    MAKE_INSTANCE_CALL_1(SetPlayMode, strNewPlayMode);


    return S_OK;
}


STDMETHODIMP AVTransportServiceImpl::SetRecordQualityMode(unsigned long InstanceID,
                                                          BSTR NewRecordQualityMode)
{
    // Convert arguments for call

    wstring strNewRecordQualityMode;

    if(!strNewRecordQualityMode.assign(NewRecordQualityMode, SysStringLen(NewRecordQualityMode)))
        return m_ErrReport.ReportError(ERROR_AV_OOM);


    MAKE_INSTANCE_CALL_1(SetRecordQualityMode, strNewRecordQualityMode);


    return S_OK;
}


// Appends the string DATA_MEMBER_STRING to the outside-of-this-macro wstring strActions
// if transportActions.DATA_MEMBER is true. Prepends a te AV DCP delimiter
// if the bool fFirstItem is true and then sets it to false.
#define APPEND_ACTION(DATA_MEMBER, DATA_MEMBER_STRING)          \
if(transportActions.DATA_MEMBER)                                \
{                                                               \
    if(!strActions.empty())                                     \
        if(!strActions.append(AVDCPListDelimiter))              \
            return m_ErrReport.ReportError(ERROR_AV_OOM);       \
                                                                \
    if(!strActions.append(DATA_MEMBER_STRING))                  \
        return m_ErrReport.ReportError(ERROR_AV_OOM);           \
}

STDMETHODIMP AVTransportServiceImpl::GetCurrentTransportActions(unsigned long InstanceID,
                                                                BSTR* pActions)
{
    if(!pActions)
        return E_POINTER;


    TransportActions transportActions;

    MAKE_INSTANCE_CALL_1(GetCurrentTransportActions, &transportActions);


    // Set out args
    wstring strActions;

    // Create the list of current transport actions
    APPEND_ACTION(bPlay,     TransportAction::Play)
    APPEND_ACTION(bStop,     TransportAction::Stop)
    APPEND_ACTION(bPause,    TransportAction::Pause)
    APPEND_ACTION(bSeek,     TransportAction::Seek)
    APPEND_ACTION(bNext,     TransportAction::Next)
    APPEND_ACTION(bPrevious, TransportAction::Previous)
    APPEND_ACTION(bRecord,   TransportAction::Record)


    // Convert this list of transport actions from wstring to a BSTR
    if(!(*pActions = SysAllocString(strActions)))
        return m_ErrReport.ReportError(ERROR_AV_OOM);


    return S_OK;
}



//
// Private
//

HRESULT AVTransportServiceImpl::InitToolkitErrs()
{
    const int vErrMap[][2] =
    {
        {ERROR_AV_POINTER,          ERROR_AV_UPNP_ACTION_FAILED},
        {ERROR_AV_OOM,              ERROR_AV_UPNP_ACTION_FAILED},
        {ERROR_AV_INVALID_INSTANCE, ERROR_AV_UPNP_AVT_INVALID_INSTANCE_ID},
        {ERROR_AV_INVALID_STATEVAR, ERROR_AV_UPNP_ACTION_FAILED},
        {ERROR_AV_ALREADY_INITED,   ERROR_AV_UPNP_ACTION_FAILED},
        {0,                         0} // 0 is used to denote the end of this array
    };


    for(unsigned int i=0; 0 != vErrMap[i][0]; ++i)
    {
        if(ERROR_AV_OOM == m_ErrReport.AddToolkitError(vErrMap[i][0], vErrMap[i][1]))
            return E_OUTOFMEMORY;
    }

    return S_OK;
}


HRESULT AVTransportServiceImpl::InitErrDescrips()
{
    const int vErrNums[] =
    {
        // UPnP
        ERROR_AV_UPNP_INVALID_ACTION,
        ERROR_AV_UPNP_ACTION_FAILED,
        // AVTransport
        ERROR_AV_UPNP_AVT_INVALID_TRANSITION,
        ERROR_AV_UPNP_AVT_NO_CONTENTS,
        ERROR_AV_UPNP_AVT_READ_ERROR,
        ERROR_AV_UPNP_AVT_UNSUPPORTED_PLAY_FORMAT,
        ERROR_AV_UPNP_AVT_TRANSPORT_LOCKED,
        ERROR_AV_UPNP_AVT_WRITE_ERROR,
        ERROR_AV_UPNP_AVT_PROTECTED_MEDIA,
        ERROR_AV_UPNP_AVT_UNSUPPORTED_REC_FORMAT,
        ERROR_AV_UPNP_AVT_FULL_MEDIA,
        ERROR_AV_UPNP_AVT_UNSUPPORTED_SEEK_MODE,
        ERROR_AV_UPNP_AVT_ILLEGAL_SEEK_TARGET,
        ERROR_AV_UPNP_AVT_UNSUPPORTED_PLAY_MODE,
        ERROR_AV_UPNP_AVT_UNSUPPORTED_REC_QUALITY,
        ERROR_AV_UPNP_AVT_ILLEGAL_MIME,
        ERROR_AV_UPNP_AVT_CONTENT_BUSY,
        ERROR_AV_UPNP_AVT_RESOURCE_NOT_FOUND,
        ERROR_AV_UPNP_AVT_UNSUPPORTED_PLAY_SPEED,
        ERROR_AV_UPNP_AVT_INVALID_INSTANCE_ID,
        0 // 0 is used to denote the end of this array
    };
    const wstring vErrDescrips[] =
    {
        // UPnP
        L"Invalid Action",
        L"Action Failed",
        // AVTransport
        L"Transition not available",
        L"No contents",
        L"Read error",
        L"Format not supported for playback",
        L"Transport is locked",
        L"Write error",
        L"Media is protected or not writable",
        L"Format not supported for recording",
        L"Media is full",
        L"Seek mode not supported",
        L"Illegal seek target",
        L"Play mode not supported",
        L"Record quality not supported",
        L"Illegal MIME-type",
        L"Content 'BUSY'",
        L"Resource not found",
        L"Play speed not supported",
        L"Invalid InstanceID"
    };


    for(unsigned int i=0; 0 != vErrNums[i]; ++i)
    {
        if(ERROR_AV_OOM == m_ErrReport.AddErrorDescription(vErrNums[i], vErrDescrips[i]))
            return E_OUTOFMEMORY;
    }

    return S_OK;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -