os/mm/devsound/a3fdevsound/src/devsoundadaptor/cdevtonecontrol.cpp
author sl
Tue, 10 Jun 2014 14:32:02 +0200
changeset 1 260cb5ec6c19
permissions -rw-r--r--
Update contrib.
     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 "cdevtonecontrol.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 CDevToneControl::CDevToneControl()
    32 	{
    33 	TRACE_CREATE();
    34 	DP_CONTEXT(CDevToneControl::CDevToneControl *CD1*, CtxDevSound, DPLOCAL);
    35 	DP_IN();
    36 	DP_OUT();
    37 	}
    38 
    39 // -----------------------------------------------------------------------------
    40 // Symbian 2nd phase constructor
    41 // -----------------------------------------------------------------------------
    42 //
    43 void CDevToneControl::ConstructL(CDevAudio* aDevAudio, MDevSoundAdaptationObserver& aDevSoundObserver)
    44 	{
    45 	DP_CONTEXT(CDevToneControl::ConstructL *CD1*, CtxDevSound, DPLOCAL);
    46 	DP_IN();
    47 	CDevAudioControl::ConstructL(aDevAudio, aDevSoundObserver);
    48 	DP_OUT();
    49 	}
    50 
    51 // -----------------------------------------------------------------------------
    52 // Symbian constructor
    53 // -----------------------------------------------------------------------------
    54 //
    55 CDevToneControl* CDevToneControl::NewL(CDevAudio* aDevAudio, MDevSoundAdaptationObserver& aDevSoundObserver)
    56 	{
    57 	DP_STATIC_CONTEXT(CDevToneControl::NewL *CD0*, CtxDevSound, DPLOCAL);
    58 	DP_IN();
    59 	CDevToneControl* self = new (ELeave) CDevToneControl();
    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 CDevToneControl::~CDevToneControl()
    71 	{
    72 	DP_CONTEXT(CDevToneControl::~CDevToneControl *CD1*, CtxDevSound, DPLOCAL);
    73 	DP_IN();
    74 	DP_OUT();
    75 	}
    76 
    77 // -----------------------------------------------------------------------------
    78 // CDevToneControl::Initialize
    79 // -----------------------------------------------------------------------------
    80 //
    81 TInt CDevToneControl::Initialize(TUid aFormat)
    82 	{
    83 	DP_CONTEXT(CDevToneControl::Initialize *CD1*, CtxDevSound, DPLOCAL);
    84 	DP_IN();
    85 	ASSERT(iDevAudio->iAudioSource && iDevAudio->iAudioCodec && iGainControl);
    86 	TInt err(KErrNone);
    87 	
    88 	// Adding pUnits
    89 	err = iDevAudio->iAudioStream->AddSource(iDevAudio->iAudioSource);
    90 	if (err == KErrNone)
    91 		{
    92 		err = iDevAudio->iAudioStream->AddSink(iDevAudio->iAudioSink);
    93 		if (err == KErrNone)
    94 			{
    95 			err = iDevAudio->iAudioStream->AddAudioCodec(iDevAudio->iAudioCodec);
    96 			}
    97 		}
    98 
    99 	// KErrAlreadyExist shouldn't occurr 
   100 	// It's mandatory unregister any observer when no more events are required
   101 	// Otherwise the notifications will be sent to all previously registered observer
   102 	// when reinitialising for different mode
   103 	err = iDevAudio->iAudioStream->RegisterAudioStreamObserver(*this);
   104 	if (err != KErrNone)
   105 		{
   106 		DP0_RET(err, "Stream observer registeration failed, err = %d");
   107 		}
   108 	iGainControl->RegisterAudioGainControlObserver(*this);
   109 	if (err != KErrNone)
   110 		{
   111 		DP0_RET(err, "Gaincontrol observer registeration failed, err = %d");
   112 		}
   113 
   114 	err = CacheAudioCodecIf();
   115 	if (err != KErrNone)
   116 		{
   117 		DP0_RET(err, "CacheAudioCodecIf() failed, err = %d");
   118 		}
   119 
   120 	err = iAudioCodecIf->RegisterAudioCodecObserver(*this);
   121 	if(err != KErrNone)
   122 		{
   123 		DP0_RET(err, "Registration failed, err = %d");
   124 		}
   125 
   126 	__ASSERT_ALWAYS (iAudioCodecIf, CDevAudioControl::Panic(EAudioCodecIsNull));
   127 	err = iAudioCodecIf->SetFormat(aFormat);
   128 	if (err!=KErrNone)
   129 		{
   130 		DP0_RET(err, "SetFormat() failed, err = %d");
   131 		}
   132 			
   133 	// Needed to get ProcessingUnitError notification 
   134 	err = iDevAudio->iAudioCodec->RegisterProcessingUnitObserver(*this);
   135 	if ((err != KErrAlreadyExists) && (err != KErrNone))
   136 		{
   137 		DP0_RET(err, "Audiocodec observer registeration failed, err = %d");
   138 		}
   139 
   140 	// get correct BufferSource interface of DevAudio::iAudioSource
   141 	TAny* interface = iDevAudio->iAudioSource->Interface(KUidMmfBufferSource);
   142 	if (interface == NULL)
   143 		{
   144 		DP0_RET(KErrNotSupported, "Incorrect source type! %d");
   145 		}
   146 	else
   147 		{
   148 		iBufferSource = static_cast<MMMFBufferSource*>(interface);
   149 		err = iBufferSource->SetDataSupplier(*this);
   150 		if (err != KErrNone )
   151 			{
   152 			DP0_RET(err, "Data suplier setting failed, err = %d");
   153 			}
   154 		}
   155 
   156 	err = iDevAudio->iAudioStream->Initialize();
   157 	if (err == KErrNone)
   158 		{
   159 		err = iDevAudio->CommitAudioContext();
   160 		}
   161 	if (err == KErrNone)
   162 		{
   163 		iDevAudio->iActiveState = EDevSoundAdaptorInitialising;
   164 		}
   165 
   166 	DP0_RET(err,"%d");
   167 	}
   168 
   169 
   170 // -----------------------------------------------------------------------------
   171 // CDevToneControl::ProcessInit
   172 // -----------------------------------------------------------------------------
   173 //
   174 TInt CDevToneControl::ProcessInit()
   175 	{
   176 	DP_CONTEXT(CDevToneControl::ProcessInit *CD1*, CtxDevSound, DPLOCAL);
   177 	DP_IN();
   178 	PRF(PRF_ID, PRF_START, PRF_TIME, AA_DS_PlayTone, "");
   179 	TInt err(KErrNone);
   180 
   181 	DP1(DLINFO,"iActiveState = %d", iDevAudio->iActiveState);
   182 	switch (iDevAudio->iActiveState)
   183 		{
   184 		case EDevSoundAdaptorInitialised_Initialised:
   185 			{
   186 			if (iDevAudio->IsPrioritySet())
   187 				{
   188 				TAudioTypeSettings priority;
   189 				iDevAudio->GetPrioritySettings(priority);
   190 				err = iDevAudio->iAudioStream->SetAudioType(priority);
   191 				}
   192 			if ( err == KErrNone)
   193 				{
   194 				err = iDevAudio->iAudioStream->Load();
   195 				}
   196 			if ( err == KErrNone)
   197 				{
   198 				err = iDevAudio->CommitAudioContext();
   199 				}
   200 			if(err == KErrNone)
   201 				{
   202 				iDevAudio->iActiveState = EDevSoundAdaptorLoading;
   203 				}
   204 			}
   205 			break;
   206 
   207 		case EDevSoundAdaptorGoingActive:
   208 			{
   209 			//If following condition is false, then we are here because of a
   210 			//pre-emption clash in last Commit cycle started from
   211 			//CDevCommonControl::ContextEventUpdateWithStateEventNoError.
   212 			if(iDevAudio->iPreviousState != EDevSoundAdaptorActivating)
   213 				{
   214 				break;
   215 				}
   216 			//Fall through as required
   217 			}
   218 		case EDevSoundAdaptorPaused_Primed:
   219 		case EDevSoundAdaptorInitialised_Idle:
   220 			{
   221 			//If following condition is true, then we are here because of a
   222 			//pre-emption clash in last Commit cycle started from
   223 			//CDevCommonControl::ContextEventUpdateWithStateEventAndError.
   224 			if(iDevAudio->iPreviousState == EDevSoundAdaptorUnloading)
   225 				{
   226 				err = Unload();
   227 				break;
   228 				}
   229 			DP0(DLINFO, "Already in loaded state");
   230 			err = iDevAudio->RequestGainAndBalance(this);
   231 			if (err==KErrNone)
   232 				{
   233 				err = iDevAudio->iAudioStream->Activate();
   234 				}
   235 			if (err == KErrNone)
   236 				{
   237 				err = iDevAudio->CommitAudioContext();
   238 				}
   239 			if (err == KErrNone)
   240 				{
   241 				iDevAudio->iActiveState = EDevSoundAdaptorActivating;
   242 				}
   243 			break;
   244 			}
   245 		case EDevSoundAdaptorActive_Active:
   246 		default:
   247 			err = KErrNotReady;
   248 			break;
   249 		}
   250 	DP0_RET(err,"%d");
   251 	}
   252 
   253 // -----------------------------------------------------------------------------
   254 // CDevToneControl::ProcessData
   255 // -----------------------------------------------------------------------------
   256 //
   257 void CDevToneControl::ProcessData()
   258 	{
   259 	DP_CONTEXT(CDevToneControl::ProcessData *CD1*, CtxDevSound, DPLOCAL);
   260 	DP_IN();
   261 	DP_OUT();
   262 	}
   263 
   264 // -----------------------------------------------------------------------------
   265 // From class MAudioDataSupplier
   266 // CDevToneControl::BufferToBeFilled
   267 // -----------------------------------------------------------------------------
   268 //
   269 void CDevToneControl::BufferToBeFilled(MMMFBufferSource* aSource, CMMFBuffer* aBuffer)
   270 	{
   271 	DP_CONTEXT(CDevToneControl::BufferToBeFilled *CD1*, CtxDevSound, DPLOCAL);
   272 	DP_IN();
   273 	__ASSERT_ALWAYS(iBufferSource==aSource, CDevAudioControl::Panic(EBufferMismatch));
   274 	TInt err = KErrNone;
   275 	
   276 	CMMFDataBuffer* myBuffer = static_cast<CMMFDataBuffer*> (aBuffer);
   277 	Mem::Copy((TAny*)(myBuffer->Data().Ptr()), (TAny*)(&iToneData), sizeof(TToneData) );
   278 	
   279 	myBuffer->SetLastBuffer(ETrue);
   280 	
   281 	err = iBufferSource->BufferFilled(myBuffer); 
   282 	if ( err != KErrNone)
   283 		{
   284 		iErrorCondition = err;
   285 		Stop();
   286 		}
   287 
   288 	DP_OUT();
   289 	}
   290 
   291 // -----------------------------------------------------------------------------
   292 // From class MAudioDataSupplier
   293 // CDevToneControl::DiscardBuffers
   294 // -----------------------------------------------------------------------------
   295 //
   296 void CDevToneControl::DiscardBuffers(MMMFBufferSource* /*aSource*/)
   297 	{
   298 	DP_CONTEXT(CDevToneControl::DiscardBuffers *CD1*, CtxDevSound, DPLOCAL);
   299 	DP_IN();
   300 	DP_OUT();
   301 	}
   302 
   303 // -----------------------------------------------------------------------------
   304 // CDevToneControl::ProcessingFinished
   305 // -----------------------------------------------------------------------------
   306 //
   307 void CDevToneControl::ProcessingFinished(MAudioStream& /*aStream*/)
   308 	{
   309 	DP_CONTEXT(CDevToneControl::ProcessingFinished *CD1*, CtxDevSound, DPLOCAL);
   310 	DP_IN();
   311 	PRF(PRF_ID, PRF_STOP, PRF_TIME, AA_DS_PlayTone, "");
   312 	
   313 	if(iCallbackFromAdaptor == KCallbackNone)
   314 		{
   315 		iCallbackFromAdaptor = KCallbackProcessingFinished;
   316 		iAdaptationObserver->CallbackFromAdaptorReceived(KCallbackProcessingFinished, KErrNone);
   317 		}
   318 	else
   319 		{
   320 		// Multiple callbacks from adaptor
   321 		DP0(DLERR, "Multiple callbacks from adaptor");
   322 		}
   323 	DP_OUT();
   324 	}
   325 
   326 // -----------------------------------------------------------------------------
   327 // CDevToneControl::SetToneData
   328 // -----------------------------------------------------------------------------
   329 //
   330 TInt CDevToneControl::SetToneData(TToneData& aToneData)
   331 	{
   332 	DP_CONTEXT(CDevToneControl::SetToneData *CD1*, CtxDevSound, DPLOCAL);
   333 	DP_IN();
   334 
   335 	iToneData = aToneData;
   336 
   337 	DP0_RET(KErrNone, "%d");
   338 	}
   339 
   340 
   341 // -----------------------------------------------------------------------------
   342 // CDevToneControl::FinishWithError
   343 // -----------------------------------------------------------------------------
   344 //
   345 void CDevToneControl::FinishWithError(TInt aError) // from CDevCommonControl
   346     {
   347     iAdaptationObserver->ToneFinished(aError);
   348     }
   349 
   350 
   351 // -----------------------------------------------------------------------------
   352 // CDevPlayControl::ProcessingFinishedReceived
   353 // -----------------------------------------------------------------------------
   354 //
   355 TInt CDevToneControl::ProcessingFinishedReceived(TBool& asyncOperation)
   356 	{
   357 	DP_CONTEXT(CDevToneControl::ProcessingFinishedReceived *CD1*, CtxDevSound, DPLOCAL);
   358 	DP_IN();
   359 	asyncOperation = EFalse;
   360 	TInt err = iDevAudio->iAudioStream->Stop();
   361 	if ( err == KErrNone)
   362 		{
   363 		err = iDevAudio->CommitAudioContext();
   364 		if(err == KErrNone)
   365 			{
   366 			iDevAudio->iActiveState = EDevSoundAdaptorStopping;
   367 			asyncOperation = ETrue;
   368 			}
   369 		}
   370 	// Something was wrong, clear the flag.
   371 	if (err != KErrNone)
   372 		{
   373 		iCallbackFromAdaptor = KCallbackNone;
   374 		}
   375 	DP0_RET(err,"%d");
   376 	}
   377 
   378 // ---------------------------------------------------------------------------
   379 // CDevToneControl::ProcessingError
   380 // ---------------------------------------------------------------------------
   381 TInt CDevToneControl::ProcessingError(TBool& aAyncOperation)
   382     {
   383     TInt err = ProcessingFinishedReceived(aAyncOperation);
   384     return err;
   385     }
   386 // End of file