audio_svr.cpp
上传用户:dangjiwu
上传日期:2013-07-19
资源大小:42019k
文件大小:7k
源码类别:

Symbian

开发平台:

Visual C++

  1. /* ***** BEGIN LICENSE BLOCK *****
  2.  * Source last modified: $Id: audio_svr.cpp,v 1.1.4.3 2004/07/09 02:01:36 hubbe Exp $
  3.  * 
  4.  * Portions Copyright (c) 1995-2004 RealNetworks, Inc. All Rights Reserved.
  5.  * 
  6.  * The contents of this file, and the files included with this file,
  7.  * are subject to the current version of the RealNetworks Public
  8.  * Source License (the "RPSL") available at
  9.  * http://www.helixcommunity.org/content/rpsl unless you have licensed
  10.  * the file under the current version of the RealNetworks Community
  11.  * Source License (the "RCSL") available at
  12.  * http://www.helixcommunity.org/content/rcsl, in which case the RCSL
  13.  * will apply. You may also obtain the license terms directly from
  14.  * RealNetworks.  You may not use this file except in compliance with
  15.  * the RPSL or, if you have a valid RCSL with RealNetworks applicable
  16.  * to this file, the RCSL.  Please see the applicable RPSL or RCSL for
  17.  * the rights, obligations and limitations governing use of the
  18.  * contents of the file.
  19.  * 
  20.  * Alternatively, the contents of this file may be used under the
  21.  * terms of the GNU General Public License Version 2 or later (the
  22.  * "GPL") in which case the provisions of the GPL are applicable
  23.  * instead of those above. If you wish to allow use of your version of
  24.  * this file only under the terms of the GPL, and not to allow others
  25.  * to use your version of this file under the terms of either the RPSL
  26.  * or RCSL, indicate your decision by deleting the provisions above
  27.  * and replace them with the notice and other provisions required by
  28.  * the GPL. If you do not delete the provisions above, a recipient may
  29.  * use your version of this file under the terms of any one of the
  30.  * RPSL, the RCSL or the GPL.
  31.  * 
  32.  * This file is part of the Helix DNA Technology. RealNetworks is the
  33.  * developer of the Original Code and owns the copyrights in the
  34.  * portions it created.
  35.  * 
  36.  * This file, and the files included with this file, is distributed
  37.  * and made available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY
  38.  * KIND, EITHER EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS
  39.  * ALL SUCH WARRANTIES, INCLUDING WITHOUT LIMITATION, ANY WARRANTIES
  40.  * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, QUIET
  41.  * ENJOYMENT OR NON-INFRINGEMENT.
  42.  * 
  43.  * Technology Compatibility Kit Test Suite(s) Location:
  44.  *    http://www.helixcommunity.org/content/tck
  45.  * 
  46.  * Contributor(s):
  47.  * 
  48.  * ***** END LICENSE BLOCK ***** */
  49. #include "hlxclib/memory.h"
  50. #include "audio_svr.h"
  51. #if defined (HELIX_CONFIG_DEVSOUND)
  52. #include "mmf/audio_session-mmf.h"
  53. #else
  54. #include "mda/audio_session-mda.h"
  55. #endif
  56. _LIT(kHXSymbianAudioServer, "HelixAudioServer");
  57. static const TUint KDefaultMessageSlots = 2;
  58. // class HXSymbianAudioServer:
  59. HXSymbianAudioServer::HXSymbianAudioServer()
  60. : CServer(CActive::EPriorityStandard, ESharableSessions),
  61.   m_sessionCount(0)
  62. {
  63. }
  64. HXSymbianAudioServer::~HXSymbianAudioServer()
  65. {
  66.     Cancel();
  67. }
  68. CSharableSession* HXSymbianAudioServer::NewSessionL(const TVersion& aVersion) const
  69. {
  70.     RThread client = Message().Client();
  71.     return HXSymbianAudioSession::NewL(client, (HXSymbianAudioServer*)this);
  72. }
  73. void HXSymbianAudioServer::AddSession()
  74. {
  75.     ++m_sessionCount;
  76. }
  77. void HXSymbianAudioServer::DelSession()
  78. {
  79.     --m_sessionCount;
  80.     if (m_sessionCount <= 0)
  81.     {
  82.         // exit the server
  83. CActiveScheduler::Stop();
  84.     }
  85. }
  86. // in leave handler for active object (CServer::RunL())
  87. TInt HXSymbianAudioServer::RunError(TInt aError)
  88. {
  89.     Message().Complete(aError);
  90.     
  91.     //
  92.     // Leaving from CServer::RunL() results in skipping the call to request
  93.     // another message; ReStart() keeps the server running
  94.     //
  95.     ReStart();
  96.     // handled the error fully (must return KErrNone to keep active
  97.     // scheduler running)
  98.     return KErrNone;    
  99. }
  100. void HXSymbianAudioServer::NotifyDeviceTaken()
  101. {
  102.     // loop over session and notify them the device has been taken
  103.     HXSymbianAudioSession* pSession;
  104.     iSessionIter.SetToFirst();
  105.     while ((pSession = (HXSymbianAudioSession*)iSessionIter++) != NULL)
  106. pSession->NotifyDeviceTaken();
  107. }
  108. HBufC* HXSymbianAudioServer::AllocServerName()
  109. {
  110.     HBufC* pName = HBufC::New(kHXSymbianAudioServer().Length() + 16);
  111.     // create a name that is unique to this process
  112.     TPtr p = pName->Des();
  113.     p.Copy(kHXSymbianAudioServer);
  114.     p.AppendNum(TInt(RProcess().Id()));
  115.     return pName;
  116. }
  117. //
  118. // HXSymbianAudioClient
  119. //
  120. HXSymbianAudioClient::HXSymbianAudioClient()
  121.     : m_stopped(true)
  122. {}
  123. TInt HXSymbianAudioClient::Init(int sampleRate, int channels)
  124. {
  125.     TAny* p[KMaxMessageArguments];
  126.     
  127.     p[0] = (TAny*)sampleRate;
  128.     p[1] = (TAny*)channels;
  129.     return (SendReceive(HXSymbianAudioServer::EAS_Init, &p[0]));
  130. }
  131. TInt HXSymbianAudioClient::Play()
  132. {
  133.     m_stopped = false;
  134.     return SendReceive(HXSymbianAudioServer::EAS_Play, 0);
  135. }
  136. void HXSymbianAudioClient::Pause()
  137. {
  138.     SendReceive(HXSymbianAudioServer::EAS_Pause, 0);
  139. }
  140. void HXSymbianAudioClient::Stop()
  141. {
  142.     SendReceive(HXSymbianAudioServer::EAS_Stop, 0);
  143.     m_stopped = true;
  144. }
  145. bool HXSymbianAudioClient::Stopped()
  146. {
  147.     return m_stopped;
  148. }
  149. void HXSymbianAudioClient::SetVolume(const TInt aNewVolume)
  150. {
  151.     TAny* p[KMaxMessageArguments];
  152.     
  153.     p[0] = (TAny*)aNewVolume;
  154.     SendReceive(HXSymbianAudioServer::EAS_SetVolume, &p[0]);
  155. }
  156. TInt HXSymbianAudioClient::GetVolume() const
  157. {
  158.     return SendReceive(HXSymbianAudioServer::EAS_GetVolume, 0);
  159. }
  160. TInt HXSymbianAudioClient::GetMaxVolume() const
  161. {
  162.     return SendReceive(HXSymbianAudioServer::EAS_GetMaxVolume, 0);
  163. }
  164. TInt HXSymbianAudioClient::GetMinVolume() const
  165. {
  166.     return SendReceive(HXSymbianAudioServer::EAS_GetMinVolume, 0);
  167. }
  168. void HXSymbianAudioClient::Write(const IHXBuffer* pAudioBuf,
  169.  TRequestStatus& aStatus)
  170. {
  171.     TAny* p[KMaxMessageArguments];
  172.     
  173.     p[0] = (TAny*)(pAudioBuf);
  174.     SendReceive(HXSymbianAudioServer::EAS_Write, &p[0], aStatus);
  175. }
  176. TInt HXSymbianAudioClient::Write(const IHXBuffer* pAudioBuf)
  177. {
  178.     TAny* p[KMaxMessageArguments];
  179.     
  180.     p[0] = (TAny*)(pAudioBuf);
  181.     return (SendReceive(HXSymbianAudioServer::EAS_Write, &p[0]));
  182. }
  183. void HXSymbianAudioClient::CancelWrite()
  184. {
  185.     SendReceive(HXSymbianAudioServer::EAS_CancelWrite, 0);
  186. }
  187. TUint HXSymbianAudioClient::GetTime()
  188. {
  189.     return TUint(SendReceive(HXSymbianAudioServer::EAS_GetTime, 0));
  190. }
  191. TUint HXSymbianAudioClient::GetBlocksBuffered()
  192. {
  193.     return TUint(SendReceive(HXSymbianAudioServer::EAS_GetBlocksBuffered, 0));
  194. }
  195. TInt HXSymbianAudioClient::Connect()
  196. {
  197.     TInt status = KErrNoMemory;
  198.     HBufC* pName = HXSymbianAudioServer::AllocServerName();
  199.     if (pName)
  200.     {
  201. status = CreateSession(*pName, TVersion(0,0,0), KDefaultMessageSlots);
  202. delete pName;
  203.     }
  204.     return status;
  205. }
  206.     
  207. void HXSymbianAudioClient::RequestDeviceTakenNotification(TRequestStatus& status)
  208. {
  209.     SendReceive(HXSymbianAudioServer::EAS_RequestDeviceTakenNotification,
  210. 0, status);
  211. }
  212. void HXSymbianAudioClient::CancelDeviceTakenNotification()
  213. {
  214.     SendReceive(HXSymbianAudioServer::EAS_CancelDeviceTakenNotification, 0);
  215. }