os/mm/mmlibs/mmfw/tsrc/mmfunittest/Actrl/TestPlugins/AudioController/CustomMmfAudioController.cpp
author sl@SLION-WIN7.fritz.box
Fri, 15 Jun 2012 03:10:57 +0200
changeset 0 bde4ae8d615e
permissions -rw-r--r--
First public contribution.
sl@0
     1
// Copyright (c) 2002-2009 Nokia Corporation and/or its subsidiary(-ies).
sl@0
     2
// All rights reserved.
sl@0
     3
// This component and the accompanying materials are made available
sl@0
     4
// under the terms of "Eclipse Public License v1.0"
sl@0
     5
// which accompanies this distribution, and is available
sl@0
     6
// at the URL "http://www.eclipse.org/legal/epl-v10.html".
sl@0
     7
//
sl@0
     8
// Initial Contributors:
sl@0
     9
// Nokia Corporation - initial contribution.
sl@0
    10
//
sl@0
    11
// Contributors:
sl@0
    12
//
sl@0
    13
// Description:
sl@0
    14
//
sl@0
    15
sl@0
    16
#include <mmf/server/mmffile.h>
sl@0
    17
#include "CustomMmfAudioController.h"
sl@0
    18
sl@0
    19
#include <mmf/plugin/mmfcontrollerimplementationuids.hrh>
sl@0
    20
#include "ActrlTestUids.h"
sl@0
    21
sl@0
    22
_LIT(KTestWavFile19, "c:\\mm\\mmf\\testfiles\\actrl\\newmail.wav");
sl@0
    23
sl@0
    24
/**
sl@0
    25
*
sl@0
    26
* NewL
sl@0
    27
*
sl@0
    28
*/
sl@0
    29
CMMFController* CCustomMmfAudioController::NewL()
sl@0
    30
	{
sl@0
    31
    CCustomMmfAudioController* self = new(ELeave) CCustomMmfAudioController;
sl@0
    32
	CleanupStack::PushL(self);
sl@0
    33
	self->ConstructL();
sl@0
    34
	CleanupStack::Pop( self );
sl@0
    35
	
sl@0
    36
	return STATIC_CAST( CMMFController*, self );
sl@0
    37
	}
sl@0
    38
/**
sl@0
    39
*
sl@0
    40
* ~CCustomMmfAudioController
sl@0
    41
*
sl@0
    42
*/
sl@0
    43
CCustomMmfAudioController::~CCustomMmfAudioController()
sl@0
    44
	{
sl@0
    45
    delete iStoppingMessage;
sl@0
    46
	}
sl@0
    47
sl@0
    48
/**
sl@0
    49
*
sl@0
    50
* CCustomMmfAudioController
sl@0
    51
*
sl@0
    52
*/
sl@0
    53
CCustomMmfAudioController::CCustomMmfAudioController()
sl@0
    54
:CMMFAudioController(), iIsTest(EFalse)
sl@0
    55
	{
sl@0
    56
	}
sl@0
    57
sl@0
    58
/**
sl@0
    59
 *  PrimeL
sl@0
    60
 *
sl@0
    61
 *  If Prime fails the client should reset the controller
sl@0
    62
 *  becaused as noted below this code is not transactional.
sl@0
    63
 *
sl@0
    64
 */
sl@0
    65
void CCustomMmfAudioController::PrimeL(TMMFMessage& aMessage)
sl@0
    66
	{
sl@0
    67
	PrimeL();
sl@0
    68
	aMessage.Complete(KErrNone);
sl@0
    69
	}
sl@0
    70
void CCustomMmfAudioController::PlayL(TMMFMessage& aMessage)
sl@0
    71
	{
sl@0
    72
	PlayL();
sl@0
    73
	aMessage.Complete(KErrNone);
sl@0
    74
	}
sl@0
    75
void CCustomMmfAudioController::PauseL(TMMFMessage& aMessage)
sl@0
    76
	{
sl@0
    77
	PauseL();
sl@0
    78
	aMessage.Complete(KErrNone);
sl@0
    79
	} 
sl@0
    80
 
sl@0
    81
