📄 avtransportservice.cpp
字号:
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 + -