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