diff -r a36789189b53 -r 095bea5f582e khronosfws/openmax_al/src/mmf_adaptation/cmmfbackendengine.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/khronosfws/openmax_al/src/mmf_adaptation/cmmfbackendengine.cpp Tue Aug 31 15:43:02 2010 +0300 @@ -0,0 +1,1930 @@ +/* + * Copyright (c) 2009 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: + * + */ + +#include +#include +#include +#include +#include "cmmfbackendengine.h" +#include "markerpositiontimer.h" +#include "positionupdatetimer.h" +#include "profileutilmacro.h" +#include + +extern "C" + { +#include "xaadaptationmmf.h" + } + +#define RET_IF_ERR(res, val) if (res != KErrNone) return val + +const XAuint32 XA_PLAYSTATE_PLAYERUNINITIALIZED = 0; + +CMMFBackendEngine* CMMFBackendEngine::NewL() + { + CMMFBackendEngine* self = new (ELeave) CMMFBackendEngine(); + CleanupStack::PushL(self); + self->ConstructL(); + CleanupStack::Pop(self); + return self; + } + +CMMFBackendEngine::~CMMFBackendEngine() + { + Close(); + Destroy(); + } + +CMMFBackendEngine::CMMFBackendEngine() : + iPositionUpdatePeriod(1000), /* default is 1000 millisec */ + iUriPtr(NULL, 0) + { + iRecordState = ERecorderNotReady; + iPositionUpdateTimer = NULL; + iMediaPlayerState = XA_PLAYSTATE_PLAYERUNINITIALIZED; + iMMFPlayerState = EPlayerClosed; + } + +void CMMFBackendEngine::ConstructL() + { + iAPIBeingUsed = ENoUtility; + iActiveSchedulerWait = new (ELeave) CActiveSchedulerWait; + } + +void CMMFBackendEngine::InitAudioRecorderUtilityL() + { + if (!iAudioRecorder) + { + iBaseAudioRecorder = CMdaAudioRecorderUtility::NewL(*this); + iAudioRecorder = (CMdaAudioRecorderUtility*) iBaseAudioRecorder; + } + } + +void CMMFBackendEngine::InitAudioPlayerUtilityL() + { + if (!iAudioPlayer) + { + iBaseAudioPlayer = CMdaAudioPlayerUtility::NewL(*this); + iAudioPlayer = (CMdaAudioPlayerUtility*) iBaseAudioPlayer; + } + InitPlayerTimersL(); + } + +void CMMFBackendEngine::InitVideoPlayerUtilityL() + { + if (!iVideoPlayer) + { + iBaseVideoPlayer = CVideoPlayerUtility2::NewL(*this, + EMdaPriorityNormal, EMdaPriorityPreferenceTimeAndQuality); + iVideoPlayer = (CVideoPlayerUtility2*) iBaseVideoPlayer; + iVideoPlayer->RegisterForVideoLoadingNotification(*this); + } + InitPlayerTimersL(); + } + +void CMMFBackendEngine::InitPlayerTimersL() + { + if (!iMarkerPositionTimer) + { + iMarkerPositionTimer = CMarkerPositionTimer::NewL(iAudioPlayer, + iVideoPlayer); + iMarkerPositionTimer->SetContext(iAdaptContext); + } + if (!iPlayItfPositionUpdateTimer) + { + iPlayItfPositionUpdateTimer = CPositionUpdateTimer::NewL( + iAudioPlayer, iVideoPlayer); + iPlayItfPositionUpdateTimer->SetContext(iAdaptContext); + } + iMarkerPositionTimer->Stop(); + iPlayItfPositionUpdateTimer->Stop(); + } + +TInt CMMFBackendEngine::SetFileName(char* uri, XAuint32 format, + TFuncInUse func) + { + TInt err(KErrNone); + _LIT8(KFileSlash,"file:///"); + TInt fileslashlen = KFileSlash().Length(); + if (func == ERecord) + { + if (iRecordState == ERecorderNotReady) + { + iFileFormat = format; + iAPIBeingUsed = DetermineAPIToUse(uri, ERecord); + err = XA_RESULT_INTERNAL_ERROR; + if (iAPIBeingUsed == EAudioRecorderUtility) + { + /* Initialize URI as needed by MMF utilities */ + err = InitializeURIForMMFUtil(uri); + RET_IF_ERR(err, XA_RESULT_INTERNAL_ERROR); + /* Initalize Recorder related objects */ + TRAP(err, InitAudioRecorderUtilityL()); + RET_IF_ERR(err, XA_RESULT_INTERNAL_ERROR); + + TRAP(err, iAudioRecorder->OpenFileL(iUriPtr)); + RET_IF_ERR(err, XA_RESULT_INTERNAL_ERROR); + /* Wait until we receive moscostatechanged callback */ + if (iActiveSchedulerWait && !iActiveSchedulerWait->IsStarted()) + { + iActiveSchedulerWait->Start(); + } + RET_IF_ERR(iErrorCode, XA_RESULT_INTERNAL_ERROR); + } + } + } + else + { + /* The second one is needed for dynamic source interface */ + if ((iMediaPlayerState == XA_PLAYSTATE_PLAYERUNINITIALIZED) + || (iMediaPlayerState == XA_PLAYSTATE_STOPPED)) + { + iFileFormat = format; + iAPIBeingUsed = DetermineAPIToUse(uri, EPlay); + err = XA_RESULT_INTERNAL_ERROR; + if (iAPIBeingUsed == EAudioPlayerUtility) + { + /* Initialize URI as needed by MMF utilities */ + err = InitializeURIForMMFUtil(uri); + RET_IF_ERR(err, XA_RESULT_INTERNAL_ERROR); + /* Initalize Player related objects */ + TRAP(err, InitAudioPlayerUtilityL()); + RET_IF_ERR(err, XA_RESULT_INTERNAL_ERROR); + + TAG_TIME_PROFILING_BEGIN; + TRAP(err, iAudioPlayer->OpenFileL(iUriPtr)); + RET_IF_ERR(err, XA_RESULT_INTERNAL_ERROR); + TAG_TIME_PROFILING_END; + PRINT_TO_CONSOLE_TIME_DIFF; + + /* Wait until we receive mapc init complete */ + PRINT_TO_CONSOLE_HOME_TIME; + if (iActiveSchedulerWait && !iActiveSchedulerWait->IsStarted()) + { + iActiveSchedulerWait->Start(); + } + RET_IF_ERR(iErrorCode, XA_RESULT_INTERNAL_ERROR); + } + else if (iAPIBeingUsed == EVideoPlayerUtility) + { + /* Initialize URI as needed by MMF utilities */ + err = InitializeURIForMMFUtil(uri); + RET_IF_ERR(err, XA_RESULT_INTERNAL_ERROR); + /* Initalize Player related objects */ + TRAP(err, InitVideoPlayerUtilityL()); + RET_IF_ERR(err, XA_RESULT_INTERNAL_ERROR); + + if (iUriType == ELocal) + { + /* Open file */ + TAG_TIME_PROFILING_BEGIN; + TRAP(err, iVideoPlayer->OpenFileL(iUriPtr)); + RET_IF_ERR(err, XA_RESULT_INTERNAL_ERROR); + TAG_TIME_PROFILING_END; + PRINT_TO_CONSOLE_TIME_DIFF; + } + else + { + /* Open URL */ + TAG_TIME_PROFILING_BEGIN; + TRAP(err, iVideoPlayer->OpenUrlL(iUriPtr)); + RET_IF_ERR(err, XA_RESULT_INTERNAL_ERROR); + TAG_TIME_PROFILING_END; + PRINT_TO_CONSOLE_TIME_DIFF; + } + /* Wait until we receive MvpuoOpenComplete */ + PRINT_TO_CONSOLE_HOME_TIME; + if (iActiveSchedulerWait && !iActiveSchedulerWait->IsStarted()) + { + iActiveSchedulerWait->Start(); + } + RET_IF_ERR(iErrorCode, XA_RESULT_INTERNAL_ERROR); + + /* Prepare utility */ + TAG_TIME_PROFILING_BEGIN_NO_VAR_DEF; + iVideoPlayer->Prepare(); + TAG_TIME_PROFILING_END_NO_VAR_DEF; + PRINT_TO_CONSOLE_TIME_DIFF; + + /* Wait until we receive MvpuoPrepareComplete */ + PRINT_TO_CONSOLE_HOME_TIME_NO_VAR_DEF; + if (iActiveSchedulerWait && !iActiveSchedulerWait->IsStarted()) + { + iActiveSchedulerWait->Start(); + } + RET_IF_ERR(iErrorCode, XA_RESULT_INTERNAL_ERROR); + } + } + } + if (err != KErrNone) + { + err = XA_RESULT_INTERNAL_ERROR; + } + return err; + } + +TInt CMMFBackendEngine::DetermineAPIToUse(char* uri, TFuncInUse aFunc) + { + char* dotPtr = NULL; + char ext[MAX_EXTENSION_SIZE] = + { + 0 + }; + int extLen; + + int colpos; + char urischeme[MAX_EXTENSION_SIZE] = + { + 0 + }; + int urischemeLen; + + dotPtr = strrchr(uri, (int) '.'); + if (!dotPtr) + { + return KErrNotFound; + } + + strncpy(ext, dotPtr, strlen(dotPtr)); + /*Null terminate the string*/ + ext[strlen(dotPtr)] = '\0'; + extLen = sizeof(ext); + for (unsigned int i = 0; i < extLen; i++) + { + ext[i] = tolower(ext[i]); + } + + colpos = strcspn(uri, ":"); + + strncpy(urischeme, uri, colpos + 1); + /*Null terminate the string*/ + urischeme[colpos + 1] = '\0'; + urischemeLen = sizeof(urischeme); + for (unsigned int i = 0; i < urischemeLen; i++) + { + urischeme[i] = tolower(urischeme[i]); + } + + if (aFunc == ERecord) + { + return EAudioRecorderUtility; + } + else + { + if (!strcmp(urischeme, "file:")) + { + if (!strcmp(ext, ".mp3") || !strcmp(ext, ".amr") + || !strcmp(ext, ".aac") || !strcmp(ext, ".mid") + || !strcmp(ext, ".wav") || !strcmp(ext, ".awb")) + { + return EAudioPlayerUtility; + } + else + { + return EVideoPlayerUtility; + } + } + else + { + return EVideoPlayerUtility; + } + } + } + +//From MVidePlayerUtilityObserver +void CMMFBackendEngine::MvpuoOpenComplete(TInt aError) + { + PRINT_TO_CONSOLE_HOME_TIME; + + iErrorCode = aError; + if (iErrorCode == KErrNone) + { + iMMFPlayerState = EPlayerOpened; + } + if (iActiveSchedulerWait && iActiveSchedulerWait->IsStarted()) + { + iActiveSchedulerWait->AsyncStop(); + } + } + +void CMMFBackendEngine::MvpuoPrepareComplete(TInt aError) + { + PRINT_TO_CONSOLE_HOME_TIME; + + TAutoScaleType autoScale = EAutoScaleBestFit; + iErrorCode = aError; + iMediaPlayerState = XA_PLAYSTATE_PLAYERUNINITIALIZED; + iMediaDuration = 0; + iMarkerPositionTimer->ResetPlayer(); + iPlayItfPositionUpdateTimer->ResetPlayer(); + if (iErrorCode == KErrNone) + { + iMMFPlayerState = EPlayerPrepared; + TAG_TIME_PROFILING_BEGIN; + TRAP(iErrorCode, iMediaDuration = iVideoPlayer->DurationL()); + TAG_TIME_PROFILING_END; + PRINT_TO_CONSOLE_TIME_DIFF; + if (iErrorCode == KErrNone) + { + iPlaybackHead = 0; + iMediaPlayerState = XA_PLAYSTATE_STOPPED; + iMarkerPositionTimer->UseVideoPlayer(); + iPlayItfPositionUpdateTimer->UseVideoPlayer(); + if (m_pWs && m_pScr && m_pWindow) + { + TRect videoExtent = TRect(m_pWindow->Size()); + TRect clipRect = TRect(m_pWindow->Size()); + TAG_TIME_PROFILING_BEGIN; + TRAP_IGNORE(iVideoPlayer->AddDisplayWindowL(*m_pWs, *m_pScr, *m_pWindow, videoExtent, clipRect)); + TRAP_IGNORE(iVideoPlayer->SetAutoScaleL(*m_pWindow, autoScale)); + TAG_TIME_PROFILING_END; + PRINT_TO_CONSOLE_TIME_DIFF; + } + } + } + if (iActiveSchedulerWait && iActiveSchedulerWait->IsStarted()) + { + iActiveSchedulerWait->AsyncStop(); + } + } + +void CMMFBackendEngine::MvpuoFrameReady(CFbsBitmap& /*aFrame*/, TInt /*aError*/) + { + + } +void CMMFBackendEngine::MvpuoPlayComplete(TInt aError) + { + iErrorCode = aError; + if (iErrorCode == KErrNone) + { + iPlaybackHead = iMediaDuration; + /* Per OpenMAX AL Spec, when playback is completed, media player stays in + * paused state with playhead at the end of the media clip */ + iMediaPlayerState = XA_PLAYSTATE_PAUSED; + DoPostEvent(XA_PLAYEVENT_HEADATEND); + } + else + { + iPlaybackHead = 0; + iMediaPlayerState = XA_PLAYSTATE_STOPPED; + XAAdaptEvent event = + { + XA_PLAYITFEVENTS, XA_OBJECT_EVENT_RESOURCES_LOST, 0, NULL + }; + XAAdaptationBase_SendAdaptEvents( + (XAAdaptationBaseCtx*) iAdaptContext, &event); + } + iMMFPlayerState = EPlayerPrepared; + iMarkerPositionTimer->Stop(); + iPlayItfPositionUpdateTimer->Stop(); + } + +void CMMFBackendEngine::MvpuoEvent(class TMMFEvent const & event) + { + //RDebug::Print(_L("CMMFBackendEngine::MvpuoEvent (0x%x %d)"), event.iEventType, event.iErrorCode); + + if (event.iEventType == KMMFEventCategoryVideoPlayerGeneralError + && event.iErrorCode == KErrHardwareNotAvailable) + { + //RDebug::Print(_L("CMMFBackendEngine::MvpuoEvent: Hardware Not Available")); + } + + else if (event.iEventType == KMMFEventCategoryVideoPlayerGeneralError + && event.iErrorCode == KErrMMPartialPlayback) + { + //RDebug::Print(_L("CMMFBackendEngine::MvpuoEvent: Partial playback")); + } + if (event.iEventType == KMMFEventCategoryVideoPlayerGeneralError + && event.iErrorCode == -12014) + { + //RDebug::Print(_L("CMMFBackendEngine::MvpuoEvent: Audio Device taken")); + PausePlayback(); + XAAdaptEvent alEvent = + { + XA_PLAYITFEVENTS, XA_OBJECT_EVENT_RESOURCES_LOST, 0, NULL + }; + XAAdaptationBase_SendAdaptEvents( + (XAAdaptationBaseCtx*) iAdaptContext, &alEvent); + } + else if (event.iEventType == KMMFRefreshMetaData) + { + //RDebug::Print(_L("CMMFBackendEngine::MvpuoEvent: EventType == KMMFRefreshMetaData")); + } + else + { + //RDebug::Print(_L("CMMFBackendEngine::MvpuoEvent: Unhandled event")); + } + + } + +// From MRebufferCallback +void CMMFBackendEngine::MvloLoadingStarted() + { + } + +void CMMFBackendEngine::MvloLoadingComplete() + { + //file playing + } + +//MMdaAudioPlayerCallback +void CMMFBackendEngine::MapcInitComplete(TInt aError, + const TTimeIntervalMicroSeconds& aDuration) + { + PRINT_TO_CONSOLE_HOME_TIME; + + iErrorCode = aError; + iMediaPlayerState = XA_PLAYSTATE_PLAYERUNINITIALIZED; + iMMFPlayerState = EPlayerClosed; + iMediaDuration = 0; + iMarkerPositionTimer->ResetPlayer(); + iPlayItfPositionUpdateTimer->ResetPlayer(); + if (iErrorCode == KErrNone) + { + iMediaDuration = aDuration; + iPlaybackHead = 0; + iMediaPlayerState = XA_PLAYSTATE_STOPPED; + iMMFPlayerState = EPlayerOpened; + iMarkerPositionTimer->UseAudioPlayer(); + iPlayItfPositionUpdateTimer->UseAudioPlayer(); + } + if (iActiveSchedulerWait && iActiveSchedulerWait->IsStarted()) + { + iActiveSchedulerWait->AsyncStop(); + } + } + +void CMMFBackendEngine::MapcPlayComplete(TInt aError) + { + iErrorCode = aError; + if (iErrorCode == KErrNone) + { + /* Now we should have better value. Start using that */ + iAudioPlayer->Duration(iMediaDuration); + iPlaybackHead = iMediaDuration; + /* Per OpenMAX AL Spec, when playback is completed, media player stays in + * paused state with playhead at the end of the media clip */ + iMediaPlayerState = XA_PLAYSTATE_PAUSED; + DoPostEvent(XA_PLAYEVENT_HEADATEND); + iMMFPlayerState = EPlayerOpened; + } + else + { + iAudioPlayer->GetPosition(iPlaybackHead); + iMediaPlayerState = XA_PLAYSTATE_PAUSED; + iMMFPlayerState = EPlayerPaused; + XAAdaptEvent event = + { + XA_PLAYITFEVENTS, XA_OBJECT_EVENT_RESOURCES_LOST, 0, NULL + }; + XAAdaptationBase_SendAdaptEvents( + (XAAdaptationBaseCtx*) iAdaptContext, &event); + } + iMarkerPositionTimer->Stop(); + iPlayItfPositionUpdateTimer->Stop(); + } + +// from MMdaObjectStateChangeObserver +void CMMFBackendEngine::MoscoStateChangeEvent(CBase* /*aObject*/, + TInt aPreviousState, TInt aCurrentState, TInt aErrorCode) + { + TInt err(KErrNone); + iPreviousRecordState = aPreviousState; + iCurrentRecordState = aCurrentState; + iErrorCode = aErrorCode; + //RDebug::Print(_L("CMMFBackendEngine::MoscoStateChangeEvent 1 Error[%d]"),aErrorCode); + if (iCurrentRecordState == CMdaAudioClipUtility::EOpen) //EOpen + { + //outputfile is open and ready for recording + iRecordState = CMMFBackendEngine::ERecorderOpen; + if (iErrorCode == KErrNone) + { + if (iPreviousRecordState == CMdaAudioClipUtility::ENotReady) + { + //RDebug::Print(_L("CMMFBackendEngine::MoscoStateChangeEvent 2")); + TRAP(err,iAudioInputRecord = CAudioInput::NewL( *iAudioRecorder )); + if (err == KErrNone) + { + RArray inputArray; + inputArray.Append(CAudioInput::EDefaultMic); + // Set Audio Input + TRAP(err, iAudioInputRecord->SetAudioInputL( inputArray.Array( ) )); + inputArray.Close(); + } + TMMFMessageDestination destination( + KUidMetaDataWriteCustomCommand); + TMMFMessageDestinationPckg pckg = TMMFMessageDestinationPckg( + destination); + TInt ret = iAudioRecorder->RecordControllerCustomCommandSync( + pckg, 0, KNullDesC8, KNullDesC8); + //RDebug::Print(_L("CMMFBackendEngine::MoscoStateChangeEvent 3 [%d]"),ret); + if (ret != KErrNone && iFileFormat == XA_CONTAINERTYPE_MP4) + { + iPauseSupportMP4 = FALSE; + } + if (iActiveSchedulerWait && iActiveSchedulerWait->IsStarted()) + { + iActiveSchedulerWait->AsyncStop(); + } + } + } + else + { + XAAdaptEvent event = + { + XA_RECORDITFEVENTS, XA_OBJECT_EVENT_RESOURCES_LOST, 0, NULL + }; + XAAdaptationBase_SendAdaptEvents( + (XAAdaptationBaseCtx*) iAdaptContext, &event); + } + } + else if (iCurrentRecordState == CMdaAudioClipUtility::ERecording) //ERecording + { + iRecordState = CMMFBackendEngine::ERecorderRecording; + iPositionUpdateTimer->Start(iTimerDelay); + XAAdaptEvent event = + { + XA_RECORDITFEVENTS, XA_RECORDEVENT_HEADMOVING, 0, NULL + }; + XAAdaptationBase_SendAdaptEvents( + (XAAdaptationBaseCtx*) iAdaptContext, &event); + } + else //ENotReady + { + //outputfile is not open + iRecordState = CMMFBackendEngine::ERecorderNotReady; + } + } + +TInt CMMFBackendEngine::SetRecorderState(TRecorderState state, + XAboolean stopCalled) + { + TInt err(KErrNone); + + if (iAPIBeingUsed != EAudioRecorderUtility) + { + return XA_RESULT_INTERNAL_ERROR; + } + + switch (state) + { + case ERecorderNotReady: + iAudioRecorder->Close(); + iRecordState = ERecorderNotReady; + break; + case ERecorderOpen: + if (iFileFormat == XA_CONTAINERTYPE_MP4 && !iPauseSupportMP4 + && !stopCalled) + { + err = KErrNotSupported; + return err; + } + iPositionUpdateTimer->Stop(); + iAudioRecorder->Stop(); + iRecordState = ERecorderOpen; + break; + case ERecorderRecording: + TRAP(err, iAudioRecorder->RecordL()) + ; + break; + } + return err; + } + +void CMMFBackendEngine::Close() + { + if (iMarkerPositionTimer) + { + iMarkerPositionTimer->Stop(); + } + if (iPlayItfPositionUpdateTimer) + { + iPlayItfPositionUpdateTimer->Stop(); + } + + if (iBaseVideoPlayer && iVideoPlayer) + { + switch (iMMFPlayerState) + { + case EPlayerPlaying: + case EPlayerPaused: + case EPlayerPrepared: + iVideoPlayer->Stop(); + case EPlayerOpened: + if (m_pWs && m_pScr && m_pWindow) + { + iVideoPlayer->RemoveDisplayWindow(*m_pWindow); + } + iVideoPlayer->Close(); + case EPlayerClosed: + default: + break; + }; + } + + // deleting the AudioInput object + if (iAudioInputRecord) + { + delete iAudioInputRecord; + iAudioInputRecord = NULL; + } + + if (iBaseAudioPlayer && iAudioPlayer) + { + iAudioPlayer->Close(); + } + + if (iBaseAudioRecorder) + { + iAudioRecorder->Close(); + } + + if (iPositionUpdateTimer) + { + iPositionUpdateTimer->Stop(); + } + + if (iActiveSchedulerWait && iActiveSchedulerWait->IsStarted()) + { + iActiveSchedulerWait->AsyncStop(); + } + } + +void CMMFBackendEngine::Destroy() + { + delete iPositionUpdateTimer; + iPositionUpdateTimer = NULL; + delete iUri; + iUri = NULL; + delete iMarkerPositionTimer; + iMarkerPositionTimer = NULL; + delete iPlayItfPositionUpdateTimer; + iPlayItfPositionUpdateTimer = NULL; + delete iBaseVideoPlayer; + iBaseVideoPlayer = NULL; + iVideoPlayer = NULL; + delete iBaseAudioPlayer; + iBaseAudioPlayer = NULL; + iAudioPlayer = NULL; + delete iBaseAudioRecorder; + iBaseAudioRecorder = NULL; + iAudioRecorder = NULL; + delete iActiveSchedulerWait; + iActiveSchedulerWait = NULL; + delete m_pScr; + m_pScr = NULL; + } + +TInt CMMFBackendEngine::GetRecordPosition(XAuint64* position) + { + TInt err(KErrNone); + *position = iAudioRecorder->Position().Int64(); + return err; + } + +TInt CMMFBackendEngine::SetPositionUpdatePerioed(XAmillisecond period) + { + TInt err(KErrNone); + iTimerDelay = period; + return err; + } + +TInt CMMFBackendEngine::SetAdaptContext(void* adaptcontext) + { + TInt err(KErrNone); + iAdaptContext = adaptcontext; + TRAP(err, iPositionUpdateTimer = new (ELeave) LocalTimer(this, iAdaptContext)); + if (!err) + { + iPositionUpdateTimer->PostInit(); + } + return err; + } + +TInt CMMFBackendEngine::GetCodecId(XAuint32* codecid) + { + TInt err(KErrNone); + + if (iAPIBeingUsed == EAudioRecorderUtility) + { + if (iRecordState != CMMFBackendEngine::ERecorderNotReady) + { + TFourCC dest; + TRAP(err, dest = iAudioRecorder->DestinationDataTypeL()); + if (err == KErrNone) + { + *codecid = dest.FourCC(); + } + } + } + else if (iAPIBeingUsed == EAudioPlayerUtility) + { + if (iMediaPlayerState != XA_PLAYSTATE_PLAYERUNINITIALIZED) + { + TMMFMessageDestinationPckg pckg(KUidInterfaceMMFAudioController); + TPckgBuf configPackage; + TInt err = iAudioPlayer->CustomCommandSync(pckg, + EMMFAudioControllerGetSourceDataType, KNullDesC8, + KNullDesC8, configPackage); + if (err == KErrNone) + { + *codecid = configPackage().iSourceDataTypeCode.FourCC(); + } + } + } + return err; + } + +TInt CMMFBackendEngine::GetBitRate(XAuint32* bitrate) + { + TInt err(KErrNone); + TUint br(0); + if (iAPIBeingUsed == EAudioRecorderUtility) + { + if (iRecordState != CMMFBackendEngine::ERecorderNotReady) + { + TRAP(err, br = iAudioRecorder->DestinationBitRateL()); + if (err == KErrNone) + { + *bitrate = br; + } + } + } + else if (iAPIBeingUsed == EAudioPlayerUtility) + { + if (iMediaPlayerState != XA_PLAYSTATE_PLAYERUNINITIALIZED) + { + TInt err = iAudioPlayer->GetBitRate(br); + *bitrate = br; + } + } + return err; + } + +TInt CMMFBackendEngine::GetSampleRate(XAmilliHertz* samplerate) + { + TInt err(KErrNone); + TUint sr(0); + if (iAPIBeingUsed == EAudioRecorderUtility) + { + if (iRecordState != CMMFBackendEngine::ERecorderNotReady) + { + TRAP(err, sr = iAudioRecorder->DestinationSampleRateL()); + if (err == KErrNone) + { + *samplerate = sr * 1000; + } + } + } + else if (iAPIBeingUsed == EAudioPlayerUtility) + { + if (iMediaPlayerState != XA_PLAYSTATE_PLAYERUNINITIALIZED) + { + TMMFMessageDestinationPckg pckg(KUidInterfaceMMFAudioController); + TPckgBuf configPackage; + TInt err = iAudioPlayer->CustomCommandSync(pckg, + EMMFAudioControllerGetSourceSampleRate, KNullDesC8, + KNullDesC8, configPackage); + if (err == KErrNone) + { + *samplerate = configPackage().iSampleRate * 1000; + } + } + } + return err; + } + +TInt CMMFBackendEngine::GetChannels(XAuint32* channels) + { + TInt err(KErrNone); + TUint ch(0); + if (iAPIBeingUsed == EAudioRecorderUtility) + { + if (iRecordState != CMMFBackendEngine::ERecorderNotReady) + { + TRAP(err,ch = iAudioRecorder->DestinationNumberOfChannelsL()); + if (err == KErrNone) + { + *channels = ch; + } + } + } + else if (iAPIBeingUsed == EAudioPlayerUtility) + { + if (iMediaPlayerState != XA_PLAYSTATE_PLAYERUNINITIALIZED) + { + TMMFMessageDestinationPckg pckg(KUidInterfaceMMFAudioController); + TPckgBuf configPackage; + TInt err = iAudioPlayer->CustomCommandSync(pckg, + EMMFAudioControllerGetSourceNumChannels, KNullDesC8, + KNullDesC8, configPackage); + if (err == KErrNone) + { + *channels = configPackage().iChannels; + } + } + } + return err; + } + +TInt CMMFBackendEngine::SetDestinationBitRate(XAuint32* bitrate) + { + TInt err(KErrNone); + if (iRecordState == CMMFBackendEngine::ERecorderOpen) + { + TRAP(err, iAudioRecorder->SetDestinationBitRateL(*bitrate)); + if (err != KErrNone) + { + return XA_RESULT_PARAMETER_INVALID; + } + } + return err; + } + +TInt CMMFBackendEngine::SetDestinationSampleRate(XAmilliHertz* samplerate) + { + TInt err(KErrNone); + if (iRecordState == CMMFBackendEngine::ERecorderOpen) + { + TRAP(err, iAudioRecorder->SetDestinationSampleRateL(*samplerate/1000)); + if (err != KErrNone) + { + return XA_RESULT_PARAMETER_INVALID; + } + } + return err; + } + +TInt CMMFBackendEngine::SetDestinationChannels(XAuint32* channels) + { + TInt err(KErrNone); + if (iRecordState == CMMFBackendEngine::ERecorderOpen) + { + TRAP(err,iAudioRecorder->SetDestinationNumberOfChannelsL(*channels)); + if (err != KErrNone) + { + return XA_RESULT_PARAMETER_INVALID; + } + } + return err; + } + +/* + XAresult CMMFBackendEngine::SetWindowHandle(void* display_info) + { + XADataLocator_NativeDisplay* nativeDisplay; + XADataSink* videoSink = (XADataSink*)display_info; + + nativeDisplay = (XADataLocator_NativeDisplay*) (videoSink->pLocator); + + m_pWindow = ((RWindow*)(nativeDisplay->hWindow)); + m_pWs = ((RWsSession*)(nativeDisplay->hDisplay)); + + m_bWindowReferencePassed = TRUE; + return XA_RESULT_SUCCESS; + } + + */ +XAresult CMMFBackendEngine::CreateAndConfigureWindowL() + { +#ifdef USE_LOCAL_WINDOW_RESOURCES + // create window for attaching the surface as its background + //RWsSession ws; + //TInt err2(KErrNone); + TInt err2 = m_ws.Connect(); + m_pScr = new(ELeave) CWsScreenDevice(m_ws); + err2 = m_pScr->Construct(); + CWindowGc* gc = NULL; + err2 = m_pScr->CreateContext(gc); + RWindowGroup grp(m_ws); + err2 = grp.Construct(0xf00f00); + const TSize KWinSize(320, 240); + m_pWindow = new (ELeave) RWindow(m_ws); + err2 = m_pWindow->Construct(grp, 0xfeefee); + m_pWindow->SetExtent(TPoint(), KWinSize); + m_pWindow->SetBackgroundColor(TRgb(255,0,0,128)); + //win.SetBackgroundColor(TRgb(0,0,0,0)); + m_pWindow->Activate(); + m_pWindow->Invalidate(); + m_pWindow->BeginRedraw(); + gc->Activate(*m_pWindow); + m_pWindow->EndRedraw(); + m_ws.Flush(); + + //Create MediaClientUitlity for NGA Surfaces + TInt displayId = m_pScr->GetScreenNumber(); + + // Add the display window + m_cropRegion = TRect(m_pWindow->Size()); + m_clipRect = TRect(m_pWindow->Size()); + m_videoExtent = TRect(m_pWindow->Size()); + m_rotation = EVideoRotationNone; +#endif /* USE_LOCAL_WINDOW_RESOURCES */ + + return XA_RESULT_SUCCESS; + } + +XAresult CMMFBackendEngine::SetNativeDisplayInformation(void* display_info) + { + XAresult retVal(XA_RESULT_SUCCESS); + //display_info is of type XADataSink + //display_info.pLocator is of type XADataLocator_NativeDisplay + XADataLocator_NativeDisplay* nativeDisplay; + XADataSink* videoSink = (XADataSink*) display_info; + + if (videoSink) + { + nativeDisplay = (XADataLocator_NativeDisplay*) (videoSink->pLocator); + m_pWindow = ((RWindow*) (nativeDisplay->hWindow)); + m_pWs = ((RWsSession*) (nativeDisplay->hDisplay)); + /* + m_cropRegion = TRect(m_pWindow->Size()); + m_videoExtent = TRect(m_pWindow->Size()); + m_cropRect = TRect(m_pWindow->Size()); + m_clipRect = TRect(m_pWindow->Size()); + m_cropRegion = TRect(m_pWindow->Size()); + */ + if (m_pWs) + { + delete m_pScr; + m_pScr = NULL; + TRAPD(err, m_pScr = new CWsScreenDevice(*m_pWs)); + RET_IF_ERR(err, XA_RESULT_MEMORY_FAILURE); + m_pScr->Construct(); + } + } + return retVal; + } + +XAresult CMMFBackendEngine::ResumePlayback() + { + XAresult retVal(XA_RESULT_SUCCESS); + TBool postHeadMovingEvent(EFalse); + switch (iMediaPlayerState) + { + case XA_PLAYSTATE_STOPPED: + case XA_PLAYSTATE_PAUSED: + /* If we are already at the end of clip, do nothing + * check ::MapcPlayComplete for documentation */ + if ((iPlaybackHead < iMediaDuration) && ((iAPIBeingUsed + == EAudioPlayerUtility) || (iAPIBeingUsed + == EVideoPlayerUtility))) + { + if (iAPIBeingUsed == EAudioPlayerUtility) + { + TAG_TIME_PROFILING_BEGIN; + iAudioPlayer->Play(); + TAG_TIME_PROFILING_END; PRINT_TO_CONSOLE_TIME_DIFF; + } + else if (iAPIBeingUsed == EVideoPlayerUtility) + { + TAG_TIME_PROFILING_BEGIN; + //iVideoPlayer->Play( iPlaybackHead, iMediaDuration); + iVideoPlayer->Play(); + TAG_TIME_PROFILING_END; PRINT_TO_CONSOLE_TIME_DIFF; + } + postHeadMovingEvent = ETrue; + iMediaPlayerState = XA_PLAYSTATE_PLAYING; + iMMFPlayerState = EPlayerPlaying; + iMarkerPositionTimer->Start(); + iPlayItfPositionUpdateTimer->Start(); + } + break; + case XA_PLAYSTATE_PLAYING: + break; + case XA_PLAYSTATE_PLAYERUNINITIALIZED: + default: + retVal = XA_RESULT_INTERNAL_ERROR; + break; + } + + if (postHeadMovingEvent) + { + DoPostEvent(XA_PLAYEVENT_HEADMOVING); + } + return retVal; + } + +XAresult CMMFBackendEngine::PausePlayback() + { + XAresult retVal(XA_RESULT_SUCCESS); + switch (iMediaPlayerState) + { + case XA_PLAYSTATE_PLAYING: + case XA_PLAYSTATE_STOPPED: + if ((iAPIBeingUsed == EAudioPlayerUtility) || (iAPIBeingUsed + == EVideoPlayerUtility)) + { + TInt pauseOpRes(KErrNone); + if (iAPIBeingUsed == EAudioPlayerUtility) + { + TAG_TIME_PROFILING_BEGIN; + pauseOpRes = iAudioPlayer->Pause(); + TAG_TIME_PROFILING_END; PRINT_TO_CONSOLE_TIME_DIFF; + } + else if (iAPIBeingUsed == EVideoPlayerUtility) + { + TAG_TIME_PROFILING_BEGIN; + TRAP(pauseOpRes, iVideoPlayer->PauseL()); + if (pauseOpRes == KErrNone) + { + TRAPD(err, iPlaybackHead = iVideoPlayer->PositionL()); + if (err != KErrNone) + { + iPlaybackHead = 0; + } + } TAG_TIME_PROFILING_END; PRINT_TO_CONSOLE_TIME_DIFF; + } + if (pauseOpRes == KErrNone) + { + iMediaPlayerState = XA_PLAYSTATE_PAUSED; + iMMFPlayerState = EPlayerPaused; + iMarkerPositionTimer->Stop(); + iPlayItfPositionUpdateTimer->Stop(); + } + } + break; + case XA_PLAYSTATE_PAUSED: + break; + case XA_PLAYSTATE_PLAYERUNINITIALIZED: + default: + retVal = XA_RESULT_INTERNAL_ERROR; + break; + } + return retVal; + } + +XAresult CMMFBackendEngine::StopPlayback() + { + XAresult retVal(XA_RESULT_SUCCESS); + switch (iMediaPlayerState) + { + case XA_PLAYSTATE_PAUSED: + case XA_PLAYSTATE_PLAYING: + if ((iAPIBeingUsed == EAudioPlayerUtility) || (iAPIBeingUsed + == EVideoPlayerUtility)) + { + if (iAPIBeingUsed == EAudioPlayerUtility) + { + TAG_TIME_PROFILING_BEGIN; + iAudioPlayer->Stop(); + TAG_TIME_PROFILING_END; PRINT_TO_CONSOLE_TIME_DIFF; + + iMMFPlayerState = EPlayerOpened; + } + else if (iAPIBeingUsed == EVideoPlayerUtility) + { + TAG_TIME_PROFILING_BEGIN; + iVideoPlayer->Stop(); + TAG_TIME_PROFILING_END; PRINT_TO_CONSOLE_TIME_DIFF; + + iMMFPlayerState = EPlayerPrepared; + } + iMediaPlayerState = XA_PLAYSTATE_STOPPED; + iPlaybackHead = 0; + iMarkerPositionTimer->Stop(); + iPlayItfPositionUpdateTimer->Stop(); + } + break; + case XA_PLAYSTATE_STOPPED: + break; + case XA_PLAYSTATE_PLAYERUNINITIALIZED: + default: + retVal = XA_RESULT_INTERNAL_ERROR; + break; + } + return retVal; + } +XAresult CMMFBackendEngine::GetPlayState(XAuint32 *pState) + { + XAresult retVal(XA_RESULT_INTERNAL_ERROR); + switch (iMediaPlayerState) + { + case XA_PLAYSTATE_STOPPED: + case XA_PLAYSTATE_PAUSED: + case XA_PLAYSTATE_PLAYING: + *pState = iMediaPlayerState; + retVal = XA_RESULT_SUCCESS; + break; + case XA_PLAYSTATE_PLAYERUNINITIALIZED: + default: + break; + } + return retVal; + } + +XAresult CMMFBackendEngine::GetDuration(XAmillisecond *pMsec) + { + XAresult retVal(XA_RESULT_INTERNAL_ERROR); + /* to convert from microseconds to milliseconds */ + TInt64 divider(1000); + switch (iMediaPlayerState) + { + case XA_PLAYSTATE_STOPPED: + case XA_PLAYSTATE_PAUSED: + case XA_PLAYSTATE_PLAYING: + /* TODO Check if we query from MMF*/ + *pMsec = iMediaDuration.Int64() / divider; + retVal = XA_RESULT_SUCCESS; + break; + case XA_PLAYSTATE_PLAYERUNINITIALIZED: + default: + break; + } + return retVal; + } + +XAresult CMMFBackendEngine::GetPosition(XAmillisecond *pMsec) + { + XAresult retVal(XA_RESULT_INTERNAL_ERROR); + TInt64 divider(1000); + TTimeIntervalMicroSeconds pos; + switch (iMediaPlayerState) + { + case XA_PLAYSTATE_STOPPED: + case XA_PLAYSTATE_PAUSED: + case XA_PLAYSTATE_PLAYING: + if (iAPIBeingUsed == EAudioPlayerUtility) + { + if (iAudioPlayer->GetPosition(pos) == KErrNone) + { + *pMsec = pos.Int64() / divider; + retVal = XA_RESULT_SUCCESS; + } + } + else if (iAPIBeingUsed == EVideoPlayerUtility) + { + TInt err(KErrNone); + TRAP(err, pos = iVideoPlayer->PositionL()); + if (err == KErrNone) + { + *pMsec = pos.Int64() / divider; + retVal = XA_RESULT_SUCCESS; + } + } + break; + case XA_PLAYSTATE_PLAYERUNINITIALIZED: + default: + break; + } + return retVal; + } + +XAresult CMMFBackendEngine::SetPosition(XAmillisecond pMsec) + { + XAresult retVal(XA_RESULT_INTERNAL_ERROR); + TInt64 multiplier(1000); + TTimeIntervalMicroSeconds pos; + switch (iMediaPlayerState) + { + case XA_PLAYSTATE_STOPPED: + case XA_PLAYSTATE_PAUSED: + case XA_PLAYSTATE_PLAYING: + if (iAPIBeingUsed == EAudioPlayerUtility) + { + pos = pMsec * multiplier; + TAG_TIME_PROFILING_BEGIN; + iAudioPlayer->SetPosition(pos); + TAG_TIME_PROFILING_END; PRINT_TO_CONSOLE_TIME_DIFF; + + retVal = XA_RESULT_SUCCESS; + } + else if (iAPIBeingUsed == EVideoPlayerUtility) + { + pos = pMsec * multiplier; + TAG_TIME_PROFILING_BEGIN; + TRAPD(err, iVideoPlayer->SetPositionL(pos)); + TAG_TIME_PROFILING_END; + PRINT_TO_CONSOLE_TIME_DIFF; + if (err == KErrNone) + { + retVal = XA_RESULT_SUCCESS; + } + } + break; + case XA_PLAYSTATE_PLAYERUNINITIALIZED: + default: + break; + } + return retVal; + } + +XAresult CMMFBackendEngine::SetRepeats(XAboolean repeat) + { + XAresult retVal(XA_RESULT_INTERNAL_ERROR); + TInt numRepeats(0); + switch (iMediaPlayerState) + { + case XA_PLAYSTATE_STOPPED: + case XA_PLAYSTATE_PAUSED: + case XA_PLAYSTATE_PLAYING: + if (iAPIBeingUsed == EAudioPlayerUtility) + { + numRepeats = repeat ? -2 : 0; + iAudioPlayer->SetRepeats(numRepeats, 0); + retVal = XA_RESULT_SUCCESS; + } + else + { + } + break; + case XA_PLAYSTATE_PLAYERUNINITIALIZED: + default: + break; + } + return retVal; + } + +XAresult CMMFBackendEngine::SetPlayWindow(XAmillisecond start, + XAmillisecond end) + { + XAresult retVal(XA_RESULT_INTERNAL_ERROR); + TInt64 multiplier(1000); + TTimeIntervalMicroSeconds startpos(0); + TTimeIntervalMicroSeconds endpos(0); + + switch (iMediaPlayerState) + { + case XA_PLAYSTATE_STOPPED: + case XA_PLAYSTATE_PAUSED: + case XA_PLAYSTATE_PLAYING: + if (iAPIBeingUsed == EAudioPlayerUtility) + { + startpos = start * multiplier; + endpos = end * multiplier; + retVal = iAudioPlayer->SetPlayWindow(startpos, endpos); + } + else + { + } + break; + case XA_PLAYSTATE_PLAYERUNINITIALIZED: + default: + break; + } + return retVal; + } + +XAresult CMMFBackendEngine::SetPlayAdaptContext(void * adaptcontext) + { + XAresult retVal(XA_RESULT_SUCCESS); + + iAdaptContext = adaptcontext; + + return retVal; + } + +XAresult CMMFBackendEngine::RegisterCallback(xaPlayCallback cbFunction) + { + iPlayItfCBFunction = cbFunction; + return DoHandlePlayItfAttributesChanged(); + } + +XAresult CMMFBackendEngine::SetCallbackEventsMask(XAuint32 eventflags) + { + iPlayItfEventFlags = eventflags; + return DoHandlePlayItfAttributesChanged(); + } + +XAresult CMMFBackendEngine::SetMarkerPosition(XAmillisecond mSec) + { + iMarkerPosition = mSec; + return DoHandlePlayItfAttributesChanged(); + } + +XAresult CMMFBackendEngine::ClearMarkerPosition() + { + iMarkerPosition = XA_TIME_UNKNOWN; + DoHandlePlayItfAttributesChanged(); + return XA_RESULT_SUCCESS; + } + +XAresult CMMFBackendEngine::SetPositionUpdatePeriod(XAmillisecond mSec) + { + iPositionUpdatePeriod = mSec; + DoHandlePlayItfAttributesChanged(); + return XA_RESULT_SUCCESS; + } + +XAresult CMMFBackendEngine::DoHandlePlayItfAttributesChanged() + { + XAresult retVal(XA_RESULT_SUCCESS); + + iMarkerPositionTimer->SetCallbackEventMask(iPlayItfEventFlags); + iMarkerPositionTimer->RegisterCallback(iPlayItfCBFunction); + iMarkerPositionTimer->SetMarkerPosition(iMarkerPosition); + + iPlayItfPositionUpdateTimer->SetCallbackEventMask(iPlayItfEventFlags); + iPlayItfPositionUpdateTimer->RegisterCallback(iPlayItfCBFunction); + iPlayItfPositionUpdateTimer->SetPositionUpdatePeriod( + iPositionUpdatePeriod); + + switch (iMediaPlayerState) + { + case XA_PLAYSTATE_STOPPED: + case XA_PLAYSTATE_PAUSED: + break; + case XA_PLAYSTATE_PLAYING: + iMarkerPositionTimer->Start(); + iPlayItfPositionUpdateTimer->Start(); + break; + case XA_PLAYSTATE_PLAYERUNINITIALIZED: + default: + break; + } + return retVal; + } + +void CMMFBackendEngine::DoPostEvent(XAuint32 event) + { + if ((iPlayItfEventFlags & event) && (iPlayItfCBFunction != NULL)) + { + XAAdaptEvent xaevent = + { + XA_PLAYITFEVENTS, event, 0, 0 + }; + XAAdaptationBase_SendAdaptEvents( + (XAAdaptationBaseCtx*) iAdaptContext, &xaevent); + } + } + +XAresult CMMFBackendEngine::GetNumStreams(XAuint32* numstreams) + { + XAresult retVal(XA_RESULT_SUCCESS); + TInt bitRate(0); + TInt numS(0); + if (iAPIBeingUsed == EAudioPlayerUtility) + { + numS = 1; + *numstreams = numS; + } + else if (iAPIBeingUsed == EVideoPlayerUtility) + { + TRAPD(err, bitRate = iVideoPlayer->VideoBitRateL()); + if (!err && bitRate) + { + numS++; + *numstreams = numS; + } + + bitRate = 0; + TRAP(err, bitRate = iVideoPlayer->AudioBitRateL()); + if (!err && bitRate) + { + numS++; + *numstreams = numS; + } + } + return retVal; + } + +XAresult CMMFBackendEngine::GetStreamInfo(XAuint32 streamindex, + XAuint32* streamtype) + { + XAresult retVal(XA_RESULT_SUCCESS); + if (iAPIBeingUsed == EAudioPlayerUtility) + { + *streamtype = XA_DOMAINTYPE_AUDIO; + } + else if (iAPIBeingUsed == EVideoPlayerUtility) + { + switch (streamindex) + { + case 1: + *streamtype = XA_DOMAINTYPE_VIDEO; + break; + case 2: + *streamtype = XA_DOMAINTYPE_AUDIO; + break; + default: + retVal = XA_RESULT_PARAMETER_INVALID; + break; + } + } + return retVal; + } + +XAresult CMMFBackendEngine::GetVideoFrameSize(XAuint32* height, + XAuint32* width, XAuint32* frameRate) + { + XAresult retVal(XA_RESULT_SUCCESS); + if (iAPIBeingUsed == EVideoPlayerUtility) + { + if (iMediaPlayerState != XA_PLAYSTATE_PLAYERUNINITIALIZED) + { + TSize size; + TReal32 framerate(0); + TRAPD(err, iVideoPlayer->VideoFrameSizeL(size)); + if (!err) + { + *height = size.iHeight; + *width = size.iWidth; + } + else + { + retVal = err; + } + + TRAP(err, framerate = iVideoPlayer->VideoFrameRateL()); + if (!err) + { + *frameRate = framerate; + } + } + else + { + retVal = XA_RESULT_PRECONDITIONS_VIOLATED; + } + } + else + { + retVal = XA_RESULT_FEATURE_UNSUPPORTED; + } + return retVal; + } + +XAresult CMMFBackendEngine::SetActiveState(XAuint32 streamindex, + XAboolean active) + { + XAresult retVal(XA_RESULT_SUCCESS); + TInt err(KErrNone); + if (iAPIBeingUsed == EAudioPlayerUtility) + { + retVal = XA_RESULT_FEATURE_UNSUPPORTED; + } + else if (iAPIBeingUsed == EVideoPlayerUtility) + { + switch (streamindex) + { + case 1: + TRAP(err, iVideoPlayer->SetVideoEnabledL(active)) + ; + retVal = err; + break; + case 2: + TRAP(err, iVideoPlayer->SetAudioEnabledL(active)) + ; + retVal = err; + break; + default: + retVal = XA_RESULT_PARAMETER_INVALID; + break; + } + } + return retVal; + } + +TInt CMMFBackendEngine::InitializeURIForMMFUtil(char *uri) + { + /* Initializes and save uri param into iUri structure */ + TInt err(KErrNone); + TInt uriLen; + + if (!uri) + return KErrArgument; + + if (iUri) + { + delete iUri; + iUri = NULL; + } + + uriLen = strlen(uri); + TPtr8 uriParam((TUint8*) uri, uriLen, uriLen); + + TRAP(err, iUri = HBufC::NewL(uriLen)); + if (err != KErrNone) + return err; + + iUriPtr.Set(iUri->Des()); + iUriPtr.Copy(uriParam); /* Copy data*/ + //iUriPtr.LowerCase(); + /* For file scheme convert from file:///c:/folder/file.ext + * format to c:\\folder\\file.ext using TUriParser. */ + _LIT(KFileScheme,"file:///"); + if (iUriPtr.Find(KFileScheme) >= 0) + { + iUriType = ELocal; + TPtr tmp(const_cast (iUriPtr.Ptr()) + + KFileScheme().Length(), iUriPtr.Length(), iUriPtr.Length()); + /* Convert from c:/folder/file.ext format to + * c:\\folder\\file.ext using TUriParser. + * TUriParser8 accepts uri in format file:///c/folder/file.ext, + * so get rid of ':' after drive letter (if any) */ + TInt pos = tmp.Find(_L(":")); + if (pos != KErrNotFound) + { + iUriPtr.Delete(KFileScheme().Length() + pos, 1); + } + + TUriParser16 uriParser; + err = uriParser.Parse(iUriPtr); + if (err != KErrNone) + return err; + + HBufC* file = NULL; + TRAP(err, file = uriParser.GetFileNameL()); + if (err != KErrNone) + return err; + + iUriPtr.Copy(file->Des()); + delete file; + file = NULL; + + } + else + { + iUriType = EStreaming; + } + return err; + } + +XAresult CMMFBackendEngine::SetVolume(XAuint32 volume) + { + XAresult retVal(XA_RESULT_SUCCESS); + TInt err(KErrNone); + if (iAPIBeingUsed == EAudioPlayerUtility) + { + retVal = iAudioPlayer->SetVolume(volume); + } + else if (iAPIBeingUsed == EVideoPlayerUtility) + { + TRAP(err, iVideoPlayer->SetVolumeL(volume)); + retVal = err; + } + else if (iAPIBeingUsed == EAudioRecorderUtility) + { + retVal = iAudioRecorder->SetVolume(volume); + } + return retVal; + } + +XAresult CMMFBackendEngine::GetMaxVolume(XAuint32* maxvolume) + { + XAresult retVal(XA_RESULT_SUCCESS); + if (iAPIBeingUsed == EAudioPlayerUtility) + { + *maxvolume = iAudioPlayer->MaxVolume(); + } + else if (iAPIBeingUsed == EVideoPlayerUtility) + { + *maxvolume = iVideoPlayer->MaxVolume(); + } + else if (iAPIBeingUsed == EAudioRecorderUtility) + { + *maxvolume = iAudioRecorder->MaxVolume(); + } + return retVal; + } + +XAresult CMMFBackendEngine::GetVolume(XAuint32* volume) + { + XAresult retVal(XA_RESULT_SUCCESS); + TInt mmfvolume(0); + if (iAPIBeingUsed == EAudioPlayerUtility) + { + retVal = iAudioPlayer->GetVolume(mmfvolume); + if (retVal == XA_RESULT_SUCCESS) + { + *volume = mmfvolume; + } + } + else if (iAPIBeingUsed == EVideoPlayerUtility) + { + *volume = iVideoPlayer->Volume(); + } + else if (iAPIBeingUsed == EAudioRecorderUtility) + { + retVal = iAudioRecorder->GetVolume(mmfvolume); + if (retVal == XA_RESULT_SUCCESS) + { + *volume = mmfvolume; + } + } + return retVal; + } + +XAresult CMMFBackendEngine::SetPlaybackRate(XAint16 rate) + { + XAresult retVal(XA_RESULT_INTERNAL_ERROR); + + switch (iMediaPlayerState) + { + case XA_PLAYSTATE_STOPPED: + case XA_PLAYSTATE_PAUSED: + case XA_PLAYSTATE_PLAYING: + if (iAPIBeingUsed == EAudioPlayerUtility) + { + retVal = XA_RESULT_FEATURE_UNSUPPORTED; + } + else + { + TRAPD(err, iVideoPlayer->SetPlayVelocityL(rate)); + if(!err) + { + retVal = XA_RESULT_SUCCESS; + } + } + break; + case XA_PLAYSTATE_PLAYERUNINITIALIZED: + default: + break; + } + return retVal; + } + +XAresult CMMFBackendEngine::GetPlaybackRateCapabilities(XAboolean* forward, + XAboolean* backward) + { + XAresult retVal(XA_RESULT_PARAMETER_INVALID); + + switch (iMediaPlayerState) + { + case XA_PLAYSTATE_STOPPED: + case XA_PLAYSTATE_PAUSED: + case XA_PLAYSTATE_PLAYING: + if (iAPIBeingUsed == EAudioPlayerUtility) + { + retVal = XA_RESULT_FEATURE_UNSUPPORTED; + } + else + { + TVideoPlayRateCapabilities capability; + TRAPD(err, iVideoPlayer->GetPlayRateCapabilitiesL(capability)); + if(!err) + { + *forward = capability.iPlayForward; + *backward = capability.iPlayBackward; + retVal = XA_RESULT_SUCCESS; + } + } + break; + case XA_PLAYSTATE_PLAYERUNINITIALIZED: + default: + break; + } + return retVal; + } + +extern "C" + { + + int mmf_backend_engine_init(void** engine) + { + TRAPD(err, *engine = CMMFBackendEngine::NewL()); + return err; + } + + void mmf_backend_engine_deinit(void* engine) + { + delete ((CMMFBackendEngine*) engine); + } + + int mmf_set_recorder_uri(void* context, char* uri, XAuint32 format) + { + return ((CMMFBackendEngine*) (context))->SetFileName(uri, format, + CMMFBackendEngine::ERecord); + } + + int mmf_set_adapt_context(void* context, void* adaptcontext) + { + return ((CMMFBackendEngine*) (context))->SetAdaptContext(adaptcontext); + } + + void mmf_close(void* context) + { + ((CMMFBackendEngine*) context)->Close(); + } + + int mmf_start_recording(void* context) + { + return ((CMMFBackendEngine*) (context))->SetRecorderState( + CMMFBackendEngine::ERecorderRecording, FALSE); + } + + int mmf_stop_recording(void* context, XAboolean stopCalled) + { + return ((CMMFBackendEngine*) (context))->SetRecorderState( + CMMFBackendEngine::ERecorderOpen, stopCalled); + } + + int mmf_get_record_position(void* context, XAuint64* position) + { + return ((CMMFBackendEngine*) (context))->GetRecordPosition(position); + } + + int mmf_set_record_position_update_period(void* context, + XAmillisecond msec) + { + return ((CMMFBackendEngine*) (context))->SetPositionUpdatePerioed( + msec); + } + + int mmf_get_codec_id(void* context, XAuint32* encoderId) + { + return ((CMMFBackendEngine*) (context))->GetCodecId(encoderId); + } + + int mmf_get_channels(void* context, XAuint32* channelsIn) + { + return ((CMMFBackendEngine*) (context))->GetChannels(channelsIn); + } + + int mmf_get_samplerate(void* context, XAmilliHertz* sampleRate) + { + return ((CMMFBackendEngine*) (context))->GetSampleRate(sampleRate); + } + + int mmf_get_bitrate(void* context, XAuint32* bitRate) + { + return ((CMMFBackendEngine*) (context))->GetBitRate(bitRate); + } + + int mmf_set_destination_channels(void* context, XAuint32* channelsIn) + { + return ((CMMFBackendEngine*) (context))->SetDestinationChannels( + channelsIn); + } + + int mmf_set_destination_samplerate(void* context, + XAmilliHertz* sampleRate) + { + return ((CMMFBackendEngine*) (context))->SetDestinationSampleRate( + sampleRate); + } + + int mmf_set_destination_bitrate(void* context, XAuint32* bitRate) + { + return ((CMMFBackendEngine*) (context))->SetDestinationBitRate( + bitRate); + } + + XAresult mmf_set_play_adapt_context(void * context, void * adaptcontext) + { + return ((CMMFBackendEngine *) (context))->SetPlayAdaptContext( + adaptcontext); + } + + XAresult mmf_set_player_uri(void * context, char * uri, XAuint32 format) + { + return ((CMMFBackendEngine *) (context))->SetFileName(uri, format, + CMMFBackendEngine::EPlay); + } + + /* + XAresult mmf_set_window_handle(void * context, void * display_info) + { + return ((CMMFBackendEngine *)(context))->SetWindowHandle(display_info); + } + + */ + XAresult mmf_setup_native_display(void * context, void * display_info) + { + return ((CMMFBackendEngine *) (context))->SetNativeDisplayInformation( + display_info); + } + + XAresult mmf_playitf_resume_playback(void * context) + { + return ((CMMFBackendEngine *) (context))->ResumePlayback(); + } + + XAresult mmf_playitf_pause_playback(void * context) + { + return ((CMMFBackendEngine *) (context))->PausePlayback(); + } + + XAresult mmf_playitf_stop_playback(void * context) + { + return ((CMMFBackendEngine *) (context))->StopPlayback(); + } + + XAresult mmf_playitf_get_play_state(void * context, XAuint32 * pState) + { + return ((CMMFBackendEngine *) (context))->GetPlayState(pState); + } + + XAresult mmf_playitf_get_duration(void * context, XAmillisecond * pMsec) + { + return ((CMMFBackendEngine *) (context))->GetDuration(pMsec); + } + + XAresult mmf_playitf_get_position(void * context, XAmillisecond * pMsec) + { + return ((CMMFBackendEngine *) (context))->GetPosition(pMsec); + } + + XAresult mmf_playitf_register_callback(void * context, + xaPlayCallback callback) + { + return ((CMMFBackendEngine *) (context))->RegisterCallback(callback); + } + + XAresult mmf_playitf_set_callback_events_mask(void * context, + XAuint32 eventflags) + { + return ((CMMFBackendEngine *) (context))->SetCallbackEventsMask( + eventflags); + } + + XAresult mmf_playitf_set_marker_position(void * context, + XAmillisecond mSec) + { + return ((CMMFBackendEngine *) (context))->SetMarkerPosition(mSec); + } + + XAresult mmf_playitf_clear_marker_position(void * context) + { + return ((CMMFBackendEngine *) (context))->ClearMarkerPosition(); + + } + + XAresult mmf_playitf_set_position_update_period(void * context, + XAmillisecond mSec) + { + return ((CMMFBackendEngine *) (context))->SetPositionUpdatePeriod( + mSec); + } + + XAresult mmf_seekitf_set_position(void * context, XAmillisecond pMsec) + { + return ((CMMFBackendEngine *) (context))->SetPosition(pMsec); + } + + XAresult mmf_seekitf_set_playwindow(void * context, XAmillisecond start, + XAmillisecond end) + { + return ((CMMFBackendEngine *) (context))->SetPlayWindow(start, end); + } + + XAresult mmf_seekitf_set_repeats(void * context, XAboolean repeat) + { + return ((CMMFBackendEngine *) (context))->SetRepeats(repeat); + } + + XAresult mmf_streaminformationitf_get_streaminfo(void * context, + XAuint32 streamindex, XAuint32* streamtype) + { + return ((CMMFBackendEngine *) (context))->GetStreamInfo(streamindex, + streamtype); + } + + XAresult mmf_streaminformationitf_get_numstreams(void * context, + XAuint32* numstreams) + { + return ((CMMFBackendEngine *) (context))->GetNumStreams(numstreams); + } + + XAresult mmf_streaminformationitf_get_videoframesize(void * context, + XAuint32* height, XAuint32* width, XAuint32* frameRate) + { + return ((CMMFBackendEngine *) (context))->GetVideoFrameSize(height, + width, frameRate); + } + + XAresult mmf_streaminformationitf_set_activestream(void * context, + XAuint32 streamindex, XAboolean active) + { + return ((CMMFBackendEngine *) (context))->SetActiveState(streamindex, + active); + } + + XAresult mmf_volumeitf_set_volume(void * context, XAuint32 volume) + { + return ((CMMFBackendEngine *) (context))->SetVolume(volume); + } + + XAresult mmf_volumeitf_get_maxvolume(void * context, XAuint32* volume) + { + return ((CMMFBackendEngine *) (context))->GetMaxVolume(volume); + } + + XAresult mmf_volumeitf_get_volume(void * context, XAuint32* volume) + { + return ((CMMFBackendEngine *) (context))->GetVolume(volume); + } + + XAresult mmf_playbackrateitf_set_playbackrate(void * context, XAint16 rate) + { + return ((CMMFBackendEngine *) (context))->SetPlaybackRate(rate); + } + + XAresult mmf_playbackrateitf_get_playbackratecaps(void * context, XAboolean* forward, XAboolean* backward) + { + return ((CMMFBackendEngine *) (context))->GetPlaybackRateCapabilities(forward,backward); + } + }