sl@0: // Copyright (c) 2007-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 sl@0: #include sl@0: sl@0: #include "gettimestampsci.h" sl@0: sl@0: class TPositionTimestamp sl@0: { sl@0: public: sl@0: TTimeIntervalMicroSeconds iBufferPosition; sl@0: TTime iTimestamp; sl@0: }; sl@0: sl@0: // MUX // sl@0: /*****************************************************************************/ sl@0: sl@0: TInt CMMFGetTimestampsMux::OpenInterface(TUid /*aInterfaceId*/) sl@0: { sl@0: // attempt to open the interface link with the sl@0: // remote slave device sl@0: iRemoteHandle = -1; sl@0: TUid slaveId = {KMmfUidCustomInterfaceGetTimestampsDeMux}; sl@0: sl@0: TInt handle = iUtility->OpenSlave(slaveId, KNullDesC8); sl@0: if (handle >= 0) sl@0: { sl@0: iRemoteHandle = handle; sl@0: } sl@0: sl@0: return iRemoteHandle; sl@0: } sl@0: sl@0: /*****************************************************************************/ sl@0: void CMMFGetTimestampsMux::Release() sl@0: { sl@0: // close the slave device if it exists sl@0: if (iRemoteHandle > 0) sl@0: { sl@0: // we assume the slave is closed correctly sl@0: iUtility->CloseSlave(iRemoteHandle); sl@0: } sl@0: sl@0: TUid key = iDestructorKey; sl@0: delete this; sl@0: sl@0: // tell ECom to destroy us sl@0: REComSession::DestroyedImplementation(key); sl@0: } sl@0: sl@0: /*****************************************************************************/ sl@0: void CMMFGetTimestampsMux::PassDestructorKey(TUid aDestructorKey) sl@0: { sl@0: // store the destructor key sl@0: iDestructorKey = aDestructorKey; sl@0: } sl@0: sl@0: /*****************************************************************************/ sl@0: void CMMFGetTimestampsMux::CompleteConstructL(MMMFDevSoundCustomInterfaceMuxUtility* aCustomUtility) sl@0: { sl@0: // store a pointer to the utility sl@0: iUtility = aCustomUtility; sl@0: } sl@0: sl@0: /*****************************************************************************/ sl@0: MMMFDevSoundCustomInterfaceMuxPlugin* CMMFGetTimestampsMux::NewL() sl@0: { sl@0: CMMFGetTimestampsMux* self = new (ELeave) CMMFGetTimestampsMux; sl@0: return self; sl@0: } sl@0: sl@0: /*****************************************************************************/ sl@0: TAny* CMMFGetTimestampsMux::CustomInterface(TUid /*aInterfaceId*/) sl@0: { sl@0: MMMFGetTimestamps* interface = this; sl@0: return interface; sl@0: } sl@0: sl@0: /*****************************************************************************/ sl@0: CMMFGetTimestampsMux::CMMFGetTimestampsMux() : sl@0: iRemoteHandle(-1) sl@0: { sl@0: } sl@0: sl@0: /*****************************************************************************/ sl@0: CMMFGetTimestampsMux::~CMMFGetTimestampsMux() sl@0: { sl@0: } sl@0: sl@0: /*****************************************************************************/ sl@0: // from MMMFGetTimestamps sl@0: TInt CMMFGetTimestampsMux::MmgtSetRecordSystemTimestampsEnabled(TBool aEnable) sl@0: { sl@0: if (iRemoteHandle > 0) sl@0: { sl@0: // send the enable flag in the sync command sl@0: TPckgBuf flag(aEnable); sl@0: sl@0: // any return code other than zero is an error sl@0: return iUtility->SendSlaveSyncCommand(iRemoteHandle, EMMFDevSoundCIGetTimestampsEnable, flag); sl@0: } sl@0: else sl@0: { sl@0: return KErrNotReady; sl@0: } sl@0: } sl@0: sl@0: TInt CMMFGetTimestampsMux::MmgtGetSystemTimestampForBuffer(const TTimeIntervalMicroSeconds& aBufferPosition, sl@0: TTime& aTimestamp) const sl@0: { sl@0: TInt err = KErrNotReady; sl@0: if (iRemoteHandle > 0) sl@0: { sl@0: // send the position and timestamp in the sync command sl@0: TPositionTimestamp value; sl@0: value.iBufferPosition = aBufferPosition; sl@0: value.iTimestamp = aTimestamp; sl@0: TPckgBuf pckgBuffer(value); sl@0: sl@0: // any return code other than zero is an error sl@0: err = iUtility->SendSlaveSyncCommandResult(iRemoteHandle, EMMFDevSoundCIGetTimestampsForBuffer, sl@0: pckgBuffer, pckgBuffer); sl@0: aTimestamp = pckgBuffer().iTimestamp; sl@0: } sl@0: sl@0: return err; sl@0: } sl@0: sl@0: sl@0: sl@0: // DEMUX // sl@0: /*****************************************************************************/ sl@0: TInt CMMFGetTimestampsDeMux::OpenInterface(TUid /*aInterfaceId*/) sl@0: { sl@0: return KErrNone; sl@0: } sl@0: sl@0: /*****************************************************************************/ sl@0: void CMMFGetTimestampsDeMux::Release() sl@0: { sl@0: TUid key = iDestructorKey; sl@0: sl@0: delete this; sl@0: sl@0: // tell ECom to destroy us sl@0: REComSession::DestroyedImplementation(key); sl@0: } sl@0: sl@0: /*****************************************************************************/ sl@0: void CMMFGetTimestampsDeMux::PassDestructorKey(TUid aDestructorKey) sl@0: { sl@0: // store the destructor key sl@0: iDestructorKey = aDestructorKey; sl@0: } sl@0: sl@0: /*****************************************************************************/ sl@0: void CMMFGetTimestampsDeMux::SetInterfaceTarget(MMMFDevSoundCustomInterfaceTarget* aTarget) sl@0: { sl@0: iTarget = aTarget; sl@0: } sl@0: sl@0: /*****************************************************************************/ sl@0: void CMMFGetTimestampsDeMux::CompleteConstructL(MMMFDevSoundCustomInterfaceDeMuxUtility* aCustomUtility) sl@0: { sl@0: // store a pointer to the utility sl@0: iUtility = aCustomUtility; sl@0: } sl@0: sl@0: /*****************************************************************************/ sl@0: void CMMFGetTimestampsDeMux::RefreshL() sl@0: { sl@0: // refetch the play back status custom interface if we already have a target sl@0: if (iTarget) sl@0: { sl@0: MMMFGetTimestamps* ptr = NULL; sl@0: sl@0: ptr = static_cast (iTarget->CustomInterface(KUidGetTimestamps)); sl@0: sl@0: if (!ptr) sl@0: { sl@0: iInterfaceGetTimestamps = NULL; sl@0: User::Leave(KErrNotSupported); sl@0: } sl@0: else sl@0: { sl@0: iInterfaceGetTimestamps = ptr; sl@0: } sl@0: } sl@0: } sl@0: sl@0: /*****************************************************************************/ sl@0: MMMFDevSoundCustomInterfaceDeMuxPlugin* CMMFGetTimestampsDeMux::NewL() sl@0: { sl@0: CMMFGetTimestampsDeMux* self = new (ELeave) CMMFGetTimestampsDeMux; sl@0: return self; sl@0: } sl@0: sl@0: /*****************************************************************************/ sl@0: CMMFGetTimestampsDeMux::CMMFGetTimestampsDeMux() sl@0: { sl@0: } sl@0: sl@0: /*****************************************************************************/ sl@0: CMMFGetTimestampsDeMux::~CMMFGetTimestampsDeMux() sl@0: { sl@0: } sl@0: sl@0: /*****************************************************************************/ sl@0: TInt CMMFGetTimestampsDeMux::DoOpenSlaveL(TUid /*aInterface*/, const TDesC8& /*aPackageBuf*/) sl@0: { sl@0: // fetch the Playback status Hw Device custom interface sl@0: MMMFGetTimestamps* ptr = NULL; sl@0: sl@0: ptr = static_cast (iTarget->CustomInterface(KUidGetTimestamps)); sl@0: sl@0: if (!ptr) sl@0: { sl@0: iInterfaceGetTimestamps = NULL; sl@0: User::Leave(KErrNotSupported); sl@0: } sl@0: else sl@0: { sl@0: iInterfaceGetTimestamps = ptr; sl@0: } sl@0: return KErrNone; sl@0: } sl@0: sl@0: /*****************************************************************************/ sl@0: void CMMFGetTimestampsDeMux::DoCloseSlaveL(TInt /*aHandle*/) sl@0: { sl@0: // nothing to do sl@0: } sl@0: sl@0: /*****************************************************************************/ sl@0: // original RMessage is supplied so that remote demux plugin can extract necessary details sl@0: // using DeMux utility sl@0: TInt CMMFGetTimestampsDeMux::DoSendSlaveSyncCommandL(const RMmfIpcMessage& aMessage) sl@0: { sl@0: TMMFDevSoundCIMessageData data; sl@0: sl@0: TInt retVal = KErrNone; sl@0: sl@0: // decode message sl@0: iUtility->GetSyncMessageDataL(aMessage, data); sl@0: sl@0: switch (data.iCommand) sl@0: { sl@0: case EMMFDevSoundCIGetTimestampsEnable: sl@0: { sl@0: TPckgBuf flag; sl@0: iUtility->ReadFromInputDesL(aMessage, &flag); sl@0: retVal = DoMmgtSetRecordSystemTimestampsEnabled(flag()); sl@0: break; sl@0: } sl@0: default: sl@0: { sl@0: User::Leave(KErrNotSupported); sl@0: } sl@0: } sl@0: return retVal; sl@0: } sl@0: sl@0: /*****************************************************************************/ sl@0: TInt CMMFGetTimestampsDeMux::DoSendSlaveSyncCommandResultL(const RMmfIpcMessage& aMessage) sl@0: { sl@0: TMMFDevSoundCIMessageData data; sl@0: sl@0: TInt retVal = KErrNone; sl@0: sl@0: // decode message sl@0: iUtility->GetSyncMessageDataL(aMessage, data); sl@0: sl@0: switch (data.iCommand) sl@0: { sl@0: case EMMFDevSoundCIGetTimestampsForBuffer: sl@0: { sl@0: TPckgBuf value; sl@0: iUtility->ReadFromInputDesL(aMessage, &value); sl@0: retVal = DoMmgtGetSystemTimestampForBuffer(value().iBufferPosition, value().iTimestamp); sl@0: iUtility->WriteToOutputDesL(aMessage, value); sl@0: break; sl@0: } sl@0: default: sl@0: { sl@0: User::Leave(KErrNotSupported); sl@0: } sl@0: } sl@0: return retVal; sl@0: } sl@0: sl@0: /*****************************************************************************/ sl@0: void CMMFGetTimestampsDeMux::DoSendSlaveAsyncCommandL(const RMmfIpcMessage& /*aMessage*/) sl@0: { sl@0: // not used in this interface sl@0: } sl@0: sl@0: /*****************************************************************************/ sl@0: void CMMFGetTimestampsDeMux::DoSendSlaveAsyncCommandResultL(const RMmfIpcMessage& /*aMessage*/) sl@0: { sl@0: // not used in this interface sl@0: } sl@0: sl@0: /*****************************************************************************/ sl@0: // Get Timestamp custom interface implementation sl@0: TInt CMMFGetTimestampsDeMux::DoMmgtSetRecordSystemTimestampsEnabled(TBool aEnable) sl@0: { sl@0: if (!iInterfaceGetTimestamps) sl@0: { sl@0: return KErrNotReady; sl@0: } sl@0: else sl@0: { sl@0: return iInterfaceGetTimestamps->MmgtSetRecordSystemTimestampsEnabled(aEnable); sl@0: } sl@0: } sl@0: sl@0: TInt CMMFGetTimestampsDeMux::DoMmgtGetSystemTimestampForBuffer(const TTimeIntervalMicroSeconds& aBufferPosition, sl@0: TTime& aTimestamp) sl@0: { sl@0: if (!iInterfaceGetTimestamps) sl@0: { sl@0: return KErrNotReady; sl@0: } sl@0: else sl@0: { sl@0: return iInterfaceGetTimestamps->MmgtGetSystemTimestampForBuffer(aBufferPosition, aTimestamp); sl@0: } sl@0: } sl@0: /*****************************************************************************/ sl@0: // sl@0: // ImplementationTable sl@0: // sl@0: sl@0: const TImplementationProxy ImplementationTable[] = sl@0: { sl@0: IMPLEMENTATION_PROXY_ENTRY(KMmfUidCustomInterfaceGetTimestampsMux, CMMFGetTimestampsMux::NewL), sl@0: IMPLEMENTATION_PROXY_ENTRY(KMmfUidCustomInterfaceGetTimestampsDeMux, CMMFGetTimestampsDeMux::NewL), sl@0: }; sl@0: sl@0: /*****************************************************************************/ sl@0: // sl@0: // ImplementationGroupProxy sl@0: // sl@0: // sl@0: sl@0: EXPORT_C const TImplementationProxy* ImplementationGroupProxy(TInt& aTableCount) sl@0: { sl@0: aTableCount = sizeof(ImplementationTable) / sizeof(TImplementationProxy); sl@0: sl@0: return ImplementationTable; sl@0: } sl@0: sl@0: