sl@0: // Copyright (c) 2004-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 sl@0: #include "MmfBtDevSoundSession.h" sl@0: #include "MmfBtDevSoundSessionXtnd.h" sl@0: #include "MmfBtDevSoundSessionBody.h" sl@0: sl@0: #include "MmfBtAudioClientServer.h" sl@0: #include "MmfBtAudioServer.h" sl@0: #include "MmfBtDevSoundServer.h" sl@0: sl@0: sl@0: void CMMFDevSoundSession::CreateL(const CMmfIpcServer& aServer) sl@0: { sl@0: CMmfIpcSession::CreateL(aServer); sl@0: CMMFDevSoundServer& server = sl@0: const_cast(static_cast(aServer)); sl@0: server.IncrementSessionId(); sl@0: iDevSoundSessionId = server.DevSoundSessionId(); sl@0: iClientHasCaps = server.CheckClientCapabilities(); sl@0: } sl@0: sl@0: TBool CMMFDevSoundSession::CheckClientCapabilities() sl@0: { sl@0: return iClientHasCaps; sl@0: } sl@0: sl@0: void CMMFDevSoundSession::ServiceL(const RMmfIpcMessage& aMessage) sl@0: { sl@0: TBool complete = EFalse; sl@0: switch(aMessage.Function()) sl@0: { sl@0: case EMMFDevSoundProxyInitialize1: sl@0: complete = DoInitialize1L(aMessage); sl@0: break; sl@0: case EMMFDevSoundProxyInitialize2: sl@0: complete = DoInitialize2L(aMessage); sl@0: break; sl@0: case EMMFDevSoundProxyInitialize3: sl@0: complete = DoInitialize3L(aMessage); sl@0: break; sl@0: case EMMFDevSoundProxyInitialize4: sl@0: complete = DoInitialize4L(aMessage); sl@0: break; sl@0: case EMMFDevSoundProxyCapabilities: sl@0: complete = DoCapabilitiesL(aMessage); sl@0: break; sl@0: case EMMFDevSoundProxyConfig: sl@0: complete = DoConfigL(aMessage); sl@0: break; sl@0: case EMMFDevSoundProxySetConfig: sl@0: complete = DoSetConfigL(aMessage); sl@0: break; sl@0: case EMMFDevSoundProxyMaxVolume: sl@0: complete = DoMaxVolumeL(aMessage); sl@0: break; sl@0: case EMMFDevSoundProxyVolume: sl@0: complete = DoVolumeL(aMessage); sl@0: break; sl@0: case EMMFDevSoundProxySetVolume: sl@0: complete = DoSetVolumeL(aMessage); sl@0: break; sl@0: case EMMFDevSoundProxyMaxGain: sl@0: complete = DoMaxGainL(aMessage); sl@0: break; sl@0: case EMMFDevSoundProxyGain: sl@0: complete = DoGainL(aMessage); sl@0: break; sl@0: case EMMFDevSoundProxySetGain: sl@0: complete = DoSetGainL(aMessage); sl@0: break; sl@0: case EMMFDevSoundProxyPlayBalance: sl@0: complete = DoGetPlayBalanceL(aMessage); sl@0: break; sl@0: case EMMFDevSoundProxySetPlayBalance: sl@0: complete = DoSetPlayBalanceL(aMessage); sl@0: break; sl@0: case EMMFDevSoundProxyRecordBalance: sl@0: complete = DoGetRecordBalanceL(aMessage); sl@0: break; sl@0: case EMMFDevSoundProxySetRecordBalance: sl@0: complete = DoSetRecordBalanceL(aMessage); sl@0: break; sl@0: case EMMFDevSoundProxyReceiveICEvent: sl@0: complete = DoInitializeCompleteEventL(aMessage); sl@0: break; sl@0: case EMMFDevSoundProxyCancelReceiveICEvent: sl@0: complete = DoCancelInitializeCompleteEventL(aMessage); sl@0: break; sl@0: case EMMFDevSoundProxyReceiveBTBFEvent: sl@0: complete = DoBufferToBeFilledEventL(aMessage); sl@0: break; sl@0: case EMMFDevSoundProxyCancelReceiveBTBFEvent: sl@0: complete = DoCancelBufferToBeFilledEventL(aMessage); sl@0: break; sl@0: case EMMFDevSoundProxyReceiveBTBEEvent: sl@0: complete = DoBufferToBeEmptiedEventL(aMessage); sl@0: break; sl@0: case EMMFDevSoundProxyCancelReceiveBTBEEvent: sl@0: complete = DoCancelBufferToBeEmptiedEventL(aMessage); sl@0: break; sl@0: case EMMFDevSoundProxyReceivePEEvent: sl@0: complete = DoPlayErrorEventL(aMessage); sl@0: break; sl@0: case EMMFDevSoundProxyCancelReceivePEEvent: sl@0: complete = DoCancelPlayErrorEventL(aMessage); sl@0: break; sl@0: case EMMFDevSoundProxyReceiveREEvent: sl@0: complete = DoRecordErrorEventL(aMessage); sl@0: break; sl@0: case EMMFDevSoundProxyCancelReceiveREEvent: sl@0: complete = DoCancelRecordErrorEventL(aMessage); sl@0: break; sl@0: case EMMFDevSoundProxyReceiveSETCEvent: sl@0: complete = DoSendEventToClientEventL(aMessage); sl@0: break; sl@0: case EMMFDevSoundProxyCancelReceiveSETCEvent: sl@0: complete = DoCancelSendEventToClientEventL(aMessage); sl@0: break; sl@0: case EMMFDevSoundProxyReceiveTFEvent: sl@0: complete = DoToneFinishedEventL(aMessage); sl@0: break; sl@0: case EMMFDevSoundProxyCancelReceiveTFEvent: sl@0: complete = DoCancelToneFinishedEventL(aMessage); sl@0: break; sl@0: case EMMFDevSoundProxyPlayInit: sl@0: complete = DoPlayInitL(aMessage); sl@0: break; sl@0: case EMMFDevSoundProxyRecordInit: sl@0: complete = DoRecordInitL(aMessage); sl@0: break; sl@0: case EMMFDevSoundProxyPlayData: sl@0: complete = DoPlayDataL(aMessage); sl@0: break; sl@0: case EMMFDevSoundProxyRecordData: sl@0: complete = DoRecordDataL(aMessage); sl@0: break; sl@0: case EMMFDevSoundProxyStop: sl@0: complete = DoStopL(aMessage); sl@0: break; sl@0: case EMMFDevSoundProxyPause: sl@0: complete = DoPauseL(aMessage); sl@0: break; sl@0: case EMMFDevSoundProxyPlayTone: sl@0: complete = DoPlayToneL(aMessage); sl@0: break; sl@0: case EMMFDevSoundProxyPlayDualTone: sl@0: complete = DoPlayDualToneL(aMessage); sl@0: break; sl@0: case EMMFDevSoundProxyPlayDTMFString: sl@0: complete = DoPlayDTMFStringL(aMessage); sl@0: break; sl@0: case EMMFDevSoundProxyPlayToneSequence: sl@0: complete = DoPlayToneSequenceL(aMessage); sl@0: break; sl@0: case EMMFDevSoundProxyPlayFixedSequence: sl@0: complete = DoPlayFixedSequenceL(aMessage); sl@0: break; sl@0: case EMMFDevSoundProxySetDTMFLengths: sl@0: complete = DoSetDTMFLengthsL(aMessage); sl@0: break; sl@0: case EMMFDevSoundProxySetVolumeRamp: sl@0: complete = DoSetVolumeRampL(aMessage); sl@0: break; sl@0: case EMMFDevSoundProxyGetSupportedInputDataTypes: sl@0: complete = DoGetSupportedInputDataTypesL(aMessage); sl@0: break; sl@0: case EMMFDevSoundProxyGetSupportedOutputDataTypes: sl@0: complete = DoGetSupportedOutputDataTypesL(aMessage); sl@0: break; sl@0: case EMMFDevSoundProxyCopyFourCCArrayData: sl@0: complete = DoCopyFourCCArrayDataL(aMessage); sl@0: break; sl@0: case EMMFDevSoundProxyGetRecordedBuffer: sl@0: complete = DoGetRecordedBufferL(aMessage); sl@0: break; sl@0: case EMMFDevSoundProxySamplesRecorded: sl@0: complete = DoSamplesRecordedL(aMessage); sl@0: break; sl@0: case EMMFDevSoundProxySamplesPlayed: sl@0: complete = DoSamplesPlayedL(aMessage); sl@0: break; sl@0: case EMMFDevSoundProxySetToneRepeats: sl@0: complete = DoSetToneRepeatsL(aMessage); sl@0: break; sl@0: case EMMFDevSoundProxySetPrioritySettings: sl@0: complete = DoSetPrioritySettingsL(aMessage); sl@0: break; sl@0: case EMMFDevSoundProxyFixedSequenceName: sl@0: complete = DoFixedSequenceNameL(aMessage); sl@0: break; sl@0: case EMMFDevSoundProxyConvertInit: sl@0: complete = DoConvertInitL(aMessage); sl@0: break; sl@0: case EMMFDevSoundProxyConvertData: sl@0: complete = DoConvertDataL(aMessage); sl@0: break; sl@0: case EMMFDevSoundProxyFixedSequenceCount: sl@0: complete = DoFixedSequenceCountL(aMessage); sl@0: break; sl@0: case EMMFDevSoundProxyRequestResourceNotification: sl@0: complete = DoRegisterAsClientL(aMessage); sl@0: break; sl@0: case EMMFDevSoundProxyCancelRequestResourceNotification: sl@0: complete = DoCancelRegisterAsClientL(aMessage); sl@0: break; sl@0: case EMMFDevSoundProxyGetResourceNotificationData: sl@0: complete = DoGetResourceNotificationDataL(aMessage); sl@0: break; sl@0: case EMMFDevSoundProxyWillResumePlay: sl@0: complete = DoWillResumePlayL(aMessage); sl@0: break; sl@0: case EMMFDevSoundProxySetClientThreadInfo: sl@0: complete = DoSetClientThreadInfoL(aMessage); sl@0: break; sl@0: default: sl@0: User::Leave(KErrNotSupported); sl@0: break; sl@0: } sl@0: if (complete) sl@0: aMessage.Complete(KErrNone); sl@0: } sl@0: sl@0: TBool CMMFDevSoundSession::DoInitialize1L(const RMmfIpcMessage& aMessage) sl@0: { sl@0: TMMFDevSoundProxySettingsPckg buf; sl@0: MmfMessageUtil::ReadL(aMessage,0,buf); sl@0: TMMFState mode = buf().iMode; sl@0: iBody->InitializeL(*this, mode); sl@0: return ETrue; sl@0: } sl@0: sl@0: TBool CMMFDevSoundSession::DoInitialize2L(const RMmfIpcMessage& aMessage) sl@0: { sl@0: TMMFDevSoundProxySettingsPckg buf; sl@0: MmfMessageUtil::ReadL(aMessage,0,buf); sl@0: TUid HWDev = buf().iHWDev; sl@0: TMMFState mode = buf().iMode; sl@0: iBody->InitializeL(*this, HWDev, mode); sl@0: return ETrue; sl@0: } sl@0: sl@0: TBool CMMFDevSoundSession::DoInitialize3L(const RMmfIpcMessage& /*aMessage*/) sl@0: { sl@0: User::Leave(KErrNotSupported); sl@0: return ETrue; sl@0: } sl@0: sl@0: TBool CMMFDevSoundSession::DoInitialize4L(const RMmfIpcMessage& aMessage) sl@0: { sl@0: TMMFDevSoundProxySettingsPckg buf; sl@0: aMessage.ReadL(TInt(0),buf); sl@0: TFourCC desiredFourCC = buf().iDesiredFourCC; sl@0: TMMFState mode = buf().iMode; sl@0: iBody->InitializeL(*this, desiredFourCC, mode); sl@0: return ETrue; sl@0: } sl@0: sl@0: TBool CMMFDevSoundSession::DoCapabilitiesL(const RMmfIpcMessage& aMessage) sl@0: { sl@0: TMMFDevSoundProxySettings set; sl@0: set.iCaps = iBody->Capabilities(); sl@0: TMMFDevSoundProxySettingsPckg pckg(set); sl@0: aMessage.WriteL(TInt(2),pckg); sl@0: return ETrue; sl@0: } sl@0: sl@0: TBool CMMFDevSoundSession::DoConfigL(const RMmfIpcMessage& aMessage) sl@0: { sl@0: TMMFDevSoundProxySettings set; sl@0: set.iConfig = iBody->Config(); sl@0: TMMFDevSoundProxySettingsPckg pckg(set); sl@0: aMessage.WriteL(TInt(2),pckg); sl@0: return ETrue; sl@0: } sl@0: sl@0: TBool CMMFDevSoundSession::DoSetConfigL(const RMmfIpcMessage& aMessage) sl@0: { sl@0: TMMFDevSoundProxySettingsPckg buf; sl@0: aMessage.ReadL(TInt(0),buf); sl@0: TMMFCapabilities config = buf().iConfig; sl@0: iBody->SetConfigL(config); sl@0: return ETrue; sl@0: } sl@0: sl@0: TBool CMMFDevSoundSession::DoMaxVolumeL(const RMmfIpcMessage& aMessage) sl@0: { sl@0: TMMFDevSoundProxySettings set; sl@0: set.iMaxVolume = iBody->MaxVolume(); sl@0: TMMFDevSoundProxySettingsPckg pckg(set); sl@0: aMessage.WriteL(TInt(2),pckg); sl@0: return ETrue; sl@0: } sl@0: sl@0: TBool CMMFDevSoundSession::DoVolumeL(const RMmfIpcMessage& aMessage) sl@0: { sl@0: TMMFDevSoundProxySettings set; sl@0: set.iVolume = iBody->Volume(); sl@0: TMMFDevSoundProxySettingsPckg pckg(set); sl@0: aMessage.WriteL(TInt(2),pckg); sl@0: return ETrue; sl@0: } sl@0: sl@0: TBool CMMFDevSoundSession::DoSetVolumeL(const RMmfIpcMessage& aMessage) sl@0: { sl@0: TMMFDevSoundProxySettingsPckg buf; sl@0: aMessage.ReadL(TInt(0),buf); sl@0: TInt volume = buf().iVolume; sl@0: iBody->SetVolume(volume); sl@0: return ETrue; sl@0: } sl@0: sl@0: TBool CMMFDevSoundSession::DoMaxGainL(const RMmfIpcMessage& aMessage) sl@0: { sl@0: TMMFDevSoundProxySettings set; sl@0: set.iMaxGain = iBody->MaxGain(); sl@0: TMMFDevSoundProxySettingsPckg pckg(set); sl@0: aMessage.WriteL(TInt(2),pckg); sl@0: return ETrue; sl@0: } sl@0: sl@0: TBool CMMFDevSoundSession::DoGainL(const RMmfIpcMessage& aMessage) sl@0: { sl@0: TMMFDevSoundProxySettings set; sl@0: set.iGain = iBody->Gain(); sl@0: TMMFDevSoundProxySettingsPckg pckg(set); sl@0: aMessage.WriteL(TInt(2),pckg); sl@0: return ETrue; sl@0: } sl@0: sl@0: TBool CMMFDevSoundSession::DoSetGainL(const RMmfIpcMessage& aMessage) sl@0: { sl@0: TMMFDevSoundProxySettingsPckg buf; sl@0: aMessage.ReadL(TInt(0),buf); sl@0: TInt gain = buf().iGain; sl@0: iBody->SetGain(gain); sl@0: return ETrue; sl@0: } sl@0: sl@0: TBool CMMFDevSoundSession::DoGetPlayBalanceL(const RMmfIpcMessage& aMessage) sl@0: { sl@0: TMMFDevSoundProxySettings set; sl@0: iBody->GetPlayBalanceL(set.iLeftPercentage, set.iRightPercentage); sl@0: TMMFDevSoundProxySettingsPckg pckg(set); sl@0: aMessage.WriteL(TInt(2),pckg); sl@0: return ETrue; sl@0: } sl@0: sl@0: TBool CMMFDevSoundSession::DoSetPlayBalanceL(const RMmfIpcMessage& aMessage) sl@0: { sl@0: TMMFDevSoundProxySettingsPckg buf; sl@0: aMessage.ReadL(TInt(0),buf); sl@0: TInt leftPercentage = buf().iLeftPercentage; sl@0: TInt rightPercentage = buf().iRightPercentage; sl@0: iBody->SetPlayBalanceL(leftPercentage, rightPercentage); sl@0: return ETrue; sl@0: } sl@0: sl@0: TBool CMMFDevSoundSession::DoGetRecordBalanceL(const RMmfIpcMessage& aMessage) sl@0: { sl@0: TMMFDevSoundProxySettings set; sl@0: iBody->GetRecordBalanceL(set.iLeftPercentage, set.iRightPercentage); sl@0: TMMFDevSoundProxySettingsPckg pckg(set); sl@0: aMessage.WriteL(TInt(2),pckg); sl@0: return ETrue; sl@0: } sl@0: sl@0: TBool CMMFDevSoundSession::DoSetRecordBalanceL(const RMmfIpcMessage& aMessage) sl@0: { sl@0: TMMFDevSoundProxySettingsPckg buf; sl@0: aMessage.ReadL(TInt(0),buf); sl@0: TInt leftPercentage = buf().iLeftPercentage; sl@0: TInt rightPercentage = buf().iRightPercentage; sl@0: iBody->SetRecordBalanceL(leftPercentage, rightPercentage); sl@0: return ETrue; sl@0: } sl@0: sl@0: TBool CMMFDevSoundSession::DoPlayInitL(const RMmfIpcMessage& /*aMessage*/) sl@0: { sl@0: iBody->PlayInitL(); sl@0: return ETrue; sl@0: } sl@0: sl@0: TBool CMMFDevSoundSession::DoRecordInitL(const RMmfIpcMessage& aMessage) sl@0: { sl@0: iBody->RecordInitL(aMessage); sl@0: return ETrue; sl@0: } sl@0: sl@0: TBool CMMFDevSoundSession::DoPlayDataL(const RMmfIpcMessage& aMessage) sl@0: { sl@0: TMMFDevSoundProxyHwBufPckg buf; sl@0: aMessage.ReadL(TInt(0),buf); sl@0: iBufferPlay->SetLastBuffer(buf().iLastBuffer); sl@0: sl@0: aMessage.ReadL(TInt(1),iBufferPlay->Data()); sl@0: iBody->PlayData(); sl@0: return ETrue; sl@0: } sl@0: sl@0: TBool CMMFDevSoundSession::DoRecordDataL(const RMmfIpcMessage& aMessage) sl@0: { sl@0: iBody->RecordData(aMessage); sl@0: return ETrue; sl@0: } sl@0: sl@0: TBool CMMFDevSoundSession::DoStopL(const RMmfIpcMessage& /*aMessage*/) sl@0: { sl@0: iBody->Stop(); sl@0: return ETrue; sl@0: } sl@0: sl@0: TBool CMMFDevSoundSession::DoPauseL(const RMmfIpcMessage& /*aMessage*/) sl@0: { sl@0: iBody->Pause(); sl@0: return ETrue; sl@0: } sl@0: sl@0: TBool CMMFDevSoundSession::DoPlayToneL(const RMmfIpcMessage& aMessage) sl@0: { sl@0: TMMFDevSoundProxySettingsPckg buf; sl@0: aMessage.ReadL(TInt(0),buf); sl@0: TInt frequency = buf().iFrequencyOne; sl@0: TTimeIntervalMicroSeconds duration(buf().iDuration); sl@0: iBody->PlayToneL(frequency, duration); sl@0: return ETrue; sl@0: } sl@0: sl@0: TBool CMMFDevSoundSession::DoPlayDualToneL(const RMmfIpcMessage& aMessage) sl@0: { sl@0: TMMFDevSoundProxySettingsPckg buf; sl@0: aMessage.ReadL(TInt(0),buf); sl@0: TInt frequencyOne = buf().iFrequencyOne; sl@0: TInt frequencyTwo = buf().iFrequencyTwo; sl@0: TTimeIntervalMicroSeconds duration(buf().iDuration); sl@0: iBody->PlayDualToneL(frequencyOne, frequencyTwo, duration); sl@0: return ETrue; sl@0: } sl@0: sl@0: TBool CMMFDevSoundSession::DoPlayDTMFStringL(const RMmfIpcMessage& aMessage) sl@0: { sl@0: TInt DTMFLength = aMessage.GetDesLength(0); sl@0: sl@0: if(iDTMFString) sl@0: { sl@0: delete iDTMFString; sl@0: iDTMFString = NULL; sl@0: } sl@0: sl@0: iDTMFString = HBufC::NewL(DTMFLength); sl@0: TPtr DTMFPtr = iDTMFString->Des(); sl@0: aMessage.ReadL(TInt(0), DTMFPtr); sl@0: sl@0: iBody->PlayDTMFStringL(*iDTMFString); sl@0: return ETrue; sl@0: } sl@0: sl@0: TBool CMMFDevSoundSession::DoPlayToneSequenceL(const RMmfIpcMessage& aMessage) sl@0: { sl@0: TInt toneLength = aMessage.GetDesLength(0); sl@0: sl@0: if(iToneSeqBuf) sl@0: { sl@0: delete iToneSeqBuf; sl@0: iToneSeqBuf = NULL; sl@0: } sl@0: sl@0: iToneSeqBuf = HBufC8::NewL(toneLength); sl@0: TPtr8 toneSeqPtr = iToneSeqBuf->Des(); sl@0: aMessage.ReadL(TInt(0), toneSeqPtr); sl@0: sl@0: iBody->PlayToneSequenceL(*iToneSeqBuf); sl@0: return ETrue; sl@0: } sl@0: sl@0: TBool CMMFDevSoundSession::DoPlayFixedSequenceL(const RMmfIpcMessage& aMessage) sl@0: { sl@0: TPckgBuf buf; sl@0: aMessage.ReadL(TInt(0),buf); sl@0: TInt seqNum = buf(); sl@0: sl@0: iBody->PlayFixedSequenceL(seqNum); sl@0: return ETrue; sl@0: } sl@0: sl@0: TBool CMMFDevSoundSession::DoSetDTMFLengthsL(const RMmfIpcMessage& aMessage) sl@0: { sl@0: TMMFDevSoundProxySettingsPckg buf; sl@0: aMessage.ReadL(TInt(0),buf); sl@0: TTimeIntervalMicroSeconds32 toneOnLength = buf().iToneOnLength; sl@0: TTimeIntervalMicroSeconds32 toneOffLength = buf().iToneOffLength; sl@0: TTimeIntervalMicroSeconds32 pauseLength = buf().iPauseLength; sl@0: iBody->SetDTMFLengths(toneOnLength, toneOffLength, pauseLength); sl@0: return ETrue; sl@0: } sl@0: sl@0: TBool CMMFDevSoundSession::DoSetVolumeRampL(const RMmfIpcMessage& aMessage) sl@0: { sl@0: TMMFDevSoundProxySettingsPckg buf; sl@0: aMessage.ReadL(TInt(0),buf); sl@0: TTimeIntervalMicroSeconds duration = buf().iDuration; sl@0: iBody->SetVolumeRamp(duration); sl@0: return ETrue; sl@0: } sl@0: sl@0: TBool CMMFDevSoundSession::DoGetSupportedInputDataTypesL(const RMmfIpcMessage& aMessage) sl@0: { sl@0: iArray.Reset(); sl@0: sl@0: TMMFPrioritySettingsPckg buf; sl@0: aMessage.ReadL(TInt(0),buf); sl@0: TMMFPrioritySettings prioritySet = buf(); sl@0: sl@0: iBody->GetSupportedInputDataTypesL(iArray, prioritySet); sl@0: sl@0: TPckgBuf pckg; sl@0: pckg() = iArray.Count(); sl@0: aMessage.WriteL(TInt(2),pckg); sl@0: sl@0: return ETrue; sl@0: } sl@0: sl@0: TBool CMMFDevSoundSession::DoGetSupportedOutputDataTypesL(const RMmfIpcMessage& aMessage) sl@0: { sl@0: iArray.Reset(); sl@0: sl@0: TMMFPrioritySettingsPckg buf; sl@0: aMessage.ReadL(TInt(0),buf); sl@0: TMMFPrioritySettings prioritySet = buf(); sl@0: sl@0: iBody->GetSupportedOutputDataTypesL(iArray, prioritySet); sl@0: sl@0: TPckgBuf pckg; sl@0: pckg() = iArray.Count(); sl@0: aMessage.WriteL(TInt(2),pckg); sl@0: sl@0: return ETrue; sl@0: } sl@0: sl@0: TBool CMMFDevSoundSession::DoSamplesRecordedL(const RMmfIpcMessage& aMessage) sl@0: { sl@0: TPckgBuf pckg; sl@0: pckg() = iBody->SamplesRecorded(); sl@0: aMessage.WriteL(TInt(2),pckg); sl@0: return ETrue; sl@0: } sl@0: sl@0: TBool CMMFDevSoundSession::DoSamplesPlayedL(const RMmfIpcMessage& aMessage) sl@0: { sl@0: TPckgBuf pckg; sl@0: pckg() = iBody->SamplesPlayed(); sl@0: aMessage.WriteL(TInt(2),pckg); sl@0: return ETrue; sl@0: } sl@0: sl@0: TBool CMMFDevSoundSession::DoSetToneRepeatsL(const RMmfIpcMessage& aMessage) sl@0: { sl@0: TPckgBuf countRepeat; sl@0: aMessage.ReadL(TInt(0),countRepeat); sl@0: sl@0: TPckgBuf repeatTS; sl@0: aMessage.ReadL(TInt(1),repeatTS); sl@0: sl@0: iBody->SetToneRepeats(countRepeat(), repeatTS()); sl@0: return ETrue; sl@0: } sl@0: sl@0: TBool CMMFDevSoundSession::DoSetPrioritySettingsL(const RMmfIpcMessage& aMessage) sl@0: { sl@0: TPckgBuf prioritySet; sl@0: aMessage.ReadL(TInt(0),prioritySet); sl@0: sl@0: iBody->SetPrioritySettings(prioritySet()); sl@0: return ETrue; sl@0: } sl@0: sl@0: TBool CMMFDevSoundSession::DoFixedSequenceNameL(const RMmfIpcMessage& aMessage) sl@0: { sl@0: TPckgBuf seqNum; sl@0: aMessage.ReadL(0, seqNum); sl@0: aMessage.WriteL(2, iBody->FixedSequenceName(seqNum()).Left(KMaxFixedSequenceNameLength)); sl@0: return ETrue; sl@0: } sl@0: sl@0: TBool CMMFDevSoundSession::DoConvertInitL(const RMmfIpcMessage& /*aMessage*/) sl@0: { sl@0: iBody->ConvertInitL(); sl@0: return ETrue; sl@0: } sl@0: sl@0: TBool CMMFDevSoundSession::DoConvertDataL(const RMmfIpcMessage& /*aMessage*/) sl@0: { sl@0: iBody->ConvertData(); sl@0: return ETrue; sl@0: } sl@0: sl@0: TBool CMMFDevSoundSession::DoFixedSequenceCountL(const RMmfIpcMessage& aMessage) sl@0: { sl@0: TPckgBuf fixSeqCountPckg; sl@0: TInt fixSeqCount = iBody->FixedSequenceCount(); sl@0: fixSeqCountPckg = fixSeqCount; sl@0: sl@0: aMessage.WriteL(TInt(0),fixSeqCountPckg); sl@0: return ETrue; sl@0: } sl@0: sl@0: sl@0: TBool CMMFDevSoundSession::DoCopyFourCCArrayDataL(const RMmfIpcMessage& aMessage) sl@0: { sl@0: const TInt KBufExpandSize8 = 8;//two TInts sl@0: CBufFlat* dataCopyBuffer = CBufFlat::NewL(KBufExpandSize8); sl@0: CleanupStack::PushL(dataCopyBuffer); sl@0: RBufWriteStream stream; sl@0: stream.Open(*dataCopyBuffer); sl@0: CleanupClosePushL(stream); sl@0: for (TInt i=0;iPtr(0)); sl@0: stream.Close(); sl@0: CleanupStack::PopAndDestroy(2);//iDataCopyBuffer, stream sl@0: return ETrue; sl@0: } sl@0: sl@0: sl@0: TBool CMMFDevSoundSession::DoGetRecordedBufferL(const RMmfIpcMessage& aMessage) sl@0: { sl@0: MmfMessageUtil::Write(aMessage, TInt(0), iBufferRecord->Data()); sl@0: return ETrue; sl@0: } sl@0: sl@0: sl@0: TBool CMMFDevSoundSession::DoInitializeCompleteEventL(const RMmfIpcMessage& aMessage) sl@0: { sl@0: if (iICMessage) sl@0: { sl@0: delete iICMessage; sl@0: iICMessage = NULL; sl@0: } sl@0: iICMessage = new (ELeave) RMmfIpcMessage(aMessage); sl@0: return EFalse; sl@0: } sl@0: sl@0: TBool CMMFDevSoundSession::DoCancelInitializeCompleteEventL(const RMmfIpcMessage& /*aMessage*/) sl@0: { sl@0: if(iICMessage) sl@0: iICMessage->Complete(KErrCancel); sl@0: return ETrue; sl@0: } sl@0: sl@0: sl@0: TBool CMMFDevSoundSession::DoBufferToBeFilledEventL(const RMmfIpcMessage& aMessage) sl@0: { sl@0: if(iBTBFMessage) sl@0: { sl@0: delete iBTBFMessage; sl@0: iBTBFMessage = NULL; sl@0: } sl@0: iBTBFMessage = new (ELeave) RMmfIpcMessage(aMessage); sl@0: return EFalse; sl@0: } sl@0: sl@0: TBool CMMFDevSoundSession::DoCancelBufferToBeFilledEventL(const RMmfIpcMessage& /*aMessage*/) sl@0: { sl@0: if(iBTBFMessage) sl@0: iBTBFMessage->Complete(KErrCancel); sl@0: return ETrue; sl@0: } sl@0: sl@0: TBool CMMFDevSoundSession::DoBufferToBeEmptiedEventL(const RMmfIpcMessage& aMessage) sl@0: { sl@0: if(iBTBEMessage) sl@0: { sl@0: delete iBTBEMessage; sl@0: iBTBEMessage = NULL; sl@0: } sl@0: iBTBEMessage = new (ELeave) RMmfIpcMessage(aMessage); sl@0: return EFalse; sl@0: } sl@0: sl@0: TBool CMMFDevSoundSession::DoCancelBufferToBeEmptiedEventL(const RMmfIpcMessage& /*aMessage*/) sl@0: { sl@0: if(iBTBEMessage) sl@0: iBTBEMessage->Complete(KErrCancel); sl@0: return ETrue; sl@0: } sl@0: sl@0: TBool CMMFDevSoundSession::DoPlayErrorEventL(const RMmfIpcMessage& aMessage) sl@0: { sl@0: if(iPEMessage) sl@0: { sl@0: delete iPEMessage; sl@0: iPEMessage = NULL; sl@0: } sl@0: iPEMessage = new (ELeave) RMmfIpcMessage(aMessage); sl@0: return EFalse; sl@0: } sl@0: sl@0: TBool CMMFDevSoundSession::DoCancelPlayErrorEventL(const RMmfIpcMessage& /*aMessage*/) sl@0: { sl@0: if(iPEMessage) sl@0: iPEMessage->Complete(KErrCancel); sl@0: return ETrue; sl@0: } sl@0: sl@0: TBool CMMFDevSoundSession::DoRecordErrorEventL(const RMmfIpcMessage& aMessage) sl@0: { sl@0: if(iREMessage) sl@0: { sl@0: delete iREMessage; sl@0: iREMessage = NULL; sl@0: } sl@0: iREMessage = new (ELeave) RMmfIpcMessage(aMessage); sl@0: return EFalse; sl@0: } sl@0: sl@0: TBool CMMFDevSoundSession::DoCancelRecordErrorEventL(const RMmfIpcMessage& /*aMessage*/) sl@0: { sl@0: if(iREMessage) sl@0: iREMessage->Complete(KErrCancel); sl@0: return ETrue; sl@0: } sl@0: sl@0: TBool CMMFDevSoundSession::DoToneFinishedEventL(const RMmfIpcMessage& aMessage) sl@0: { sl@0: if(iTFMessage) sl@0: { sl@0: delete iTFMessage; sl@0: iTFMessage = NULL; sl@0: } sl@0: iTFMessage = new (ELeave) RMmfIpcMessage(aMessage); sl@0: return EFalse; sl@0: } sl@0: sl@0: TBool CMMFDevSoundSession::DoCancelToneFinishedEventL(const RMmfIpcMessage& /*aMessage*/) sl@0: { sl@0: if(iTFMessage) sl@0: iTFMessage->Complete(KErrCancel); sl@0: return ETrue; sl@0: } sl@0: sl@0: TBool CMMFDevSoundSession::DoSendEventToClientEventL(const RMmfIpcMessage& aMessage) sl@0: { sl@0: if(iSETCMessage) sl@0: { sl@0: delete iSETCMessage; sl@0: iSETCMessage = NULL; sl@0: } sl@0: iSETCMessage = new (ELeave) RMmfIpcMessage(aMessage); sl@0: return EFalse; sl@0: } sl@0: sl@0: TBool CMMFDevSoundSession::DoCancelSendEventToClientEventL(const RMmfIpcMessage& /*aMessage*/) sl@0: { sl@0: if(iSETCMessage) sl@0: iSETCMessage->Complete(KErrCancel); sl@0: return ETrue; sl@0: } sl@0: sl@0: TBool CMMFDevSoundSession::DoRegisterAsClientL(const RMmfIpcMessage& aMessage) sl@0: { sl@0: TMMFDevSoundProxySettingsPckg buf; sl@0: aMessage.ReadL(0,buf); sl@0: HBufC8* notificationRegistrationData = NULL; sl@0: notificationRegistrationData = HBufC8::NewLC(User::LeaveIfError(aMessage.GetDesLengthL(1))); sl@0: TPtr8 dataPtr(notificationRegistrationData->Des()); sl@0: aMessage.ReadL(1,dataPtr); sl@0: TInt err = KErrNone; sl@0: err = iBody->RegisterAsClient(buf().iNotificationEventUid,dataPtr); sl@0: CleanupStack::PopAndDestroy(1); // Notification Registeration data sl@0: if (err != KErrNone) sl@0: { sl@0: aMessage.Complete(err); sl@0: return EFalse; sl@0: } sl@0: return ETrue; sl@0: } sl@0: sl@0: TBool CMMFDevSoundSession::DoCancelRegisterAsClientL(const RMmfIpcMessage& aMessage) sl@0: { sl@0: TMMFDevSoundProxySettingsPckg buf; sl@0: aMessage.ReadL(0,buf); sl@0: TInt err = KErrNone; sl@0: err = iBody->CancelRegisterAsClient(buf().iNotificationEventUid); sl@0: if (err != KErrNone) sl@0: { sl@0: aMessage.Complete(err); sl@0: return EFalse; sl@0: } sl@0: return ETrue; sl@0: } sl@0: sl@0: TBool CMMFDevSoundSession::DoGetResourceNotificationDataL(const RMmfIpcMessage& aMessage) sl@0: { sl@0: TMMFDevSoundProxySettingsPckg buf; sl@0: aMessage.ReadL(0,buf); sl@0: HBufC8* notificationData = NULL; sl@0: notificationData = HBufC8::NewLC(User::LeaveIfError(aMessage.GetDesMaxLengthL(2))); sl@0: TPtr8 dataPtr(notificationData->Des()); sl@0: aMessage.ReadL(2,dataPtr); sl@0: TInt err = KErrNone; sl@0: err = iBody->GetResourceNotificationData(buf().iNotificationEventUid,dataPtr); sl@0: aMessage.WriteL(2,*notificationData); sl@0: CleanupStack::PopAndDestroy(1); // Notification data sl@0: if (err != KErrNone) sl@0: { sl@0: aMessage.Complete(err); sl@0: return EFalse; sl@0: } sl@0: return ETrue; sl@0: } sl@0: sl@0: TBool CMMFDevSoundSession::DoWillResumePlayL(const RMmfIpcMessage& aMessage) sl@0: { sl@0: TInt err = KErrNone; sl@0: if(CheckClientCapabilities()) sl@0: { sl@0: err = iBody->WillResumePlay(); sl@0: } sl@0: else sl@0: { sl@0: err = KErrPermissionDenied; sl@0: } sl@0: sl@0: if (err != KErrNone) sl@0: { sl@0: aMessage.Complete(err); sl@0: return EFalse; sl@0: } sl@0: return ETrue; sl@0: } sl@0: sl@0: TBool CMMFDevSoundSession::DoSetClientThreadInfoL(const RMmfIpcMessage& aMessage) sl@0: { sl@0: if (aMessage.HasCapability(ECapabilityMultimediaDD)) sl@0: { sl@0: TPckgBuf threadId; sl@0: aMessage.ReadL(0, threadId); sl@0: sl@0: CMMFDevSoundServer* server = sl@0: const_cast(static_cast(Server())); sl@0: server->SetClientCapabilitiesL(threadId()); sl@0: iClientHasCaps = server->CheckClientCapabilities(); sl@0: } sl@0: else sl@0: { sl@0: User::Leave(KErrPermissionDenied); sl@0: } sl@0: sl@0: return ETrue; sl@0: } sl@0: sl@0: void CMMFDevSoundSession::SendEventToClient(/*TMMFAudioPolicyEvent& aEvent*/) sl@0: { sl@0: } sl@0: sl@0: sl@0: /* sl@0: * sl@0: * Default Constructor. sl@0: * sl@0: * sl@0: */ sl@0: CMMFDevSoundSession::CMMFDevSoundSession() sl@0: { sl@0: } sl@0: sl@0: CMMFDevSoundSession::~CMMFDevSoundSession() sl@0: { sl@0: delete iBTBFMessage; sl@0: delete iBTBEMessage; sl@0: delete iPEMessage; sl@0: delete iREMessage; sl@0: delete iTFMessage; sl@0: delete iICMessage; sl@0: delete iSETCMessage; sl@0: iArray.Close(); sl@0: delete iDTMFString; sl@0: delete iToneSeqBuf; sl@0: delete iBody; sl@0: sl@0: CMMFDevSoundServer* server = sl@0: const_cast(static_cast(Server())); sl@0: if (server) sl@0: { sl@0: server->DecrementSessionId(); sl@0: } sl@0: } sl@0: sl@0: /* sl@0: * -doxygen comments moved to header- sl@0: * sl@0: * Constructs, and returns a pointer to, a new CMMFDevSoundProxy object. sl@0: * sl@0: * Leaves on failure. sl@0: * sl@0: */ sl@0: CMMFDevSoundSession* CMMFDevSoundSession::NewL(RServer2& aPolicyServerHandle) sl@0: { sl@0: CMMFDevSoundSession* self = new (ELeave) CMMFDevSoundSessionXtnd; sl@0: CleanupStack::PushL(self); sl@0: self->ConstructL(aPolicyServerHandle); sl@0: CleanupStack::Pop(); sl@0: return self; sl@0: } sl@0: sl@0: /* sl@0: * -doxygen comments moved to header- sl@0: * sl@0: * Second phase constructor. sl@0: * sl@0: */ sl@0: void CMMFDevSoundSession::ConstructL(RServer2& aPolicyServerHandle) sl@0: { sl@0: iBody = CMMFDevSoundSvrImp::NewL(static_cast(this)); sl@0: iBody->Construct3L(aPolicyServerHandle); sl@0: } sl@0: sl@0: //callbacks sl@0: void CMMFDevSoundSession::InitializeComplete(TInt aError) sl@0: { sl@0: if (iICMessage) sl@0: { sl@0: iICMessage->Complete(aError); sl@0: delete iICMessage; sl@0: iICMessage = NULL; sl@0: } sl@0: } sl@0: sl@0: void CMMFDevSoundSession::ToneFinished(TInt aError) sl@0: { sl@0: iTFMessage->Complete(aError); sl@0: delete iTFMessage; sl@0: iTFMessage = NULL; sl@0: } sl@0: sl@0: void CMMFDevSoundSession::BufferToBeFilled(CMMFBuffer* aBuffer) sl@0: { sl@0: /* store here "aBuffer" to be used later with PlayData*/ sl@0: iBufferPlay = reinterpret_cast(aBuffer); sl@0: sl@0: TMMFDevSoundProxyHwBuf set; sl@0: set.iBufferType = iBufferPlay->Type(); sl@0: set.iRequestSize = iBufferPlay->RequestSize(); sl@0: set.iBufferSize = iBufferPlay->Data().MaxLength(); sl@0: set.iLastBuffer = iBufferPlay->LastBuffer(); sl@0: TMMFDevSoundProxyHwBufPckg pckg(set); sl@0: TInt err = MmfMessageUtil::Write(*iBTBFMessage, 0, pckg); sl@0: iBTBFMessage->Complete(err); sl@0: delete iBTBFMessage; sl@0: iBTBFMessage = NULL; sl@0: } sl@0: sl@0: void CMMFDevSoundSession::PlayError(TInt aError) sl@0: { sl@0: if (iPEMessage) sl@0: { sl@0: iPEMessage->Complete(aError); sl@0: delete iPEMessage; sl@0: iPEMessage = NULL; sl@0: } sl@0: else sl@0: { sl@0: // need to send message but for some reason nobody to send to - just swallow sl@0: __DEBUGGER() sl@0: } sl@0: } sl@0: sl@0: void CMMFDevSoundSession::BufferToBeEmptied(CMMFBuffer* aBuffer) sl@0: { sl@0: iBufferRecord = reinterpret_cast(aBuffer); sl@0: sl@0: TMMFDevSoundProxyHwBuf set; sl@0: set.iBufferType = iBufferRecord->Type(); sl@0: set.iRequestSize = iBufferRecord->RequestSize(); sl@0: set.iBufferSize = iBufferRecord->Data().MaxLength(); sl@0: set.iLastBuffer = iBufferRecord->LastBuffer(); sl@0: TMMFDevSoundProxyHwBufPckg pckg(set); sl@0: TInt err = MmfMessageUtil::Write(*iBTBEMessage, 0, pckg); sl@0: iBTBEMessage->Complete(err); sl@0: delete iBTBEMessage; sl@0: iBTBEMessage = NULL; sl@0: } sl@0: sl@0: void CMMFDevSoundSession::RecordError(TInt aError) sl@0: { sl@0: iREMessage->Complete(aError); sl@0: delete iREMessage; sl@0: iREMessage = NULL; sl@0: } sl@0: sl@0: void CMMFDevSoundSession::ConvertError(TInt /*aError*/) sl@0: { sl@0: } sl@0: void CMMFDevSoundSession::DeviceMessage(TUid /*aMessageType*/, const TDesC8& /*aMsg*/) sl@0: { sl@0: } sl@0: sl@0: void CMMFDevSoundSession::SendEventToClient(const TMMFEvent& aEvent) sl@0: { sl@0: TMMFEventPckg iEventPckg(aEvent); sl@0: TInt err = MmfMessageUtil::Write(*iSETCMessage, 0, iEventPckg); sl@0: iSETCMessage->Complete(err); sl@0: delete iSETCMessage; sl@0: iSETCMessage = NULL; sl@0: } sl@0: sl@0: /******************************************************************************** sl@0: * Non Exported public functions begins here * sl@0: ********************************************************************************/ sl@0: sl@0: // sl@0: // Audio Policy specific implementation begins here // sl@0: // sl@0: sl@0: /** sl@0: * sl@0: * Sets Id for this instance of DevSound sl@0: * sl@0: * @param "TInt aDevSoundId" sl@0: * Integer value assigned by Audio Policy Server sl@0: * sl@0: */ sl@0: void CMMFDevSoundSessionXtnd::SetDevSoundId(TInt aDevSoundId) sl@0: { sl@0: iBody->SetDevSoundId(aDevSoundId); sl@0: } sl@0: sl@0: /** sl@0: * sl@0: * Returns information about this DevSound instance. sl@0: * sl@0: * This method is used by Audio Policy Server to make audio policy decisions. sl@0: * sl@0: * @return "TMMFDevSoundinfo" sl@0: * A reference to TMMFDevSoundinfo object holding the current settings sl@0: * of this DevSound instance. sl@0: * sl@0: */ sl@0: TMMFDevSoundInfo CMMFDevSoundSessionXtnd::DevSoundInfo() sl@0: { sl@0: return iBody->DevSoundInfo(); sl@0: } sl@0: sl@0: /** sl@0: * sl@0: * Called by Audio Policy Server when a request to play is approved by the sl@0: * Audio Policy Server. sl@0: * sl@0: * Leaves on failure. sl@0: * sl@0: */ sl@0: void CMMFDevSoundSessionXtnd::StartPlayDataL() sl@0: { sl@0: iBody->StartPlayDataL(); sl@0: } sl@0: sl@0: /** sl@0: * sl@0: * Called by Audio Policy Server when a request to record is approved by the sl@0: * Audio Policy Server. sl@0: * sl@0: * Leaves on failure. sl@0: * sl@0: */ sl@0: void CMMFDevSoundSessionXtnd::StartRecordDataL() sl@0: { sl@0: iBody->StartRecordDataL(); sl@0: } sl@0: sl@0: /** sl@0: * sl@0: * Called by Audio Policy Server when a request to play tone is approved by sl@0: * the Audio Policy Server. sl@0: * sl@0: * Leaves on failure. sl@0: * sl@0: */ sl@0: void CMMFDevSoundSessionXtnd::StartPlayToneL() sl@0: { sl@0: iBody->StartPlayToneL(); sl@0: } sl@0: sl@0: /** sl@0: * sl@0: * Called by Audio Policy Server when a request to play a dual tone is approved by sl@0: * the Audio Policy Server. sl@0: * sl@0: */ sl@0: void CMMFDevSoundSessionXtnd::StartPlayDualToneL() sl@0: { sl@0: iBody->StartPlayDualToneL(); sl@0: } sl@0: sl@0: /** sl@0: * sl@0: * Called by Audio Policy Server when a request to play DTMF String is approved sl@0: * by the Audio Policy Server. sl@0: * sl@0: * Leaves on failure. sl@0: * sl@0: */ sl@0: void CMMFDevSoundSessionXtnd::StartPlayDTMFStringL() sl@0: { sl@0: iBody->StartPlayDTMFStringL(); sl@0: } sl@0: sl@0: /** sl@0: * sl@0: * Called by Audio Policy Server when a request to play tone sequence is sl@0: * approved by the Audio Policy Server. sl@0: * sl@0: * Leaves on failure. sl@0: * sl@0: */ sl@0: void CMMFDevSoundSessionXtnd::StartPlayToneSequenceL() sl@0: { sl@0: iBody->StartPlayToneSequenceL(); sl@0: } sl@0: sl@0: /** sl@0: * sl@0: * Called by Audio Policy Server when the current DevSound instance looses the sl@0: * policy because of another instance with a higher priority wants the device. sl@0: * sl@0: */ sl@0: void CMMFDevSoundSessionXtnd::SendEvent(const TMMFEvent& aEvent) sl@0: { sl@0: iBody->SendEventToClient(aEvent); sl@0: } sl@0: sl@0: sl@0: // sl@0: // Audio Policy specific implementation begins here // sl@0: // sl@0: sl@0: /** sl@0: * sl@0: * Updates the total bytes played. sl@0: * sl@0: */ sl@0: void CMMFDevSoundSessionXtnd::UpdateBytesPlayed() sl@0: { sl@0: iBody->UpdateBytesPlayed(); sl@0: } sl@0: sl@0: sl@0: sl@0: