sl@0: /* sl@0: * Copyright (c) 2006 Nokia Corporation and/or its subsidiary(-ies). sl@0: * All rights reserved. sl@0: * This component and the accompanying materials are made available sl@0: * under the terms of "Eclipse Public License v1.0" sl@0: * which accompanies this distribution, and is available sl@0: * at the URL "http://www.eclipse.org/legal/epl-v10.html". sl@0: * sl@0: * Initial Contributors: sl@0: * Nokia Corporation - initial contribution. sl@0: * sl@0: * Contributors: sl@0: * sl@0: * Description: Methods for CTelephonyAudioRoutingManager class sl@0: * sl@0: */ sl@0: sl@0: sl@0: sl@0: // INCLUDE FILES sl@0: #include sl@0: #include sl@0: #include sl@0: sl@0: #include "TelephonyAudioRoutingManager.h" sl@0: #include "TelephonyAudioRoutingClientServer.h" sl@0: #include "TelephonyAudioRoutingServer.h" sl@0: #include "TelephonyAudioRoutingManagerSession.h" sl@0: sl@0: const TUid KTelAudRtngServerUid = {0x10207A93}; sl@0: sl@0: const TInt KTelAudRtngServerStackSize=0x2000; // 8KB sl@0: const TInt KTelAudRtngServerInitHeapSize=0x1000; // 4KB sl@0: const TInt KTelAudRtngServerMaxHeapSize=0x1000000; // 16MB sl@0: sl@0: // ================= MEMBER FUNCTIONS ======================= sl@0: sl@0: // C++ default constructor can NOT contain any code, that sl@0: // might leave. sl@0: // sl@0: CTelephonyAudioRoutingManager::CTelephonyAudioRoutingManager( sl@0: MTelephonyAudioRoutingPolicyObserver& aObserver) sl@0: : iObserver(aObserver) sl@0: { sl@0: } sl@0: sl@0: sl@0: // ----------------------------------------------------------------------------- sl@0: // CAudioOutputProxy::ConstructL sl@0: // Symbian 2nd phase constructor can leave. sl@0: // ----------------------------------------------------------------------------- sl@0: // sl@0: void CTelephonyAudioRoutingManager::ConstructL( sl@0: const TArray& aArray) sl@0: { sl@0: TELAUDRTNG_RDEBUG(_L("[TELAUDRTNG]\t CTelephonyAudioRoutingManager::ConstructL ")); sl@0: sl@0: User::LeaveIfError(StartServer()); sl@0: iMgrSession = new (ELeave)RTelephonyAudioRoutingManagerSession; sl@0: User::LeaveIfError(iMgrSession->Connect(*this, iObserver)); sl@0: sl@0: iMgrSession->SetPolicySessionIdL(); sl@0: iMgrSession->MonitorOutputChangeRequest(); sl@0: iMgrSession->AvailableOutputsChangedL(aArray); sl@0: sl@0: } sl@0: sl@0: // Two-phased constructor. sl@0: EXPORT_C CTelephonyAudioRoutingManager* CTelephonyAudioRoutingManager::NewL( sl@0: MTelephonyAudioRoutingPolicyObserver& aObserver, sl@0: const TArray& aArray) sl@0: { sl@0: CTelephonyAudioRoutingManager* self = new(ELeave) CTelephonyAudioRoutingManager(aObserver); sl@0: CleanupStack::PushL(self); sl@0: self->ConstructL(aArray); sl@0: CleanupStack::Pop(self); sl@0: return self; sl@0: } sl@0: sl@0: sl@0: // Destructor sl@0: CTelephonyAudioRoutingManager::~CTelephonyAudioRoutingManager() sl@0: { sl@0: TELAUDRTNG_RDEBUG(_L("[TELAUDRTNG]\t CTelephonyAudioRoutingManager::~CTelephonyAudioRoutingManager ")); sl@0: if (iMgrSession) sl@0: { sl@0: iMgrSession->Close(); sl@0: } sl@0: delete iMgrSession; sl@0: iServer.Close(); sl@0: } sl@0: sl@0: // --------------------------------------------------------- sl@0: // CAudioOutput::OutputChanged sl@0: // Policy is sending out notification that the output has changed sl@0: // (a change initiated by policy) sl@0: // (other items were commented in a header). sl@0: // --------------------------------------------------------- sl@0: // sl@0: sl@0: EXPORT_C void CTelephonyAudioRoutingManager::OutputChanged(CTelephonyAudioRouting::TAudioOutput aOutput) sl@0: { sl@0: TELAUDRTNG_RDEBUG1(_L("[TELAUDRTNG]\t CTelephonyAudioRoutingManager::OutputChanged to: %d"), aOutput); sl@0: iMgrSession->OutputChanged(aOutput); sl@0: } sl@0: sl@0: // --------------------------------------------------------- sl@0: // CAudioOutput::AvailableOutputsChanged sl@0: // Policy is sending out notification that the available outputs have changed sl@0: // (other items were commented in a header). sl@0: // --------------------------------------------------------- sl@0: // sl@0: sl@0: EXPORT_C void CTelephonyAudioRoutingManager::AvailableOutputsChanged(const TArray& aArray) sl@0: { sl@0: TELAUDRTNG_RDEBUG(_L("[TELAUDRTNG]\t CTelephonyAudioRoutingManager::AvailableOutputsChanged ")); sl@0: TRAPD(err,iMgrSession->AvailableOutputsChangedL(aArray)); sl@0: if (err != KErrNone) sl@0: { sl@0: TELAUDRTNG_RDEBUG1(_L("[TELAUDRTNG]\t CTelephonyAudioRoutingManager::AvailableOutputsChanged: ERROR from Adaptation: %d "), err); sl@0: } sl@0: } sl@0: sl@0: // --------------------------------------------------------- sl@0: // CAudioOutput::OutputChangeRequestCompleted sl@0: // Policy is sending out notification that the request change in output has been completed sl@0: // (other items were commented in a header). sl@0: // --------------------------------------------------------- sl@0: // sl@0: EXPORT_C void CTelephonyAudioRoutingManager::OutputChangeRequestCompleted(CTelephonyAudioRouting::TAudioOutput aOutput, TInt aError) sl@0: { sl@0: TELAUDRTNG_RDEBUG(_L("[TELAUDRTNG]\t CTelephonyAudioRoutingManager::OutputChangeRequestCompleted ")); sl@0: if (aError != KErrNone) sl@0: { sl@0: TELAUDRTNG_RDEBUG1(_L("[TELAUDRTNG]\t CTelephonyAudioRoutingManager::OutputChangeRequestCompleted: ERROR from Adaptation: %d "), aError); sl@0: } sl@0: sl@0: iMgrSession->OutputChangeCompleted(aOutput, aError); sl@0: } sl@0: sl@0: sl@0: // ----------------------------------------------------------------------------- sl@0: // CStartTelephonyAudioRoutingServer::StartServer sl@0: // Start TelephonyAudioRouting Server sl@0: // (other items were commented in a header). sl@0: // ----------------------------------------------------------------------------- sl@0: // sl@0: TInt CTelephonyAudioRoutingManager::StartServer() sl@0: { sl@0: TELAUDRTNG_RDEBUG(_L("[TELAUDRTNG]\t CTelephonyAudioRoutingManager::StartServer ")); sl@0: sl@0: const TUidType serverUid(KNullUid,KNullUid,KTelAudRtngServerUid); sl@0: sl@0: TThreadFunction serverFunc=CTelephonyAudioRoutingServer::StartThreadL; sl@0: sl@0: TInt err(KErrNone); sl@0: TName name(KTelAudRtngServName); sl@0: sl@0: err = iServer.Create(name, serverFunc, KTelAudRtngServerStackSize, sl@0: KTelAudRtngServerInitHeapSize, KTelAudRtngServerMaxHeapSize, sl@0: /*&start*/ NULL, EOwnerProcess); sl@0: sl@0: sl@0: if(err != KErrNone) sl@0: return err; sl@0: // Synchronise with the server sl@0: TRequestStatus reqStatus; sl@0: iServer.Rendezvous(reqStatus); sl@0: sl@0: if (reqStatus!=KRequestPending) sl@0: { sl@0: iServer.Kill(0); sl@0: } sl@0: else sl@0: { sl@0: // Start the test harness sl@0: iServer.Resume(); sl@0: // Server will call the reciprocal static synchronise call sl@0: } sl@0: sl@0: User::WaitForRequest(reqStatus); // wait for start or death sl@0: if(reqStatus.Int() != KErrNone) sl@0: { sl@0: iServer.Close(); sl@0: return reqStatus.Int(); sl@0: } sl@0: sl@0: return KErrNone; sl@0: sl@0: } sl@0: sl@0: // End of File