void CCustomMmfAudioController::PrimeL()
sl@0
    82
	{
sl@0
    83
	// apply heap check's here
sl@0
    84
	// Note if they fail this is the end of the controller
sl@0
    85
    
sl@0
    86
	// call the base class functionality
sl@0
    87
	TRAPD( errorCode, CMMFAudioController::PrimeL());
sl@0
    88
	// send an event back to the test framework with 
sl@0
    89
	// the error code
sl@0
    90
	TMMFEvent aEvent( KPrimeTestId, errorCode );
sl@0
    91
	DoSendEventToClient(aEvent);
sl@0
    92
	//[ we need to preserve the leave semantics for the caller]
sl@0
    93
	User::LeaveIfError( errorCode );
sl@0
    94
	}
sl@0
    95
sl@0
    96
/**
sl@0
    97
 *
sl@0
    98
 *  PlayL
sl@0
    99
 *
sl@0
   100
 */
sl@0
   101
void CCustomMmfAudioController::PlayL()
sl@0
   102
	{
sl@0
   103
// call the base class functionality
sl@0
   104
	TRAPD( errorCode, CMMFAudioController::PlayL());
sl@0
   105
	// send an event back to the test framework with 
sl@0
   106
	// the error code
sl@0
   107
	TMMFEvent aEvent( KPlayTestId, errorCode );
sl@0
   108
	DoSendEventToClient(aEvent);
sl@0
   109
	//[ we need to preserve the leave semantics for the caller]
sl@0
   110
	User::LeaveIfError( errorCode );
sl@0
   111
	}
sl@0
   112
sl@0
   113
/**
sl@0
   114
*
sl@0
   115
* MapdSetVolumeL
sl@0
   116
*
sl@0
   117
*/
sl@0
   118
void CCustomMmfAudioController::MapdSetVolumeL(TInt aVolume)
sl@0
   119
	{
sl@0
   120
	//Special return code to test fix for PDEF120609, test case id MM-MMF-ACLNT-U-0277-CP
sl@0
   121
	if (aVolume == -999)
sl@0
   122
		{
sl@0
   123
		User::Leave(-12345);
sl@0
   124
		}
sl@0
   125
	CMMFAudioController::MapdSetVolumeL( aVolume );
sl@0
   126
	}
sl@0
   127
sl@0
   128
/**
sl@0
   129
*
sl@0
   130
* MapdGetMaxVolumeL
sl@0
   131
*
sl@0
   132
*/
sl@0
   133
void CCustomMmfAudioController::MapdGetMaxVolumeL(TInt& aMaxVolume)
sl@0
   134
	{
sl@0
   135
	CMMFAudioController::MapdGetMaxVolumeL( aMaxVolume );
sl@0
   136
	}
sl@0
   137
sl@0
   138
/**
sl@0
   139
* MapdGetVolumeL
sl@0
   140
*
sl@0
   141
*/
sl@0
   142
void CCustomMmfAudioController::MapdGetVolumeL(TInt& aVolume)
sl@0
   143
	{
sl@0
   144
	CMMFAudioController::MapdGetVolumeL( aVolume );
sl@0
   145
	}
sl@0
   146
sl@0
   147
/**
sl@0
   148
* 
sl@0
   149
*PauseL
sl@0
   150
*
sl@0
   151
*/
sl@0
   152
void CCustomMmfAudioController::PauseL()
sl@0
   153
	{
sl@0
   154
	TRAPD( errorCode,CMMFAudioController::PauseL());
sl@0
   155
	//[ send pause event ]
sl@0
   156
	TMMFEvent aEvent( KPauseTestId, errorCode );
sl@0
   157
	DoSendEventToClient(aEvent);
sl@0
   158
	//[ we need to preserve the leave semantics for the caller]
sl@0
   159
	User::LeaveIfError( errorCode );
sl@0
   160
	}
sl@0
   161
sl@0
   162
/**
sl@0
   163
* 
sl@0
   164
* StopL
sl@0
   165
*
sl@0
   166
*/
sl@0
   167
