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 "MmfDevSoundSession.h" sl@0: #include "MmfDevSoundSessionXtnd.h" sl@0: #include "MmfDevSoundSessionBody.h" sl@0: sl@0: #include "MmfAudioClientServer.h" sl@0: #include "MmfAudioServer.h" sl@0: #include "MmfDevSoundServer.h" 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 EMMFDevSoundProxyBTBFData: sl@0: complete = DoBufferToBeFilledDataL(aMessage); sl@0: break; sl@0: case EMMFDevSoundProxyBTBEData: sl@0: complete = DoBufferToBeEmptiedDataL(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 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: case EMMFDevSoundProxyGetTimePlayed: sl@0: complete = DoGetTimePlayedL(aMessage); sl@0: break; sl@0: sl@0: // custom command support sl@0: case EMMFDevSoundProxySyncCustomCommand: sl@0: complete = DoSyncCustomCommandL(aMessage); sl@0: break; sl@0: case EMMFDevSoundProxySyncCustomCommandResult: sl@0: complete = DoSyncCustomCommandResultL(aMessage); sl@0: break; sl@0: case EMMFDevSoundProxyAsyncCustomCommand: sl@0: complete = DoAsyncCustomCommandL(aMessage); sl@0: break; sl@0: case EMMFDevSoundProxyAsyncCustomCommandResult: sl@0: complete = DoAsyncCustomCommandResultL(aMessage); sl@0: break; sl@0: case EMMFDevSoundProxyEmptyBuffers: sl@0: complete = DoEmptyBuffersL(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: if(iMsgQueue.Handle() == 0) sl@0: { sl@0: TInt err = iMsgQueue.Open(aMessage, 1); // a global queue. sl@0: User::LeaveIfError(err); 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: iBufferPlay = NULL; sl@0: return ETrue; sl@0: } sl@0: sl@0: TBool CMMFDevSoundSession::DoInitialize2L(const RMmfIpcMessage& aMessage) sl@0: { sl@0: if(iMsgQueue.Handle() == 0) sl@0: { sl@0: TInt err = iMsgQueue.Open(aMessage, 1); // a global queue. sl@0: User::LeaveIfError(err); 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: iBufferPlay = NULL; 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: if(iMsgQueue.Handle() == 0) sl@0: { sl@0: TInt err = iMsgQueue.Open(aMessage, 1); // a global queue. sl@0: User::LeaveIfError(err); 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: iBufferPlay = NULL; 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: return iBody->PlayData(aMessage); sl@0: } sl@0: sl@0: TBool CMMFDevSoundSession::DoRecordDataL(const RMmfIpcMessage& aMessage) sl@0: { sl@0: return iBody->RecordData(aMessage); sl@0: } sl@0: sl@0: TBool CMMFDevSoundSession::DoStopL(const RMmfIpcMessage& /*aMessage*/) sl@0: { sl@0: if(iMsgQueue.Handle() != 0) sl@0: { sl@0: TMMFDevSoundQueueItem queueItem; sl@0: TInt err = KErrNone; sl@0: while(err != KErrUnderflow) sl@0: { sl@0: err = iMsgQueue.Receive(queueItem); sl@0: } 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 = User::LeaveIfError(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 = User::LeaveIfError(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::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: 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: TBool CMMFDevSoundSession::DoBufferToBeFilledDataL(const RMmfIpcMessage& aMessage) sl@0: { sl@0: TInt err = MmfMessageUtil::Write(aMessage, 0, iHwBufPckgFill); sl@0: aMessage.Complete(err); sl@0: return EFalse; sl@0: } sl@0: sl@0: TBool CMMFDevSoundSession::DoBufferToBeEmptiedDataL(const RMmfIpcMessage& aMessage) sl@0: { sl@0: TInt err = MmfMessageUtil::Write(aMessage, 0, iHwBufPckgEmpty); sl@0: aMessage.Complete(err); sl@0: return EFalse; 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::DoEmptyBuffersL(const RMmfIpcMessage& aMessage) sl@0: { sl@0: TInt err = KErrNone; sl@0: err = iBody->EmptyBuffers(); 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: return ETrue; sl@0: } sl@0: sl@0: TBool CMMFDevSoundSession::DoGetTimePlayedL(const RMmfIpcMessage& aMessage) sl@0: { sl@0: TInt err = KErrNone; sl@0: TPckgBuf timePckg; sl@0: err = iBody->GetTimePlayed(timePckg()); sl@0: if (err != KErrNone) sl@0: { sl@0: aMessage.Complete(err); sl@0: return EFalse; sl@0: } sl@0: aMessage.WriteL(TInt(2),timePckg); sl@0: return ETrue; sl@0: } sl@0: sl@0: TBool CMMFDevSoundSession::DoSyncCustomCommandL(const RMmfIpcMessage& aMessage) sl@0: { sl@0: // check whether these are custom interface commands sl@0: // if so then send them into the demux pipeline sl@0: TInt retVal = KErrNone; sl@0: sl@0: // try and process this as a custom interface sl@0: TRAPD(err, retVal = iDeMuxUtility->ProcessCustomInterfaceCommandL(aMessage)); sl@0: if (err == KErrNone) sl@0: { sl@0: // we can pass back valid values here since command sl@0: // has been handled by the DeMux framework sl@0: aMessage.Complete(retVal); sl@0: } sl@0: else if (err != KErrNotFound) sl@0: { sl@0: // the framework left with an error condition sl@0: // so we complete the message with this error sl@0: aMessage.Complete(err); sl@0: } sl@0: else sl@0: { sl@0: // commmand was not found inside the Custom Interface framework sl@0: // so we can pass onto the DevSound server implementation sl@0: // assume that this will either leave or complete the message sl@0: iBody->DoSyncCustomCommandL(aMessage); sl@0: } sl@0: sl@0: // we complete our own message so don't need the framework to do so sl@0: return EFalse; sl@0: } sl@0: sl@0: TBool CMMFDevSoundSession::DoSyncCustomCommandResultL(const RMmfIpcMessage& aMessage) sl@0: { sl@0: // check whether these are custom interface commands sl@0: TInt retVal = KErrNone; sl@0: TRAPD(err, retVal = iDeMuxUtility->ProcessCustomInterfaceCommandL(aMessage)); sl@0: if (err == KErrNone) sl@0: { sl@0: // we can pass back valid values here since command sl@0: // has been handled by the DeMux framework sl@0: aMessage.Complete(retVal); sl@0: } sl@0: else if (err != KErrNotFound) sl@0: { sl@0: // the framework left with an error condition sl@0: // so we complete the message with this error sl@0: aMessage.Complete(err); sl@0: } sl@0: else sl@0: { sl@0: // commmand was not found inside the Custom Interface framework sl@0: // so we can pass onto the DevSound server implementation sl@0: // assume that this will either leave or complete the message sl@0: iBody->DoSyncCustomCommandResultL(aMessage); sl@0: } sl@0: // we complete our own message so don't need the framework to do so sl@0: return EFalse; sl@0: } sl@0: sl@0: TBool CMMFDevSoundSession::DoAsyncCustomCommandL(const RMmfIpcMessage& aMessage) sl@0: { sl@0: // check whether these are custom interface commands sl@0: // async message will complete later sl@0: TRAPD(err, iDeMuxUtility->ProcessCustomInterfaceCommandL(aMessage)); sl@0: if ((err != KErrNotFound) && (err != KErrNone)) sl@0: { sl@0: // the framework left with an error condition sl@0: // so we complete the message with this error sl@0: aMessage.Complete(err); sl@0: } sl@0: else if (err == KErrNotFound) sl@0: { sl@0: // commmand was not found inside the Custom Interface framework sl@0: // so we can pass onto the DevSound server implementation sl@0: // assume that this will either leave or complete the message sl@0: iBody->DoAsyncCustomCommandL(aMessage); sl@0: } sl@0: return EFalse; sl@0: } sl@0: sl@0: TBool CMMFDevSoundSession::DoAsyncCustomCommandResultL(const RMmfIpcMessage& aMessage) sl@0: { sl@0: // check whether these are custom interface commands sl@0: // async message will complete later sl@0: TRAPD(err, iDeMuxUtility->ProcessCustomInterfaceCommandL(aMessage)); sl@0: if ((err != KErrNotFound) && (err != KErrNone)) sl@0: { sl@0: // the framework left with an error condition sl@0: // so we complete the message with this error sl@0: aMessage.Complete(err); sl@0: } sl@0: else if (err == KErrNotFound) sl@0: { sl@0: // commmand was not found inside the Custom Interface framework sl@0: // so we can pass onto the DevSound server implementation sl@0: // assume that this will either leave or complete the message sl@0: iBody->DoAsyncCustomCommandL(aMessage); sl@0: } sl@0: return EFalse; sl@0: } sl@0: 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: // clear the array of custom interfaces sl@0: for (TInt i = 0; i < iCustomInterfaceArray.Count(); i++) sl@0: { sl@0: // we could have already deleted interfaces without sl@0: // removing them from the array so check for this sl@0: // and only delete release plugin if non-null sl@0: MMMFDevSoundCustomInterfaceDeMuxPlugin* ptr = iCustomInterfaceArray[i].iInterface; sl@0: if (ptr) sl@0: { sl@0: iCustomInterfaceArray[i].iInterface->Release(); sl@0: } sl@0: } sl@0: iCustomInterfaceArray.Reset(); sl@0: iCustomInterfaceArray.Close(); sl@0: sl@0: delete iDeMuxUtility; sl@0: sl@0: iMsgQueue.Close(); 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: iDeMuxUtility = CMMFDevSoundCIDeMuxUtility::NewL(this); sl@0: } sl@0: sl@0: //callbacks sl@0: void CMMFDevSoundSession::InitializeComplete(TInt aError) sl@0: { sl@0: // this may be a re-initialization and so we need to sl@0: // re-get our custom interfaces on the DeMux plugins sl@0: for (TInt i = 0; i < iCustomInterfaceArray.Count(); i++) sl@0: { sl@0: // we could have already deleted interfaces without sl@0: // removing them from the array so check for this sl@0: // and only delete release plugin if non-null sl@0: MMMFDevSoundCustomInterfaceDeMuxPlugin* ptr = iCustomInterfaceArray[i].iInterface; sl@0: if (ptr) sl@0: { sl@0: // we can't keep track of.. sl@0: // 1. where a custom interface is implemented sl@0: // 2. the uid of the custom interface to be refreshed sl@0: // so assume all have to be refreshed sl@0: TRAPD(err, iCustomInterfaceArray[i].iInterface->RefreshL()); sl@0: sl@0: // if there is an error then this is no longer a sl@0: // valid interface so could be deleted this from the array sl@0: // but this would involve notifying the client side sl@0: // sl@0: // since we have no way of notifying the client in this sl@0: // implementation and the fact that this is a prototype sl@0: // implementation and we will leave this up to the licensee sl@0: // to implement as required sl@0: if (err != KErrNone) sl@0: { sl@0: TMMFEvent event; sl@0: TMMFDevSoundQueueItem item; sl@0: item.iRequest = EMMFDevSoundCustomCommandCloseMuxDemuxPair; sl@0: item.iErrorCode = err; sl@0: event.iEventType.iUid = i+1; sl@0: item.iEventPckg() = event; sl@0: iMsgQueue.Send(item); sl@0: } sl@0: } sl@0: } sl@0: sl@0: // The previous implementation was commented out, sl@0: // so add a new commented out implementation :) sl@0: TMMFDevSoundQueueItem item; sl@0: item.iRequest = EMMFDevSoundProxyICEvent; sl@0: item.iErrorCode = aError; sl@0: iMsgQueue.Send(item); // assumes sufficient space in the queue so ignores the return value sl@0: } sl@0: sl@0: void CMMFDevSoundSession::ToneFinished(TInt aError) sl@0: { sl@0: TMMFDevSoundQueueItem item; sl@0: item.iRequest = EMMFDevSoundProxyTFEvent; sl@0: item.iErrorCode = aError; sl@0: iMsgQueue.Send(item); // assumes sufficient space in the queue so ignores the return value sl@0: } sl@0: sl@0: void CMMFDevSoundSession::BufferToBeFilled(CMMFBuffer* aBuffer) sl@0: { sl@0: // Package up the data for retrieval later (using a two stage process sl@0: // as this payload is too large to be sent via the queue in one message) sl@0: iBufferPlay = reinterpret_cast(aBuffer); sl@0: iHwBufPckgFill().iBufferType = iBufferPlay->Type(); sl@0: iHwBufPckgFill().iRequestSize = iBufferPlay->RequestSize(); sl@0: iHwBufPckgFill().iBufferSize = iBufferPlay->Data().MaxLength(); sl@0: iHwBufPckgFill().iLastBuffer = iBufferPlay->LastBuffer(); sl@0: sl@0: TMMFDevSoundQueueItem item; sl@0: item.iRequest = EMMFDevSoundProxyBTBFEvent; sl@0: iMsgQueue.Send(item); // assumes sufficient space in the queue so ignores the return value sl@0: } sl@0: sl@0: void CMMFDevSoundSession::PlayError(TInt aError) sl@0: { sl@0: TMMFDevSoundQueueItem item; sl@0: item.iRequest = EMMFDevSoundProxyPEEvent; sl@0: item.iErrorCode = aError; sl@0: iMsgQueue.Send(item); // assumes sufficient space in the queue so ignores the return value sl@0: } sl@0: sl@0: void CMMFDevSoundSession::BufferToBeEmptied(CMMFBuffer* aBuffer) sl@0: { sl@0: iBufferRecord = reinterpret_cast(aBuffer); sl@0: sl@0: iHwBufPckgEmpty().iBufferType = iBufferRecord->Type(); sl@0: iHwBufPckgEmpty().iRequestSize = iBufferRecord->RequestSize(); sl@0: iHwBufPckgEmpty().iBufferSize = iBufferRecord->Data().MaxLength(); sl@0: iHwBufPckgEmpty().iLastBuffer = iBufferRecord->LastBuffer(); sl@0: sl@0: TMMFDevSoundQueueItem item; sl@0: item.iRequest = EMMFDevSoundProxyBTBEEvent; sl@0: iMsgQueue.Send(item); // assumes sufficient space in the queue so ignores the return value sl@0: } sl@0: sl@0: void CMMFDevSoundSession::RecordError(TInt aError) sl@0: { sl@0: TMMFDevSoundQueueItem item; sl@0: item.iRequest = EMMFDevSoundProxyREEvent; sl@0: item.iErrorCode = aError; sl@0: iMsgQueue.Send(item); // assumes sufficient space in the queue so ignores the return value sl@0: } sl@0: sl@0: void CMMFDevSoundSession::ConvertError(TInt /*aError*/) sl@0: { 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: TMMFDevSoundQueueItem item; sl@0: item.iRequest = EMMFDevSoundProxySETCEvent; sl@0: item.iEventPckg() = aEvent; sl@0: iMsgQueue.Send(item); // assumes sufficient space in the queue so ignores the return value 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: // Custom Interface // sl@0: TInt CMMFDevSoundSession::DoOpenSlaveL(TUid aInterface, const TDesC8& aPackageBuf) sl@0: { sl@0: // it shouldn't be necessary to check if we have already instantiated this sl@0: // interface since the client would already know - however this is something sl@0: // that a licensee could implement if they required additional functionality sl@0: // e.g. many : 1 mappings between client and DevSound. sl@0: sl@0: MMMFDevSoundCustomInterfaceDeMuxPlugin* ptr = NULL; sl@0: sl@0: // try and instantiate a plugin tunnelling sl@0: // pair to support this Custom Interface sl@0: ptr = iDeMuxUtility->CreateCustomInterfaceDeMuxL(aInterface); sl@0: sl@0: TInt handle = KNullHandle; sl@0: sl@0: if (ptr) sl@0: { sl@0: TMMFDevSoundCustomInterfaceDeMuxData data; sl@0: data.iInterface = ptr; sl@0: data.iId = aInterface; sl@0: sl@0: CleanupReleasePushL(*ptr); sl@0: sl@0: // setup demux plugin sl@0: ptr->SetInterfaceTarget(iBody); sl@0: sl@0: // try and open interface sl@0: // this will fetch the interface from the svr implementation sl@0: ptr->DoOpenSlaveL(aInterface, aPackageBuf); sl@0: User::LeaveIfError(iCustomInterfaceArray.Append(data)); sl@0: sl@0: CleanupStack::Pop(); // ptr sl@0: sl@0: handle = iCustomInterfaceArray.Count(); sl@0: return handle; sl@0: } sl@0: sl@0: // we couldn't set up the interface correctly so return a NULL sl@0: // handle to the client sl@0: return KNullHandle; sl@0: } sl@0: sl@0: void CMMFDevSoundSession::DoCloseSlaveL(TInt aHandle) sl@0: { sl@0: if (aHandle==KNullHandle) sl@0: { sl@0: // null-handle -> NOP sl@0: return; sl@0: } sl@0: sl@0: if (aHandle iCustomInterfaceArray.Count()) sl@0: { sl@0: // handle out of range - should not happen, but leave to show error sl@0: User::Leave(KErrBadHandle); sl@0: } sl@0: sl@0: // set the current handle location to NULL sl@0: // can't re-compress array because this will alter handles sl@0: // we could change this to a list type structure but this sl@0: // seems overkill for the current prototype sl@0: TMMFDevSoundCustomInterfaceDeMuxData& data = iCustomInterfaceArray[aHandle-1]; sl@0: sl@0: // close and delete the plugin sl@0: MMMFDevSoundCustomInterfaceDeMuxPlugin* ptr = data.iInterface; sl@0: ptr->DoCloseSlaveL(aHandle); sl@0: ptr->Release(); sl@0: sl@0: // clear the entry sl@0: data.iInterface = NULL; sl@0: data.iId.iUid = 0; sl@0: } sl@0: sl@0: TInt CMMFDevSoundSession::DoSendSlaveSyncCommandL(const RMmfIpcMessage& aMessage) sl@0: { sl@0: // use the demux utility to get the handle sl@0: TMMFDevSoundCIMessageData data; sl@0: iDeMuxUtility->GetSyncMessageDataL(aMessage, data); sl@0: sl@0: TInt handle = data.iHandle; sl@0: sl@0: if ((handle <= 0) || (handle > (iCustomInterfaceArray.Count()))) sl@0: { sl@0: sl@0: User::Leave(KErrBadHandle); sl@0: } sl@0: sl@0: // call on demux plugin sl@0: return iCustomInterfaceArray[handle-1].iInterface->DoSendSlaveSyncCommandL(aMessage); sl@0: } sl@0: sl@0: TInt CMMFDevSoundSession::DoSendSlaveSyncCommandResultL(const RMmfIpcMessage& aMessage) sl@0: { sl@0: // use the demux utility to get the handle sl@0: TMMFDevSoundCIMessageData data; sl@0: iDeMuxUtility->GetSyncMessageDataL(aMessage, data); sl@0: sl@0: TInt handle = data.iHandle; sl@0: sl@0: if ((handle <= 0) || (handle > (iCustomInterfaceArray.Count()))) sl@0: { sl@0: sl@0: User::Leave(KErrBadHandle); sl@0: } sl@0: sl@0: // call on demux plugin sl@0: return iCustomInterfaceArray[handle-1].iInterface->DoSendSlaveSyncCommandResultL(aMessage); sl@0: } sl@0: sl@0: void CMMFDevSoundSession::DoSendSlaveAsyncCommandL(const RMmfIpcMessage& aMessage) sl@0: { sl@0: // use the demux utility to get the handle sl@0: TMMFDevSoundCIMessageData data; sl@0: iDeMuxUtility->GetAsyncMessageDataL(aMessage, data); sl@0: sl@0: TInt handle = data.iHandle; sl@0: sl@0: if ((handle <= 0) || (handle > (iCustomInterfaceArray.Count()))) sl@0: { sl@0: User::Leave(KErrBadHandle); sl@0: } sl@0: sl@0: // call on demux plugin sl@0: iCustomInterfaceArray[handle-1].iInterface->DoSendSlaveAsyncCommandL(aMessage); sl@0: } sl@0: sl@0: void CMMFDevSoundSession::DoSendSlaveAsyncCommandResultL(const RMmfIpcMessage& aMessage) sl@0: { sl@0: // use the demux utility to get the handle sl@0: TMMFDevSoundCIMessageData data; sl@0: iDeMuxUtility->GetAsyncMessageDataL(aMessage, data); sl@0: sl@0: TInt handle = data.iHandle; sl@0: sl@0: if ((handle <= 0) || (handle > (iCustomInterfaceArray.Count()))) sl@0: { sl@0: User::Leave(KErrBadHandle); sl@0: } sl@0: sl@0: // call on demux plugin sl@0: iCustomInterfaceArray[handle-1].iInterface->DoSendSlaveAsyncCommandResultL(aMessage); sl@0: } sl@0: sl@0: sl@0: