sl@0: // Copyright (c) 2000-2009 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: sl@0: // sl@0: sl@0: #include "MmfBtAudioPolicySession.h" sl@0: #include "MmfBtPolicyClientServer.h" sl@0: #include "MmfBtAudioPolicyServer.h" sl@0: #include "MmfBtDevSoundInfo.h" sl@0: sl@0: sl@0: sl@0: CMMFAudioPolicySession* CMMFAudioPolicySession::NewL() sl@0: { sl@0: CMMFAudioPolicySession* self = new(ELeave) CMMFAudioPolicySession(); sl@0: CleanupStack::PushL(self); sl@0: self->ConstructL(); sl@0: CleanupStack::Pop(); sl@0: return self; sl@0: } sl@0: sl@0: void CMMFAudioPolicySession::ConstructL() sl@0: { sl@0: iAudioPolicyRequest = new (ELeave) CMMFAudioPolicyRequest(); sl@0: } sl@0: sl@0: CMMFAudioPolicySession::CMMFAudioPolicySession() : iEventsQue(_FOFF(TMMFAudioPolicyEventHolder,iLink)) sl@0: { sl@0: } sl@0: sl@0: void CMMFAudioPolicySession::CreateL(const CMmfIpcServer& aServer) sl@0: { sl@0: iServer = STATIC_CAST(CMMFAudioPolicyServer*, (CONST_CAST(CMmfIpcServer*, &aServer))); sl@0: iServer->IncrementSessionCount(); sl@0: CMmfIpcSession::CreateL(aServer); sl@0: iServer->IncrementSessionId(); sl@0: iPolicySessionId = iServer->PolicySessionId(); sl@0: // Get ptr to AudioPolicy from the server sl@0: iAudioPolicy = iServer->AudioPolicy(); sl@0: (iAudioPolicy->AudioPolicyRequestArray())->SetReserveL(iServer->PolicySessionCount()); sl@0: } sl@0: sl@0: CMMFAudioPolicyServer* CMMFAudioPolicySession::Server() sl@0: { sl@0: return STATIC_CAST(CMMFAudioPolicyServer*, iServer); sl@0: } sl@0: sl@0: CMMFAudioPolicySession::~CMMFAudioPolicySession() sl@0: { sl@0: delete iEventReceiver; sl@0: delete iAudioPolicyRequest; sl@0: iEventReceiver=NULL; sl@0: if (!iEventsQue.IsEmpty()) sl@0: { sl@0: TMMFAudioPolicyEventHolder* heldEvent = iEventsQue.First(); sl@0: iEventsQue.Remove(*heldEvent); sl@0: delete heldEvent; sl@0: } sl@0: iAudioPolicyPrioritySettings.iState = EMMFStateClosed; sl@0: // Have session's CMMFAudioPolicyRequest object removed from list sl@0: iAudioPolicy->RemoveFromList(iPolicySessionId); sl@0: iServer->DecrementSessionCount(); sl@0: iServer->StopNotificationTimer(); sl@0: } sl@0: sl@0: void CMMFAudioPolicySession::ServiceL(const RMmfIpcMessage& aMessage) sl@0: { sl@0: TBool complete = EFalse; sl@0: switch(aMessage.Function()) sl@0: { sl@0: case EMMFPolicyMakeRequest: sl@0: MakeRequestL(aMessage); sl@0: aMessage.Complete(KErrNone); sl@0: break; sl@0: case EMMFPolicySetDevSoundInfo: sl@0: complete = SetDevSoundInfoL(aMessage); sl@0: break; sl@0: case EMMFPolicyUpdateState: sl@0: complete = UpdateStateL(aMessage); sl@0: break; sl@0: case EMMFPolicyReceiveEvents: sl@0: complete = ReceiveEventsL(aMessage); sl@0: break; sl@0: case EMMFPolicyCancelReceiveEvents: sl@0: complete = CancelReceiveEvents(); sl@0: break; sl@0: case EMMFPolicyGetPlayFormatsSupported: sl@0: complete = GetPlayFormatsSupportedL(aMessage); sl@0: break; sl@0: case EMMFPolicyGetRecordFormatsSupported: sl@0: complete = GetRecordFormatsSupportedL(aMessage); sl@0: break; sl@0: case EMMFPolicyGetPlayFormat: sl@0: complete = GetPlayFormatL(aMessage); sl@0: break; sl@0: case EMMFPolicyGetRecordFormat: sl@0: complete = GetRecordFormatL(aMessage); sl@0: break; sl@0: case EMMFPolicyLaunchRequests: sl@0: complete = LaunchRequest(); sl@0: break; sl@0: case EMMFPolicyRequestResourceNotification: sl@0: complete = RequestResourceNotificationL(aMessage); sl@0: break; sl@0: case EMMFPolicyCancelRequestResourceNotification: sl@0: complete = CancelRequestResourceNotificationL(aMessage); sl@0: break; sl@0: case EMMFPolicyStopNotification: sl@0: complete = StopNotificationL(aMessage); sl@0: break; sl@0: case EMMFPolicyGetResourceNotificationEvent: sl@0: complete = GetResourceNotificationEventL(aMessage); sl@0: break; sl@0: default: sl@0: User::Leave(KErrNotSupported); sl@0: break; sl@0: } sl@0: if(complete) sl@0: { sl@0: aMessage.Complete(KErrNone); sl@0: } sl@0: } sl@0: sl@0: void CMMFAudioPolicySession::MakeRequestL(const RMmfIpcMessage& aMessage) sl@0: { sl@0: TMMFAudioPolicyPrioritySettingsPckg settingsPckg; sl@0: MmfMessageUtil::ReadL(aMessage, 0, settingsPckg); sl@0: sl@0: iAudioPolicyRequest->SetPriority(settingsPckg().iPriority); sl@0: iAudioPolicyRequest->SetPref(settingsPckg().iPref); sl@0: iAudioPolicyRequest->SetState(settingsPckg().iState); sl@0: sl@0: iAudioPolicyRequest->SetCapabilities(settingsPckg().iCapabilities); sl@0: sl@0: // Set session Id in Request sl@0: iAudioPolicyRequest->SetPolicySessionId(iPolicySessionId); sl@0: iAudioPolicy->MakeRequest(iAudioPolicyRequest); sl@0: } sl@0: sl@0: TBool CMMFAudioPolicySession::UpdateStateL(const RMmfIpcMessage& aMessage) sl@0: { sl@0: TMMFAudioPolicyPrioritySettingsPckg settingsPckg; sl@0: MmfMessageUtil::ReadL(aMessage, 0, settingsPckg); sl@0: sl@0: iAudioPolicyRequest->SetState(settingsPckg().iState); sl@0: iAudioPolicy->ModifyEntry(iPolicySessionId, iAudioPolicyRequest); sl@0: return ETrue; sl@0: } sl@0: sl@0: void CMMFAudioPolicySession::SendEventToClient(TMMFAudioPolicyEvent& aEvent) sl@0: { sl@0: if (iEventReceiver) sl@0: { sl@0: iEventReceiver->SendEvent(aEvent); sl@0: delete iEventReceiver; sl@0: iEventReceiver=NULL; sl@0: } sl@0: else sl@0: { sl@0: TMMFAudioPolicyEventHolder* heldEvent = new TMMFAudioPolicyEventHolder(aEvent); sl@0: iEventsQue.AddLast(*heldEvent); sl@0: } sl@0: } sl@0: sl@0: TBool CMMFAudioPolicySession::SetDevSoundInfoL(const RMmfIpcMessage& aMessage) sl@0: { sl@0: TMMFDevSoundInfoPckg devSoundInfoPckg; sl@0: MmfMessageUtil::ReadL(aMessage, 0, devSoundInfoPckg); sl@0: iDevSoundId = devSoundInfoPckg().iDevSoundId; sl@0: return ETrue; sl@0: } sl@0: sl@0: TBool CMMFAudioPolicySession::ReceiveEventsL(const RMmfIpcMessage& aMessage) sl@0: { sl@0: if (iEventReceiver) sl@0: User::Leave(KErrAlreadyExists); sl@0: iEventReceiver = CMMFAudioPolicyEventReceiver::NewL(aMessage); sl@0: //send the next cached event (if any) to the client sl@0: if (!iEventsQue.IsEmpty()) sl@0: { sl@0: TMMFAudioPolicyEventHolder* heldEvent = iEventsQue.First(); sl@0: iEventReceiver->SendEvent(heldEvent->iEvent); sl@0: iEventsQue.Remove(*heldEvent); sl@0: delete iEventReceiver; sl@0: iEventReceiver=NULL; sl@0: } sl@0: return EFalse; sl@0: } sl@0: sl@0: TBool CMMFAudioPolicySession::CancelReceiveEvents() sl@0: { sl@0: delete iEventReceiver; sl@0: iEventReceiver = NULL; sl@0: return ETrue; sl@0: } sl@0: sl@0: TBool CMMFAudioPolicySession::GetPlayFormatsSupportedL(const RMmfIpcMessage& aMessage) sl@0: { sl@0: RMdaDevSound::TSoundFormatsSupportedBuf aPlayFormatsSupported; sl@0: aPlayFormatsSupported = iAudioPolicy->MdaHwInfo()->GetPlayFormatsSupported(); sl@0: MmfMessageUtil::WriteL(aMessage, 0, aPlayFormatsSupported); sl@0: return ETrue; sl@0: } sl@0: sl@0: TBool CMMFAudioPolicySession::GetRecordFormatsSupportedL(const RMmfIpcMessage& aMessage) sl@0: { sl@0: RMdaDevSound::TSoundFormatsSupportedBuf aRecordFormatsSupported; sl@0: aRecordFormatsSupported = iAudioPolicy->MdaHwInfo()->GetRecordFormatsSupported(); sl@0: MmfMessageUtil::WriteL(aMessage, 0, aRecordFormatsSupported); sl@0: return ETrue; sl@0: } sl@0: sl@0: TBool CMMFAudioPolicySession::GetPlayFormatL(const RMmfIpcMessage& aMessage) sl@0: { sl@0: RMdaDevSound::TCurrentSoundFormatBuf aPlayFormat; sl@0: aPlayFormat = iAudioPolicy->MdaHwInfo()->GetPlayFormat(); sl@0: MmfMessageUtil::WriteL(aMessage, 0, aPlayFormat); sl@0: return ETrue; sl@0: } sl@0: sl@0: TBool CMMFAudioPolicySession::GetRecordFormatL(const RMmfIpcMessage& aMessage) sl@0: { sl@0: RMdaDevSound::TCurrentSoundFormatBuf aRecordFormat; sl@0: aRecordFormat = iAudioPolicy->MdaHwInfo()->GetRecordFormat(); sl@0: MmfMessageUtil::WriteL(aMessage, 0, aRecordFormat); sl@0: return ETrue; sl@0: } sl@0: sl@0: TBool CMMFAudioPolicySession::LaunchRequest() sl@0: { sl@0: iAudioPolicy->LaunchRequest(); sl@0: return ETrue; sl@0: } sl@0: sl@0: TBool CMMFAudioPolicySession::RequestResourceNotificationL(const RMmfIpcMessage& aMessage) sl@0: { sl@0: TMMFAudioPolicyResourceNotificationSettingsPckg notificationPckg; sl@0: MmfMessageUtil::ReadL(aMessage, 0, notificationPckg); sl@0: iAudioPolicyRequest->SetNotificationEvent(notificationPckg().iNotificationUid); sl@0: iAudioPolicy->SetNotification(iPolicySessionId,notificationPckg().iNotificationUid); sl@0: return ETrue; sl@0: } sl@0: sl@0: TBool CMMFAudioPolicySession::CancelRequestResourceNotificationL(const RMmfIpcMessage& aMessage) sl@0: { sl@0: if(iServer->IsTimerActive() == EFalse) sl@0: { sl@0: iServer->StartNotificationTimer(); sl@0: } sl@0: TMMFAudioPolicyResourceNotificationSettingsPckg notificationPckg; sl@0: MmfMessageUtil::ReadL(aMessage, 0, notificationPckg); sl@0: iAudioPolicyRequest->ResetNotificationEvent(notificationPckg().iNotificationUid); sl@0: iAudioPolicy->SetNotification(iPolicySessionId,KNullUid); sl@0: return ETrue; sl@0: } sl@0: sl@0: TBool CMMFAudioPolicySession::StopNotificationL(const RMmfIpcMessage& /*aMessage*/) sl@0: { sl@0: iServer->StopNotificationTimer(); sl@0: return ETrue; sl@0: } sl@0: sl@0: TBool CMMFAudioPolicySession::GetResourceNotificationEventL(const RMmfIpcMessage& aMessage) sl@0: { sl@0: TMMFAudioPolicyResourceNotificationSettingsPckg notificationPckg; sl@0: notificationPckg().iNotificationUid = iAudioPolicyRequest->NotificationEvent(); sl@0: MmfMessageUtil::WriteL(aMessage, 0, notificationPckg); sl@0: return ETrue; sl@0: } sl@0: sl@0: CMMFAudioPolicyEventReceiver* CMMFAudioPolicyEventReceiver::NewL(const RMmfIpcMessage& aMessage) sl@0: { sl@0: return new(ELeave) CMMFAudioPolicyEventReceiver(aMessage); sl@0: } sl@0: sl@0: CMMFAudioPolicyEventReceiver::~CMMFAudioPolicyEventReceiver() sl@0: { sl@0: if (iNeedToCompleteMessage) sl@0: iMessage.Complete(KErrDied); sl@0: } sl@0: sl@0: void CMMFAudioPolicyEventReceiver::SendEvent(const TMMFAudioPolicyEvent& aEvent) sl@0: { sl@0: TMMFAudioPolicyEventPckg eventpckg(aEvent); sl@0: TInt err = MmfMessageUtil::Write(iMessage, 0, eventpckg); sl@0: iMessage.Complete(err); sl@0: iNeedToCompleteMessage = EFalse; sl@0: } sl@0: sl@0: void CMMFAudioPolicyEventReceiver::SendEvent(const TMMFEvent& aEvent) sl@0: { sl@0: TMMFEventPckg eventpckg(aEvent); sl@0: TInt err = MmfMessageUtil::Write(iMessage, 0, eventpckg); sl@0: iMessage.Complete(err); sl@0: iNeedToCompleteMessage = EFalse; sl@0: } sl@0: sl@0: CMMFAudioPolicyEventReceiver::CMMFAudioPolicyEventReceiver(const RMmfIpcMessage& aMessage) : sl@0: iMessage(aMessage), iNeedToCompleteMessage(ETrue) sl@0: { sl@0: }