os/mm/devsoundextensions/effects/SrcDoppler/SourceDopplerMessageHandler/src/SourceDopplerMessageHandler.cpp
Update contrib.
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 SourceDoppler effect message handler class.
21 #include "SourceDopplerMessageHandler.h"
22 #include "SourceDopplerMessageTypes.h"
23 #include <SourceDopplerBase.h>
24 #include "EffectDataQueItem.h"
29 // ================= MEMBER FUNCTIONS =======================
31 // C++ default constructor can NOT contain any code, that
34 CSourceDopplerMessageHandler::CSourceDopplerMessageHandler(
35 CSourceDoppler* aDoppler )
36 : CMMFObject(KUidSourceDopplerEffect),
46 EXPORT_C CSourceDopplerMessageHandler* CSourceDopplerMessageHandler::NewL(
47 TAny* aCustomInterface )
49 CSourceDoppler* doppler = (CSourceDoppler*)aCustomInterface;
50 CSourceDopplerMessageHandler* self = new (ELeave) CSourceDopplerMessageHandler(doppler);
56 // -----------------------------------------------------------------------------
57 // CSourceDopplerMessageHandler::ConstructL
58 // Symbian 2nd phase constructor can leave.
59 // Create and initializes the effect data queue.
60 // -----------------------------------------------------------------------------
62 void CSourceDopplerMessageHandler::ConstructL()
64 iEffectDataQue = new(ELeave) TSglQue<CEffectDataQueItem>(_FOFF(CEffectDataQueItem, iLink));
68 // -----------------------------------------------------------------------------
69 // CSourceDopplerMessageHandler::~CSourceDopplerMessageHandler
70 // Before going away, unregister with the CI Doppler object.
71 // The observation message must be completed if outstanding.
72 // The effect data queue must be emptied and destroyed.
73 // -----------------------------------------------------------------------------
75 CSourceDopplerMessageHandler::~CSourceDopplerMessageHandler()
79 RDebug::Print(_L("CSourceDopplerMessageHandler::~CSourceDopplerMessageHandler"));
82 iDoppler->UnRegisterObserver(*this);
87 if ( !iMessage->IsCompleted() )
89 iMessage->Complete(KErrCancel);
96 CEffectDataQueItem* queItem;
97 while ( !iEffectDataQue->IsEmpty() )
99 queItem = iEffectDataQue->First();
100 iEffectDataQue->Remove(*queItem);
104 delete iEffectDataQue;
112 // ---------------------------------------------------------
113 // CSourceDopplerMessageHandler::HandleRequest
114 // (other items were commented in a header).
115 // ---------------------------------------------------------
117 void CSourceDopplerMessageHandler::HandleRequest(
118 TMMFMessage& aMessage )
120 ASSERT(aMessage.Destination().InterfaceId() == KUidSourceDopplerEffect);
121 TRAPD(error,DoHandleRequestL(aMessage));
124 aMessage.Complete(error);
128 // ---------------------------------------------------------
129 // CSourceDopplerMessageHandler::DoHandleRequestL
130 // Dispatches the message to the appropriate handler.
131 // ---------------------------------------------------------
133 void CSourceDopplerMessageHandler::DoHandleRequestL(
134 TMMFMessage& aMessage )
136 switch( aMessage.Function() )
138 case ESourceDopplerOfInitialize: // Request to initialize the SourceDoppler
140 DoInitializeL(aMessage);
143 case ESourceDopplerOfApply: // Request to apply the SourceDoppler settings
148 case ESourceDopplerOfObserve: // Observation request
150 DoObserveL(aMessage);
155 aMessage.Complete(KErrNotSupported);
160 // ---------------------------------------------------------
161 // CSourceDopplerMessageHandler::DoInitializeL
162 // ---------------------------------------------------------
164 void CSourceDopplerMessageHandler::DoInitializeL(TMMFMessage& aMessage)
166 aMessage.WriteDataToClient(iDoppler->DoEffectData());
167 aMessage.Complete(KErrNone);
170 // ---------------------------------------------------------
171 // CSourceDopplerMessageHandler::DoApplyL
172 // Extracts the data from the message. The client doppler data
173 // is applied to the CI doppler object.
174 // ---------------------------------------------------------
176 void CSourceDopplerMessageHandler::DoApplyL(
177 TMMFMessage& aMessage )
179 TEfDopplerDataPckg dopplerPckgFromClient;
180 aMessage.ReadData1FromClient(dopplerPckgFromClient);
182 iDoppler->SetEffectData(dopplerPckgFromClient);
184 aMessage.Complete(KErrNone);
187 // ---------------------------------------------------------
188 // CSourceDopplerMessageHandler::DoObserveL
189 // Receives the observation request message and depending
190 // on the status of the effect data queue, the message is
191 // completed immediately or saved for later completion.
192 // ---------------------------------------------------------
194 void CSourceDopplerMessageHandler::DoObserveL(
195 TMMFMessage& aMessage )
199 RDebug::Print(_L("CSourceDopplerMessageHandler::DoObserveL"));
202 if ( !iRegistered ) // Don't register again if we're registered.
204 iDoppler->RegisterObserverL(*this);
208 if ( iEffectDataQue->IsEmpty() )
210 // Message is saved and completed when an event occurs
211 iMessage = new(ELeave) TMMFMessage(aMessage);
215 TEfDopplerDataPckg dataPckg;
216 CEffectDataQueItem* item = iEffectDataQue->First();
217 dataPckg.Copy(item->EffectData());
218 aMessage.WriteDataToClient(dataPckg);
219 aMessage.Complete(KErrNone);
220 iEffectDataQue->Remove(*item);
225 // ---------------------------------------------------------
226 // CSourceDopplerMessageHandler::EffectChanged
227 // The CI doppler object has changed state.
228 // The observation message is completed if no data has been
229 // queued up. Otherwise, the CI doppler object's data is
230 // packaged and queued.
231 // ---------------------------------------------------------
233 void CSourceDopplerMessageHandler::EffectChanged(
234 const CAudioEffect* aAudioEffect,
238 RDebug::Print(_L("CSourceDopplerMessageHandler::EffectChanged"));
241 if ( iMessage && !iMessage->IsCompleted() && iEffectDataQue->IsEmpty() )
243 iMessage->WriteDataToClient(((CSourceDoppler*)aAudioEffect)->DoEffectData());
244 iMessage->Complete(KErrNone);
248 else // no message pending and there is no event queued up
250 // Saves the data and complete an observation message next time when
251 // there is a pending message.
253 TRAPD(err1,data = ((CSourceDoppler*)aAudioEffect)->DoEffectData().AllocL());
256 //CleanupStack::PushL(data);
257 CEffectDataQueItem* item = NULL;
258 TRAPD(err2,item = CEffectDataQueItem::NewL(data));
261 iEffectDataQue->AddLast(*item);
271 RDebug::Print(_L("CSourceDopplerMessageHandler::EffectChanged Error Allocating Memory %d"),err1);
278 // ========================== OTHER EXPORTED FUNCTIONS =========================