diff -r f9bb0fca356a -r 0fd27995241b javauis/mmapi_qt/baseline/src.emc/cmmaemcplayerbase.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/javauis/mmapi_qt/baseline/src.emc/cmmaemcplayerbase.cpp Tue May 11 16:07:20 2010 +0300 @@ -0,0 +1,358 @@ +/* +* Copyright (c) 2002-2007 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: This class is used for playing sounds +* +*/ + + +// INCLUDE FILES +//#include +#include +#include +#include "cmmaemcplayerbase.h" +#include "cmmaemcresolver.h" + +using namespace multimedia; + +using multimedia::MSourceControlObserver; +using multimedia::MStreamControlObserver; + +CMMAEMCPlayerBase::~CMMAEMCPlayerBase() +{ + LOG( EJavaMMAPI, EInfo, "MMA::CMMAEMCPlayerBase::~CMMAEMCPlayerBase +"); + + if (iMStreamControl) + { + iMStreamControl->RemoveObserver(*this); + if (iMStreamControl->GetState() > 0) + { + LOG1( EJavaMMAPI, EInfo, "MMA::CMMAEMCPlayerBase::~CMMAEMCPlayerBase: iMStreamControl's state = %d",iMStreamControl->GetState()); + TInt err = iMStreamControl->Close(); + ELOG1( EJavaMMAPI, "MMA::CMMAEMCPlayerBase::~CMMAEMCPlayerBase: Close() err = %d",err); + } + } + + if (iFactory) + { + CleanupSource(); + + MSinkControl* objPtr1 = iMAudioSink; + iMStreamControl->RemoveSink(*objPtr1); + + iFactory->DeleteSinkControl(objPtr1); + iMAudioSink = NULL; + + //before deleting Stream Control all the controls need to be deleted + if (iControls.Count() > 0) + iControls.ResetAndDestroy(); + + iFactory->DeleteStreamControl(iMStreamControl); + delete iFactory; + } + + delete iFileName; + + delete iActiveSchedulerWait; + + delete iMimeType; + + delete iDescData; + + LOG( EJavaMMAPI, EInfo, "MMA::CMMAEMCPlayerBase::~CMMAEMCPlayerBase -"); +} + + +CMMAEMCPlayerBase::CMMAEMCPlayerBase( + CMMAEMCResolver* aResolver) : + iMediaTime(KTimeUnknown), iStartedEventTime(0) +{ + LOG( EJavaMMAPI, EInfo, "MMA::CMMAEMCPlayerBase +"); + // content type ownership is transferred + iDescData = NULL; + iContentType = aResolver->ContentTypeOwnership(); + iMimeType = aResolver->MimeTypeOwnership(); // 8-bit version of iContentType + + LOG1( EJavaMMAPI, EInfo, "MMA::CMMAEMCPlayerBase::ContentType-- %S" ,iContentType->Des().PtrZ()); + + // file name ownership is transferred + iFileName = aResolver->FileNameOwnership(); + LOG1( EJavaMMAPI, EInfo, "MMA::CMMAEMCPlayerBase::FileName-- %S" ,iFileName->Des().PtrZ()); + LOG( EJavaMMAPI, EInfo, "MMA::CMMAEMCPlayerBase -"); +} + +void CMMAEMCPlayerBase::ConstructL() +{ + LOG( EJavaMMAPI, EInfo, "MMA::CMMAEMCPlayerBase::ConstructL +"); + CMMAPlayer::ConstructL(); + iSourceType = EDATABUFFERSOURCE; //Currently it only support Http + + TInt status=CMultimediaFactory::CreateFactory(iFactory); + CreateStreamL(); + AddDataSourceToStreamL(); + + LOG( EJavaMMAPI, EInfo, "MMA::CMMAEMCPlayerBase::ConstructL -"); +} + +void CMMAEMCPlayerBase::CreateStreamL() +{ + LOG( EJavaMMAPI, EInfo, "MMA::CMMAEMCPlayerBase::CreateStreamL +"); + if (iMStreamControl) + User::Leave(KErrAlreadyExists); + TInt err = iFactory->CreateStreamControl(KStreamControl,iMStreamControl); + User::LeaveIfError(err); + //If the state of iMStreamControl changes,iPrevStreamControlState will keep its previous state + iPrevStreamControlState = MStreamControl::CLOSED; + iMStreamControl->AddObserver(*this); + + MSinkControl* tempSinkCtrl(NULL); + err = iFactory->CreateSinkControl(KMMFAudioOutputSinkControl,tempSinkCtrl); + User::LeaveIfError(err); + iMAudioSink = tempSinkCtrl; + iMStreamControl->AddSink(*iMAudioSink); + LOG( EJavaMMAPI, EInfo, "MMA::CMMAEMCPlayerBase::CreateStreamL -"); +} + +void CMMAEMCPlayerBase::AddDataSourceToStreamL() +{ + LOG( EJavaMMAPI, EInfo, "MMA::CMMAEMCPlayerBase::AddDataSourceToStreamL +"); + if (iMStreamControl == NULL) + { + User::Leave(KErrNotReady); + } + + TInt err(KErrNone); + MSourceControl* tempCtrl(NULL); + + switch (iSourceType) + { + case EFILESOURCE: + { + err = iFactory->CreateSourceControl(KFileSourceControl, tempCtrl); + User::LeaveIfError(err); + iMFileSource = static_cast(tempCtrl); + iMimeType->Des().FillZ(); + User::LeaveIfError(iMFileSource->Open(*iFileName, *iMimeType)); + iMFileSource->AddObserver(*this); + break; + } + case EDATABUFFERSOURCE: + { + err = iFactory->CreateSourceControl(KDataBufferSourceControl, tempCtrl); + User::LeaveIfError(err); + + iMDataBufferSource = static_cast(tempCtrl); + MDataBuffer* headerData = NULL; + User::LeaveIfError(iMDataBufferSource->Open(*iMimeType, *headerData)); + iMDataBufferSource->AddObserver(*this); + break; + } + case EDESCRIPTORSOURCE: + { + err = iFactory->CreateSourceControl(KDescriptorSourceControl, tempCtrl); + User::LeaveIfError(err); + iMDescriptorSource = static_cast(tempCtrl); + TInt size = 0; + // iFile.Size(size); will be used when Descriptor support will be implemented + + if (iDescData) + { + delete iDescData; + iDescData = NULL; + } + iDescData = HBufC8::NewL(size); + TPtr8 des = iDescData->Des(); + //iFile.Read(des); + User::LeaveIfError(iMDescriptorSource->Open(*iMimeType,*iDescData)); + iMDescriptorSource->AddObserver(*this); + break; + } + default: + break; + } + + iMStreamControl->AddSource(*tempCtrl); + LOG( EJavaMMAPI, EInfo, "MMA::CMMAEMCPlayerBase::AddDataSourceToStreamL -"); +} + +void CMMAEMCPlayerBase::CleanupSource() +{ + LOG( EJavaMMAPI, EInfo, "MMA::CMMAEMCPlayerBase::CleanupSource +"); + if (iMDataBufferSource) + { + iMDataBufferSource->RemoveObserver(*this); + MSourceControl* objPtr = iMDataBufferSource; + iMStreamControl->RemoveSource(*objPtr); //added + objPtr->Close(); + iFactory->DeleteSourceControl(objPtr); + iMDataBufferSource = NULL; + } + LOG( EJavaMMAPI, EInfo, "MMA::CMMAEMCPlayerBase::CleanupSource -"); +} + +EXPORT_C MStreamControl* CMMAEMCPlayerBase::StreamControl() +{ + return iMStreamControl; +} + +EXPORT_C CMultimediaFactory* CMMAEMCPlayerBase::MMFactory() +{ + return iFactory; +} + +TBool CMMAEMCPlayerBase::IsFilePlayer() +{ + return EFalse; +} + +void CMMAEMCPlayerBase::StartL() +{ + // empty implementation + // should be overwritten in derived class +} + +void CMMAEMCPlayerBase::StopL(TBool /*aPostEvent*/) +{ + // empty implementation + // should be overwritten in derived class +} + +void CMMAEMCPlayerBase::DeallocateL() +{ + LOG( EJavaMMAPI, EInfo, "MMA::CMMAEMCPlayerBase::DeallocateL +"); + if (iState == EPrefetched) + { + // Change state first to enable AMMS to delete Effect API classes + ChangeState(ERealized); + + TInt err = iMStreamControl->Stop(); + ELOG1( EJavaMMAPI, "CMMAEMCPlayerBase::DeallocateL iMStreamControl->Stop = %d", err); + ResetSourceStreams(); + } + LOG( EJavaMMAPI, EInfo, "MMA::CMMAEMCPlayerBase::DeallocateL -"); +} + + +void CMMAEMCPlayerBase::GetDuration(TInt64* aDuration) +{ + LOG( EJavaMMAPI, EInfo, "MMA::CMMAEMCPlayerBase::GetDuration +"); + if (iDuration == KTimeUnknown) + { + TInt64 duration(0); + TInt err = iMStreamControl->GetDuration(duration); + if (!err) + { + iDuration = duration; + } + } + *aDuration = iDuration; + LOG( EJavaMMAPI, EInfo, "MMA::CMMAEMCPlayerBase::GetDuration -"); +} + +void CMMAEMCPlayerBase::SetMediaTimeL(TInt64* aTime) +{ + LOG( EJavaMMAPI, EInfo, "CMMAEMCPlayerBase::SetMediaTimeL +"); + + // Negative values are not checked here + // because it's done already in Java side. + + // Get clip duration + TInt64 duration; + User::LeaveIfError(iMStreamControl->GetDuration(duration)); + LOG1( EJavaMMAPI, EInfo, "CMMAEMCPlayerBase::SetMediaTimeL iMStreamControl->GetDuration=%d", duration); + + TInt64 position; + + // If the desired media time is beyond the duration, + // the time is set to the end of the media. + if (*aTime > duration) + { + position = duration; + } + else + { + position = *aTime; + } + + // The controller must be in the PRIMED or PLAYING state + User::LeaveIfError(iMStreamControl->SetPosition(position)); + + // Reset cached media time, because actual set position may be + // something else than aTime. + iMediaTime = KTimeUnknown; + + // Inform about the position change to the StateListeners + ChangeState(iState); + + // Get the actual media time + GetMediaTime(aTime); + + iStartedEventTime = iMediaTime; + LOG( EJavaMMAPI, EInfo, "CMMAEMCPlayerBase::SetMediaTimeL -"); +} + +void CMMAEMCPlayerBase::GetMediaTime(TInt64* aMediaTime) +{ + LOG( EJavaMMAPI, EInfo, "CMMAEMCPlayerBase::GetMediaTimeL +"); + TInt64 position(0); + + if (iMediaTime == KTimeUnknown || iState == EStarted) + { + + TInt error(iMStreamControl->GetPosition(position)); + + if (error == KErrNone) + { + TInt64 newTime = position; + + // Sanity check for media time going backwards or beyond the + // duration. + // Some native controls may return zero media time for + // a few moments just before playback will complete. + if (newTime < iMediaTime || + (iDuration > 0 && newTime > iDuration)) + { + GetDuration(&iMediaTime); + } + else + { + // set return value + iMediaTime = newTime; + } + } + else + { + ELOG1( EJavaMMAPI, "CMMAEMCPlayerBase::GetMediaTimeL: error=%d, returning TIME_UNKNOWN", error); + // cannot get media time + iMediaTime = KTimeUnknown; + } + } + *aMediaTime = iMediaTime; + LOG( EJavaMMAPI, EInfo, "CMMAEMCPlayerBase::GetMediaTimeL -"); +} + +void CMMAEMCPlayerBase::CloseL() +{ + LOG( EJavaMMAPI, EInfo, "CMMAEMCPlayerBase::CloseL +"); + CMMAPlayer::CloseL(); + + iMStreamControl->Close(); + LOG( EJavaMMAPI, EInfo, "CMMAEMCPlayerBase::CloseL -"); +} + +void CMMAEMCPlayerBase::Event(MControl* /*aControl*/, TUint /*aEventType*/, TAny* /*aEventObject*/) +{ + //Not Called +} + +// END OF FILE