devsound/a3fdevsound/src/devsoundadaptor/cdevplaycontrol.cpp
changeset 0 40261b775718
child 12 b74061f7f3d2
equal deleted inserted replaced
-1:000000000000 0:40261b775718
       
     1 // Copyright (c) 2006-2009 Nokia Corporation and/or its subsidiary(-ies).
       
     2 // All rights reserved.
       
     3 // This component and the accompanying materials are made available
       
     4 // under the terms of "Eclipse Public License v1.0"
       
     5 // which accompanies this distribution, and is available
       
     6 // at the URL "http://www.eclipse.org/legal/epl-v10.html".
       
     7 //
       
     8 // Initial Contributors:
       
     9 // Nokia Corporation - initial contribution.
       
    10 //
       
    11 // Contributors:
       
    12 //
       
    13 // Description:
       
    14 //
       
    15 
       
    16 
       
    17 
       
    18 #include "cdevplaycontrol.h"
       
    19 
       
    20 #include <a3f/maudiocontext.h>
       
    21 #include <a3f/mbuffersource.h>
       
    22 #include <a3f/maudiocodec.h>
       
    23 #include <a3f/maudiogaincontrol.h>
       
    24 #include <a3f/audioprocessingunittypeuids.h>
       
    25 
       
    26 
       
    27 // ---------------------------------------------------------------------------
       
    28 // Default constructor
       
    29 // ---------------------------------------------------------------------------
       
    30 //
       
    31 CDevPlayControl::CDevPlayControl()
       
    32 	{
       
    33 	TRACE_CREATE();
       
    34 	DP_CONTEXT(CDevPlayControl::CDevPlayControl *CD1*, CtxDevSound, DPLOCAL);
       
    35 	DP_IN();
       
    36 	DP_OUT();
       
    37 	}
       
    38 
       
    39 // -----------------------------------------------------------------------------
       
    40 // Symbian 2nd phase constructor
       
    41 // -----------------------------------------------------------------------------
       
    42 //
       
    43 void CDevPlayControl::ConstructL(CDevAudio* aDevAudio, MDevSoundAdaptationObserver& aAdaptationObserver)
       
    44 	{
       
    45 	DP_CONTEXT(CDevPlayControl::ConstructL *CD1*, CtxDevSound, DPLOCAL);
       
    46 	DP_IN();
       
    47 	CDevAudioControl::ConstructL(aDevAudio, aAdaptationObserver);
       
    48 	DP_OUT();
       
    49 	}
       
    50 
       
    51 // -----------------------------------------------------------------------------
       
    52 // Symbian constructor
       
    53 // -----------------------------------------------------------------------------
       
    54 //
       
    55 CDevPlayControl* CDevPlayControl::NewL(CDevAudio* aDevAudio, MDevSoundAdaptationObserver& aDevSoundObserver)
       
    56 	{
       
    57 	DP_STATIC_CONTEXT(CDevPlayControl::NewL *CD0*, CtxDevSound, DPLOCAL);
       
    58 	DP_IN();
       
    59 	CDevPlayControl* self = new (ELeave) CDevPlayControl();
       
    60 	CleanupStack::PushL(self);
       
    61 	self->ConstructL(aDevAudio, aDevSoundObserver);
       
    62 	CleanupStack::Pop(self);
       
    63 	DP0_RET(self, "0x%x");
       
    64 	}
       
    65 
       
    66 // ---------------------------------------------------------------------------
       
    67 // Destructor
       
    68 // ---------------------------------------------------------------------------
       
    69 //
       
    70 CDevPlayControl::~CDevPlayControl()
       
    71 	{
       
    72 	DP_CONTEXT(CDevPlayControl::~CDevPlayControl *CD1*, CtxDevSound, DPLOCAL);
       
    73 	DP_IN();
       
    74 	DP_OUT();
       
    75 	}
       
    76 
       
    77 // -----------------------------------------------------------------------------
       
    78 // CDevPlayControl::Initialize
       
    79 // -----------------------------------------------------------------------------
       
    80 //
       
    81 TInt CDevPlayControl::Initialize(TUid aFormat)
       
    82 	{
       
    83 	DP_CONTEXT(CDevPlayControl::Initialize *CD1*, CtxDevSound, DPLOCAL);
       
    84 	DP_IN();
       
    85 	ASSERT(iDevAudio->iAudioSource && iDevAudio->iAudioCodec && iGainControl);
       
    86 	TInt err(KErrNone);
       
    87 
       
    88 	err = iDevAudio->iAudioStream->AddSource(iDevAudio->iAudioSource);
       
    89 	if (err == KErrNone)
       
    90 		{
       
    91 		err = iDevAudio->iAudioStream->AddSink(iDevAudio->iAudioSink);
       
    92 		if (err == KErrNone)
       
    93 			{
       
    94 			err = iDevAudio->iAudioStream->AddAudioCodec(iDevAudio->iAudioCodec);
       
    95 			}
       
    96 		}
       
    97 	
       
    98 	if(err == KErrNone && iDevAudio->iActiveState == EDevSoundAdaptorCreated_Uninitialised)
       
    99 		{
       
   100 		// Register for notifications
       
   101 		// Note KErrAlreadyExist is not acceptable as an error, since it shouldn't occurr 
       
   102 		// It's mandatory unregister any observer when no more events are required
       
   103 		// Otherwise the notifications will be sent to all previously registered observer
       
   104 		// when reinitialising for different mode
       
   105 		err = iDevAudio->iAudioStream->RegisterAudioStreamObserver(*this);
       
   106 		if (err == KErrNone)
       
   107 			{
       
   108 			err = iGainControl->RegisterAudioGainControlObserver(*this);
       
   109 			if (err == KErrNone)
       
   110 				{
       
   111 				err = CacheAudioCodecIf();
       
   112 				if (err == KErrNone)
       
   113 					{
       
   114 					__ASSERT_ALWAYS (iAudioCodecIf,CDevAudioControl::Panic(EAudioCodecIsNull));
       
   115 					err = iAudioCodecIf->RegisterAudioCodecObserver(*this);
       
   116 					if(err == KErrNone)
       
   117 						{
       
   118 						err = iAudioCodecIf->SetFormat(aFormat);
       
   119 						if (err == KErrNone)
       
   120 							{
       
   121 							// Needed to get ProcessingUnitError notification 
       
   122 							err = iDevAudio->iAudioCodec->RegisterProcessingUnitObserver(*this);
       
   123 							}
       
   124 						}
       
   125 					}
       
   126 				}
       
   127 			}
       
   128 
       
   129 		if (err != KErrNone)
       
   130 			{
       
   131 			DP0(DLINFO,"Error while registering observers");
       
   132 			iDevAudio->iAudioStream->UnregisterAudioStreamObserver(*this);
       
   133 			iGainControl->UnregisterAudioGainControlObserver(*this);
       
   134 			if(iAudioCodecIf)
       
   135 				{
       
   136 				iAudioCodecIf->UnregisterAudioCodecObserver(*this);
       
   137 				iAudioCodecIf = NULL; // Not owned here: convenience pointer, so no need to delete
       
   138 				}
       
   139 			}
       
   140 
       
   141 		if (err == KErrNone)
       
   142 			{
       
   143 			err = iDevAudio->iAudioStream->Initialize();
       
   144 			if (err == KErrNone)
       
   145 				{
       
   146 				err = iDevAudio->iAudioContext->Commit();
       
   147 				if (err == KErrNone)
       
   148 					{
       
   149 					iDevAudio->iActiveState = EDevSoundAdaptorInitialising;
       
   150 					}
       
   151 				}
       
   152 			}
       
   153 		}
       
   154 	DP0_RET(err,"%d");
       
   155 	}
       
   156 
       
   157 // -----------------------------------------------------------------------------
       
   158 // CDevPlayControl::ProcessInit
       
   159 // -----------------------------------------------------------------------------
       
   160 //
       
   161 TInt CDevPlayControl::ProcessInit()
       
   162 	{
       
   163 	DP_CONTEXT(CDevPlayControl::ProcessInit *CD1*, CtxDevSound, DPLOCAL);
       
   164 	DP_IN();
       
   165 	PRF(PRF_ID, PRF_START, PRF_TIME, AA_DS_PlayInit, "");
       
   166 	PRF(PRF_ID, PRF_START, PRF_LOAD, AA_DS_Play, "");
       
   167 	TInt err(KErrNone);
       
   168 	
       
   169 	switch (iDevAudio->iActiveState)
       
   170 		{
       
   171 		case EDevSoundAdaptorInitialised_Initialised:
       
   172 			{
       
   173 			TAny* interface(NULL);
       
   174 			// get correct BufferSource interface of DevAudio::iAudioSource
       
   175 			interface = iDevAudio->iAudioSource->Interface(KUidMmfBufferSource);
       
   176 			
       
   177 			if (interface == NULL)
       
   178 				{
       
   179 				DP0_RET(KErrNotSupported, "Incorrect source type! %d");
       
   180 				}
       
   181 			else
       
   182 				{
       
   183 				iBufferSource = static_cast<MMMFBufferSource*>(interface);
       
   184 				iBufferSource->SetDataSupplier(*this);
       
   185 				if (iDevAudio->IsPrioritySet())
       
   186 					{
       
   187 					TAudioTypeSettings priority;
       
   188 					iDevAudio->GetPrioritySettings(priority);
       
   189 					err = iDevAudio->iAudioStream->SetAudioType(priority);
       
   190 					}				
       
   191 				}
       
   192 			if ( err == KErrNone)
       
   193 				{
       
   194 				err = iDevAudio->iAudioStream->Load();
       
   195 				}
       
   196 			if ( err == KErrNone)
       
   197 				{
       
   198 				err = iDevAudio->iAudioContext->Commit();
       
   199 				}
       
   200 			if(err == KErrNone)
       
   201 				{
       
   202 				iDevAudio->iActiveState = EDevSoundAdaptorLoading;
       
   203 				}
       
   204 			}
       
   205 			break;
       
   206 
       
   207 		case EDevSoundAdaptorPaused_Primed:
       
   208 		case EDevSoundAdaptorInitialised_Idle:
       
   209 			err = iDevAudio->RequestGainAndBalance(this);
       
   210 			if (err==KErrNone)
       
   211 				{
       
   212 				err = iDevAudio->iAudioStream->Activate();
       
   213 				}
       
   214 			if (err == KErrNone)
       
   215 				{
       
   216 				err = iDevAudio->iAudioContext->Commit();
       
   217 				}
       
   218 			if (err == KErrNone)
       
   219 				{
       
   220 				iDevAudio->iActiveState = EDevSoundAdaptorActivating;
       
   221 				}
       
   222 			break;
       
   223 		case EDevSoundAdaptorActive_Active:
       
   224 			// Deliberate fall through - set err=KErrNotReady for PlayInit when already active
       
   225 		default:
       
   226 			err = KErrNotReady;
       
   227 			break;
       
   228 		}
       
   229 
       
   230 	if(err == KErrNone)
       
   231 		{
       
   232 		iDevAudio->iStop = EFalse;
       
   233 		}
       
   234 	
       
   235 	DP0_RET(err,"%d");
       
   236 	}
       
   237 
       
   238 // -----------------------------------------------------------------------------
       
   239 // CDevPlayControl::ProcessData
       
   240 // -----------------------------------------------------------------------------
       
   241 //
       
   242 void CDevPlayControl::ProcessData()
       
   243 	{
       
   244 	DP_CONTEXT(CDevPlayControl::ProcessData *CD1*, CtxDevSound, DPLOCAL);
       
   245 	DP_IN();
       
   246 	TInt err(KErrNone);
       
   247 	
       
   248 	if(!iDevAudio->iStop)
       
   249 		{
       
   250 		err = iBufferSource->BufferFilled(iBuffer);
       
   251 		if ( err != KErrNone)
       
   252 			{
       
   253 			iErrorCondition = err;
       
   254 			Stop();
       
   255 			}
       
   256 		}
       
   257 
       
   258 	DP_OUT();
       
   259 	}
       
   260 
       
   261 // -----------------------------------------------------------------------------
       
   262 // From class MAudioDataSupplier
       
   263 // CDevPlayControl::BufferToBeFilled
       
   264 // -----------------------------------------------------------------------------
       
   265 //
       
   266 void CDevPlayControl::BufferToBeFilled(MMMFBufferSource* aSource, CMMFBuffer* aBuffer)
       
   267 	{
       
   268 	DP_CONTEXT(CDevPlayControl::BufferToBeFilled *CD1*, CtxDevSound, DPLOCAL);
       
   269 	DP_IN();
       
   270 	PRF(PRF_ID, PRF_STOP, PRF_TIME, AA_DS_PlayInit, "");
       
   271 	__ASSERT_ALWAYS(iBufferSource==aSource, CDevAudioControl::Panic(EBufferMismatch));
       
   272 	iAdaptationObserver->BufferToBeFilled(aBuffer);
       
   273 	iBuffer = aBuffer;
       
   274 	DP_OUT();
       
   275 	}
       
   276 
       
   277 // -----------------------------------------------------------------------------
       
   278 // From class MAudioDataSupplier
       
   279 // CDevPlayControl::DiscardBuffers
       
   280 // -----------------------------------------------------------------------------
       
   281 //
       
   282 void CDevPlayControl::DiscardBuffers(MMMFBufferSource* /*aSource*/)
       
   283 	{
       
   284 	DP_CONTEXT(CDevPlayControl::DiscardBuffers *CD1*, CtxDevSound, DPLOCAL);
       
   285 	DP_IN();
       
   286 
       
   287 	DP_OUT();
       
   288 	}
       
   289 
       
   290 // -----------------------------------------------------------------------------
       
   291 // CDevPlayControl::ProcessingFinished
       
   292 // -----------------------------------------------------------------------------
       
   293 //
       
   294 void CDevPlayControl::ProcessingFinished(MAudioStream& /*aStream*/)
       
   295 	{
       
   296 	DP_CONTEXT(CDevPlayControl::ProcessingFinished *CD1*, CtxDevSound, DPLOCAL);
       
   297 	DP_IN();
       
   298 	PRF(PRF_ID, PRF_STOP, PRF_LOAD, AA_DS_Play, "");
       
   299 	
       
   300 	if(iCallbackFromAdaptor == KCallbackNone)
       
   301 		{
       
   302 		iCallbackFromAdaptor = KCallbackProcessingFinished;
       
   303 		iAdaptationObserver->CallbackFromAdaptorReceived(iCallbackFromAdaptor, KErrNone);
       
   304 		}
       
   305 	else
       
   306 		{
       
   307 		// Multiple callbacks from adaptor
       
   308 		DP0(DLERR, "Multiple callbacks from adaptor");
       
   309 		}
       
   310 	DP_OUT();
       
   311 	}
       
   312 
       
   313 
       
   314 // -----------------------------------------------------------------------------
       
   315 // CDevPlayControl::ProcessingFinishedReceived
       
   316 // -----------------------------------------------------------------------------
       
   317 //
       
   318 TInt CDevPlayControl::ProcessingFinishedReceived(TBool& aAyncOperation)
       
   319 	{
       
   320 	DP_CONTEXT(CDevPlayControl::ProcessingFinishedReceived *CD1*, CtxDevSound, DPLOCAL);
       
   321 	DP_IN();
       
   322 	aAyncOperation = EFalse;
       
   323 	TInt err = iDevAudio->iAudioStream->Stop();
       
   324 	if ( err == KErrNone)
       
   325 		{
       
   326 		err = iDevAudio->iAudioContext->Commit();
       
   327 		if(err == KErrNone)
       
   328 			{
       
   329 			iDevAudio->iActiveState = EDevSoundAdaptorStopping;
       
   330 			aAyncOperation = ETrue;
       
   331 			}
       
   332 		}
       
   333 	// Something was wrong, clear the flag.
       
   334 	if (err != KErrNone)
       
   335 		{
       
   336 		iCallbackFromAdaptor = KCallbackNone;
       
   337 		}
       
   338 	DP0_RET(err,"%d");
       
   339 	}
       
   340 
       
   341 // -----------------------------------------------------------------------------
       
   342 // CDevPlayControl::BufferErrorEvent
       
   343 // -----------------------------------------------------------------------------
       
   344 //
       
   345 void CDevPlayControl::BufferErrorEvent()
       
   346 	{
       
   347 	ProcessingUnitError(NULL,KErrNoMemory);
       
   348 	}
       
   349 
       
   350 
       
   351 // -----------------------------------------------------------------------------
       
   352 // CDevPlayControl::FinishWithError
       
   353 // -----------------------------------------------------------------------------
       
   354 //
       
   355 void CDevPlayControl::FinishWithError(TInt aError)
       
   356     {
       
   357     iAdaptationObserver->PlayError(aError);
       
   358     }
       
   359 
       
   360 // ---------------------------------------------------------------------------
       
   361 // CDevPlayControl::ProcessingError
       
   362 // ---------------------------------------------------------------------------
       
   363 TInt CDevPlayControl::ProcessingError(TBool& aAyncOperation)
       
   364     {
       
   365     TInt err = ProcessingFinishedReceived(aAyncOperation);
       
   366     return err;
       
   367     }
       
   368     
       
   369 // End of file
       
   370