devsound/a3fdevsound/src/devsoundadaptor/cdevtonecontrol.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 "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->iAudioContext->Commit();
       
   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->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 			DP0(DLINFO, "Already in loaded state");
       
   210 			err = iDevAudio->RequestGainAndBalance(this);
       
   211 			if (err==KErrNone)
       
   212 				{
       
   213 				err = iDevAudio->iAudioStream->Activate();
       
   214 				}
       
   215 			if (err == KErrNone)
       
   216 				{
       
   217 				err = iDevAudio->iAudioContext->Commit();
       
   218 				}
       
   219 			if (err == KErrNone)
       
   220 				{
       
   221 				iDevAudio->iActiveState = EDevSoundAdaptorActivating;
       
   222 				}
       
   223 			break;
       
   224 		case EDevSoundAdaptorActive_Active:
       
   225 		default:
       
   226 			err = KErrNotReady;
       
   227 			break;
       
   228 		}
       
   229 	DP0_RET(err,"%d");
       
   230 	}
       
   231 
       
   232 // -----------------------------------------------------------------------------
       
   233 // CDevToneControl::ProcessData
       
   234 // -----------------------------------------------------------------------------
       
   235 //
       
   236 void CDevToneControl::ProcessData()
       
   237 	{
       
   238 	DP_CONTEXT(CDevToneControl::ProcessData *CD1*, CtxDevSound, DPLOCAL);
       
   239 	DP_IN();
       
   240 	DP_OUT();
       
   241 	}
       
   242 
       
   243 // -----------------------------------------------------------------------------
       
   244 // From class MAudioDataSupplier
       
   245 // CDevToneControl::BufferToBeFilled
       
   246 // -----------------------------------------------------------------------------
       
   247 //
       
   248 void CDevToneControl::BufferToBeFilled(MMMFBufferSource* aSource, CMMFBuffer* aBuffer)
       
   249 	{
       
   250 	DP_CONTEXT(CDevToneControl::BufferToBeFilled *CD1*, CtxDevSound, DPLOCAL);
       
   251 	DP_IN();
       
   252 	__ASSERT_ALWAYS(iBufferSource==aSource, CDevAudioControl::Panic(EBufferMismatch));
       
   253 	TInt err = KErrNone;
       
   254 	
       
   255 	CMMFDataBuffer* myBuffer = static_cast<CMMFDataBuffer*> (aBuffer);
       
   256 	Mem::Copy((TAny*)(myBuffer->Data().Ptr()), (TAny*)(&iToneData), sizeof(TToneData) );
       
   257 	
       
   258 	myBuffer->SetLastBuffer(ETrue);
       
   259 	
       
   260 	err = iBufferSource->BufferFilled(myBuffer); 
       
   261 	if ( err != KErrNone)
       
   262 		{
       
   263 		iErrorCondition = err;
       
   264 		Stop();
       
   265 		}
       
   266 
       
   267 	DP_OUT();
       
   268 	}
       
   269 
       
   270 // -----------------------------------------------------------------------------
       
   271 // From class MAudioDataSupplier
       
   272 // CDevToneControl::DiscardBuffers
       
   273 // -----------------------------------------------------------------------------
       
   274 //
       
   275 void CDevToneControl::DiscardBuffers(MMMFBufferSource* /*aSource*/)
       
   276 	{
       
   277 	DP_CONTEXT(CDevToneControl::DiscardBuffers *CD1*, CtxDevSound, DPLOCAL);
       
   278 	DP_IN();
       
   279 	DP_OUT();
       
   280 	}
       
   281 
       
   282 // -----------------------------------------------------------------------------
       
   283 // CDevToneControl::ProcessingFinished
       
   284 // -----------------------------------------------------------------------------
       
   285 //
       
   286 void CDevToneControl::ProcessingFinished(MAudioStream& /*aStream*/)
       
   287 	{
       
   288 	DP_CONTEXT(CDevToneControl::ProcessingFinished *CD1*, CtxDevSound, DPLOCAL);
       
   289 	DP_IN();
       
   290 	PRF(PRF_ID, PRF_STOP, PRF_TIME, AA_DS_PlayTone, "");
       
   291 	
       
   292 	if(iCallbackFromAdaptor == KCallbackNone)
       
   293 		{
       
   294 		iCallbackFromAdaptor = KCallbackProcessingFinished;
       
   295 		iAdaptationObserver->CallbackFromAdaptorReceived(KCallbackProcessingFinished, KErrNone);
       
   296 		}
       
   297 	else
       
   298 		{
       
   299 		// Multiple callbacks from adaptor
       
   300 		DP0(DLERR, "Multiple callbacks from adaptor");
       
   301 		}
       
   302 	DP_OUT();
       
   303 	}
       
   304 
       
   305 // -----------------------------------------------------------------------------
       
   306 // CDevToneControl::SetToneData
       
   307 // -----------------------------------------------------------------------------
       
   308 //
       
   309 TInt CDevToneControl::SetToneData(TToneData& aToneData)
       
   310 	{
       
   311 	DP_CONTEXT(CDevToneControl::SetToneData *CD1*, CtxDevSound, DPLOCAL);
       
   312 	DP_IN();
       
   313 
       
   314 	iToneData = aToneData;
       
   315 
       
   316 	DP0_RET(KErrNone, "%d");
       
   317 	}
       
   318 
       
   319 
       
   320 // -----------------------------------------------------------------------------
       
   321 // CDevToneControl::FinishWithError
       
   322 // -----------------------------------------------------------------------------
       
   323 //
       
   324 void CDevToneControl::FinishWithError(TInt aError) // from CDevCommonControl
       
   325     {
       
   326     iAdaptationObserver->ToneFinished(aError);
       
   327     }
       
   328 
       
   329 
       
   330 // -----------------------------------------------------------------------------
       
   331 // CDevPlayControl::ProcessingFinishedReceived
       
   332 // -----------------------------------------------------------------------------
       
   333 //
       
   334 TInt CDevToneControl::ProcessingFinishedReceived(TBool& asyncOperation)
       
   335 	{
       
   336 	DP_CONTEXT(CDevToneControl::ProcessingFinishedReceived *CD1*, CtxDevSound, DPLOCAL);
       
   337 	DP_IN();
       
   338 	asyncOperation = EFalse;
       
   339 	TInt err = iDevAudio->iAudioStream->Stop();
       
   340 	if ( err == KErrNone)
       
   341 		{
       
   342 		err = iDevAudio->iAudioContext->Commit();
       
   343 		if(err == KErrNone)
       
   344 			{
       
   345 			iDevAudio->iActiveState = EDevSoundAdaptorStopping;
       
   346 			asyncOperation = ETrue;
       
   347 			}
       
   348 		}
       
   349 	// Something was wrong, clear the flag.
       
   350 	if (err != KErrNone)
       
   351 		{
       
   352 		iCallbackFromAdaptor = KCallbackNone;
       
   353 		}
       
   354 	DP0_RET(err,"%d");
       
   355 	}
       
   356 
       
   357 // ---------------------------------------------------------------------------
       
   358 // CDevToneControl::ProcessingError
       
   359 // ---------------------------------------------------------------------------
       
   360 TInt CDevToneControl::ProcessingError(TBool& aAyncOperation)
       
   361     {
       
   362     TInt err = ProcessingFinishedReceived(aAyncOperation);
       
   363     return err;
       
   364     }
       
   365 // End of file