mmfenh/progressivedownload/ProgressiveDownloadUtility/src/AudioPdPlayUtility.cpp
changeset 16 43d09473c595
parent 14 80975da52420
child 22 128eb6a32b84
equal deleted inserted replaced
14:80975da52420 16:43d09473c595
     1 /*
       
     2 * Copyright (c) 2004 Nokia Corporation and/or its subsidiary(-ies).
       
     3 * All rights reserved.
       
     4 * This component and the accompanying materials are made available
       
     5 * under the terms of "Eclipse Public License v1.0"
       
     6 * which accompanies this distribution, and is available
       
     7 * at the URL "http://www.eclipse.org/legal/epl-v10.html".
       
     8 *
       
     9 * Initial Contributors:
       
    10 * Nokia Corporation - initial contribution.
       
    11 *
       
    12 * Contributors:
       
    13 *
       
    14 * Description:  Progressive Download Utility
       
    15 *
       
    16 */
       
    17 
       
    18 #include <bautils.h>
       
    19 #include <utf.h>
       
    20 #include <mmfpaniccodes.h>
       
    21 #include "AudioPdPlayUtility.h"
       
    22 #include "AudioPdProperties.h"
       
    23 #include "progressivedownloadsourceuids.hrh"
       
    24 
       
    25 #include <AudioPreference.h>
       
    26 
       
    27 //void Panic(TInt aPanicCode);
       
    28 
       
    29 const TUid KUidProgressiveDlSource	= {KProgressiveDownloadSourceUid};
       
    30 
       
    31 void Panic(TInt aPanicCode)
       
    32 	{
       
    33 	_LIT(KProgressiveDownloadUtility, "ProgressiveDownloadUtility");
       
    34 	User::Panic(KProgressiveDownloadUtility, aPanicCode);
       
    35 	}
       
    36 
       
    37 CAudioPdPlayUtility* CAudioPdPlayUtility::NewL(MAudioPdPlayUtilityCallback& aCallback)
       
    38 	{
       
    39     CAudioPdPlayUtility* self = new(ELeave) CAudioPdPlayUtility();
       
    40 	CleanupStack::PushL(self);
       
    41 
       
    42  	self->iProperties = CAudioPdProperties::NewL(aCallback);
       
    43 	CleanupStack::Pop(self);
       
    44 	return self;
       
    45 	}
       
    46 
       
    47 CAudioPdPlayUtility::~CAudioPdPlayUtility()
       
    48 	{
       
    49 	delete iProperties;
       
    50 	}
       
    51 
       
    52 CAudioPdPlayUtility::CAudioPdPlayUtility()
       
    53 	{
       
    54 
       
    55 	}
       
    56 
       
    57 void CAudioPdPlayUtility::ConstructL()
       
    58 	{
       
    59 
       
    60 	}
       
    61 
       
    62 //For Download Status
       
    63 void CAudioPdPlayUtility::HandleDownloadEventL(TUint aTransactionID,
       
    64                                                TBrCtlDownloadEvent aEvent,
       
    65                                                TUint aValue)
       
    66 	{
       
    67     iProperties->HandleDownloadEventL(aTransactionID,aEvent,aValue);
       
    68 	}
       
    69 
       
    70 
       
    71 void CAudioPdPlayUtility::Play()
       
    72 	{
       
    73     iProperties->Play();
       
    74 	}
       
    75 void CAudioPdPlayUtility::Stop()
       
    76 	{
       
    77     iProperties->Stop();
       
    78 	}
       
    79 TInt CAudioPdPlayUtility::Pause()
       
    80 	{
       
    81     return iProperties->Pause();
       
    82 	}
       
    83 void CAudioPdPlayUtility::SetVolume(TInt aVolume)
       
    84 	{
       
    85     iProperties->SetVolume(aVolume);
       
    86 	}
       
    87 void CAudioPdPlayUtility::SetRepeats(TInt aRepeatNumberOfTimes, const TTimeIntervalMicroSeconds& aTrailingSilence)
       
    88 	{
       
    89     iProperties->SetRepeats(aRepeatNumberOfTimes,aTrailingSilence);
       
    90 	}
       
    91 void CAudioPdPlayUtility::SetVolumeRamp(const TTimeIntervalMicroSeconds& aRampDuration)
       
    92 	{
       
    93     iProperties->SetVolumeRamp(aRampDuration);
       
    94 	}
       
    95 const TTimeIntervalMicroSeconds& CAudioPdPlayUtility::Duration()
       
    96 	{
       
    97 	return iProperties->Duration();
       
    98 	}
       
    99 TInt CAudioPdPlayUtility:: MaxVolume()
       
   100 	{
       
   101 	return iProperties->MaxVolume();
       
   102 	}
       
   103 void CAudioPdPlayUtility::Close()
       
   104 	{
       
   105     iProperties->Close();
       
   106 	}
       
   107 TInt CAudioPdPlayUtility::GetPosition(TTimeIntervalMicroSeconds& aPosition)
       
   108 	{
       
   109     return iProperties->GetPosition(aPosition);
       
   110 	}
       
   111 void CAudioPdPlayUtility::SetPosition(const TTimeIntervalMicroSeconds& aPosition)
       
   112 	{
       
   113     iProperties->SetPosition(aPosition);
       
   114 	}
       
   115 
       
   116 TInt CAudioPdPlayUtility::SetPriority(TInt aPriority, TMdaPriorityPreference aPref)
       
   117 	{
       
   118     return iProperties->SetPriority(aPriority,aPref);
       
   119 	}
       
   120 TInt CAudioPdPlayUtility::GetVolume(TInt& aVolume)
       
   121 	{
       
   122     return iProperties->GetVolume(aVolume);
       
   123 	}
       
   124 TInt CAudioPdPlayUtility::GetNumberOfMetaDataEntries(TInt& aNumEntries)
       
   125 	{
       
   126     return iProperties->GetNumberOfMetaDataEntries(aNumEntries);
       
   127 	}
       
   128 
       
   129 
       
   130 CMMFMetaDataEntry* CAudioPdPlayUtility::GetMetaDataEntryL(TInt aMetaDataIndex)
       
   131 	{
       
   132 	return iProperties->GetMetaDataEntryL(aMetaDataIndex);
       
   133 	}
       
   134 
       
   135 TInt CAudioPdPlayUtility::SetPlayWindow(const TTimeIntervalMicroSeconds& aStart,
       
   136 								const TTimeIntervalMicroSeconds& aEnd)
       
   137 	{
       
   138     return iProperties->SetPlayWindow(aStart,aEnd);
       
   139 	}
       
   140 
       
   141 TInt CAudioPdPlayUtility::ClearPlayWindow()
       
   142 	{
       
   143     return iProperties->ClearPlayWindow();
       
   144 	}
       
   145 TInt CAudioPdPlayUtility::SetBalance(TInt aBalance)
       
   146 	{
       
   147     return iProperties->SetBalance(aBalance);
       
   148 	}
       
   149 TInt CAudioPdPlayUtility::GetBalance(TInt& aBalance)
       
   150 	{
       
   151     return iProperties->GetBalance(aBalance);
       
   152 	}
       
   153 TInt CAudioPdPlayUtility::GetBitRate(TUint& aBitRate)
       
   154 	{
       
   155     return iProperties->GetBitRate(aBitRate);
       
   156 	}
       
   157 
       
   158 
       
   159 void CAudioPdPlayUtility::RegisterForAudioLoadingNotification(MAudioLoadingObserver& aCallback)
       
   160 	{
       
   161     iProperties->RegisterForAudioLoadingNotification(aCallback);
       
   162 	}
       
   163 
       
   164 void CAudioPdPlayUtility::GetAudioLoadingProgressL(TInt& aPercentageProgress)
       
   165 	{
       
   166     iProperties->GetAudioLoadingProgressL(aPercentageProgress);
       
   167 	}
       
   168 
       
   169 const CMMFControllerImplementationInformation& CAudioPdPlayUtility::ControllerImplementationInformationL()
       
   170 	{
       
   171 	return iProperties->ControllerImplementationInformationL();
       
   172 	}
       
   173 
       
   174 
       
   175 TInt CAudioPdPlayUtility::CustomCommandSync(const TMMFMessageDestinationPckg& aDestination, TInt aFunction, const TDesC8& aDataTo1, const TDesC8& aDataTo2, TDes8& aDataFrom)
       
   176 	{
       
   177     return iProperties->CustomCommandSync(aDestination, aFunction, aDataTo1, aDataTo2, aDataFrom);
       
   178 	}
       
   179 TInt CAudioPdPlayUtility::CustomCommandSync(const TMMFMessageDestinationPckg& aDestination, TInt aFunction, const TDesC8& aDataTo1, const TDesC8& aDataTo2)
       
   180 	{
       
   181     return iProperties->CustomCommandSync(aDestination, aFunction, aDataTo1, aDataTo2);
       
   182 	}
       
   183 void CAudioPdPlayUtility::CustomCommandAsync(const TMMFMessageDestinationPckg& aDestination, TInt aFunction, const TDesC8& aDataTo1, const TDesC8& aDataTo2, TDes8& aDataFrom, TRequestStatus& aStatus)
       
   184 	{
       
   185 	iProperties->CustomCommandAsync(aDestination, aFunction, aDataTo1, aDataTo2, aDataFrom, aStatus);
       
   186 	}
       
   187 void CAudioPdPlayUtility::CustomCommandAsync(const TMMFMessageDestinationPckg& aDestination, TInt aFunction, const TDesC8& aDataTo1, const TDesC8& aDataTo2, TRequestStatus& aStatus)
       
   188 	{
       
   189 	iProperties->CustomCommandAsync(aDestination, aFunction, aDataTo1, aDataTo2, aStatus);
       
   190 	}
       
   191 
       
   192 void CAudioPdPlayUtility::OpenFileL(const TDesC& aFileName)
       
   193 	{
       
   194 	iProperties->OpenFileL(aFileName);
       
   195 	}
       
   196 
       
   197 
       
   198 void CAudioPdPlayUtility::OpenFileL(const RFile& aFile)
       
   199 	{
       
   200 	RFile& file = const_cast<RFile&>(aFile);
       
   201 	iProperties->OpenFileL(file);
       
   202 	}
       
   203 
       
   204 
       
   205 void CAudioPdPlayUtility::OpenFileL(const TMMSource& aSource)
       
   206 	{
       
   207 	iProperties->OpenFileL(aSource);
       
   208 	}
       
   209 
       
   210 void CAudioPdPlayUtility::DlCompleteOpenFileL(const TDesC& aFileName)
       
   211 	{
       
   212 	iProperties->DlCompleteOpenFileL(aFileName);
       
   213 	}
       
   214 
       
   215 TInt CAudioPdPlayUtility::GetFilePosition(TInt& aFilePosition)
       
   216 	{
       
   217 	return iProperties->GetFilePosition(aFilePosition);
       
   218 	}
       
   219 
       
   220 TInt CAudioPdPlayUtility::SetFileSize(TInt aFileSize)
       
   221 	{
       
   222 	return iProperties->SetFileSize(aFileSize);
       
   223 	}
       
   224 
       
   225 TInt CAudioPdPlayUtility::SetBytesDownloaded(TInt aBytesDownloaded, TBool aDownloadComplete)
       
   226 	{
       
   227 	return iProperties->SetBytesDownloaded(aBytesDownloaded,aDownloadComplete);
       
   228 	}
       
   229 
       
   230 MMMFDRMCustomCommand* CAudioPdPlayUtility::GetDRMCustomCommand()
       
   231 	{
       
   232 	//ASSERT(iProperties);
       
   233 	return iProperties->GetDRMCustomCommand();
       
   234 	}
       
   235 
       
   236 
       
   237 TInt CAudioPdPlayUtility::CheckAudioPlayerState()
       
   238 	{
       
   239 	return iProperties->CheckAudioPlayerState();
       
   240 	}
       
   241 
       
   242 
       
   243 //===============================================================
       
   244 // CAudioPdProperties implementation begins
       
   245 //
       
   246 //===============================================================
       
   247 CAudioPdProperties* CAudioPdProperties::NewL(MAudioPdPlayUtilityCallback& aCallback)
       
   248 	{
       
   249 	CAudioPdProperties* self = new(ELeave) CAudioPdProperties(aCallback);
       
   250 	CleanupStack::PushL(self);
       
   251 	self->ConstructL(aCallback);
       
   252 	CleanupStack::Pop(self);
       
   253 	return self;
       
   254 	}
       
   255 CAudioPdProperties* CAudioPdProperties::NewLC(MAudioPdPlayUtilityCallback& /*aCallback*/)
       
   256 	{
       
   257 	return NULL;
       
   258 	}
       
   259 
       
   260 CAudioPdProperties::~CAudioPdProperties()
       
   261 	{
       
   262 
       
   263 	delete iControllerImplementationInformation;
       
   264 	delete iAsyncCallBack;
       
   265 	delete iRepeatTrailingSilenceTimer;
       
   266 	delete iFindAndOpenController;
       
   267 	delete iControllerEventMonitor;
       
   268 	iMediaIds.Close();
       
   269 	iController.Close();
       
   270 	}
       
   271 
       
   272 CAudioPdProperties::CAudioPdProperties(/*MMdaAudioPlayerCallback*/MAudioPdPlayUtilityCallback& aCallback):
       
   273 	iCallback(aCallback),
       
   274 	iAudioPlayDeviceCommands(iController),
       
   275 	iAudioPlayControllerCommands(iController),
       
   276 	iDRMCustomCommands(iController)
       
   277 	{
       
   278 	iState = EStopped;
       
   279 	iPrioritySettings.iPriority = KAudioPriorityRealOnePlayer;//80
       
   280 	iPrioritySettings.iPref =(TMdaPriorityPreference) KAudioPrefRealOneLocalPlayback;// 0x01420001;
       
   281 	iPlayStart = TTimeIntervalMicroSeconds(0);
       
   282 	iPlayEnd = TTimeIntervalMicroSeconds(0);
       
   283 	iPlayWindowSet = ENone;
       
   284     iSourceHandle =  NULL;
       
   285 	}
       
   286 
       
   287 void CAudioPdProperties::ConstructL(MAudioPdPlayUtilityCallback& /*aCallback*/)
       
   288 	{
       
   289 
       
   290 	iControllerEventMonitor = CMMFControllerEventMonitor::NewL(*this, iController);
       
   291 	iRepeatTrailingSilenceTimer = CRepeatTrailingSilenceTimer::NewL(*this);
       
   292 	iAsyncCallBack = CMMFMdaAudioPlayerCallBack::NewL(iCallback);
       
   293 	User::LeaveIfError(iMediaIds.Append(KUidMediaTypeAudio));
       
   294 	iFindAndOpenController = CMMFFindAndOpenController::NewL(*this);
       
   295 	iFindAndOpenController->Configure(iMediaIds[0], iPrioritySettings);
       
   296 	iFindAndOpenController->ConfigureController(iController, *iControllerEventMonitor, CMMFFindAndOpenController::EPlayback);
       
   297 
       
   298 	}
       
   299 
       
   300 void CAudioPdProperties::MfaocComplete(
       
   301 		TInt& aError,
       
   302 		RMMFController* /*aController*/,
       
   303 		TUid aControllerUid,
       
   304 		TMMFMessageDestination* aSourceHandle,
       
   305 		TMMFMessageDestination* /*aSinkHandle*/)
       
   306 	{
       
   307 
       
   308 	iSourceHandle = aSourceHandle;
       
   309 
       
   310 	if (aError == KErrNone)
       
   311 		{
       
   312 		iControllerUid = aControllerUid;
       
   313 
       
   314 		// Get the clip duration
       
   315 		iDuration = TTimeIntervalMicroSeconds(0);
       
   316 		aError = iController.GetDuration(iDuration);
       
   317 
       
   318 		// If an error occurred in any of the above, close the controller.
       
   319 		if (aError != KErrNone)
       
   320 			{
       
   321 			iControllerEventMonitor->Cancel();
       
   322 			iController.Close();
       
   323 			}
       
   324 		}
       
   325 
       
   326 	iAsyncCallBack->InitComplete(aError, iDuration);
       
   327 	}
       
   328 
       
   329 void CAudioPdProperties::HandleDownloadEventL(TUint aTransactionID,
       
   330                                               TBrCtlDownloadEvent aEvent,
       
   331                                               TUint aValue)
       
   332 	{
       
   333 	iCallback.HandleDownloadEventL(aTransactionID,aEvent,aValue);
       
   334 
       
   335 	}
       
   336 
       
   337 
       
   338 void CAudioPdProperties::OpenFileL(const TDesC& aFileName)
       
   339 	{
       
   340 	TMMFileSource filesource(aFileName, ContentAccess::KDefaultContentObject, ContentAccess::EPlay);
       
   341 	OpenFileL(filesource);
       
   342 	}
       
   343 
       
   344 
       
   345 void CAudioPdProperties::OpenFileL(const RFile& aFile)
       
   346 	{
       
   347 	RFile& file = const_cast<RFile&>(aFile);
       
   348 	TMMFileHandleSource filesource(file, KNullDesC, ContentAccess::EPlay);
       
   349 	OpenFileL(filesource);
       
   350 	}
       
   351 
       
   352 void CAudioPdProperties::OpenFileL(const TMMSource& aSource)
       
   353 	{
       
   354 	// If iAsyncCallBack is already active, we're still in the process of notifying the client
       
   355 	// that a previous request to Open...(...) has completed.
       
   356 	if (iAsyncCallBack->IsActive())
       
   357 		User::Leave(KErrNotReady);
       
   358 
       
   359 
       
   360 	if (aSource.SourceType()==KUidMMFileHandleSource)
       
   361 		{
       
   362 
       
   363 		RFile& fileHandle = static_cast<const TMMFileHandleSource&>(aSource).Handle();
       
   364 
       
   365 	    iFindAndOpenController->ConfigureSourceSink(
       
   366 	       CMMFFindAndOpenController::TSourceSink(KUidProgressiveDlSource,fileHandle),
       
   367 		   CMMFFindAndOpenController::TSourceSink(KUidMmfAudioOutput));
       
   368 
       
   369 		}
       
   370 	if (aSource.SourceType()==KUidMMFileSource)
       
   371 		{
       
   372 		const TDesC& fileName = static_cast<const TMMFileSource&>(aSource).Name();
       
   373 
       
   374 	    iFindAndOpenController->ConfigureSourceSink(
       
   375 	       CMMFFindAndOpenController::TSourceSink(KUidProgressiveDlSource,
       
   376 	       CMMFFindAndOpenController::GetConfigFile(fileName)),
       
   377 		   CMMFFindAndOpenController::TSourceSink(KUidMmfAudioOutput));
       
   378 
       
   379 		}
       
   380 
       
   381 	iFindAndOpenController->OpenByFileSource(aSource);
       
   382 	}
       
   383 
       
   384 void CAudioPdProperties::DlCompleteOpenFileL(const TDesC& aFileName)
       
   385 	{
       
   386 	if (iAsyncCallBack->IsActive())
       
   387 		User::Leave(KErrNotReady);
       
   388 
       
   389 	Close();
       
   390 
       
   391 	TMMFileSource filesource(aFileName, ContentAccess::KDefaultContentObject, ContentAccess::EPlay);
       
   392 
       
   393 
       
   394 	iFindAndOpenController->ConfigureSourceSink(
       
   395 			TMMFileSource(aFileName, filesource.UniqueId(), filesource.Intent(), filesource.IsUIEnabled()),
       
   396 			CMMFFindAndOpenController::TSourceSink(KUidMmfAudioOutput));
       
   397 
       
   398 	iFindAndOpenController->OpenByFileSource(filesource);
       
   399 
       
   400 
       
   401 	}
       
   402 
       
   403 
       
   404 void CAudioPdProperties::Play()
       
   405 	{
       
   406 	// if we're already playing, call the client's callback with KErrNotReady.
       
   407 	// This is what the controller would do if we allowed the Play()
       
   408 	// to propagate down. Need to do it here too (for consistency)
       
   409 	// in case we're in a trailing silence period.
       
   410     if (iState == EPlaying)
       
   411 		{
       
   412 		iAsyncCallBack->PlayComplete(KErrNotReady);
       
   413 		return;
       
   414 		}
       
   415 
       
   416 	// cancel the repeat timer in case the client has called Play()
       
   417 	// without waiting for the previous play to complete
       
   418 	iRepeatTrailingSilenceTimer->Cancel();
       
   419 	// Reset played count
       
   420 	iNumberOfTimesPlayed = 0;
       
   421 
       
   422 	DoPlay();
       
   423 	}
       
   424 
       
   425 void CAudioPdProperties::DoPlay()
       
   426 	{
       
   427 #if defined(__AUDIO_PROFILING)
       
   428 	RDebug::ProfileStart(4);
       
   429 #endif  // defined(__AUDIO_PROFILING)
       
   430     TInt err = KErrNone;
       
   431     if (iState != EPaused)
       
   432         {
       
   433 		err = iController.Prime();
       
   434 
       
   435 #if defined(__AUDIO_PROFILING)
       
   436 	RDebug::ProfileEnd(4);
       
   437 #endif  // defined(__AUDIO_PROFILING)
       
   438 
       
   439 		// make sure we don't set the position outside the play window -
       
   440 		// but allow it to remain unchanged if it's within the window
       
   441 		if (iPlayWindowSet == ESet &&
       
   442 			(iPosition < iPlayStart || iPosition >= iPlayEnd))
       
   443 			iPosition = iPlayStart;
       
   444 
       
   445 		if (err==KErrNone)
       
   446 			err = iController.SetPosition(iPosition);
       
   447         }
       
   448 
       
   449 	if (err==KErrNone)
       
   450 		{
       
   451 		if (iPlayWindowSet == ESet)
       
   452 			err = iAudioPlayControllerCommands.SetPlaybackWindow(iPlayStart, iPlayEnd);
       
   453 		else if (iPlayWindowSet == EClear)
       
   454 			{
       
   455 			err = iAudioPlayControllerCommands.DeletePlaybackWindow();
       
   456 			iPlayWindowSet = ENone;	// assume window will stay cleared
       
   457 			}
       
   458 		}
       
   459 
       
   460 	if (err==KErrNone)
       
   461 		{
       
   462 #if defined(__AUDIO_PROFILING)
       
   463 		RDebug::ProfileStart(5);
       
   464 #endif  // defined(__AUDIO_PROFILING)
       
   465 
       
   466 		err = iController.Play();
       
   467 
       
   468 #if defined(__AUDIO_PROFILING)
       
   469 		RDebug::ProfileEnd(5);
       
   470 #endif  // defined(__AUDIO_PROFILING)
       
   471 		}
       
   472 
       
   473 	if (err!=KErrNone)
       
   474 		iAsyncCallBack->PlayComplete(err);
       
   475 	else
       
   476 		{
       
   477 		iState = EPlaying;
       
   478 		iCallback.Playing();
       
   479 		}
       
   480 	}
       
   481 
       
   482 
       
   483 void CAudioPdProperties::Stop()
       
   484 	{
       
   485 	if (iState==EPlaying || iState==EPaused)
       
   486 		{
       
   487 		// cancel the repeat timer in case the client has called Stop()
       
   488 		// during the trailing silence period
       
   489 		iRepeatTrailingSilenceTimer->Cancel();
       
   490 
       
   491 		iController.Stop();
       
   492 		iPosition = iPlayStart;
       
   493 		iState = EStopped;
       
   494 		}
       
   495 
       
   496 	}
       
   497 TInt CAudioPdProperties::Pause()
       
   498 	{
       
   499     TInt err = KErrNone;
       
   500 	if (iState==EPlaying)
       
   501 		{
       
   502 		err = iController.Pause();
       
   503 		if (!err || err==KErrNotReady)
       
   504 			err = iController.GetPosition(iPosition);
       
   505 		iState = EPaused;
       
   506 		iCallback.Paused();
       
   507 		}
       
   508 	return err;
       
   509 	}
       
   510 void CAudioPdProperties::SetVolume(TInt aVolume)
       
   511 	{
       
   512 	TInt err = iAudioPlayDeviceCommands.SetVolume(aVolume);
       
   513 
       
   514 	__ASSERT_ALWAYS(err==KErrNone, Panic(EMMFMediaClientBadArgument));
       
   515 	}
       
   516 void CAudioPdProperties::SetRepeats(TInt aRepeatNumberOfTimes, const TTimeIntervalMicroSeconds& aTrailingSilence)
       
   517 	{
       
   518 	iNumberOfTimesToRepeat = aRepeatNumberOfTimes;
       
   519 	iTrailingSilence = aTrailingSilence;
       
   520 	}
       
   521 void CAudioPdProperties::SetVolumeRamp(const TTimeIntervalMicroSeconds& aRampDuration)
       
   522 	{
       
   523 	iAudioPlayDeviceCommands.SetVolumeRamp(aRampDuration);
       
   524 	}
       
   525 const TTimeIntervalMicroSeconds& CAudioPdProperties::Duration()
       
   526 	{
       
   527 	TInt err = iController.GetDuration(iDuration);
       
   528 	if (err)
       
   529 		{
       
   530 		iDuration = 0;
       
   531 		}
       
   532 	return iDuration;
       
   533 	}
       
   534 TInt CAudioPdProperties:: MaxVolume()
       
   535 	{
       
   536 		TInt maxVolume = 0;
       
   537 #ifdef _DEBUG
       
   538 	TInt error =
       
   539 #endif
       
   540 		iAudioPlayDeviceCommands.GetMaxVolume(maxVolume);
       
   541 	__ASSERT_DEBUG(error==KErrNone, Panic(EMMFMediaClientPanicServerCommunicationProblem));
       
   542 	return maxVolume;
       
   543 	}
       
   544 void CAudioPdProperties::Close()
       
   545 	{
       
   546 	// Reset the audio player state.
       
   547 	Stop();
       
   548 	iControllerEventMonitor->Cancel();
       
   549 	iController.Close();
       
   550 	}
       
   551 TInt CAudioPdProperties::GetPosition(TTimeIntervalMicroSeconds& aPosition)
       
   552 	{
       
   553     TInt error = KErrNone;
       
   554 //	if (iState==EPlaying)
       
   555    //For progressivedownload pause and resume I need to get the
       
   556    //last position even if not playing.
       
   557 	error = iController.GetPosition(iPosition);
       
   558 
       
   559 	aPosition = iPosition;
       
   560 	return error;
       
   561 	}
       
   562 void CAudioPdProperties::SetPosition(const TTimeIntervalMicroSeconds& aPosition)
       
   563 	{
       
   564 	// Clip the position if aPosition is greater than the duration
       
   565 	// or if aPosition is negative.
       
   566 	const TTimeIntervalMicroSeconds maxPosition(Duration());
       
   567 	const TTimeIntervalMicroSeconds minPosition(0);
       
   568 
       
   569 	if (aPosition > maxPosition)
       
   570 		iPosition = maxPosition;
       
   571 	else if (aPosition < minPosition)
       
   572 		iPosition = minPosition;
       
   573 	else
       
   574 		iPosition = aPosition;
       
   575 
       
   576     if (iState==EPlaying || iState==EPaused || iState == EStopped)
       
   577 		{
       
   578 		iController.SetPosition(iPosition);
       
   579 		}
       
   580 //	else if (iState == EPaused)
       
   581 //		{
       
   582 //		Stop();	// We call stop so that DevSound's internal buffers are reset
       
   583 //		}
       
   584 	}
       
   585 
       
   586 TInt CAudioPdProperties::SetPriority(TInt aPriority, TMdaPriorityPreference aPref)
       
   587 	{
       
   588     iPrioritySettings.iPref = aPref;
       
   589 	iPrioritySettings.iPriority = aPriority;
       
   590 	iFindAndOpenController->Configure(iMediaIds[0], iPrioritySettings);
       
   591 
       
   592 	return iController.SetPrioritySettings(iPrioritySettings);
       
   593 	}
       
   594 TInt CAudioPdProperties::GetVolume(TInt& aVolume)
       
   595 	{
       
   596     TInt error = iAudioPlayDeviceCommands.GetVolume(aVolume);
       
   597 	return error;
       
   598 	}
       
   599 TInt CAudioPdProperties::GetNumberOfMetaDataEntries(TInt& aNumEntries)
       
   600 	{
       
   601     TInt error = iController.GetNumberOfMetaDataEntries(aNumEntries);
       
   602 	return error;
       
   603 	}
       
   604 
       
   605 
       
   606 CMMFMetaDataEntry* CAudioPdProperties::GetMetaDataEntryL(TInt aMetaDataIndex)
       
   607 	{
       
   608 	return iController.GetMetaDataEntryL(aMetaDataIndex);
       
   609 	}
       
   610 
       
   611 TInt CAudioPdProperties::SetPlayWindow(const TTimeIntervalMicroSeconds& aPlayStart,
       
   612 								const TTimeIntervalMicroSeconds& aPlayEnd)
       
   613 	{
       
   614     TInt error = KErrNone;
       
   615 
       
   616 	if (aPlayStart >= TTimeIntervalMicroSeconds(0) &&
       
   617 		aPlayStart < iDuration &&
       
   618 			aPlayStart < aPlayEnd &&
       
   619 			aPlayEnd <= iDuration )
       
   620 		{
       
   621 		iPlayStart = aPlayStart;
       
   622 		iPlayEnd = aPlayEnd;
       
   623 		iPlayWindowSet = ESet;
       
   624 
       
   625 		if (iState==EPlaying)
       
   626 			error = iAudioPlayControllerCommands.SetPlaybackWindow(aPlayStart, aPlayEnd);
       
   627 		}
       
   628 	else
       
   629 		error = KErrArgument;
       
   630 
       
   631 	return error;
       
   632 	}
       
   633 
       
   634 TInt CAudioPdProperties::ClearPlayWindow()
       
   635 	{
       
   636     	// clear play window start - very important because this is assigned
       
   637 	// to iPosition when we stop & is used to set the position on the next Play()
       
   638 	iPosition = iPlayStart = iPlayEnd = TTimeIntervalMicroSeconds(0);
       
   639 
       
   640 	iPlayWindowSet = EClear;
       
   641 	TInt err = KErrNone;
       
   642 	if (iState==EPlaying)
       
   643 		err = iAudioPlayControllerCommands.DeletePlaybackWindow();
       
   644 	return err;
       
   645 	}
       
   646 TInt CAudioPdProperties::SetBalance(TInt aBalance)
       
   647 	{
       
   648     TInt err = iAudioPlayDeviceCommands.SetBalance(aBalance);
       
   649 	return err;
       
   650 	}
       
   651 TInt CAudioPdProperties::GetBalance(TInt& aBalance)
       
   652 	{
       
   653 	TInt err = iAudioPlayDeviceCommands.GetBalance(aBalance);
       
   654 	return err;
       
   655 	}
       
   656 
       
   657 TInt CAudioPdProperties::GetBitRate(TUint& aBitRate)
       
   658 	{
       
   659 	RMMFAudioControllerCustomCommands controller(iController);
       
   660 	TInt err = controller.GetSourceBitRate(aBitRate);
       
   661 	return err;
       
   662 	}
       
   663 
       
   664 void CAudioPdProperties::RegisterForAudioLoadingNotification(MAudioLoadingObserver& aLoadingObserver)
       
   665 	{
       
   666     iLoadingObserver = &aLoadingObserver;
       
   667 	}
       
   668 
       
   669 void CAudioPdProperties::GetAudioLoadingProgressL(TInt& aPercentageProgress)
       
   670 	{
       
   671     User::LeaveIfError(iAudioPlayControllerCommands.GetLoadingProgress(aPercentageProgress));
       
   672 	}
       
   673 
       
   674 const CMMFControllerImplementationInformation& CAudioPdProperties::ControllerImplementationInformationL()
       
   675 	{
       
   676 	if (!iControllerImplementationInformation)
       
   677 		{
       
   678 		if (iControllerUid==KNullUid)
       
   679 			User::Leave(KErrNotReady);
       
   680 		iControllerImplementationInformation = CMMFControllerImplementationInformation::NewL(iControllerUid);
       
   681 		}
       
   682 	return *iControllerImplementationInformation;
       
   683 	}
       
   684 
       
   685 TInt CAudioPdProperties::CustomCommandSync(const TMMFMessageDestinationPckg& aDestination, TInt aFunction, const TDesC8& aDataTo1, const TDesC8& aDataTo2, TDes8& aDataFrom)
       
   686 	{
       
   687     return iController.CustomCommandSync(aDestination, aFunction, aDataTo1, aDataTo2, aDataFrom);
       
   688 	}
       
   689 TInt CAudioPdProperties::CustomCommandSync(const TMMFMessageDestinationPckg& aDestination, TInt aFunction, const TDesC8& aDataTo1, const TDesC8& aDataTo2)
       
   690 	{
       
   691     return iController.CustomCommandSync(aDestination, aFunction, aDataTo1, aDataTo2);
       
   692 	}
       
   693 void CAudioPdProperties::CustomCommandAsync(const TMMFMessageDestinationPckg& aDestination, TInt aFunction, const TDesC8& aDataTo1, const TDesC8& aDataTo2, TDes8& aDataFrom, TRequestStatus& aStatus)
       
   694 	{
       
   695 	iController.CustomCommandAsync(aDestination, aFunction, aDataTo1, aDataTo2, aDataFrom, aStatus);
       
   696 	}
       
   697 void CAudioPdProperties::CustomCommandAsync(const TMMFMessageDestinationPckg& aDestination, TInt aFunction, const TDesC8& aDataTo1, const TDesC8& aDataTo2, TRequestStatus& aStatus)
       
   698 	{
       
   699     iController.CustomCommandAsync(aDestination, aFunction, aDataTo1, aDataTo2, aStatus);
       
   700 	}
       
   701 
       
   702 TInt CAudioPdProperties::GetFilePosition(TInt& aFilePosition)
       
   703 	{
       
   704   	TInt err = KErrNone;
       
   705   	TPckgBuf<TInt> dataFrom;
       
   706 
       
   707 	if(iSourceHandle != NULL)
       
   708         {
       
   709     	TMMFMessageDestinationPckg destPckg(*iSourceHandle);
       
   710 	    err =CustomCommandSync(destPckg, EGETFILEPOSITION, KNullDesC8, KNullDesC8, dataFrom);
       
   711 	    }
       
   712 	else
       
   713 	    {
       
   714 	    err = KErrNotFound;
       
   715 	    }
       
   716 
       
   717     if(err==KErrNone)
       
   718        aFilePosition = dataFrom();
       
   719 
       
   720 	return err;
       
   721     }
       
   722 
       
   723 TInt CAudioPdProperties::SetFileSize(TInt aFileSize)
       
   724 	{
       
   725   	TInt err = KErrNone;
       
   726 	if(iSourceHandle != NULL)
       
   727         {
       
   728         TMMFMessageDestinationPckg destPckg(*iSourceHandle);
       
   729         TPckgBuf<TInt> data1(aFileSize);
       
   730         err = CustomCommandSync(destPckg, ESETFILESIZE, data1, KNullDesC8);
       
   731         }
       
   732 	else
       
   733 	    {
       
   734         err = KErrNotFound;
       
   735 	    }
       
   736 	return err;
       
   737 	}
       
   738 
       
   739 TInt CAudioPdProperties::SetBytesDownloaded(TInt aBytesDownloaded, TBool /*aDownloadComplete*/)
       
   740 	{
       
   741   	TInt err = KErrNone;
       
   742 	if(iSourceHandle != NULL)
       
   743         {
       
   744         TMMFMessageDestinationPckg destPckg(*iSourceHandle);
       
   745     	TPckgBuf<TInt> data1(aBytesDownloaded);
       
   746         err = CustomCommandSync(destPckg, ESETBYTESDOWNLOADED, data1, KNullDesC8);
       
   747         }
       
   748 	else
       
   749 	    {
       
   750 	    err = KErrNotFound;
       
   751 	    }
       
   752 
       
   753     return err;
       
   754 	}
       
   755 
       
   756 
       
   757 MMMFDRMCustomCommand* CAudioPdProperties::GetDRMCustomCommand()
       
   758 	{
       
   759 	if (iDRMCustomCommands.IsSupported())
       
   760 		{
       
   761 		return static_cast<MMMFDRMCustomCommand*>(&iDRMCustomCommands);
       
   762 		}
       
   763 	else
       
   764 		{
       
   765 		return NULL;
       
   766 		}
       
   767 	}
       
   768 
       
   769 
       
   770 TInt CAudioPdProperties::CheckAudioPlayerState()
       
   771 	{
       
   772 	return iState;
       
   773 	}
       
   774 void CAudioPdProperties::HandleEvent(const TMMFEvent& aEvent)
       
   775 	{
       
   776 	// handle loading started/complete messages first, as the later code does not explicitly check the event type
       
   777 	if (aEvent.iEventType==KMMFEventCategoryAudioLoadingStarted)
       
   778 		{
       
   779 		if (iLoadingObserver)
       
   780 			iLoadingObserver->MaloLoadingStarted();
       
   781 		}
       
   782 	else if (aEvent.iEventType==KMMFEventCategoryAudioLoadingComplete)
       
   783 		{
       
   784 		if (iLoadingObserver)
       
   785 			iLoadingObserver->MaloLoadingComplete();
       
   786 		}
       
   787 	else if (aEvent.iEventType==KMMFEventCategoryPlaybackComplete)
       
   788 		{
       
   789 		TInt oldState = iState;
       
   790 		iPosition = iPlayStart;
       
   791 		if (aEvent.iErrorCode == KErrNone)
       
   792 			{
       
   793 			//If we weren't playing, ignore the event.
       
   794 			if(oldState == EPlaying)
       
   795 				{
       
   796 				//we finished playing the clip so repeat if required
       
   797 				iNumberOfTimesPlayed++;
       
   798 				if ((iNumberOfTimesPlayed>iNumberOfTimesToRepeat) && (iNumberOfTimesToRepeat!=KMdaRepeatForever))
       
   799 					{
       
   800 					//we've repeated enough times now
       
   801 					iNumberOfTimesPlayed = 0;
       
   802 					iState = EStopped;
       
   803 					iCallback.MapcPlayComplete(KErrNone);
       
   804 					}
       
   805 				else
       
   806 					{
       
   807 					// We need to repeat the clip
       
   808 					// we're truncating the trailingsilence here so maximum time is ~37mins
       
   809                		TTimeIntervalMicroSeconds32 silence = I64INT(iTrailingSilence.Int64());
       
   810 					iRepeatTrailingSilenceTimer->After(silence);
       
   811 					}
       
   812 				}
       
   813 			}
       
   814 		else
       
   815 			{ //aEvent.iErrorCode != KErrNone
       
   816 			//if we weren't playing, don't advise Client.
       
   817 			iState = EStopped;
       
   818 			if(oldState == EPlaying)
       
   819 				iCallback.MapcPlayComplete(aEvent.iErrorCode);
       
   820 			}
       
   821 		}
       
   822 
       
   823 	// else we have an unexpected event that cannot be dealt with by the client.
       
   824 	// We will simply ignore this.
       
   825 	}
       
   826 
       
   827 
       
   828 void CAudioPdProperties::RepeatTrailingSilenceTimerComplete()
       
   829 	{
       
   830 	// reset the position for subsequent plays
       
   831 	iPosition = iPlayStart;
       
   832 	DoPlay();
       
   833 	}
       
   834 
       
   835 
       
   836 CRepeatTrailingSilenceTimer* CRepeatTrailingSilenceTimer::NewL(MRepeatTrailingSilenceTimerObs& aObs)
       
   837 	{
       
   838 	CRepeatTrailingSilenceTimer* s = new(ELeave) CRepeatTrailingSilenceTimer(aObs);
       
   839 	CleanupStack::PushL(s);
       
   840 	s->ConstructL();
       
   841 	CleanupStack::Pop();
       
   842 	return s;
       
   843 	}
       
   844 
       
   845 void CRepeatTrailingSilenceTimer::RunL()
       
   846 	{
       
   847 	iObs.RepeatTrailingSilenceTimerComplete();
       
   848 	}
       
   849 
       
   850 CRepeatTrailingSilenceTimer::CRepeatTrailingSilenceTimer(MRepeatTrailingSilenceTimerObs& aObs) :
       
   851 	CTimer(EPriorityHigh),
       
   852 	iObs(aObs)
       
   853 	{
       
   854 	CActiveScheduler::Add(this);
       
   855 	}
       
   856 
       
   857 
       
   858 CMMFMdaAudioPlayerCallBack* CMMFMdaAudioPlayerCallBack::NewL(MAudioPdPlayUtilityCallback& aCallback)
       
   859 	{
       
   860 	return new(ELeave) CMMFMdaAudioPlayerCallBack(aCallback);
       
   861 	}
       
   862 
       
   863 CMMFMdaAudioPlayerCallBack::CMMFMdaAudioPlayerCallBack(MAudioPdPlayUtilityCallback& aCallback) :
       
   864 	CActive(CActive::EPriorityHigh), iCallback(aCallback)
       
   865 	{
       
   866 	CActiveScheduler::Add(this);
       
   867 	}
       
   868 
       
   869 CMMFMdaAudioPlayerCallBack::~CMMFMdaAudioPlayerCallBack()
       
   870 	{
       
   871 	Cancel();
       
   872 	}
       
   873 
       
   874 void CMMFMdaAudioPlayerCallBack::InitComplete(TInt aError, const TTimeIntervalMicroSeconds& aDuration)
       
   875 	{
       
   876 	iError = aError;
       
   877 	iDuration = aDuration;
       
   878 	iState = ECallbackInitComplete;
       
   879 	if (!IsActive())
       
   880 		{
       
   881 		TRequestStatus* s = &iStatus;
       
   882 		SetActive();
       
   883 		User::RequestComplete(s, KErrNone);
       
   884 		}
       
   885 	}
       
   886 
       
   887 void CMMFMdaAudioPlayerCallBack::PlayComplete(TInt aError)
       
   888 	{
       
   889 	iError = aError;
       
   890 	iState = ECallbackPlayComplete;
       
   891 	if (!IsActive())
       
   892 		{
       
   893 		TRequestStatus* s = &iStatus;
       
   894 		SetActive();
       
   895 		User::RequestComplete(s, KErrNone);
       
   896 		}
       
   897 	}
       
   898 
       
   899 
       
   900 void CMMFMdaAudioPlayerCallBack::PlayingCallback()
       
   901 	{
       
   902 	iState = ECallbackPlaying;
       
   903 	if (!IsActive())
       
   904 		{
       
   905 		TRequestStatus* s = &iStatus;
       
   906 		SetActive();
       
   907 		User::RequestComplete(s, KErrNone);
       
   908 		}
       
   909 	}
       
   910 
       
   911 void CMMFMdaAudioPlayerCallBack::PausedCallback()
       
   912 	{
       
   913 	iState = ECallbackPaused;
       
   914 	if (!IsActive())
       
   915 		{
       
   916 		TRequestStatus* s = &iStatus;
       
   917 		SetActive();
       
   918 		User::RequestComplete(s, KErrNone);
       
   919 		}
       
   920 	}
       
   921 
       
   922 
       
   923 void CMMFMdaAudioPlayerCallBack::RunL()
       
   924 	{
       
   925 	switch (iState)
       
   926 		{
       
   927 		case ECallbackInitComplete:
       
   928 			iCallback.MapcInitComplete(iError, iDuration);
       
   929 			break;
       
   930 		case ECallbackPlayComplete:
       
   931 			iCallback.MapcPlayComplete(iError);
       
   932 			break;
       
   933 		case ECallbackPlaying:
       
   934 			iCallback.Playing();
       
   935 			break;
       
   936 		case ECallbackPaused:
       
   937 			iCallback.Paused();
       
   938 			break;
       
   939 
       
   940 		}
       
   941 	}
       
   942 
       
   943 void CMMFMdaAudioPlayerCallBack::DoCancel()
       
   944 	{
       
   945 	// Nothing to cancel
       
   946 	}
       
   947