os/mm/devsoundextensions/effects/AudioEqualizer/AudioEqualizerMessageHandler/src/AudioEqualizerMessageHandler.cpp
1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
1.2 +++ b/os/mm/devsoundextensions/effects/AudioEqualizer/AudioEqualizerMessageHandler/src/AudioEqualizerMessageHandler.cpp Fri Jun 15 03:10:57 2012 +0200
1.3 @@ -0,0 +1,384 @@
1.4 +/*
1.5 +* Copyright (c) 2004 Nokia Corporation and/or its subsidiary(-ies).
1.6 +* All rights reserved.
1.7 +* This component and the accompanying materials are made available
1.8 +* under the terms of "Eclipse Public License v1.0"
1.9 +* which accompanies this distribution, and is available
1.10 +* at the URL "http://www.eclipse.org/legal/epl-v10.html".
1.11 +*
1.12 +* Initial Contributors:
1.13 +* Nokia Corporation - initial contribution.
1.14 +*
1.15 +* Contributors:
1.16 +*
1.17 +* Description: Implementation of the AudioEqualizer effect message handler class.
1.18 +*
1.19 +*/
1.20 +
1.21 +
1.22 +
1.23 +// INCLUDE FILES
1.24 +#include "AudioEqualizerMessageHandler.h"
1.25 +#include "AudioEqualizerMessageTypes.h"
1.26 +#include <AudioEqualizerBase.h>
1.27 +#include "EffectDataQueItem.h"
1.28 +#ifdef _DEBUG
1.29 +#include <e32svr.h>
1.30 +#endif
1.31 +
1.32 +// ================= MEMBER FUNCTIONS =======================
1.33 +
1.34 +// C++ default constructor can NOT contain any code, that
1.35 +// might leave.
1.36 +//
1.37 +CAudioEqualizerMessageHandler::CAudioEqualizerMessageHandler(
1.38 + CAudioEqualizer* aAudioEqualizer )
1.39 + : CMMFObject(KUidAudioEqualizerEffect),
1.40 + iAudioEqualizer(NULL),
1.41 + iMessage(NULL),
1.42 + iRegistered(EFalse),
1.43 + iEffectDataQue(NULL)
1.44 + {
1.45 + iAudioEqualizer = aAudioEqualizer;
1.46 + }
1.47 +
1.48 +
1.49 +EXPORT_C CAudioEqualizerMessageHandler* CAudioEqualizerMessageHandler::NewL(
1.50 + TAny* aCustomInterface )
1.51 + {
1.52 + CAudioEqualizer* audioEqualizer = (CAudioEqualizer*)aCustomInterface;
1.53 + CAudioEqualizerMessageHandler* self = new (ELeave) CAudioEqualizerMessageHandler(audioEqualizer);
1.54 + self->ConstructL();
1.55 + return self;
1.56 + }
1.57 +
1.58 +
1.59 +// -----------------------------------------------------------------------------
1.60 +// CAudioEqualizerMessageHandler::ConstructL
1.61 +// Symbian 2nd phase constructor can leave.
1.62 +// Create and initializes the effect data queue.
1.63 +// -----------------------------------------------------------------------------
1.64 +//
1.65 +void CAudioEqualizerMessageHandler::ConstructL()
1.66 + {
1.67 + iEffectDataQue = new(ELeave) TSglQue<CEffectDataQueItem>(_FOFF(CEffectDataQueItem, iLink));
1.68 + }
1.69 +
1.70 +
1.71 +// -----------------------------------------------------------------------------
1.72 +// CAudioEqualizerMessageHandler::~CAudioEqualizerMessageHandler
1.73 +// Before going away, unregister with the CI AudioEqualizer object.
1.74 +// The observation message must be completed if outstanding.
1.75 +// The effect data queue must be emptied and destroyed.
1.76 +// -----------------------------------------------------------------------------
1.77 +//
1.78 +CAudioEqualizerMessageHandler::~CAudioEqualizerMessageHandler()
1.79 + {
1.80 +
1.81 +#ifdef _DEBUG
1.82 + RDebug::Print(_L("CAudioEqualizerMessageHandler::~CAudioEqualizerMessageHandler"));
1.83 +#endif
1.84 +
1.85 + if(iAudioEqualizer)
1.86 + iAudioEqualizer->UnRegisterObserver(*this);
1.87 + iRegistered = EFalse;
1.88 +
1.89 + if(iMessage)
1.90 + {
1.91 + if ( !iMessage->IsCompleted() )
1.92 + {
1.93 + iMessage->Complete(KErrCancel);
1.94 + delete iMessage;
1.95 + }
1.96 + }
1.97 +
1.98 + if ( iEffectDataQue )
1.99 + {
1.100 + CEffectDataQueItem* queItem;
1.101 + while ( !iEffectDataQue->IsEmpty() )
1.102 + {
1.103 + queItem = iEffectDataQue->First();
1.104 + iEffectDataQue->Remove(*queItem);
1.105 + delete queItem;
1.106 + }
1.107 +
1.108 + delete iEffectDataQue;
1.109 + }
1.110 +
1.111 + delete iAudioEqualizer;
1.112 +
1.113 + }
1.114 +
1.115 +
1.116 +// ---------------------------------------------------------
1.117 +// CAudioEqualizerMessageHandler::HandleRequest
1.118 +// (other items were commented in a header).
1.119 +// ---------------------------------------------------------
1.120 +//
1.121 +void CAudioEqualizerMessageHandler::HandleRequest(
1.122 + TMMFMessage& aMessage )
1.123 + {
1.124 + ASSERT(aMessage.Destination().InterfaceId() == KUidAudioEqualizerEffect);
1.125 + TRAPD(error,DoHandleRequestL(aMessage));
1.126 + if ( error )
1.127 + {
1.128 + aMessage.Complete(error);
1.129 + }
1.130 + }
1.131 +
1.132 +// ---------------------------------------------------------
1.133 +// CAudioEqualizerMessageHandler::DoHandleRequestL
1.134 +// Dispatches the message to the appropriate handler.
1.135 +// ---------------------------------------------------------
1.136 +//
1.137 +void CAudioEqualizerMessageHandler::DoHandleRequestL(
1.138 + TMMFMessage& aMessage )
1.139 + {
1.140 + switch( aMessage.Function() )
1.141 + {
1.142 + case EAefInitialize:
1.143 + {
1.144 + DoInitializeL(aMessage);
1.145 + break;
1.146 + }
1.147 + case EAefInitializeBand:
1.148 + {
1.149 + DoInitializeBandL(aMessage);
1.150 + break;
1.151 + }
1.152 + case EAefGetNumberOfBands:
1.153 + {
1.154 + DoGetNumberOfBandsL(aMessage);
1.155 + break;
1.156 + }
1.157 + case EAefApply:
1.158 + {
1.159 + DoApplyL(aMessage);
1.160 + break;
1.161 + }
1.162 + case EAefApplyBand:
1.163 + {
1.164 + DoApplyBandL(aMessage);
1.165 + break;
1.166 + }
1.167 + case EAefObserve:
1.168 + {
1.169 + DoObserveL(aMessage);
1.170 + break;
1.171 + }
1.172 + default:
1.173 + {
1.174 + aMessage.Complete(KErrNotSupported);
1.175 + }
1.176 + }
1.177 + }
1.178 +
1.179 +// ---------------------------------------------------------
1.180 +// CAudioEqualizerMessageHandler::DoInitializeL
1.181 +// ---------------------------------------------------------
1.182 +//
1.183 +void CAudioEqualizerMessageHandler::DoInitializeL(TMMFMessage& aMessage)
1.184 + {
1.185 +#ifdef _DEBUG
1.186 + RDebug::Print(_L("CAudioEqualizerMessageHandler::DoInitializeL"));
1.187 +#endif
1.188 + aMessage.WriteDataToClient(iAudioEqualizer->DoEffectData());
1.189 + aMessage.Complete(KErrNone);
1.190 + }
1.191 +
1.192 +// ---------------------------------------------------------
1.193 +// CAudioEqualizerMessageHandler::DoInitializeBandL
1.194 +// ---------------------------------------------------------
1.195 +//
1.196 +void CAudioEqualizerMessageHandler::DoInitializeBandL(TMMFMessage& aMessage)
1.197 + {
1.198 +#ifdef _DEBUG
1.199 + RDebug::Print(_L("CAudioEqualizerMessageHandler::DoInitializeBandL"));
1.200 +#endif
1.201 + TUint8 band = 0;
1.202 + TPckgBuf<TUint8> bandPckg;
1.203 + aMessage.ReadData1FromClient(bandPckg);
1.204 + band = bandPckg();
1.205 + aMessage.WriteDataToClient(iAudioEqualizer->DoBandDataL(band, EFalse));
1.206 + aMessage.Complete(KErrNone);
1.207 + }
1.208 +
1.209 +// ---------------------------------------------------------
1.210 +// CAudioEqualizerMessageHandler::DoGetNumberOfBandsL
1.211 +// ---------------------------------------------------------
1.212 +//
1.213 +void CAudioEqualizerMessageHandler::DoGetNumberOfBandsL(TMMFMessage& aMessage)
1.214 + {
1.215 +#ifdef _DEBUG
1.216 + RDebug::Print(_L("CAudioEqualizerMessageHandler::DoGetNumberOfBandsL"));
1.217 +#endif
1.218 + TUint8 band = iAudioEqualizer->NumberOfBands();
1.219 + TPckgBuf<TUint8> bandPckg(band);
1.220 + aMessage.WriteDataToClient(bandPckg);
1.221 + aMessage.Complete(KErrNone);
1.222 + }
1.223 +
1.224 +// ---------------------------------------------------------
1.225 +// CAudioEqualizerMessageHandler::DoApplyL
1.226 +// Extracts the data from the message. The client AudioEqualizer
1.227 +// data is applied to the CI AudioEqualizer object.
1.228 +// ---------------------------------------------------------
1.229 +//
1.230 +void CAudioEqualizerMessageHandler::DoApplyL(
1.231 + TMMFMessage& aMessage )
1.232 + {
1.233 +#ifdef _DEBUG
1.234 + RDebug::Print(_L("CAudioEqualizerMessageHandler::DoApplyL"));
1.235 +#endif
1.236 + TEfAudioEqualizerDataPckg audioEqualizerPckgFromClient;
1.237 + aMessage.ReadData1FromClient(audioEqualizerPckgFromClient);
1.238 + iAudioEqualizer->SetEffectData(audioEqualizerPckgFromClient);
1.239 +// iAudioEqualizer->ApplyL();
1.240 + aMessage.Complete(KErrNone);
1.241 + }
1.242 +
1.243 +// ---------------------------------------------------------
1.244 +// CAudioEqualizerMessageHandler::DoApplyBandL
1.245 +// Extracts the data from the message. The client Audio Equalizer
1.246 +// band data is applied to the CI AudioEqualizer object.
1.247 +// ---------------------------------------------------------
1.248 +//
1.249 +void CAudioEqualizerMessageHandler::DoApplyBandL(
1.250 + TMMFMessage& aMessage )
1.251 + {
1.252 +#ifdef _DEBUG
1.253 + RDebug::Print(_L("CAudioEqualizerMessageHandler::DoApplyBandL"));
1.254 +#endif
1.255 + TEfAudioEqualizerBandDataPckg audioEqualizerBandDataPckgFromClient;
1.256 + HBufC8* bandDataBuf = HBufC8::NewL(iAudioEqualizer->NumberOfBands() * sizeof(TEfAudioEqualizerBand));
1.257 + TPtr8 des = bandDataBuf->Des();
1.258 + des.SetLength(bandDataBuf->Size());
1.259 +
1.260 + aMessage.ReadData1FromClient(des);
1.261 + //aMessage.ReadData1FromClient(audioEqualizerBandDataPckgFromClient);
1.262 + //iAudioEqualizer->SetBandDataL(1,audioEqualizerBandDataPckgFromClient);
1.263 + iAudioEqualizer->SetBandDataL(2,des);
1.264 + delete bandDataBuf;
1.265 + iAudioEqualizer->ApplyL();
1.266 + aMessage.Complete(KErrNone);
1.267 + }
1.268 +// ---------------------------------------------------------
1.269 +// CAudioEqualizerMessageHandler::DoObserveL
1.270 +// Receives the observation request message and depending
1.271 +// on the status of the effect data queue, the message is
1.272 +// completed immediately or saved for later completion.
1.273 +// ---------------------------------------------------------
1.274 +//
1.275 +void CAudioEqualizerMessageHandler::DoObserveL(
1.276 + TMMFMessage& aMessage )
1.277 + {
1.278 +
1.279 +#ifdef _DEBUG
1.280 + RDebug::Print(_L("CAudioEqualizerMessageHandler::DoObserveL"));
1.281 +#endif
1.282 +
1.283 + if ( !iRegistered )
1.284 + {
1.285 + iAudioEqualizer->RegisterObserverL(*this);
1.286 + iRegistered = ETrue;
1.287 + }
1.288 +
1.289 + if ( iEffectDataQue->IsEmpty() )
1.290 + {
1.291 + //iMessage = &aMessage;
1.292 + iMessage = new(ELeave) TMMFMessage(aMessage);
1.293 + }
1.294 + else
1.295 + {
1.296 + TEfAudioEqualizerCombinedDataPckg dataPckg;
1.297 + CEffectDataQueItem* item = iEffectDataQue->First();
1.298 + dataPckg.Copy(item->EffectData());
1.299 + aMessage.WriteDataToClient(dataPckg);
1.300 + aMessage.Complete(KErrNone);
1.301 + iEffectDataQue->Remove(*item);
1.302 + delete item;
1.303 + }
1.304 + }
1.305 +
1.306 +// ---------------------------------------------------------
1.307 +// CAudioEqualizerMessageHandler::EffectChanged
1.308 +// The CI AudioEqualizer object has changed state.
1.309 +// The observation message is completed if no data has been
1.310 +// queued up. Otherwise, the CI AudioEqualizer object's data is
1.311 +// packaged and queued.
1.312 +// ---------------------------------------------------------
1.313 +//
1.314 +void CAudioEqualizerMessageHandler::EffectChanged(
1.315 + const CAudioEffect* aAudioEffect,
1.316 + TUint8 aEvent )
1.317 + {
1.318 +#ifdef _DEBUG
1.319 + RDebug::Print(_L("CAudioEqualizerMessageHandler::EffectChanged"));
1.320 +#endif
1.321 +
1.322 + TEfAudioEqualizerCombined data;
1.323 + data.iAudioEqualizerDataValid = EFalse;
1.324 + data.iAudioEqualizerBandDataValid = EFalse;
1.325 +
1.326 + if ( aEvent < MAudioEffectObserver::KSpecificEffectBase )
1.327 + {
1.328 + data.iEnabled = ((CAudioEqualizer*)aAudioEffect)->IsEnabled();
1.329 + data.iHaveUpdateRights = ((CAudioEqualizer*)aAudioEffect)->HaveUpdateRights();
1.330 + data.iEnforced = ((CAudioEqualizer*)aAudioEffect)->IsEnforced();
1.331 + data.iAudioEqualizerDataValid = ETrue;
1.332 + }
1.333 + else
1.334 + {
1.335 + TUint8 band = aEvent - MAudioEffectObserver::KSpecificEffectBase;
1.336 + data.iBandId = band;
1.337 + data.iBandLevel = ((CAudioEqualizer*)aAudioEffect)->BandLevel(band);
1.338 + data.iBandWidth = ((CAudioEqualizer*)aAudioEffect)->BandWidth(band);
1.339 + data.iCenterFrequency = ((CAudioEqualizer*)aAudioEffect)->CenterFrequency(band);
1.340 + data.iCrossoverFrequency = ((CAudioEqualizer*)aAudioEffect)->CrossoverFrequency(band);
1.341 + data.iAudioEqualizerBandDataValid = ETrue;
1.342 + }
1.343 +
1.344 + TEfAudioEqualizerCombinedDataPckg dataPckg(data);
1.345 +
1.346 + if ( iMessage && !iMessage->IsCompleted() && iEffectDataQue->IsEmpty() )
1.347 + {
1.348 + iMessage->WriteDataToClient(dataPckg);
1.349 + iMessage->Complete(KErrNone);
1.350 + delete iMessage;
1.351 + iMessage = NULL;
1.352 + }
1.353 + else
1.354 + {
1.355 + // Saves the data and complete an observation message next time around.
1.356 + HBufC8* data = NULL;
1.357 + TRAPD(err1,data = dataPckg.AllocL());
1.358 + if(!err1)
1.359 + {
1.360 + //CleanupStack::PushL(data);
1.361 + CEffectDataQueItem* item = NULL;
1.362 + TRAPD(err2,item = CEffectDataQueItem::NewL(data));
1.363 + if(!err2)
1.364 + {
1.365 + iEffectDataQue->AddLast(*item);
1.366 + }
1.367 + else
1.368 + {
1.369 + delete data;
1.370 + }
1.371 + }
1.372 + else
1.373 + {
1.374 +#ifdef _DEBUG
1.375 + RDebug::Print(_L("CAudioEqualizerMessageHandler::EffectChanged Error Allocating Memory %d"),err1);
1.376 +#endif
1.377 + }
1.378 + }
1.379 +
1.380 + }
1.381 +
1.382 +
1.383 +// ========================== OTHER EXPORTED FUNCTIONS =========================
1.384 +
1.385 +
1.386 +
1.387 +// End of File