void CCustomMmfAudioController::StopL()
sl@0
   168
	{
sl@0
   169
	TRAPD( errorCode,CMMFAudioController::StopL());
sl@0
   170
	//[ send stop event ]
sl@0
   171
	TMMFEvent aEvent( KStopTestId, errorCode );
sl@0
   172
	DoSendEventToClient(aEvent);
sl@0
   173
	//[ we need to preserve the leave semantics for the caller]
sl@0
   174
	User::LeaveIfError( errorCode );
sl@0
   175
	}
sl@0
   176
sl@0
   177
/**
sl@0
   178
*
sl@0
   179
* ResetL
sl@0
   180
*
sl@0
   181
*/
sl@0
   182
void CCustomMmfAudioController::ResetL()
sl@0
   183
	{
sl@0
   184
	TRAPD( errorCode,CMMFAudioController::ResetL());
sl@0
   185
	//[ send stop event ]
sl@0
   186
	TMMFEvent aEvent( KResetTestId, errorCode );
sl@0
   187
	DoSendEventToClient(aEvent);
sl@0
   188
	//[ we need to preserve the leave semantics for the caller]
sl@0
   189
	User::LeaveIfError( errorCode );
sl@0
   190
	}
sl@0
   191
sl@0
   192
/**
sl@0
   193
*
sl@0
   194
* RemoveDataSourceL
sl@0
   195
*
sl@0
   196
*/
sl@0
   197
void CCustomMmfAudioController::RemoveDataSourceL(MDataSource& aDataSource)
sl@0
   198
	{
sl@0
   199
	TRAPD( errorCode,CMMFAudioController::RemoveDataSourceL( aDataSource));
sl@0
   200
	//[ send stop event ]
sl@0
   201
	TMMFEvent aEvent( KRemoveDataSourceTestId, errorCode );
sl@0
   202
	DoSendEventToClient(aEvent);
sl@0
   203
	//[ we need to preserve the leave semantics for the caller]
sl@0
   204
	User::LeaveIfError( errorCode );
sl@0
   205
	}
sl@0
   206
sl@0
   207
/**
sl@0
   208
*
sl@0
   209
* RemoveDataSinkL
sl@0
   210
*
sl@0
   211
*/
sl@0
   212
void CCustomMmfAudioController::RemoveDataSinkL(MDataSink& aDataSink)
sl@0
   213
	{
sl@0
   214
	TRAPD( errorCode,CMMFAudioController::RemoveDataSinkL( aDataSink));
sl@0
   215
	//[ send stop event ]
sl@0
   216
	TMMFEvent aEvent( KRemoveDataSinkTestId, errorCode );
sl@0
   217
	DoSendEventToClient(aEvent);
sl@0
   218
	//[ we need to preserve the leave semantics for the caller]
sl@0
   219
	User::LeaveIfError( errorCode );
sl@0
   220
	}
sl@0
   221
sl@0
   222
/**
sl@0
   223
*
sl@0
   224
* MarcSetMaxFileSizeL
sl@0
   225
*
sl@0
   226
*/
sl@0
   227
sl@0
   228
void CCustomMmfAudioController::MarcSetMaxFileSizeL(TInt aFileSize)
sl@0
   229
	{
sl@0
   230
	TRAPD( errorCode,CMMFAudioController::MarcSetMaxFileSizeL( aFileSize));
sl@0
   231
	//[ send stop event ]
sl@0
   232
	TMMFEvent aEvent( KMarcSetMaxFileSizeId, errorCode );
sl@0
   233
	DoSendEventToClient(aEvent);
sl@0
   234
	//[ we need to preserve the leave semantics for the caller]
sl@0
   235
	User::LeaveIfError( errorCode );
sl@0
   236
	}
sl@0
   237
sl@0
   238
/**
sl@0
   239
*
sl@0
   240
* MarcGetRecordTimeAvailableL
sl@0
   241
* @param aTime
sl@0
   242
*
sl@0
   243
*/
sl@0
   244
void CCustomMmfAudioController::MarcGetRecordTimeAvailableL(TTimeIntervalMicroSeconds& aTime)
sl@0
   245
	{
sl@0
   246
	TRAPD( errorCode,CMMFAudioController::MarcGetRecordTimeAvailableL( aTime));
sl@0
   247
	//[ send stop event ]
sl@0
   248
	TMMFEvent aEvent( KMarcGetRecordTimeAvailId, errorCode );
sl@0
   249
	DoSendEventToClient(aEvent);
sl@0
   250
	//[ we need to preserve the leave semantics for the caller]
sl@0
   251
	User::LeaveIfError( errorCode );
sl@0
   252
	}
