javauis/mmapi_qt/baseline/src.emc/cmmaemcplayerbase.cpp
branchRCL_3
changeset 17 0fd27995241b
--- /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 <mmf/server/mmfdes.h>
+#include <AudioPreference.h>
+#include <logger.h>
+#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<MFileSource*>(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<MDataBufferSource*>(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<MDescriptorSource*>(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