os/mm/devsoundextensions/effects/AudioEqualizer/AudioEqualizerMessageHandler/src/AudioEqualizerMessageHandler.cpp
author sl
Tue, 10 Jun 2014 14:32:02 +0200
changeset 1 260cb5ec6c19
permissions -rw-r--r--
Update contrib.
     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:   Implementation of the AudioEqualizer effect message handler class.
    15 *
    16 */
    17 
    18 
    19 
    20 // INCLUDE FILES
    21 #include "AudioEqualizerMessageHandler.h"
    22 #include "AudioEqualizerMessageTypes.h"
    23 #include <AudioEqualizerBase.h>
    24 #include "EffectDataQueItem.h"
    25 #ifdef _DEBUG
    26 #include <e32svr.h>
    27 #endif
    28 
    29 // ================= MEMBER FUNCTIONS =======================
    30 
    31 // C++ default constructor can NOT contain any code, that
    32 // might leave.
    33 //
    34 CAudioEqualizerMessageHandler::CAudioEqualizerMessageHandler(
    35 	CAudioEqualizer* aAudioEqualizer )
    36     :	CMMFObject(KUidAudioEqualizerEffect),
    37     	iAudioEqualizer(NULL),
    38     	iMessage(NULL),
    39     	iRegistered(EFalse),
    40     	iEffectDataQue(NULL)
    41     {
    42     iAudioEqualizer = aAudioEqualizer;
    43     }
    44 
    45 
    46 EXPORT_C CAudioEqualizerMessageHandler* CAudioEqualizerMessageHandler::NewL(
    47 	TAny* aCustomInterface )
    48     {
    49     CAudioEqualizer* audioEqualizer = (CAudioEqualizer*)aCustomInterface;
    50     CAudioEqualizerMessageHandler* self = new (ELeave) CAudioEqualizerMessageHandler(audioEqualizer);
    51 	self->ConstructL();
    52     return self;
    53     }
    54 
    55 
    56 // -----------------------------------------------------------------------------
    57 // CAudioEqualizerMessageHandler::ConstructL
    58 // Symbian 2nd phase constructor can leave.
    59 // Create and initializes the effect data queue.
    60 // -----------------------------------------------------------------------------
    61 //
    62 void CAudioEqualizerMessageHandler::ConstructL()
    63 	{
    64 	iEffectDataQue = new(ELeave) TSglQue<CEffectDataQueItem>(_FOFF(CEffectDataQueItem, iLink));
    65 	}
    66 
    67 
    68 // -----------------------------------------------------------------------------
    69 // CAudioEqualizerMessageHandler::~CAudioEqualizerMessageHandler
    70 // Before going away, unregister with the CI AudioEqualizer object.
    71 // The observation message must be completed if outstanding.
    72 // The effect data queue must be emptied and destroyed.
    73 // -----------------------------------------------------------------------------
    74 //
    75 CAudioEqualizerMessageHandler::~CAudioEqualizerMessageHandler()
    76 	{
    77 
    78 #ifdef _DEBUG
    79     RDebug::Print(_L("CAudioEqualizerMessageHandler::~CAudioEqualizerMessageHandler"));
    80 #endif
    81 
    82     if(iAudioEqualizer)
    83 	    iAudioEqualizer->UnRegisterObserver(*this);
    84 	iRegistered = EFalse;
    85 
    86 	if(iMessage)
    87 	{
    88 		if ( !iMessage->IsCompleted() )
    89 			{
    90 			iMessage->Complete(KErrCancel);
    91 			delete iMessage;
    92 			}
    93 	}
    94 
    95     if ( iEffectDataQue )
    96         {
    97         CEffectDataQueItem* queItem;
    98         while ( !iEffectDataQue->IsEmpty() )
    99             {
   100             queItem = iEffectDataQue->First();
   101             iEffectDataQue->Remove(*queItem);
   102             delete queItem;
   103             }
   104 
   105         delete iEffectDataQue;
   106         }
   107 
   108     delete iAudioEqualizer;
   109 
   110 	}
   111 
   112 
   113 // ---------------------------------------------------------
   114 // CAudioEqualizerMessageHandler::HandleRequest
   115 // (other items were commented in a header).
   116 // ---------------------------------------------------------
   117 //
   118 void CAudioEqualizerMessageHandler::HandleRequest(
   119 	TMMFMessage& aMessage )
   120 	{
   121 	ASSERT(aMessage.Destination().InterfaceId() == KUidAudioEqualizerEffect);
   122 	TRAPD(error,DoHandleRequestL(aMessage));
   123 	if ( error )
   124 		{
   125 		aMessage.Complete(error);
   126 		}
   127 	}
   128 
   129 // ---------------------------------------------------------
   130 // CAudioEqualizerMessageHandler::DoHandleRequestL
   131 // Dispatches the message to the appropriate handler.
   132 // ---------------------------------------------------------
   133 //
   134 void CAudioEqualizerMessageHandler::DoHandleRequestL(
   135 	TMMFMessage& aMessage )
   136 	{
   137 	switch( aMessage.Function() )
   138 		{
   139 		case EAefInitialize:
   140 			{
   141 			DoInitializeL(aMessage);
   142 			break;
   143 			}
   144 		case EAefInitializeBand:
   145 			{
   146 			DoInitializeBandL(aMessage);
   147 			break;
   148 			}
   149 		case EAefGetNumberOfBands:
   150 			{
   151 			DoGetNumberOfBandsL(aMessage);
   152 			break;
   153 			}
   154 		case EAefApply:
   155 			{
   156 			DoApplyL(aMessage);
   157 			break;
   158 			}
   159 		case EAefApplyBand:
   160 			{
   161 			DoApplyBandL(aMessage);
   162 			break;
   163 			}
   164 		case EAefObserve:
   165 			{
   166 			DoObserveL(aMessage);
   167 			break;
   168 			}
   169 		default:
   170 			{
   171 			aMessage.Complete(KErrNotSupported);
   172 			}
   173 		}
   174 	}
   175 
   176 // ---------------------------------------------------------
   177 // CAudioEqualizerMessageHandler::DoInitializeL
   178 // ---------------------------------------------------------
   179 //
   180 void CAudioEqualizerMessageHandler::DoInitializeL(TMMFMessage& aMessage)
   181 	{
   182 #ifdef _DEBUG
   183     RDebug::Print(_L("CAudioEqualizerMessageHandler::DoInitializeL"));
   184 #endif
   185 	aMessage.WriteDataToClient(iAudioEqualizer->DoEffectData());
   186 	aMessage.Complete(KErrNone);
   187 	}
   188 
   189 // ---------------------------------------------------------
   190 // CAudioEqualizerMessageHandler::DoInitializeBandL
   191 // ---------------------------------------------------------
   192 //
   193 void CAudioEqualizerMessageHandler::DoInitializeBandL(TMMFMessage& aMessage)
   194 	{
   195 #ifdef _DEBUG
   196     RDebug::Print(_L("CAudioEqualizerMessageHandler::DoInitializeBandL"));
   197 #endif
   198 	TUint8 band = 0;
   199 	TPckgBuf<TUint8> bandPckg;
   200     aMessage.ReadData1FromClient(bandPckg);
   201     band = bandPckg();
   202 	aMessage.WriteDataToClient(iAudioEqualizer->DoBandDataL(band, EFalse));
   203 	aMessage.Complete(KErrNone);
   204 	}
   205 
   206 // ---------------------------------------------------------
   207 // CAudioEqualizerMessageHandler::DoGetNumberOfBandsL
   208 // ---------------------------------------------------------
   209 //
   210 void CAudioEqualizerMessageHandler::DoGetNumberOfBandsL(TMMFMessage& aMessage)
   211 	{
   212 #ifdef _DEBUG
   213     RDebug::Print(_L("CAudioEqualizerMessageHandler::DoGetNumberOfBandsL"));
   214 #endif
   215 	TUint8 band = iAudioEqualizer->NumberOfBands();
   216 	TPckgBuf<TUint8> bandPckg(band);
   217 	aMessage.WriteDataToClient(bandPckg);
   218 	aMessage.Complete(KErrNone);
   219 	}
   220 
   221 // ---------------------------------------------------------
   222 // CAudioEqualizerMessageHandler::DoApplyL
   223 // Extracts the data from the message. The client AudioEqualizer
   224 // data is applied to the CI AudioEqualizer object.
   225 // ---------------------------------------------------------
   226 //
   227 void CAudioEqualizerMessageHandler::DoApplyL(
   228 	TMMFMessage& aMessage )
   229 	{
   230 #ifdef _DEBUG
   231     RDebug::Print(_L("CAudioEqualizerMessageHandler::DoApplyL"));
   232 #endif
   233     TEfAudioEqualizerDataPckg audioEqualizerPckgFromClient;
   234     aMessage.ReadData1FromClient(audioEqualizerPckgFromClient);
   235 	iAudioEqualizer->SetEffectData(audioEqualizerPckgFromClient);
   236 //	iAudioEqualizer->ApplyL();
   237 	aMessage.Complete(KErrNone);
   238 	}
   239 
   240 // ---------------------------------------------------------
   241 // CAudioEqualizerMessageHandler::DoApplyBandL
   242 // Extracts the data from the message. The client Audio Equalizer
   243 // band data is applied to the CI AudioEqualizer object.
   244 // ---------------------------------------------------------
   245 //
   246 void CAudioEqualizerMessageHandler::DoApplyBandL(
   247 	TMMFMessage& aMessage )
   248 	{
   249 #ifdef _DEBUG
   250     RDebug::Print(_L("CAudioEqualizerMessageHandler::DoApplyBandL"));
   251 #endif
   252     TEfAudioEqualizerBandDataPckg audioEqualizerBandDataPckgFromClient;
   253     HBufC8* bandDataBuf = HBufC8::NewL(iAudioEqualizer->NumberOfBands() * sizeof(TEfAudioEqualizerBand));
   254 	TPtr8 des = bandDataBuf->Des();
   255 	des.SetLength(bandDataBuf->Size());
   256 
   257 	aMessage.ReadData1FromClient(des);
   258     //aMessage.ReadData1FromClient(audioEqualizerBandDataPckgFromClient);
   259 	//iAudioEqualizer->SetBandDataL(1,audioEqualizerBandDataPckgFromClient);
   260 	iAudioEqualizer->SetBandDataL(2,des);
   261 	delete bandDataBuf;
   262 	iAudioEqualizer->ApplyL();
   263 	aMessage.Complete(KErrNone);
   264 	}
   265 // ---------------------------------------------------------
   266 // CAudioEqualizerMessageHandler::DoObserveL
   267 // Receives the observation request message and depending
   268 // on the status of the effect data queue, the message is
   269 // completed immediately or saved for later completion.
   270 // ---------------------------------------------------------
   271 //
   272 void CAudioEqualizerMessageHandler::DoObserveL(
   273 	TMMFMessage& aMessage )
   274 	{
   275 
   276 #ifdef _DEBUG
   277     RDebug::Print(_L("CAudioEqualizerMessageHandler::DoObserveL"));
   278 #endif
   279 
   280 	if ( !iRegistered )
   281 		{
   282 		iAudioEqualizer->RegisterObserverL(*this);
   283 		iRegistered = ETrue;
   284 		}
   285 
   286 	if ( iEffectDataQue->IsEmpty() )
   287 		{
   288 		//iMessage = &aMessage;
   289 		iMessage = new(ELeave) TMMFMessage(aMessage);
   290 		}
   291 	else
   292 		{
   293 		TEfAudioEqualizerCombinedDataPckg dataPckg;
   294 		CEffectDataQueItem* item = iEffectDataQue->First();
   295 		dataPckg.Copy(item->EffectData());
   296 		aMessage.WriteDataToClient(dataPckg);
   297 		aMessage.Complete(KErrNone);
   298 		iEffectDataQue->Remove(*item);
   299 		delete item;
   300 		}
   301 	}
   302 
   303 // ---------------------------------------------------------
   304 // CAudioEqualizerMessageHandler::EffectChanged
   305 // The CI AudioEqualizer object has changed state.
   306 // The observation message is completed if no data has been
   307 // queued up. Otherwise, the CI AudioEqualizer object's data is
   308 // packaged and queued.
   309 // ---------------------------------------------------------
   310 //
   311 void CAudioEqualizerMessageHandler::EffectChanged(
   312 	const CAudioEffect* aAudioEffect,
   313 	TUint8 aEvent )
   314 	{
   315 #ifdef _DEBUG
   316     RDebug::Print(_L("CAudioEqualizerMessageHandler::EffectChanged"));
   317 #endif
   318 
   319 	TEfAudioEqualizerCombined data;
   320 	data.iAudioEqualizerDataValid = EFalse;
   321 	data.iAudioEqualizerBandDataValid = EFalse;
   322 
   323 	if ( aEvent < MAudioEffectObserver::KSpecificEffectBase )
   324 		{
   325 		data.iEnabled = ((CAudioEqualizer*)aAudioEffect)->IsEnabled();
   326 		data.iHaveUpdateRights = ((CAudioEqualizer*)aAudioEffect)->HaveUpdateRights();
   327 		data.iEnforced = ((CAudioEqualizer*)aAudioEffect)->IsEnforced();
   328 		data.iAudioEqualizerDataValid = ETrue;
   329 		}
   330 	else
   331 		{
   332 		TUint8 band = aEvent - MAudioEffectObserver::KSpecificEffectBase;
   333 		data.iBandId = band;
   334 		data.iBandLevel = ((CAudioEqualizer*)aAudioEffect)->BandLevel(band);
   335 		data.iBandWidth = ((CAudioEqualizer*)aAudioEffect)->BandWidth(band);
   336 		data.iCenterFrequency = ((CAudioEqualizer*)aAudioEffect)->CenterFrequency(band);
   337 		data.iCrossoverFrequency = ((CAudioEqualizer*)aAudioEffect)->CrossoverFrequency(band);
   338 		data.iAudioEqualizerBandDataValid = ETrue;
   339 		}
   340 
   341 	TEfAudioEqualizerCombinedDataPckg dataPckg(data);
   342 
   343 	if ( iMessage && !iMessage->IsCompleted() && iEffectDataQue->IsEmpty() )
   344 		{
   345 		iMessage->WriteDataToClient(dataPckg);
   346 		iMessage->Complete(KErrNone);
   347 		delete iMessage;
   348 		iMessage = NULL;
   349 		}
   350 	else
   351 		{
   352 		// Saves the data and complete an observation message next time around.
   353 		HBufC8* data = NULL;
   354 		TRAPD(err1,data = dataPckg.AllocL());
   355 		if(!err1)
   356 			{
   357 				//CleanupStack::PushL(data);
   358 				CEffectDataQueItem* item = NULL;
   359 				TRAPD(err2,item = CEffectDataQueItem::NewL(data));
   360 				if(!err2)
   361 				{
   362 					iEffectDataQue->AddLast(*item);
   363 				}
   364 				else
   365 				{
   366 					delete data;
   367 				}
   368 			}
   369 		else
   370 			{
   371 #ifdef _DEBUG
   372 				RDebug::Print(_L("CAudioEqualizerMessageHandler::EffectChanged Error Allocating Memory %d"),err1);
   373 #endif
   374 			}
   375 		}
   376 
   377 	}
   378 
   379 
   380 // ========================== OTHER EXPORTED FUNCTIONS =========================
   381 
   382 
   383 
   384 // End of File