sl@0
   253
sl@0
   254
sl@0
   255
/**
sl@0
   256
*
sl@0
   257
* CustomCommand
sl@0
   258
*
sl@0
   259
*/
sl@0
   260
void CCustomMmfAudioController::CustomCommand(TMMFMessage& aMessage)
sl@0
   261
	{
sl@0
   262
	//[ check if the command is for the custom plugin
sl@0
   263
	// otherwise pass it on to the real audio controller ]
sl@0
   264
	TRAPD(err, iStoppingMessage = CCustomMMFMessageHolder::NewL(aMessage));
sl@0
   265
	if (err != KErrNone)
sl@0
   266
		{
sl@0
   267
		aMessage.Complete(err);
sl@0
   268
		return;
sl@0
   269
		}
sl@0
   270
	
sl@0
   271
	iIsTest = ETrue;
sl@0
   272
	if( IsMemoryAllocCmd( aMessage ) )
sl@0
   273
		{
sl@0
   274
		//[ it is a alloc memory test command ]
sl@0
   275
		// [ new algorithm adopted from M&G database ]
sl@0
   276
		//
sl@0
   277
		TInt errorCode = KErrNone;
sl@0
   278
		TInt failCount  = 1;
sl@0
   279
		TBool completed  = EFalse;
sl@0
   280
		TBool badResult  = EFalse;
sl@0
   281
		TBool reachedEnd = EFalse; 
sl@0
   282
		
sl@0
   283
		for( ; ; )
sl@0
   284
			{
sl@0
   285
			__UHEAP_SETFAIL(RHeap::EFailNext ,failCount);	// Leavescan will think __UHEAP_SETFAIL is a leaving function due to the macro ending in 'L'. Does not leave
sl@0
   286
sl@0
   287
			//NB: Do not use __MM_HEAP_MARK macro's in this test, the cleaning up the CustomMMFAudioController
sl@0
   288
			//is insufficient to remove all possible allocated memory from the framework.
sl@0
   289
			//CMMFControllerProxyServer::DoStartThreadL has been updated to do heap checking for 
sl@0
   290
			//the whole server thread.
sl@0
   291
sl@0
   292
			//[ run a scenario of the major api 
sl@0
   293
			//functions which alloc memory in the controller]
sl@0
   294
			TRAP( errorCode, AllocMemoryTestL());
sl@0
   295
sl@0
   296
			if( errorCode == KErrNone )
sl@0
   297
				{
sl@0
   298
				// [ check we have passed through all allocs in the test]
sl@0
   299
				TAny* testAlloc = User::Alloc(1);
sl@0
   300
				if( testAlloc == NULL )
sl@0
   301
					{
sl@0
   302
					reachedEnd = ETrue;
sl@0
   303
					failCount -= 1; // Failcount of 1 equates to 0 successful allocs, etc.
sl@0
   304
					}
sl@0
   305
				else 
sl@0
   306
					{
sl@0
   307
					User::Free( testAlloc );
sl@0
   308
					}
sl@0
   309
sl@0
   310
				completed = reachedEnd || badResult;
sl@0
   311
				
sl@0
   312
				}
sl@0
   313
			else if( errorCode != KErrNoMemory ) 
sl@0
   314
				{
sl@0
   315
				// [ we failed for some reason other than memory
sl@0
   316
				//     allocation, so fail the test ]
sl@0
   317
				completed = ETrue;
sl@0
   318
				badResult = ETrue;
sl@0
   319
				}
sl@0
   320
			
sl@0
   321
			__UHEAP_SETFAIL(RHeap::ENone ,0);
sl@0
   322
			
sl@0
   323
			// [ exit the loop ]
sl@0
   324
			if( completed )
sl@0
   325
				{
sl@0
   326
				break;
sl@0
   327
				}
sl@0
   328
sl@0
   329
			failCount +=1;
sl@0
   330
			}
sl@0
   331
sl@0
   332
		//This flag is used by the audio controller to alter its behaviour
sl@0
   333
		//slightly to allow these tests to work
sl@0
   334
		iIsTest=EFalse;
sl@0
   335
		
sl@0
   336
		if(!badResult)
sl@0
   337
			{
sl@0
   338
			aMessage.Complete(KErrNone);
sl@0
   339
			}
sl@0
   340
		else
sl@0
   341
			{
sl@0
   342
			aMessage.Complete(errorCode);
sl@0
   343
			}
sl@0
   344
		}
sl@0
   345
	else
sl@0
   346
		{
sl@0
   347
		//[ let the plugin process the message ]
sl@0
   348
		CMMFAudioController::CustomCommand(aMessage);
sl@0
   349
		}
sl@0
   350
	}
sl@0
   351
sl@0
   352
/**
sl@0
   353
*
sl@0
   354
* IsMemoryAllocCmd
sl@0
   355
*
sl@0
   356
*/
sl@0
   357
TBool CCustomMmfAudioController::IsMemoryAllocCmd( TMMFMessage& )
sl@0
   358
	{
sl@0
   359
	return ETrue;
sl@0
   360
	}
sl@0
   361
sl@0
   362
sl@0
   363
static void CleanupController(TAny* ptr)
sl@0
   364
	{
sl@0
   365
	CMMFAudioController* controller = STATIC_CAST(CMMFAudioController*, ptr);
sl@0
   366
	TRAP_IGNORE(controller->CMMFAudioController::ResetL());
sl@0
   367
	}
sl@0
   368
sl@0
   369
sl@0
   370
/**
sl@0
   371
*
sl@0
   372
* AllocMemoryTest
sl@0
   373
*
sl@0
   374
*/
sl@0
   375
TInt CCustomMmfAudioController::AllocMemoryTestL()
sl@0
   376
	{
sl@0
   377
	TMMFFileConfig fileConfig; // audio file 
sl@0
   378
sl@0
   379
	fileConfig().iPath = KTestWavFile19;
sl@0
   380
sl@0
   381
	//[ lets manufacture a source and sink ]
sl@0
   382
sl@0
   383
	//[Create the source]
sl@0
   384
	MDataSource* source = MDataSource::NewSourceL(KUidMmfFileSource, fileConfig);
sl@0
   385
	CleanupDeletePushL(source);
sl@0
   386
sl@0
   387
	//[ Create the sink ]
sl@0
   388
	MDataSink* sink = MDataSink::NewSinkL(KUidMmfAudioOutput, KNullDesC8);
sl@0
   389
	CleanupDeletePushL(sink);
sl@0
   390
sl@0
   391
	// Use a cleanup item to stop & reset the controller and so remove the data 
sl@0
   392
	// sources/sinks automatically when this funtion leaves. This can be done
sl@0
   393
	// before the sinks/sources are added.
sl@0
   394
	TCleanupItem cleanupItem(CleanupController, this);
sl@0
   395
	CleanupStack::PushL(cleanupItem);
sl@0
   396
sl@0
   397
sl@0
   398
	//[ add the source ]
sl@0
   399
	CMMFAudioController::AddDataSourceL(*source);
sl@0
   400
	 
sl@0
   401
	//[ add the sink ]
sl@0
   402
	CMMFAudioController::AddDataSinkL(*sink);
sl@0
   403
sl@0
   404
	//[ prime ]
sl@0
   405
	CMMFAudioController::PrimeL();	 
sl@0
   406
	 
sl@0
   407
	//[ play ]
sl@0
   408
	CMMFAudioController::PlayL();
sl@0
   409
	 
sl@0
   410
	//[ pause ]
sl@0
   411
	CMMFAudioController::PauseL();
sl@0
   412
	 
sl@0
   413
	//[ play ]
sl@0
   414
	CMMFAudioController::PlayL();
sl@0
   415
	 
sl@0
   416
	//[ stop ]
sl@0
   417
	CMMFAudioController::StopL(iStoppingMessage->iMessage);
sl@0
   418
	 
sl@0
   419
	// [ prime ]
sl@0
   420
	CMMFAudioController::PrimeL();
sl@0
   421
	 
sl@0
   422
	//[ reset ]	
sl@0
   423
	CMMFAudioController::ResetL();
sl@0
   424
sl@0
   425
	CleanupStack::PopAndDestroy(3);// source, sink, cleanupItem
sl@0
   426
sl@0
   427
	return KErrNone;
sl@0
   428
	}
