diff -r 000000000000 -r 71ca22bcf22a mmfenh/advancedaudiocontroller/audiocontrollerpluginsvariant/DataSourceAdapter/Src/DataSourceAdapter.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mmfenh/advancedaudiocontroller/audiocontrollerpluginsvariant/DataSourceAdapter/Src/DataSourceAdapter.cpp Tue Feb 02 01:08:46 2010 +0200 @@ -0,0 +1,552 @@ +/* +* Copyright (c) 2006 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: Class definition for the DataSourceAdapter functions. +* +*/ + + +// INCLUDES +#include "DataSourceAdapter.h" +#include "DebugMacros.h" +#include +#include +#include +#include + +// ============================ MEMBER FUNCTIONS =============================== + +// ----------------------------------------------------------------------------- +// CDataSourceAdapter::CDataSourceAdapter +// C++ default constructor can NOT contain any code, that +// might leave. +// ----------------------------------------------------------------------------- +// +EXPORT_C CDataSourceAdapter::CDataSourceAdapter() + { + iPosSeekable = EFalse; + iTimeSeekable = EFalse; + iDataSource = NULL; + iIsProtected = EFalse; + } + +// ----------------------------------------------------------------------------- +// CDataSourceAdapter::ConstructL +// Symbian 2nd phase constructor can leave. +// ----------------------------------------------------------------------------- +// +void CDataSourceAdapter::ConstructL() + { + // should end up doing this for all sources + iZeroBuffer = CMMFDataBuffer::NewL(0); // this is just for test to allow source seek + iHdrBuffer = CMMFDataBuffer::NewL(20); // just enough to cover the header lengths create by recorder + } + +// ----------------------------------------------------------------------------- +// CDataSourceAdapter::NewL +// Two-phased constructor. +// ----------------------------------------------------------------------------- +// +EXPORT_C CDataSourceAdapter* CDataSourceAdapter::NewL() + { + DP0(_L("CDataSourceAdapter::NewL")); + CDataSourceAdapter* self = new(ELeave) CDataSourceAdapter(); + CleanupStack::PushL(self); + self->ConstructL(); + CleanupStack::Pop(self); + return self; + } + +// Destructor +EXPORT_C CDataSourceAdapter::~CDataSourceAdapter() + { + DP0(_L("CDataSourceAdapter::~CDataSourceAdapter")); + delete iAsyncProxyFillBuffer; + delete iZeroBuffer; + delete iHdrBuffer; + if (iMMDataSource) + { + iMMDataSource->Close(); + delete iMMDataSource; + } + iAudioOutputControlUtility = NULL; + } + +EXPORT_C void CDataSourceAdapter::SetDataSourceL(MDataSource* aDataSource, + MMultimediaDataSourceObserver* aMMultimediaDataSourceObserver, + MAsyncEventHandler* aAsyncEventHandler) + { + DP0(_L("CDataSourceAdapter::SetDataSourceL")); + iHeaderOnly = EFalse; + iDataSource = aDataSource; + iAsyncEventHandler = aAsyncEventHandler; + iSourceType = iDataSource->DataSourceType(); + DP1(_L("CDataSourceAdapter::SetDataSourceL DataSourceType[0x%x]"), iSourceType); + + if ((iSourceType == KMmdsStreamingSourceUid) || (iSourceType == KMmdsProgDLSourceUid) || + (iSourceType == KMmdsFileSourceUid) || (iSourceType == KMmdsDescriptorSourceUid)) + { + TInt err = CMultimediaDataSourceFactory::CreateDataSource(*iDataSource, iMMDataSource); + + User::LeaveIfError(err); + + iMMDataSource->SetObserver(*aMMultimediaDataSourceObserver); + + err = iMMDataSource->Open(); + User::LeaveIfError(err); + + iMMDataSource->GetSeekingSupport(iPosSeekable); + } + else if ((iSourceType == KUidMmfFileSource) || (iSourceType == KOldProgDLSourceUid)) + { + iPosSeekable = ETrue; + iDataSource->SourcePrimeL(); + iIsProtected = static_cast(iDataSource)->IsProtectedL(); + iClip = static_cast(iDataSource); + iClip->SourceThreadLogon(*aAsyncEventHandler); + iClip->ReadBufferL(iHdrBuffer,0); + iClip->ReadBufferL(iZeroBuffer, 0); // seek back to 0 position + const TUint8* ptr = iHdrBuffer->Data().Ptr(); + if (iClip->Size() == 6) + { // check for just the header from recorder + TUint32* w1p = (TUint32*)ptr; + TUint16* w2p = (TUint16*)(ptr+4); + if (((*w1p & 0x4D412123)==0x4D412123) && + ((*w2p & 0x0A52)==0x0A52)) + { + iHeaderOnly = ETrue; + return; + } + } + } + else if (iSourceType == KUidMmfDescriptorSource) + { + TRAP_IGNORE(iAsyncProxyFillBuffer = new(ELeave) CAsyncProxyFillBuffer(iDataSource)); + } + } + +EXPORT_C TUid CDataSourceAdapter::DataSourceType() + { + DP0(_L("CDataSourceAdapter::DataSourceType")); + return iDataSource->DataSourceType(); + } + +EXPORT_C void CDataSourceAdapter::FillBufferL( CMMFBuffer* aBuffer, MDataSink* aConsumer, TMediaId aMediaId) + { + DP0(_L("CDataSourceAdapter::FillBufferL")); + if (iAsyncProxyFillBuffer) + {// mmf descriptor does not have async intfc + iAsyncProxyFillBuffer->FillBuffer(aBuffer, aConsumer, aMediaId); + } + else + { + iDataSource->FillBufferL(aBuffer, aConsumer, aMediaId); + } + } + +EXPORT_C void CDataSourceAdapter::BufferEmptiedL(CMMFBuffer* aBuffer) + { + DP0(_L("CDataSourceAdapter::BufferEmptiedL")); + iDataSource->BufferEmptiedL(aBuffer); + } + +EXPORT_C TBool CDataSourceAdapter::CanCreateSourceBuffer() + { + DP0(_L("CDataSourceAdapter::CanCreateSourceBuffer")); + return iDataSource->CanCreateSourceBuffer(); + } + +EXPORT_C CMMFBuffer* CDataSourceAdapter::CreateSourceBufferL(TMediaId aMediaId, TBool& aReference) + { + DP0(_L("CDataSourceAdapter::CreateSourceBufferL")); + return iDataSource->CreateSourceBufferL(aMediaId, aReference); + } + +EXPORT_C TInt CDataSourceAdapter::SourceThreadLogon(MAsyncEventHandler& aEventHandler) + { + DP0(_L("CDataSourceAdapter::SourceThreadLogon")); + return iDataSource->SourceThreadLogon(aEventHandler); + } + +EXPORT_C void CDataSourceAdapter::SourceThreadLogoff() + { + DP0(_L("CDataSourceAdapter::SourceThreadLogoff")); + iDataSource->SourceThreadLogoff(); + } + +EXPORT_C void CDataSourceAdapter::SourcePrimeL() + { + DP0(_L("CDataSourceAdapter::SourcePrimeL")); + iDataSource->SourcePrimeL(); + } + +EXPORT_C void CDataSourceAdapter::SourceStopL() + { + DP0(_L("CDataSourceAdapter::SourceStopL")); + iDataSource->SourceStopL(); + if (iAsyncProxyFillBuffer) + { + iAsyncProxyFillBuffer->Cancel(); + iAsyncProxyFillBuffer->Reset(); + } + } + +EXPORT_C void CDataSourceAdapter::SourcePlayL() + { + DP0(_L("CDataSourceAdapter::SourcePlayL")); + iDataSource->SourcePlayL(); + } + +EXPORT_C TInt CDataSourceAdapter::SeekToPosition(TUint aPosition) + { + DP1(_L("CDataSourceAdapter::SeekToPosition [%d]"), aPosition); + TInt status = KErrNone; + if (iPosSeekable) + { + if (iSourceType == KUidMmfFileSource) + { + TRAP(status, iClip->ReadBufferL(iZeroBuffer, aPosition)); // seek + } + else + { + status = iMMDataSource->Seek(aPosition); + } + } + else + { + status = KErrNotSupported; + } + return status; + } + +EXPORT_C TInt CDataSourceAdapter::SeekToTime(TUint /*aTimeMs*/) + { + DP0(_L("CDataSourceAdapter::SeekToTime")); + TInt status = KErrNotSupported; + return status; + } + +EXPORT_C TInt CDataSourceAdapter::SeekToTime(TUint /*aTimeMs*/, TUint& /*aFoundTimeMs*/) + { + DP0(_L("CDataSourceAdapter::SeekToTime")); + TInt status = KErrNotSupported; + return status; + } + +EXPORT_C TBool CDataSourceAdapter::IsTimeSeekable() + { + DP1(_L("CDataSourceAdapter::IsTimeSeekable[%d]"), iTimeSeekable); + return iTimeSeekable; + } + +EXPORT_C TBool CDataSourceAdapter::IsPositonSeekable() + { + DP1(_L("CDataSourceAdapter::IsPositonSeekable[%d]"), iPosSeekable); + if (iMMDataSource) + { // source seekability may change after file is downloaded so ask source again. + iMMDataSource->GetSeekingSupport(iPosSeekable); + } + return iPosSeekable; + } + +EXPORT_C TInt CDataSourceAdapter::SourceSize() + { + DP0(_L("CDataSourceAdapter::SourceSize")); + iSourceSize = KErrUnknown; + if ((iSourceType == KUidMmfFileSource) ||(iSourceType == KUidMmfDescriptorSource)) + { + iSourceSize = static_cast(iDataSource)->Size(); + } + else if (iMMDataSource) + { + TUint size; + TInt stat = iMMDataSource->GetSize(size); + if (stat == KErrNone) + { + iSourceSize = size; + } + } + return iSourceSize; + } + +EXPORT_C TInt CDataSourceAdapter::IsProtectedL() + { + DP0(_L("CDataSourceAdapter::IsProtectedL")); + return iIsProtected; + } + +EXPORT_C void CDataSourceAdapter::SetSourcePrioritySettings(const TMMFPrioritySettings& aPrioritySettings) + { + DP0(_L("CDataSourceAdapter::SetSourcePrioritySettings")); + iDataSource->SetSourcePrioritySettings(aPrioritySettings); + } + +EXPORT_C TBool CDataSourceAdapter::OnlyHeaderPresent() + { + DP1(_L("CDataSourceAdapter::OnlyHeaderPresent [%d]"), iHeaderOnly); + return iHeaderOnly; + } + +// ----------------------------------------------------------------------------- +// CDataSourceAdapter::ExecuteIntent +// ----------------------------------------------------------------------------- +// +EXPORT_C TInt CDataSourceAdapter::ExecuteIntent(ContentAccess::TIntent aIntent) + { + DP1(_L("CDataSourceAdapter::ExecuteIntent [%d]"), aIntent); + TInt status = KErrNone; + + if (iMMDataSource) + { + status = iMMDataSource->ExecuteIntent(aIntent); + } + else if (iSourceType == KUidMmfFileSource) + { + CMMFFile* file = static_cast(iDataSource); + status = file->ExecuteIntent(aIntent); + } + return status; + } + +// ----------------------------------------------------------------------------- +// CDataSourceAdapter::SetAgentProperty +// ----------------------------------------------------------------------------- +// +EXPORT_C TInt CDataSourceAdapter::SetAgentProperty(ContentAccess::TAgentProperty aProperty, TInt aValue) + { + DP2(_L("CDataSourceAdapter::SetAgentProperty prop[%d] val[%d]"), aProperty, aValue); + TInt status = KErrNone; + + if (iMMDataSource) + { + status = iMMDataSource->SetAgentProperty(aProperty, aValue); + } + else if (iSourceType == KUidMmfFileSource) + { + CMMFFile* file = static_cast(iDataSource); + status = file->SetAgentProperty(aProperty, aValue); + } + + return status; + } + +// ----------------------------------------------------------------------------- +// CDataSourceAdapter::EvaluateIntent +// ----------------------------------------------------------------------------- +// +EXPORT_C TInt CDataSourceAdapter::EvaluateIntent(ContentAccess::TIntent aIntent) + { + DP0(_L("CDataSourceAdapter::EvaluateIntent")); + TInt status = KErrNone; + + if (iMMDataSource) + { + status = iMMDataSource->EvaluateIntent(aIntent); + } + else if (iSourceType == KUidMmfFileSource) + { + CMMFFile* file = static_cast(iDataSource); + status = file->EvaluateIntent(aIntent); + } + + DP1(_L("CDataSourceAdapter::EvaluateIntent aIntent[%d]"), aIntent); + return status; + } + +// ----------------------------------------------------------------------------- +// CDataSourceAdapter::GetInterface +// ----------------------------------------------------------------------------- +// +EXPORT_C TInt CDataSourceAdapter::GetInterface(TUid aInterfaceId, TVersion& aVersion, TAny*& aInterfaceImpl) + { + TInt err = KErrNotSupported; + + if (iMMDataSource) + { + err = iMMDataSource->GetInterface(aInterfaceId, aVersion, aInterfaceImpl); + + // This Error check is done because all sources have not Implemented this Interface + // and the Controller will Leave if we return this Error in Prime() + // To maintain compatibility untill all the EMC sources implement GetInterface() + if(err == KErrNotFound) + return KErrNone; + + if (err != KErrNone) + return err; + } + + return err; + } + +// ----------------------------------------------------------------------------- +// CDataSourceAdapter::Event +// ----------------------------------------------------------------------------- +// +EXPORT_C void CDataSourceAdapter::Event(TUid aEvent) + { + if (iMMDataSource) + { + iMMDataSource->Event(aEvent); + } + } + +// ----------------------------------------------------------------------------- +// CDataSourceAdapter::CAsyncProxyFillBuffer +// ----------------------------------------------------------------------------- + +// ----------------------------------------------------------------------------- +// CDataSourceAdapter::CAsyncProxyFillBuffer::CAsyncProxyFillBuffer +// ----------------------------------------------------------------------------- +// +CDataSourceAdapter::CAsyncProxyFillBuffer::CAsyncProxyFillBuffer(MDataSource* aDataSource) : + CActive(EPriorityHigh), + iDataSource(aDataSource) + { + DP0(_L("CDataSourceAdapter::CAsyncProxyFillBuffer::CAsyncProxyFillBuffer")); + CActiveScheduler::Add(this); + } + +// ----------------------------------------------------------------------------- +// CDataSourceAdapter::CAsyncProxyFillBuffer::~CAsyncProxyFillBuffer +// ----------------------------------------------------------------------------- +// + +CDataSourceAdapter::CAsyncProxyFillBuffer::~CAsyncProxyFillBuffer() + { + DP0(_L("CDataSourceAdapter::CAsyncProxyFillBuffer::~CAsyncProxyFillBuffer")); + Cancel(); + iQueuedAsyncBuffers.Close(); + } + +// ----------------------------------------------------------------------------- +// CDataSourceAdapter::CAsyncProxyFillBuffer::FillBuffer +// ----------------------------------------------------------------------------- +// +void CDataSourceAdapter::CAsyncProxyFillBuffer::FillBuffer(CMMFBuffer* aBuffer, MDataSink* aConsumer, TMediaId aMediaId) + { + DP2(_L("CDataSourceAdapter::CAsyncProxyFillBuffer::FillBuffer buffer[%x] this=consumer[%d]"), + static_cast(aBuffer)->Data().Ptr(), (aConsumer == (MDataSink*)this)); + iMediaId = aMediaId; + if (aConsumer == (MDataSink*)this) + { + iBuffer = aBuffer; + iStatus = KRequestPending; // service request would be made here and pending set by service provider + SetActive(); + iRequestStatus = &iStatus; + User::RequestComplete(iRequestStatus, KErrNone); + } + else + { + iConsumer = aConsumer; + if (IsActive()|| (iQueuedAsyncBuffers.Count() > 0)) + { + DP1(_L("CDataSourceAdapter::CAsyncProxyFillBuffer::RunL que[%x]"), + static_cast(aBuffer)->Data().Ptr()); + iQueuedAsyncBuffers.Append(aBuffer); + } + else + { + iBuffer = aBuffer; + iStatus = KRequestPending; // service request would be made here and pending set by service provider + SetActive(); + iRequestStatus = &iStatus; + User::RequestComplete(iRequestStatus, KErrNone); + } + } + } + +// ----------------------------------------------------------------------------- +// CDataSourceAdapter::CAsyncProxyFillBuffer::RunL +// ----------------------------------------------------------------------------- +// +void CDataSourceAdapter::CAsyncProxyFillBuffer::RunL() + { + DP0(_L("CDataSourceAdapter::CAsyncProxyFillBuffer::RunL")); + if (iDataSource->DataSourceType() == KUidMmfDescriptorSource) + { + // descriptor has no way to set read position back to 0 + // so we have to always read using position + // then we can adjust the read position and send the buffer to the consumer + static_cast(iDataSource)->ReadBufferL(iBuffer, iReadPos); + TInt bytesRead = static_cast(iBuffer)->Data().Length(); + iReadPos += bytesRead; + iConsumer->BufferFilledL(iBuffer); + } + else + { + iDataSource->FillBufferL(iBuffer,iConsumer,iMediaId); + } + if (iQueuedAsyncBuffers.Count() > 0) + { + DP1(_L("CDataSourceAdapter::CAsyncProxyFillBuffer::RunL que count [%d]"),iQueuedAsyncBuffers.Count()); + FillBuffer(iQueuedAsyncBuffers[0],(MDataSink*)this,iMediaId); + iQueuedAsyncBuffers.Remove(0); + } + } + +// ----------------------------------------------------------------------------- +// CDataSourceAdapter::CAsyncProxyFillBuffer::RunError +// ----------------------------------------------------------------------------- +// +TInt CDataSourceAdapter::CAsyncProxyFillBuffer::RunError(TInt aError) + { + if (aError) + { + DP1(_L("CDataSourceAdapter::CAsyncProxyFillBuffer::RunError, aError = %d"), aError); + } + return KErrNone; + } + +// ----------------------------------------------------------------------------- +// CDataSourceAdapter::CAsyncProxyFillBuffer::DoCancel +// ----------------------------------------------------------------------------- +// +void CDataSourceAdapter::CAsyncProxyFillBuffer::DoCancel() + { + DP0(_L("CDataSourceAdapter::CAsyncProxyFillBuffer::DoCancel")); +// Reset(); + } + +// ----------------------------------------------------------------------------- +// CDataSourceAdapter::CAsyncProxyFillBuffer::Reset +// ----------------------------------------------------------------------------- +// +void CDataSourceAdapter::CAsyncProxyFillBuffer::Reset() + { + DP0(_L("CDataSourceAdapter::CAsyncProxyFillBuffer::Reset")); + iQueuedAsyncBuffers.Reset(); + iReadPos = 0; + } + +// ----------------------------------------------------------------------------- +// CDataSourceAdapter::SetAudioOutputControlUtil +// sets the AudioOutputControlUtitlity reference and sets Datasource to AudioOutputContolUtility +// ----------------------------------------------------------------------------- +// +EXPORT_C TInt CDataSourceAdapter::SetAudioOutputControlUtil(CAudioOutputControlUtility* aAudioOutputControlUtility) + { + DP0(_L("CDataSourceAdapter::SetAudioOutputControlUtil")); + TInt status(KErrNotReady); + iAudioOutputControlUtility = aAudioOutputControlUtility; + + if (iMMDataSource) + status = iAudioOutputControlUtility->SetDataSource(iMMDataSource); //EMC source + else + status = iAudioOutputControlUtility->SetDataSource(iDataSource); //MMF source + + return status; + } + +// ========================== OTHER EXPORTED FUNCTIONS ========================= +// End of File +