📄 rarender.h
字号:
//
STDMETHOD (StartStream) (THIS_
IHXStream* pStream,
IHXPlayer* pPlayer);
/////////////////////////////////////////////////////////////////////////
// Method:
// IHXRenderer::EndStream
// Purpose:
// Called by client engine to inform the renderer that the stream
// is was rendering is closed.
//
STDMETHOD (EndStream) (THIS);
/////////////////////////////////////////////////////////////////////////
// Method:
// IHXRenderer::OnHeader
// Purpose:
// Called by client engine when a header for this renderer is
// available. The header will arrive before any packets.
//
STDMETHOD (OnHeader) (THIS_
IHXValues* pHeader);
/////////////////////////////////////////////////////////////////////////
// Method:
// IHXRenderer::OnPacket
// Purpose:
// Called by client engine when a packet for this renderer is
// due.
//
STDMETHOD (OnPacket) (THIS_
IHXPacket* pPacket,
LONG32 lTimeOffset);
/////////////////////////////////////////////////////////////////////////
// Method:
// IHXRenderer::OnTimeSync
// Purpose:
// Called by client engine to inform the renderer of the current
// time relative to the streams synchronized time-line. The
// renderer should use this time value to update its display or
// render it's stream data accordingly.
//
STDMETHOD (OnTimeSync) (THIS_
ULONG32 ulTime);
/////////////////////////////////////////////////////////////////////////
// Method:
// IHXRenderer::OnPreSeek
// Purpose:
// Called by client engine to inform the renderer that a seek is
// about to occur. The render is informed the last time for the
// stream's time line before the seek, as well as the first new
// time for the stream's time line after the seek will be completed.
//
STDMETHOD (OnPreSeek) (THIS_
ULONG32 ulOldTime,
ULONG32 ulNewTime);
/////////////////////////////////////////////////////////////////////////
// Method:
// IHXRenderer::OnPostSeek
// Purpose:
// Called by client engine to inform the renderer that a seek has
// just occured. The render is informed the last time for the
// stream's time line before the seek, as well as the first new
// time for the stream's time line after the seek.
//
STDMETHOD (OnPostSeek) (THIS_
ULONG32 ulOldTime,
ULONG32 ulNewTime);
/////////////////////////////////////////////////////////////////////////
// Method:
// IHXRenderer::OnPause
// Purpose:
// Called by client engine to inform the renderer that a pause has
// just occured. The render is informed the last time for the
// stream's time line before the pause.
//
STDMETHOD (OnPause) (THIS_
ULONG32 ulTime);
/////////////////////////////////////////////////////////////////////////
// Method:
// IHXRenderer::OnBegin
// Purpose:
// Called by client engine to inform the renderer that a begin or
// resume has just occured. The render is informed the first time
// for the stream's time line after the resume.
//
STDMETHOD (OnBegin) (THIS_
ULONG32 ulTime);
/////////////////////////////////////////////////////////////////////////
// Method:
// IHXRenderer::OnBuffering
// Purpose:
// Called by client engine to inform the renderer that buffering
// of data is occuring. The render is informed of the reason for
// the buffering (start-up of stream, seek has occured, network
// congestion, etc.), as well as percentage complete of the
// buffering process.
//
STDMETHOD (OnBuffering) (THIS_
ULONG32 ulFlags,
UINT16 unPercentComplete);
/////////////////////////////////////////////////////////////////////////
// Method:
// IHXRenderer::GetDisplayType
// Purpose:
// Called by client engine to ask the renderer for it's preferred
// display type. When layout information is not present, the
// renderer will be asked for it's prefered display type. Depending
// on the display type a buffer of additional information may be
// needed. This buffer could contain information about preferred
// window size.
//
STDMETHOD (GetDisplayType) (THIS_
REF(HX_DISPLAY_TYPE) ulFlags,
REF(IHXBuffer*) pBuffer);
/************************************************************************
* Method:
* IHXRenderer::OnEndofPackets
* Purpose:
* Called by client engine to inform the renderer that all the
* packets have been delivered. However, if the user seeks before
* EndStream() is called, renderer may start getting packets again
* and the client engine will eventually call this function again.
*/
STDMETHOD(OnEndofPackets) (THIS);
/*
* IHXDryNotification methods
*/
/************************************************************************
* Method:
* IHXDryNotificationOnDryNotification
* Purpose:
* This function is called when it is time to write to audio device
* and there is not enough data in the audio stream. The renderer can
* then decide to add more data to the audio stream. This should be
* done synchronously within the call to this function.
* It is OK to not write any data. Silence will be played instead.
*/
STDMETHOD(OnDryNotification) (THIS_
UINT32 /*IN*/ ulCurrentStreamTime,
UINT32 /*IN*/ ulMinimumDurationRequired);
/*
* IHXStatistics methods
*/
/************************************************************************
* Method:
* IHXStatistics::InitializeStatistics
* Purpose:
* Pass registry ID to the caller
*/
STDMETHOD (InitializeStatistics)
(THIS_
UINT32 /*IN*/ ulRegistryID);
/************************************************************************
* Method:
* IHXStatistics::UpdateStatistics
* Purpose:
* Notify the client to update its statistics stored in the registry
*/
STDMETHOD (UpdateStatistics)(THIS);
STDMETHOD (GetBandwidthInfo) (THIS_ IHXValues* pValues);
/*
* IHXInterruptSafe methods
*/
/************************************************************************
* Method:
* IHXInterruptSafe::IsInterruptSafe
* Purpose:
* This is the function that will be called to determine if
* interrupt time execution is supported.
*/
STDMETHOD_(BOOL,IsInterruptSafe) (THIS)
{ return TRUE; };
/************************************************************************
* Method:
* IHXUpdateProperties::UpdatePacketTimeOffset
* Purpose:
* Call this method to update the timestamp offset of cached packets
*/
STDMETHOD(UpdatePacketTimeOffset) (THIS_
INT32 lTimeOffset);
/************************************************************************
* Method:
* IHXUpdateProperties::UpdatePlayTimes
* Purpose:
* Call this method to update the playtime attributes
*/
STDMETHOD(UpdatePlayTimes) (THIS_
IHXValues* pProps);
// IHXValues methods
STDMETHOD(SetPropertyULONG32) (THIS_ const char* pName, ULONG32 ulVal);
STDMETHOD(GetPropertyULONG32) (THIS_ const char* pName, REF(ULONG32) rulVal);
STDMETHOD(GetFirstPropertyULONG32) (THIS_ REF(const char*) rpName, REF(ULONG32) rulVal);
STDMETHOD(GetNextPropertyULONG32) (THIS_ REF(const char*) rpName, REF(ULONG32) rulVal);
STDMETHOD(SetPropertyBuffer) (THIS_ const char* pName, IHXBuffer* pVal);
STDMETHOD(GetPropertyBuffer) (THIS_ const char* pName, REF(IHXBuffer*) rpVal);
STDMETHOD(GetFirstPropertyBuffer) (THIS_ REF(const char*) rpName, REF(IHXBuffer*) rpVal);
STDMETHOD(GetNextPropertyBuffer) (THIS_ REF(const char*) rpName, REF(IHXBuffer*) rpVal);
STDMETHOD(SetPropertyCString) (THIS_ const char* pName, IHXBuffer* pVal);
STDMETHOD(GetPropertyCString) (THIS_ const char* pName, REF(IHXBuffer*) rpVal);
STDMETHOD(GetFirstPropertyCString) (THIS_ REF(const char*) rpName, REF(IHXBuffer*) rpVal);
STDMETHOD(GetNextPropertyCString) (THIS_ REF(const char*) rpName, REF(IHXBuffer*) rpVal);
static HX_RESULT STDAPICALLTYPE HXCreateInstance(IUnknown** ppIUnknown);
static HX_RESULT STDAPICALLTYPE CanUnload2(void);
};
#ifdef _MACINTOSH
class CDryNotificationCallback : public IHXCallback
{
private:
LONG32 m_lRefCount;
CRealAudioRenderer* m_pOutter;
UINT32 m_ulAudioTimeWanted;
IHXScheduler* m_pScheduler;
CallbackHandle m_PendingHandle;
HX_BITFIELD m_bPendingCallback:1;
CDryNotificationCallback(UINT32 ulAudioTimeWanted, CRealAudioRenderer* pOutter, IUnknown* pIUnknown)
: m_lRefCount(0)
, m_ulAudioTimeWanted(ulAudioTimeWanted)
, m_pOutter(pOutter)
, m_pScheduler(NULL)
, m_PendingHandle(NULL)
, m_bPendingCallback(FALSE)
{
if (m_pOutter != NULL)
{
m_pOutter->AddRef();
}
if (HXR_OK != pIUnknown->QueryInterface(IID_IHXScheduler,
(void **) &m_pScheduler))
{
m_pScheduler = NULL;
}
};
virtual ~CDryNotificationCallback()
{
HX_RELEASE(m_pOutter);
HX_RELEASE(m_pScheduler);
}
PRIVATE_DESTRUCTORS_ARE_NOT_A_CRIME
public:
static CDryNotificationCallback*
CreateInstance(UINT32 ulAudioTimeWanted, CRealAudioRenderer* pOutter, IUnknown* pUnk)
{
CDryNotificationCallback* pInst = new CDryNotificationCallback(ulAudioTimeWanted, pOutter, pUnk);
if (pInst != NULL)
{
pInst->AddRef();
}
return pInst;
}
/*
* IUnknown methods
*/
STDMETHODIMP QueryInterface(REFIID riid, void** ppvObj)
{
if (IsEqualIID(riid, IID_IUnknown))
{
AddRef();
*ppvObj = (IUnknown*)this;
return HXR_OK;
}
else if (IsEqualIID(riid, IID_IHXCallback))
{
AddRef();
*ppvObj = (IHXCallback*)this;
return HXR_OK;
}
*ppvObj = NULL;
return HXR_NOINTERFACE;
}
STDMETHODIMP_(ULONG32)
AddRef()
{
return InterlockedIncrement(&m_lRefCount);
}
STDMETHODIMP_(ULONG32)
Release()
{
if (InterlockedDecrement(&m_lRefCount) > 0)
{
return m_lRefCount;
}
delete this;
return 0;
}
STDMETHODIMP
Func()
{
m_PendingHandle = 0;
m_bPendingCallback = FALSE;
if (m_pOutter != NULL)
{
return m_pOutter->AttemptToSatisfyDryRequest(m_ulAudioTimeWanted);
}
else
{
return HXR_UNEXPECTED;
}
}
STDMETHODIMP
ScheduleCallback()
{
IHXCallback* pCallback = NULL;
if (HXR_OK == QueryInterface(IID_IHXCallback, (void**)&pCallback))
{
// we want to do the right thing here and remove a callback before we schedule a new one
// but we should never do that.
HX_ASSERT(!m_bPendingCallback);
if (m_bPendingCallback)
{
if (m_pScheduler)
{
m_pScheduler->Remove(m_PendingHandle);
}
}
m_bPendingCallback = TRUE;
m_PendingHandle = m_pScheduler->RelativeEnter(pCallback, 0);
}
HX_RELEASE(pCallback);
return HXR_OK;
}
STDMETHODIMP
Cancel()
{
if (m_bPendingCallback && m_pScheduler)
{
m_pScheduler->Remove(m_PendingHandle);
m_bPendingCallback = FALSE;
m_PendingHandle = 0;
}
return HXR_OK;
}
STDMETHODIMP
UpdateAudioTimeWanted(UINT32 ulAudioTimeWanted)
{
HX_ASSERT(m_bPendingCallback);
m_ulAudioTimeWanted = ulAudioTimeWanted;
return HXR_OK;
}
};
#endif /*_MACINTOSH*/
ULONG32 CRealAudioRenderer::_AddRef()
{
return InterlockedIncrement(&m_lRefCount);
}
ULONG32 CRealAudioRenderer::_Release()
{
if (InterlockedDecrement(&m_lRefCount) > 0)
{
return m_lRefCount;
}
delete this;
return 0;
}
#endif // ndef _RARENDER_H_
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -