chxavplayerstatedispatch.cpp
上传用户:zhongxx05
上传日期:2007-06-06
资源大小:33641k
文件大小:5k
源码类别:

Symbian

开发平台:

C/C++

  1. /************************************************************************
  2.  * chxavplayerstatedispatch.cpp
  3.  * ----------------------------
  4.  *
  5.  * Synopsis:
  6.  * Contains the implementation of the CHXAvPlayerStateDispatch class.  
  7.  * This class calls any play state observer with state changes.
  8.  *
  9.  * Target:
  10.  * Symbian OS
  11.  *
  12.  *
  13.  * (c) 1995-2003 RealNetworks, Inc. Patents pending. All rights reserved.
  14.  *
  15.  *****************************************************************************/
  16. #include "hxstring.h"
  17. #include "ihxsymplayerstateobserver.h"
  18. #include "chxavplayerstatedispatch.h"
  19. namespace
  20. {
  21. //
  22. // ugly stuff to make fowarding methods
  23. // prettier (plus share some code)
  24. //
  25. void Notify0(CHXSimpleList& list, 
  26.     void (IHXSymPlayerStateObserver::* pmfn)())
  27. {
  28.     for ( CHXSimpleList::Iterator iter = list.Begin(); iter != list.End(); ++iter )
  29.     {
  30. IHXSymPlayerStateObserver* pObserver = static_cast<IHXSymPlayerStateObserver*>(*iter);
  31. (pObserver->*pmfn)();
  32.     }
  33. }
  34. template<typename ArgType1>
  35. void Notify1(CHXSimpleList& list, 
  36.     void (IHXSymPlayerStateObserver::* pmfn)(ArgType1),
  37.     ArgType1 arg1)
  38. {
  39.     for ( CHXSimpleList::Iterator iter = list.Begin(); iter != list.End(); ++iter )
  40.     {
  41. IHXSymPlayerStateObserver* pObserver = static_cast<IHXSymPlayerStateObserver*>(*iter);
  42. (pObserver->*pmfn)(arg1);
  43.     }
  44. }
  45. template<typename ArgType1, typename ArgType2>
  46. void Notify2(CHXSimpleList& list, 
  47.     void (IHXSymPlayerStateObserver::* pmfn)(ArgType1,ArgType2), 
  48.     ArgType1 arg1, ArgType2 arg2)
  49. {
  50.     for ( CHXSimpleList::Iterator iter = list.Begin(); iter != list.End(); ++iter )
  51.     {
  52. IHXSymPlayerStateObserver* pObserver = static_cast<IHXSymPlayerStateObserver*>(*iter);
  53. (pObserver->*pmfn)(arg1,arg2);
  54.     }
  55. }
  56. } // local namespace
  57. /*
  58.  * CHXAvPlayerStateDispatch
  59.  * ------------------------
  60.  * Ctor.  
  61.  *
  62.  */
  63. CHXAvPlayerStateDispatch::CHXAvPlayerStateDispatch()
  64. {
  65. }
  66. /*
  67.  * ~CHXAvPlayerStateDispatch
  68.  * -------------------------
  69.  * Dtor.  Make sure list is empty.
  70.  *
  71.  */
  72. CHXAvPlayerStateDispatch::~CHXAvPlayerStateDispatch()
  73. {
  74.     HX_ASSERT(m_observers.IsEmpty());
  75. }
  76. void CHXAvPlayerStateDispatch::OnPlayInitiate(const char* url)
  77. {
  78.     Notify1(m_observers, &IHXSymPlayerStateObserver::OnPlayInitiate, url);
  79. }
  80. void CHXAvPlayerStateDispatch::OnNetConnect()
  81. {
  82.     Notify0(m_observers, &IHXSymPlayerStateObserver::OnNetConnect);
  83. }
  84. void 
  85. CHXAvPlayerStateDispatch::OnLoadSession(IHXRequest* request)
  86. {
  87.     Notify1(m_observers, &IHXSymPlayerStateObserver::OnLoadSession, request);
  88. }
  89. void 
  90. CHXAvPlayerStateDispatch::OnError(HX_RESULT code)
  91. {
  92.     Notify1(m_observers, &IHXSymPlayerStateObserver::OnError, code);
  93. }
  94. void
  95. CHXAvPlayerStateDispatch::OnAdvancePlaylist()
  96. {
  97.     Notify0(m_observers, &IHXSymPlayerStateObserver::OnAdvancePlaylist);
  98. }
  99. void 
  100. CHXAvPlayerStateDispatch::OnResume()
  101. {
  102.     Notify0(m_observers, &IHXSymPlayerStateObserver::OnResume);
  103. }
  104. void 
  105. CHXAvPlayerStateDispatch::OnStop()
  106. {
  107.     Notify0(m_observers, &IHXSymPlayerStateObserver::OnStop);
  108. }
  109. void 
  110. CHXAvPlayerStateDispatch::OnPause()
  111. {
  112.     Notify0(m_observers, &IHXSymPlayerStateObserver::OnPause);
  113. }
  114. void
  115. CHXAvPlayerStateDispatch::OnBeginBuffering(bool bIsBegin)
  116. {
  117.     Notify1(m_observers, &IHXSymPlayerStateObserver::OnBeginBuffering, bIsBegin);
  118. }
  119. void
  120. CHXAvPlayerStateDispatch::OnBuffering(UINT16 percent)
  121. {
  122.     Notify1(m_observers, &IHXSymPlayerStateObserver::OnBuffering, percent);
  123. }
  124. void 
  125. CHXAvPlayerStateDispatch::OnBeginSeek()
  126. {
  127.     Notify0(m_observers, &IHXSymPlayerStateObserver::OnBeginSeek);
  128. }
  129. void 
  130. CHXAvPlayerStateDispatch::OnVolume(unsigned int percentVol)
  131. {
  132.     Notify1(m_observers, &IHXSymPlayerStateObserver::OnVolume, percentVol);
  133. }
  134.     
  135. void 
  136. CHXAvPlayerStateDispatch::OnMute(bool bMute)
  137. {
  138.     Notify1(m_observers, &IHXSymPlayerStateObserver::OnMute, bMute);
  139. }
  140.     
  141. void 
  142. CHXAvPlayerStateDispatch::OnNewPos(ULONG32 msNewTime)
  143. {
  144.     Notify1(m_observers, &IHXSymPlayerStateObserver::OnNewPos, msNewTime);
  145. }
  146. /*
  147.  * AddObserver
  148.  * -----------
  149.  * Add an observer
  150.  *
  151.  */
  152. void CHXAvPlayerStateDispatch::AddObserver(IHXSymPlayerStateObserver* pObserver)
  153. {
  154.     // Make sure this observer is not already in the list...
  155.     if (0 == m_observers.Find((void *)pObserver, NULL)) 
  156.     {
  157.         m_observers.AddTail((void *)pObserver); 
  158.     }
  159. }
  160. /* 
  161.  * RemoveObserver
  162.  * --------------
  163.  * Remove an observer
  164.  *
  165.  */
  166. void CHXAvPlayerStateDispatch::RemoveObserver(IHXSymPlayerStateObserver* pObserver)
  167. {
  168.     LISTPOSITION position = m_observers.Find((void *)pObserver, NULL);
  169.     if (position != NULL)
  170.     {
  171. m_observers.RemoveAt(position);
  172.     }
  173. }