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

Symbian

开发平台:

C/C++

  1. /* ***** BEGIN LICENSE BLOCK ***** 
  2.  * Version: RCSL 1.0/RPSL 1.0 
  3.  *  
  4.  * Portions Copyright (c) 1995-2003 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/memory.h"
  36. #include "audio_svr.h"
  37. #if defined (HELIX_CONFIG_DEVSOUND)
  38. #include "mmf/audio_session-mmf.h"
  39. #else
  40. #include "mda/audio_session-mda.h"
  41. #endif
  42. _LIT(kHXSymbianAudioServer, "HelixAudioServer");
  43. static const TUint KDefaultMessageSlots = 2;
  44. // class HXSymbianAudioServer:
  45. HXSymbianAudioServer::HXSymbianAudioServer()
  46. : CServer(CActive::EPriorityStandard, ESharableSessions),
  47.   m_sessionCount(0)
  48. {
  49. }
  50. HXSymbianAudioServer::~HXSymbianAudioServer()
  51. {
  52.     Cancel();
  53. }
  54. CSharableSession* HXSymbianAudioServer::NewSessionL(const TVersion& aVersion) const
  55. {
  56.     RThread client = Message().Client();
  57.     return HXSymbianAudioSession::NewL(client, (HXSymbianAudioServer*)this);
  58. }
  59. void HXSymbianAudioServer::AddSession()
  60. {
  61.     ++m_sessionCount;
  62. }
  63. void HXSymbianAudioServer::DelSession()
  64. {
  65.     --m_sessionCount;
  66.     if (m_sessionCount <= 0)
  67.     {
  68.         // exit the server
  69. CActiveScheduler::Stop();
  70.     }
  71. }
  72. // in leave handler for active object (CServer::RunL())
  73. TInt HXSymbianAudioServer::RunError(TInt aError)
  74. {
  75.     Message().Complete(aError);
  76.     
  77.     //
  78.     // Leaving from CServer::RunL() results in skipping the call to request
  79.     // another message; ReStart() keeps the server running
  80.     //
  81.     ReStart();
  82.     // handled the error fully (must return KErrNone to keep active
  83.     // scheduler running)
  84.     return KErrNone;    
  85. }
  86. void HXSymbianAudioServer::NotifyDeviceTaken()
  87. {
  88.     // loop over session and notify them the device has been taken
  89.     HXSymbianAudioSession* pSession;
  90.     iSessionIter.SetToFirst();
  91.     while ((pSession = (HXSymbianAudioSession*)iSessionIter++) != NULL)
  92. pSession->NotifyDeviceTaken();
  93. }
  94. HBufC* HXSymbianAudioServer::AllocServerName()
  95. {
  96.     HBufC* pName = HBufC::New(kHXSymbianAudioServer().Length() + 16);
  97.     // create a name that is unique to this process
  98.     TPtr p = pName->Des();
  99.     p.Copy(kHXSymbianAudioServer);
  100.     p.AppendNum(TInt(RProcess().Id()));
  101.     return pName;
  102. }
  103. //
  104. // HXSymbianAudioClient
  105. //
  106. HXSymbianAudioClient::HXSymbianAudioClient()
  107.     : m_stopped(true)
  108. {}
  109. TInt HXSymbianAudioClient::Init(int sampleRate, int channels)
  110. {
  111.     TAny* p[KMaxMessageArguments];
  112.     
  113.     p[0] = (TAny*)sampleRate;
  114.     p[1] = (TAny*)channels;
  115.     return (SendReceive(HXSymbianAudioServer::EAS_Init, &p[0]));
  116. }
  117. TInt HXSymbianAudioClient::Play()
  118. {
  119.     m_stopped = false;
  120.     return SendReceive(HXSymbianAudioServer::EAS_Play, 0);
  121. }
  122. void HXSymbianAudioClient::Pause()
  123. {
  124.     SendReceive(HXSymbianAudioServer::EAS_Pause, 0);
  125. }
  126. void HXSymbianAudioClient::Stop()
  127. {
  128.     SendReceive(HXSymbianAudioServer::EAS_Stop, 0);
  129.     m_stopped = true;
  130. }
  131. bool HXSymbianAudioClient::Stopped()
  132. {
  133.     return m_stopped;
  134. }
  135. void HXSymbianAudioClient::SetVolume(const TInt aNewVolume)
  136. {
  137.     TAny* p[KMaxMessageArguments];
  138.     
  139.     p[0] = (TAny*)aNewVolume;
  140.     SendReceive(HXSymbianAudioServer::EAS_SetVolume, &p[0]);
  141. }
  142. TInt HXSymbianAudioClient::GetVolume() const
  143. {
  144.     return SendReceive(HXSymbianAudioServer::EAS_GetVolume, 0);
  145. }
  146. TInt HXSymbianAudioClient::GetMaxVolume() const
  147. {
  148.     return SendReceive(HXSymbianAudioServer::EAS_GetMaxVolume, 0);
  149. }
  150. TInt HXSymbianAudioClient::GetMinVolume() const
  151. {
  152.     return SendReceive(HXSymbianAudioServer::EAS_GetMinVolume, 0);
  153. }
  154. void HXSymbianAudioClient::Write(const IHXBuffer* pAudioBuf,
  155.  TRequestStatus& aStatus)
  156. {
  157.     TAny* p[KMaxMessageArguments];
  158.     
  159.     p[0] = (TAny*)(pAudioBuf);
  160.     SendReceive(HXSymbianAudioServer::EAS_Write, &p[0], aStatus);
  161. }
  162. TInt HXSymbianAudioClient::Write(const IHXBuffer* pAudioBuf)
  163. {
  164.     TAny* p[KMaxMessageArguments];
  165.     
  166.     p[0] = (TAny*)(pAudioBuf);
  167.     return (SendReceive(HXSymbianAudioServer::EAS_Write, &p[0]));
  168. }
  169. void HXSymbianAudioClient::CancelWrite()
  170. {
  171.     SendReceive(HXSymbianAudioServer::EAS_CancelWrite, 0);
  172. }
  173. TUint HXSymbianAudioClient::GetTime()
  174. {
  175.     return TUint(SendReceive(HXSymbianAudioServer::EAS_GetTime, 0));
  176. }
  177. TUint HXSymbianAudioClient::GetBlocksBuffered()
  178. {
  179.     return TUint(SendReceive(HXSymbianAudioServer::EAS_GetBlocksBuffered, 0));
  180. }
  181. TInt HXSymbianAudioClient::Connect()
  182. {
  183.     TInt status = KErrNoMemory;
  184.     HBufC* pName = HXSymbianAudioServer::AllocServerName();
  185.     if (pName)
  186.     {
  187. status = CreateSession(*pName, TVersion(0,0,0), KDefaultMessageSlots);
  188. delete pName;
  189.     }
  190.     return status;
  191. }
  192.     
  193. void HXSymbianAudioClient::RequestDeviceTakenNotification(TRequestStatus& status)
  194. {
  195.     SendReceive(HXSymbianAudioServer::EAS_RequestDeviceTakenNotification,
  196. 0, status);
  197. }
  198. void HXSymbianAudioClient::CancelDeviceTakenNotification()
  199. {
  200.     SendReceive(HXSymbianAudioServer::EAS_CancelDeviceTakenNotification, 0);
  201. }