sl@0
   429
sl@0
   430
//Leaves with KErrNoMemory.
sl@0
   431
CMMFController* CMemoryFailAudioController::NewL()
sl@0
   432
	{
sl@0
   433
	if(ETrue) //condition used to avoid any warning
sl@0
   434
		{
sl@0
   435
		User::Leave(KErrNoMemory);	
sl@0
   436
		}
sl@0
   437
	return NULL;
sl@0
   438
	}
sl@0
   439
CMemoryFailAudioController::CMemoryFailAudioController():CMMFAudioController()
sl@0
   440
	{
sl@0
   441
	}
sl@0
   442
CMemoryFailAudioController::~CMemoryFailAudioController()
sl@0
   443
	{
sl@0
   444
    if(iSink)
sl@0
   445
    	{
sl@0
   446
    	iSink->SinkThreadLogoff();
sl@0
   447
    	}
sl@0
   448
    if(iClip)
sl@0
   449
    	{
sl@0
   450
    	iClip->SourceThreadLogoff();
sl@0
   451
    	}
sl@0
   452
	}
sl@0
   453
sl@0
   454
void CMemoryFailAudioController::AddDataSourceL(MDataSource& aSource)
sl@0
   455
	{
sl@0
   456
    if (iClip)
sl@0
   457
    	{
sl@0
   458
    	User::Leave(KErrAlreadyExists);
sl@0
   459
    	}
sl@0
   460
	if ((aSource.DataSourceType()==KUidMmfDescriptorSource)||
sl@0
   461
			(aSource.DataSourceType()==KUidMmfFileSource))
sl@0
   462
	    {
sl@0
   463
	    User::LeaveIfError(aSource.SourceThreadLogon(*this));
sl@0
   464
	    iClip = static_cast<CMMFClip*>(&aSource);
sl@0
   465
	    if(iClip->Size())
sl@0
   466
	    	{
sl@0
   467
	    	iClip->SourcePrimeL();
sl@0
   468
	    	}
sl@0
   469
	    else
sl@0
   470
	    	{
sl@0
   471
	    	iClip->SourceStopL();
sl@0
   472
	    	}
sl@0
   473
	    }
sl@0
   474
	else 
sl@0
   475
		{
sl@0
   476
		User::Leave(KErrNotSupported);
sl@0
   477
		}
sl@0
   478
	}
sl@0
   479
sl@0
   480
void CMemoryFailAudioController::AddDataSinkL(MDataSink& aSink)
sl@0
   481
	{
sl@0
   482
    if(iMMFDevSound)
sl@0
   483
    	{
sl@0
   484
    	User::Leave(KErrAlreadyExists);
sl@0
   485
    	}
sl@0
   486
    if (aSink.DataSinkType()!=KUidMmfAudioOutput) 
sl@0
   487
    	{
sl@0
   488
    	User::Leave(KErrNotSupported);	
sl@0
   489
    	}
sl@0
   490
    User::LeaveIfError(aSink.SinkThreadLogon(*this));
sl@0
   491
    iSink = &aSink;
sl@0
   492
    MMMFAudioOutput* audioOutput = static_cast<MMMFAudioOutput*>(&aSink);
sl@0
   493
    iMMFDevSound = &(audioOutput->SoundDevice());
sl@0
   494
	iMMFDevSound->SetPrioritySettings(iPrioritySettings);
sl@0
   495
	return;
sl@0
   496
	}
sl@0
   497
sl@0
   498
void CMemoryFailAudioController::SetPrioritySettings(const TMMFPrioritySettings& aSettings)
sl@0
   499
	{
sl@0
   500
    iPrioritySettings = aSettings;
sl@0
   501
    if (iMMFDevSound)
sl@0
   502
    	{
sl@0
   503
    	iMMFDevSound->SetPrioritySettings(aSettings);
sl@0
   504
    	}
sl@0
   505
	}
