os/mm/devsoundextensions/effects/AudioEqualizer/AudioEqualizerMessageHandler/src/AudioEqualizerMessageHandler.cpp
First public contribution.
2 * Copyright (c) 2004 Nokia Corporation and/or its subsidiary(-ies).
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".
9 * Initial Contributors:
10 * Nokia Corporation - initial contribution.
14 * Description: Implementation of the AudioEqualizer effect message handler class.
21 #include "AudioEqualizerMessageHandler.h"
22 #include "AudioEqualizerMessageTypes.h"
23 #include <AudioEqualizerBase.h>
24 #include "EffectDataQueItem.h"
29 // ================= MEMBER FUNCTIONS =======================
31 // C++ default constructor can NOT contain any code, that
34 CAudioEqualizerMessageHandler::CAudioEqualizerMessageHandler(
35 CAudioEqualizer* aAudioEqualizer )
36 : CMMFObject(KUidAudioEqualizerEffect),
37 iAudioEqualizer(NULL),
42 iAudioEqualizer = aAudioEqualizer;
46 EXPORT_C CAudioEqualizerMessageHandler* CAudioEqualizerMessageHandler::NewL(
47 TAny* aCustomInterface )
49 CAudioEqualizer* audioEqualizer = (CAudioEqualizer*)aCustomInterface;
50 CAudioEqualizerMessageHandler* self = new (ELeave) CAudioEqualizerMessageHandler(audioEqualizer);
56 // -----------------------------------------------------------------------------
57 // CAudioEqualizerMessageHandler::ConstructL
58 // Symbian 2nd phase constructor can leave.
59 // Create and initializes the effect data queue.
60 // -----------------------------------------------------------------------------
62 void CAudioEqualizerMessageHandler::ConstructL()
64 iEffectDataQue = new(ELeave) TSglQue<CEffectDataQueItem>(_FOFF(CEffectDataQueItem, iLink));
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 // -----------------------------------------------------------------------------
75 CAudioEqualizerMessageHandler::~CAudioEqualizerMessageHandler()
79 RDebug::Print(_L("CAudioEqualizerMessageHandler::~CAudioEqualizerMessageHandler"));
83 iAudioEqualizer->UnRegisterObserver(*this);
88 if ( !iMessage->IsCompleted() )
90 iMessage->Complete(KErrCancel);
97 CEffectDataQueItem* queItem;
98 while ( !iEffectDataQue->IsEmpty() )
100 queItem = iEffectDataQue->First();
101 iEffectDataQue->Remove(*queItem);
105 delete iEffectDataQue;
108 delete iAudioEqualizer;
113 // ---------------------------------------------------------
114 // CAudioEqualizerMessageHandler::HandleRequest
115 // (other items were commented in a header).
116 // ---------------------------------------------------------
118 void CAudioEqualizerMessageHandler::HandleRequest(
119 TMMFMessage& aMessage )
121 ASSERT(aMessage.Destination().InterfaceId() == KUidAudioEqualizerEffect);
122 TRAPD(error,DoHandleRequestL(aMessage));
125 aMessage.Complete(error);
129 // ---------------------------------------------------------
130 // CAudioEqualizerMessageHandler::DoHandleRequestL
131 // Dispatches the message to the appropriate handler.
132 // ---------------------------------------------------------
134 void CAudioEqualizerMessageHandler::DoHandleRequestL(
135 TMMFMessage& aMessage )
137 switch( aMessage.Function() )
141 DoInitializeL(aMessage);
144 case EAefInitializeBand:
146 DoInitializeBandL(aMessage);
149 case EAefGetNumberOfBands:
151 DoGetNumberOfBandsL(aMessage);
161 DoApplyBandL(aMessage);
166 DoObserveL(aMessage);
171 aMessage.Complete(KErrNotSupported);
176 // ---------------------------------------------------------
177 // CAudioEqualizerMessageHandler::DoInitializeL
178 // ---------------------------------------------------------
180 void CAudioEqualizerMessageHandler::DoInitializeL(TMMFMessage& aMessage)
183 RDebug::Print(_L("CAudioEqualizerMessageHandler::DoInitializeL"));
185 aMessage.WriteDataToClient(iAudioEqualizer->DoEffectData());
186 aMessage.Complete(KErrNone);
189 // ---------------------------------------------------------
190 // CAudioEqualizerMessageHandler::DoInitializeBandL
191 // ---------------------------------------------------------
193 void CAudioEqualizerMessageHandler::DoInitializeBandL(TMMFMessage& aMessage)
196 RDebug::Print(_L("CAudioEqualizerMessageHandler::DoInitializeBandL"));
199 TPckgBuf<TUint8> bandPckg;
200 aMessage.ReadData1FromClient(bandPckg);
202 aMessage.WriteDataToClient(iAudioEqualizer->DoBandDataL(band, EFalse));
203 aMessage.Complete(KErrNone);
206 // ---------------------------------------------------------
207 // CAudioEqualizerMessageHandler::DoGetNumberOfBandsL
208 // ---------------------------------------------------------
210 void CAudioEqualizerMessageHandler::DoGetNumberOfBandsL(TMMFMessage& aMessage)
213 RDebug::Print(_L("CAudioEqualizerMessageHandler::DoGetNumberOfBandsL"));
215 TUint8 band = iAudioEqualizer->NumberOfBands();
216 TPckgBuf<TUint8> bandPckg(band);
217 aMessage.WriteDataToClient(bandPckg);
218 aMessage.Complete(KErrNone);
221 // ---------------------------------------------------------
222 // CAudioEqualizerMessageHandler::DoApplyL
223 // Extracts the data from the message. The client AudioEqualizer
224 // data is applied to the CI AudioEqualizer object.
225 // ---------------------------------------------------------
227 void CAudioEqualizerMessageHandler::DoApplyL(
228 TMMFMessage& aMessage )
231 RDebug::Print(_L("CAudioEqualizerMessageHandler::DoApplyL"));
233 TEfAudioEqualizerDataPckg audioEqualizerPckgFromClient;
234 aMessage.ReadData1FromClient(audioEqualizerPckgFromClient);
235 iAudioEqualizer->SetEffectData(audioEqualizerPckgFromClient);
236 // iAudioEqualizer->ApplyL();
237 aMessage.Complete(KErrNone);
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 // ---------------------------------------------------------
246 void CAudioEqualizerMessageHandler::DoApplyBandL(
247 TMMFMessage& aMessage )
250 RDebug::Print(_L("CAudioEqualizerMessageHandler::DoApplyBandL"));
252 TEfAudioEqualizerBandDataPckg audioEqualizerBandDataPckgFromClient;
253 HBufC8* bandDataBuf = HBufC8::NewL(iAudioEqualizer->NumberOfBands() * sizeof(TEfAudioEqualizerBand));
254 TPtr8 des = bandDataBuf->Des();
255 des.SetLength(bandDataBuf->Size());
257 aMessage.ReadData1FromClient(des);
258 //aMessage.ReadData1FromClient(audioEqualizerBandDataPckgFromClient);
259 //iAudioEqualizer->SetBandDataL(1,audioEqualizerBandDataPckgFromClient);
260 iAudioEqualizer->SetBandDataL(2,des);
262 iAudioEqualizer->ApplyL();
263 aMessage.Complete(KErrNone);
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 // ---------------------------------------------------------
272 void CAudioEqualizerMessageHandler::DoObserveL(
273 TMMFMessage& aMessage )
277 RDebug::Print(_L("CAudioEqualizerMessageHandler::DoObserveL"));
282 iAudioEqualizer->RegisterObserverL(*this);
286 if ( iEffectDataQue->IsEmpty() )
288 //iMessage = &aMessage;
289 iMessage = new(ELeave) TMMFMessage(aMessage);
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);
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 // ---------------------------------------------------------
311 void CAudioEqualizerMessageHandler::EffectChanged(
312 const CAudioEffect* aAudioEffect,
316 RDebug::Print(_L("CAudioEqualizerMessageHandler::EffectChanged"));
319 TEfAudioEqualizerCombined data;
320 data.iAudioEqualizerDataValid = EFalse;
321 data.iAudioEqualizerBandDataValid = EFalse;
323 if ( aEvent < MAudioEffectObserver::KSpecificEffectBase )
325 data.iEnabled = ((CAudioEqualizer*)aAudioEffect)->IsEnabled();
326 data.iHaveUpdateRights = ((CAudioEqualizer*)aAudioEffect)->HaveUpdateRights();
327 data.iEnforced = ((CAudioEqualizer*)aAudioEffect)->IsEnforced();
328 data.iAudioEqualizerDataValid = ETrue;
332 TUint8 band = aEvent - MAudioEffectObserver::KSpecificEffectBase;
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;
341 TEfAudioEqualizerCombinedDataPckg dataPckg(data);
343 if ( iMessage && !iMessage->IsCompleted() && iEffectDataQue->IsEmpty() )
345 iMessage->WriteDataToClient(dataPckg);
346 iMessage->Complete(KErrNone);
352 // Saves the data and complete an observation message next time around.
354 TRAPD(err1,data = dataPckg.AllocL());
357 //CleanupStack::PushL(data);
358 CEffectDataQueItem* item = NULL;
359 TRAPD(err2,item = CEffectDataQueItem::NewL(data));
362 iEffectDataQue->AddLast(*item);
372 RDebug::Print(_L("CAudioEqualizerMessageHandler::EffectChanged Error Allocating Memory %d"),err1);
380 // ========================== OTHER EXPORTED FUNCTIONS =========================