chxavplayerstatedispatch.cpp

来自「symbian 下的helix player源代码」· C++ 代码 · 共 216 行

CPP
216
字号
/************************************************************************
 * chxavplayerstatedispatch.cpp
 * ----------------------------
 *
 * Synopsis:
 * Contains the implementation of the CHXAvPlayerStateDispatch class.  
 * This class calls any play state observer with state changes.
 *
 * Target:
 * Symbian OS
 *
 *
 * (c) 1995-2003 RealNetworks, Inc. Patents pending. All rights reserved.
 *
 *****************************************************************************/


#include "hxstring.h"

#include "ihxsymplayerstateobserver.h"
#include "chxavplayerstatedispatch.h"


namespace
{
//
// ugly stuff to make fowarding methods
// prettier (plus share some code)
//
void Notify0(CHXSimpleList& list, 
	    void (IHXSymPlayerStateObserver::* pmfn)())
{
    for ( CHXSimpleList::Iterator iter = list.Begin(); iter != list.End(); ++iter )
    {
	IHXSymPlayerStateObserver* pObserver = static_cast<IHXSymPlayerStateObserver*>(*iter);
	(pObserver->*pmfn)();
    }
}

template<typename ArgType1>
void Notify1(CHXSimpleList& list, 
	    void (IHXSymPlayerStateObserver::* pmfn)(ArgType1),
	    ArgType1 arg1)
{
    for ( CHXSimpleList::Iterator iter = list.Begin(); iter != list.End(); ++iter )
    {
	IHXSymPlayerStateObserver* pObserver = static_cast<IHXSymPlayerStateObserver*>(*iter);
	(pObserver->*pmfn)(arg1);
    }
}

template<typename ArgType1, typename ArgType2>
void Notify2(CHXSimpleList& list, 
	    void (IHXSymPlayerStateObserver::* pmfn)(ArgType1,ArgType2), 
	    ArgType1 arg1, ArgType2 arg2)
{
    for ( CHXSimpleList::Iterator iter = list.Begin(); iter != list.End(); ++iter )
    {
	IHXSymPlayerStateObserver* pObserver = static_cast<IHXSymPlayerStateObserver*>(*iter);
	(pObserver->*pmfn)(arg1,arg2);
    }
}
} // local namespace

/*
 * CHXAvPlayerStateDispatch
 * ------------------------
 * Ctor.  
 *
 */
CHXAvPlayerStateDispatch::CHXAvPlayerStateDispatch()
{
}



/*
 * ~CHXAvPlayerStateDispatch
 * -------------------------
 * Dtor.  Make sure list is empty.
 *
 */
CHXAvPlayerStateDispatch::~CHXAvPlayerStateDispatch()
{
    HX_ASSERT(m_observers.IsEmpty());
}

void CHXAvPlayerStateDispatch::OnPlayInitiate(const char* url)
{
    Notify1(m_observers, &IHXSymPlayerStateObserver::OnPlayInitiate, url);
}

void CHXAvPlayerStateDispatch::OnNetConnect()
{
    Notify0(m_observers, &IHXSymPlayerStateObserver::OnNetConnect);
}

void 
CHXAvPlayerStateDispatch::OnLoadSession(IHXRequest* request)
{
    Notify1(m_observers, &IHXSymPlayerStateObserver::OnLoadSession, request);
}


void 
CHXAvPlayerStateDispatch::OnError(HX_RESULT code)
{
    Notify1(m_observers, &IHXSymPlayerStateObserver::OnError, code);
}

void
CHXAvPlayerStateDispatch::OnAdvancePlaylist()
{
    Notify0(m_observers, &IHXSymPlayerStateObserver::OnAdvancePlaylist);
}

void 
CHXAvPlayerStateDispatch::OnResume()
{
    Notify0(m_observers, &IHXSymPlayerStateObserver::OnResume);
}


void 
CHXAvPlayerStateDispatch::OnStop()
{
    Notify0(m_observers, &IHXSymPlayerStateObserver::OnStop);
}

void 
CHXAvPlayerStateDispatch::OnPause()
{
    Notify0(m_observers, &IHXSymPlayerStateObserver::OnPause);
}

void
CHXAvPlayerStateDispatch::OnBeginBuffering(bool bIsBegin)
{
    Notify1(m_observers, &IHXSymPlayerStateObserver::OnBeginBuffering, bIsBegin);
}

void
CHXAvPlayerStateDispatch::OnBuffering(UINT16 percent)
{
    Notify1(m_observers, &IHXSymPlayerStateObserver::OnBuffering, percent);
}

void 
CHXAvPlayerStateDispatch::OnBeginSeek()
{
    Notify0(m_observers, &IHXSymPlayerStateObserver::OnBeginSeek);
}



void 
CHXAvPlayerStateDispatch::OnVolume(unsigned int percentVol)
{
    Notify1(m_observers, &IHXSymPlayerStateObserver::OnVolume, percentVol);
}



    

void 
CHXAvPlayerStateDispatch::OnMute(bool bMute)
{
    Notify1(m_observers, &IHXSymPlayerStateObserver::OnMute, bMute);
}

    

void 
CHXAvPlayerStateDispatch::OnNewPos(ULONG32 msNewTime)
{
    Notify1(m_observers, &IHXSymPlayerStateObserver::OnNewPos, msNewTime);
}



/*
 * AddObserver
 * -----------
 * Add an observer
 *
 */
void CHXAvPlayerStateDispatch::AddObserver(IHXSymPlayerStateObserver* pObserver)
{
    // Make sure this observer is not already in the list...
    if (0 == m_observers.Find((void *)pObserver, NULL)) 
    {
        m_observers.AddTail((void *)pObserver); 
    }
}


/* 
 * RemoveObserver
 * --------------
 * Remove an observer
 *
 */
void CHXAvPlayerStateDispatch::RemoveObserver(IHXSymPlayerStateObserver* pObserver)
{
    LISTPOSITION position = m_observers.Find((void *)pObserver, NULL);
    if (position != NULL)
    {
	m_observers.RemoveAt(position);
    }
}




⌨️ 快捷键说明

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