sl@0
   506
sl@0
   507
//Does not acces files; returns hard-coded value.
sl@0
   508
TTimeIntervalMicroSeconds CMemoryFailAudioController::DurationL()const
sl@0
   509
	{
sl@0
   510
	return TTimeIntervalMicroSeconds(1000000); //return 1sec
sl@0
   511
	}
sl@0
   512
sl@0
   513
CMMFController* CMemoryPassAudioController::NewL()
sl@0
   514
	{
sl@0
   515
	CMemoryPassAudioController* self = new (ELeave) CMemoryPassAudioController();
sl@0
   516
	return STATIC_CAST( CMMFController*, self );
sl@0
   517
	}
sl@0
   518
CMemoryPassAudioController::CMemoryPassAudioController():CMemoryFailAudioController()
sl@0
   519
	{
sl@0
   520
	}
sl@0
   521
sl@0
   522
//Derived from Audio Controller. Panics the controller thread after the play is started
sl@0
   523
CMMFController* CPanicAudioController::NewL()
sl@0
   524
	{
sl@0
   525
	CPanicAudioController* self = new(ELeave) CPanicAudioController;
sl@0
   526
	CleanupStack::PushL(self);
sl@0
   527
	self->ConstructL();
sl@0
   528
	CleanupStack::Pop( self );
sl@0
   529
	return static_cast<CMMFController*>(self);
sl@0
   530
	}
sl@0
   531
sl@0
   532
CPanicAudioController::CPanicAudioController():CMMFAudioController()
sl@0
   533
	{
sl@0
   534
	}
sl@0
   535
sl@0
   536
CPanicAudioController::~CPanicAudioController()
sl@0
   537
	{
sl@0
   538
	delete iPanicTimer;
sl@0
   539
	}
sl@0
   540
sl@0
   541
void CPanicAudioController::AddDataSourceL(MDataSource& aSource)
sl@0
   542
	{
sl@0
   543
    TRAP_IGNORE(CMMFAudioController::AddDataSourceL(aSource));
sl@0
   544
	}
sl@0
   545
sl@0
   546
void CPanicAudioController::AddDataSinkL(MDataSink& aSink)
sl@0
   547
	{
sl@0
   548
    TRAP_IGNORE(CMMFAudioController::AddDataSinkL(aSink));
sl@0
   549
	}
sl@0
   550
	
sl@0
   551
void CPanicAudioController::PrimeL()
sl@0
   552
	{
sl@0
   553
	TRAP_IGNORE(CMMFAudioController::PrimeL());
sl@0
   554
	}
sl@0
   555
		
sl@0
   556
void CPanicAudioController::PlayL()
sl@0
   557
	{
sl@0
   558
	TRAP_IGNORE(CMMFAudioController::PlayL());
sl@0
   559
	//trigger the panic
sl@0
   560
	iPanicTimer->Start(1000000, 1000000, TCallBack(PanicTimerComplete, this));
sl@0
   561
	}
sl@0
   562
		
sl@0
   563
void CPanicAudioController::ConstructL()
sl@0
   564
	{
sl@0
   565
	CMMFAudioController::ConstructL();
sl@0
   566
	iPanicTimer = CPeriodic::NewL(CActive::EPriorityStandard);
sl@0
   567
	}
sl@0
   568
sl@0
   569
TTimeIntervalMicroSeconds CPanicAudioController::DurationL()const
sl@0
   570
	{
sl@0
   571
	return TTimeIntervalMicroSeconds(0);
sl@0
   572
	}
sl@0
   573
	
sl@0
   574
void CPanicAudioController::SetPositionL(const TTimeIntervalMicroSeconds& aPosition)
sl@0
   575
	{
sl@0
   576
	TRAP_IGNORE(CMMFAudioController::SetPositionL(aPosition));
sl@0
   577
	}
sl@0
   578
	
sl@0
   579
TInt CPanicAudioController::PanicTimerComplete(TAny* /*aParent*/)
sl@0
   580
	{
sl@0
   581
	User::Panic(_L("CustomMmfAudioController"), 0);
sl@0
   582
	return KErrNone;
sl@0
   583
	}
sl@0
   584