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

Symbian

开发平台:

C/C++

  1. /* ***** BEGIN LICENSE BLOCK ***** 
  2.  * Version: RCSL 1.0/RPSL 1.0 
  3.  *  
  4.  * Portions Copyright (c) 1995-2002 RealNetworks, Inc. All Rights Reserved. 
  5.  *      
  6.  * The contents of this file, and the files included with this file, are 
  7.  * subject to the current version of the RealNetworks Public Source License 
  8.  * Version 1.0 (the "RPSL") available at 
  9.  * http://www.helixcommunity.org/content/rpsl unless you have licensed 
  10.  * the file under the RealNetworks Community Source License Version 1.0 
  11.  * (the "RCSL") available at http://www.helixcommunity.org/content/rcsl, 
  12.  * in which case the RCSL will apply. You may also obtain the license terms 
  13.  * directly from RealNetworks.  You may not use this file except in 
  14.  * compliance with the RPSL or, if you have a valid RCSL with RealNetworks 
  15.  * applicable to this file, the RCSL.  Please see the applicable RPSL or 
  16.  * RCSL for the rights, obligations and limitations governing use of the 
  17.  * contents of the file.  
  18.  *  
  19.  * This file is part of the Helix DNA Technology. RealNetworks is the 
  20.  * developer of the Original Code and owns the copyrights in the portions 
  21.  * it created. 
  22.  *  
  23.  * This file, and the files included with this file, is distributed and made 
  24.  * available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER 
  25.  * EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS ALL SUCH WARRANTIES, 
  26.  * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, FITNESS 
  27.  * FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. 
  28.  * 
  29.  * Technology Compatibility Kit Test Suite(s) Location: 
  30.  *    http://www.helixcommunity.org/content/tck 
  31.  * 
  32.  * Contributor(s): 
  33.  *  
  34.  * ***** END LICENSE BLOCK ***** */ 
  35. #include "hlxclib/stdio.h"
  36. #include "hlxclib/string.h"
  37. #include "hxresult.h"
  38. #include "hxtypes.h"
  39. #include "hxcom.h"
  40. #include "hxausvc.h"
  41. #include "hxaudvol.h"
  42. #include "hxslist.h"
  43. #include "hxheap.h"
  44. #ifdef _DEBUG
  45. #undef HX_THIS_FILE
  46. static const char HX_THIS_FILE[] = __FILE__;
  47. #endif
  48. /************************************************************************
  49.  *  Method:
  50.  * IHXVolume::CHXVolume()
  51.  * Purpose:
  52.  * Constructor. Clean up and set free.
  53.  */
  54. CHXVolume::CHXVolume()
  55. : m_uVolume(HX_INIT_VOLUME)
  56. , m_lRefCount(0)
  57. , m_bMute(FALSE)
  58. , m_pSinkList(0)
  59. {
  60.     Init();
  61. }
  62. /************************************************************************
  63.  *  Method:
  64.  * IHXVolume::~CHXVolume()
  65.  * Purpose:
  66.  * Destructor. Clean up and set free.
  67.  */
  68. CHXVolume::~CHXVolume()
  69. {
  70.     /* Delete items in lists */
  71.     if ( m_pSinkList )
  72.     {
  73. IHXVolumeAdviseSink* s = 0;
  74.         CHXSimpleList::Iterator lIter = m_pSinkList->Begin();
  75.         for (; lIter != m_pSinkList->End(); ++lIter)
  76.         {
  77.             s = (IHXVolumeAdviseSink*) (*lIter);
  78.             if ( s )
  79.     {
  80.                 s->Release();
  81. s = 0;
  82.     }
  83.         }
  84.   delete m_pSinkList;
  85. m_pSinkList = 0;
  86.     }
  87. }
  88. /////////////////////////////////////////////////////////////////////////
  89. //  Method:
  90. //      IUnknown::QueryInterface
  91. //  Purpose:
  92. //      Implement this to export the interfaces supported by your
  93. //      object.
  94. //
  95. STDMETHODIMP CHXVolume::QueryInterface(REFIID riid, void** ppvObj)
  96. {
  97.     QInterfaceList qiList[] =
  98.         {
  99.             { GET_IIDHANDLE(IID_IHXVolume), (IHXVolume*)this },
  100.             { GET_IIDHANDLE(IID_IUnknown), (IUnknown*)(IHXVolume*)this },
  101.         };
  102.     
  103.     return ::QIFind(qiList, QILISTSIZE(qiList), riid, ppvObj);
  104. }
  105. /////////////////////////////////////////////////////////////////////////
  106. //  Method:
  107. //      IUnknown::AddRef
  108. //  Purpose:
  109. //      Everyone usually implements this the same... feel free to use
  110. //      this implementation.
  111. //
  112. STDMETHODIMP_(ULONG32) CHXVolume::AddRef()
  113. {
  114.     return InterlockedIncrement(&m_lRefCount);
  115. }
  116. /////////////////////////////////////////////////////////////////////////
  117. //  Method:
  118. //      IUnknown::Release
  119. //  Purpose:
  120. //      Everyone usually implements this the same... feel free to use
  121. //      this implementation.
  122. //
  123. STDMETHODIMP_(ULONG32) CHXVolume::Release()
  124. {
  125.     if (InterlockedDecrement(&m_lRefCount) > 0)
  126.     {
  127.         return m_lRefCount;
  128.     }
  129.     delete this;
  130.     return 0;
  131. }
  132. /*
  133.  *  IHXVolume methods
  134.  */
  135. /************************************************************************
  136.  *  Method:
  137.  * IHXVolume::Init
  138.  * Purpose:
  139.  *
  140.  */
  141. STDMETHODIMP CHXVolume::Init()
  142. {
  143.     HX_RESULT theErr = HXR_OK;
  144.     /* create sink lists. */
  145.     m_pSinkList = new CHXSimpleList;
  146.     if ( !m_pSinkList )
  147. theErr = HXR_OUTOFMEMORY;
  148.     if ( !theErr )
  149.     {
  150. if(!m_pSinkList->IsPtrListValid())
  151.     theErr = HXR_OUTOFMEMORY;
  152.     }
  153.     if ( !theErr )
  154. return HXR_OK;
  155.     else
  156. return HXR_FAILED;
  157. }
  158. /************************************************************************
  159.  *  Method:
  160.  * IHXVolume::SetVolume
  161.  * Purpose:
  162.  *
  163.  */
  164. STDMETHODIMP CHXVolume::SetVolume
  165. (
  166.     const UINT16 uVolume
  167. )
  168. {
  169.     m_uVolume   = uVolume;
  170.     /* Call all advise sinks in list. */
  171.     if ( m_pSinkList )
  172.     {
  173. IHXVolumeAdviseSink* s = 0;
  174.         CHXSimpleList::Iterator lIter = m_pSinkList->Begin();
  175.         for (; lIter != m_pSinkList->End(); ++lIter)
  176.         {
  177.             s = (IHXVolumeAdviseSink*) (*lIter);
  178.             if ( s )
  179.                 s->OnVolumeChange(uVolume);
  180.         }
  181.     }
  182.     return HXR_OK;
  183. }
  184. /************************************************************************
  185.  *  Method:
  186.  * IHXVolume::GetVolume
  187.  * Purpose:
  188.  *
  189.  */
  190. STDMETHODIMP_(UINT16) CHXVolume::GetVolume()
  191. {
  192.     return m_uVolume;
  193. }
  194. /************************************************************************
  195.  *  Method:
  196.  * IHXVolume::SetMute
  197.  * Purpose:
  198.  *
  199.  */
  200. STDMETHODIMP CHXVolume::SetMute
  201. (
  202. const BOOL bMute
  203. )
  204. {
  205.     m_bMute = bMute;
  206.     /* Call all advise sinks in list. */
  207.     if ( m_pSinkList )
  208.     {
  209. IHXVolumeAdviseSink* s = 0;
  210.         CHXSimpleList::Iterator lIter = m_pSinkList->Begin();
  211.         for (; lIter != m_pSinkList->End(); ++lIter)
  212.         {
  213.             s = (IHXVolumeAdviseSink*) (*lIter);
  214.             if ( s )
  215.                 s->OnMuteChange(bMute);
  216.         }
  217.     }
  218.     return HXR_OK;
  219. }
  220. /************************************************************************
  221.  *  Method:
  222.  * IHXVolume::GetMute
  223.  * Purpose:
  224.  *
  225.  */
  226. STDMETHODIMP_(BOOL) CHXVolume::GetMute()
  227. {
  228.     return m_bMute;
  229. }
  230. /************************************************************************
  231.  *  Method:
  232.  * IHXVolume::AddAdviseSink
  233.  * Purpose:
  234.  *
  235.  */
  236. STDMETHODIMP CHXVolume::AddAdviseSink
  237. (
  238.     IHXVolumeAdviseSink* pSink
  239. )
  240. {
  241.     if (!pSink || !m_pSinkList)
  242.     {
  243. return HXR_FAILED;
  244.     }
  245.     /* Check if this one already exists */
  246.     LISTPOSITION lPos = m_pSinkList->Find(pSink);
  247.     if (lPos)
  248.     {
  249. return HXR_FAILED;
  250.     }
  251.     pSink->AddRef();
  252.     m_pSinkList->AddTail((void*) pSink);
  253.     return HXR_OK;
  254. }
  255. /************************************************************************
  256.  *  Method:
  257.  * IHXVolume::RemoveAdviseSink
  258.  * Purpose:
  259.  *
  260.  */
  261. STDMETHODIMP CHXVolume::RemoveAdviseSink
  262. (
  263.     IHXVolumeAdviseSink* pSink
  264. )
  265. {
  266.     if (!pSink || !m_pSinkList)
  267.     {
  268. return HXR_FAILED;
  269.     }
  270.     LISTPOSITION lpos = m_pSinkList->Find(pSink);
  271.     if (lpos)
  272.     {
  273.   m_pSinkList->RemoveAt(lpos);
  274. pSink->Release();
  275. return HXR_OK;
  276.     }
  277.     
  278.     return HXR_FAILED;
  279. }