Update contrib.
3 // Copyright (c) 2006-2009 Nokia Corporation and/or its subsidiary(-ies).
4 // All rights reserved.
5 // This component and the accompanying materials are made available
6 // under the terms of "Eclipse Public License v1.0"
7 // which accompanies this distribution, and is available
8 // at the URL "http://www.eclipse.org/legal/epl-v10.html".
10 // Initial Contributors:
11 // Nokia Corporation - initial contribution.
20 #include <a3f/maudiostream.h>
21 #include <a3f/maudiocodec.h>
22 #include <a3f/maudiogaincontrol.h>
23 #include <a3f/a3fbase.h>
25 #include "audiocontext.h"
26 #include "audioprocessingunit.h"
27 #include "logicalaudiostream.h"
28 #include "audiostreammanager.h"
31 // ---------------------------------------------------------------------------
32 // Default constructor
33 // ---------------------------------------------------------------------------
35 CAudioContext::CAudioContext()
38 DP_CONTEXT(CAudioContext::CAudioContext *CD1*, CtxDevSound, DPLOCAL);
44 // ---------------------------------------------------------------------------
45 // Symbian 2nd phase constructor
46 // ---------------------------------------------------------------------------
47 void CAudioContext::ConstructL()
49 DP_CONTEXT(CAudioContext::ConstructL *CD1*, CtxDevSound, DPLOCAL);
52 // Setup Multimedia Resource Control
53 User::LeaveIfError(iMMRC.Open(*this));
54 User::LeaveIfError(iCriticalSection.CreateLocal());
58 // ---------------------------------------------------------------------------
59 // Symbian constructor
60 // ---------------------------------------------------------------------------
61 EXPORT_C CAudioContext* CAudioContext::NewL()
63 DP_STATIC_CONTEXT(CAudioContext::NewL *CD0*, CtxDevSound, DPLOCAL);
65 CAudioContext* self = new(ELeave)CAudioContext();
66 CleanupStack::PushL(self);
68 CleanupStack::Pop(self);
69 DP0_RET(self, "0x%x");
72 // ---------------------------------------------------------------------------
74 // ---------------------------------------------------------------------------
76 EXPORT_C CAudioContext::~CAudioContext()
78 DP_CONTEXT(CAudioContext::~CAudioContext *CD1*, CtxDevSound, DPLOCAL);
81 iAudioContextObservers.Close();
82 iAudioProcessingUnits.Close();
85 iActualChain->Release();
87 iCriticalSection.Close();
91 // ---------------------------------------------------------------------------
92 // From class MAudioContext
93 // CAudioContext::SetClientSettings
94 // ---------------------------------------------------------------------------
96 TInt CAudioContext::SetClientSettings(const TClientContextSettings& aSettings)
98 DP_CONTEXT(CAudioContext::SetClientSettings *CD1*, CtxDevSound, DPLOCAL);
101 iClientSettings = aSettings;
102 if( iContextId.Id() == 0 )
104 TUint64 id = iMMRC.LogOn(iClientSettings.iProcessId);
105 TAudioContextId temp(id);
110 err = KErrAlreadyExists;
116 // ---------------------------------------------------------------------------
117 // From class MAudioContext
118 // CAudioContext::GetContextId
119 // ---------------------------------------------------------------------------
121 TAudioContextId CAudioContext::ContextId() const
123 DP_CONTEXT(CAudioContext::ContextId *CD1*, CtxDevSound, DPLOCAL);
129 // ---------------------------------------------------------------------------
130 // From class MAudioContext
131 // CAudioContext::Commit
132 // ---------------------------------------------------------------------------
134 TInt CAudioContext::Commit()
136 DP_CONTEXT(CAudioContext::Commit *CD1*, CtxDevSound, DPLOCAL);
141 if (iClientSettings.iProcessId.Id() == 0)
143 DP0_RET(KErrNotReady, "%d");
146 err = iMMRC.SendResourceRequest(iActualChain, iDesiredChain, this);
150 // ---------------------------------------------------------------------------
151 // From class MAudioContext
152 // CAudioContext::CreateAudioStream
153 // ---------------------------------------------------------------------------
155 TInt CAudioContext::CreateAudioStream(MAudioStream *&aStream)
157 DP_CONTEXT(CAudioContext::CreateAudioStream *CD1*, CtxDevSound, DPLOCAL);
161 CAudioStreamManager* manager(NULL);
163 // Create desired logical chain
164 TRAP(err, manager = CAudioStreamManager::NewL(KUidAudioStream));
167 aStream = static_cast<MAudioStream*>(manager);
169 // Use this as desired chain (this is the one that the client modify)
170 CLogicalAudioStream* logicalAudioStream = static_cast<CLogicalAudioStream*>(aStream);
171 iDesiredChain = static_cast<MLogicalChain*>(logicalAudioStream);
172 logicalAudioStream->SetParentContext(*this);
175 iActualChain->Release();
178 TRAP(err, iActualChain = iDesiredChain->CloneL());
183 // ---------------------------------------------------------------------------
184 // From class MAudioContext
185 // CAudioContext::DeleteAudioStream
186 // ---------------------------------------------------------------------------
188 void CAudioContext::DeleteAudioStream(MAudioStream *&aStream)
190 DP_CONTEXT(CAudioContext::DeleteAudioStream *CD1*, CtxDevSound, DPLOCAL);
192 CAudioStreamManager* manager = static_cast<CAudioStreamManager*>(aStream);
197 // ---------------------------------------------------------------------------
198 // From class MAudioContext
199 // CAudioContext::CreateAudioProcessingUnit
200 // ---------------------------------------------------------------------------
202 TInt CAudioContext::CreateAudioProcessingUnit(TUid aTypeId, MAudioProcessingUnit *&aProcessingUnit)
204 DP_CONTEXT(CAudioContext::CreateAudioProcessingUnit *CD1*, CtxDevSound, DPLOCAL);
207 TAudioComponentId unitInstance = GetAndSetInstanceID();
209 CAudioProcessingUnit* pUnit=NULL;
210 TComponentParameters cParameters;
211 cParameters.iTypeUid = aTypeId;
212 cParameters.iInstanceId = unitInstance;
213 cParameters.iContextId = iContextId;
214 cParameters.iSettingsObserver = this;
216 TRAP(err, pUnit = CAudioProcessingUnit::NewL(cParameters));
219 aProcessingUnit = static_cast<MAudioProcessingUnit*>(pUnit);
220 err = iAudioProcessingUnits.Append(aProcessingUnit);
224 aProcessingUnit = NULL;
230 // ---------------------------------------------------------------------------
231 // From class MAudioContext
232 // CAudioContext::DeleteAudioProcessingUnit
233 // ---------------------------------------------------------------------------
235 void CAudioContext::DeleteAudioProcessingUnit(
236 MAudioProcessingUnit *&aProcessingUnit)
238 DP_CONTEXT(CAudioContext::DeleteAudioProcessingUnit *CD1*, CtxDevSound, DPLOCAL);
241 CAudioProcessingUnit* cUnit = static_cast<CAudioProcessingUnit*>(aProcessingUnit);
242 TAudioComponentId param = aProcessingUnit->InstanceId();
243 TUint count= iAudioProcessingUnits.Count();
245 for ( TUint i(0); i < count; i++ )
247 // find and delete component
248 if( iAudioProcessingUnits[i]->InstanceId() == param)
250 iAudioProcessingUnits.Remove(i);
257 // ---------------------------------------------------------------------------
258 // From class MAudioContext
259 // CAudioContext::RegisterAudioContextObserver
260 // ---------------------------------------------------------------------------
262 TInt CAudioContext::RegisterAudioContextObserver(
263 MAudioContextObserver& aObserver)
265 DP_CONTEXT(CAudioContext::RegisterAudioContextObserver *CD1*, CtxDevSound, DPLOCAL);
267 TInt err = iAudioContextObservers.Find(&aObserver);
268 if( err != KErrNotFound )
270 err = KErrAlreadyExists;
274 err = iAudioContextObservers.Append(&aObserver);
279 // ---------------------------------------------------------------------------
280 // From class MAudioContext
281 // CAudioContext::UnregisterAudioContextObserver
282 // ---------------------------------------------------------------------------
284 void CAudioContext::UnregisterAudioContextObserver(
285 MAudioContextObserver& aObserver)
287 DP_CONTEXT(CAudioContext::UnregisterAudioContextObserver *CD1*, CtxDevSound, DPLOCAL);
290 TInt idxOrErr = iAudioContextObservers.Find(&aObserver);
291 if( idxOrErr != KErrNotFound )
293 iAudioContextObservers.Remove(idxOrErr);
298 // ---------------------------------------------------------------------------
299 // From class MAudioContext
300 // CAudioContext::Interface
301 // ---------------------------------------------------------------------------
303 TAny* CAudioContext::Interface(TUid aType)
305 DP_CONTEXT(CAudioContext::Interface *CD1*, CtxDevSound, DPLOCAL);
307 TAny* interface = NULL;
308 if(aType == KUIdAudioResourceNotification)
310 #ifndef SYMBIAN_DISABLE_ARN
311 interface = static_cast<MA3FDevSoundAutoPauseResume*>(this);
325 // ---------------------------------------------------------------------------
326 // From class MAudioContext
327 // CAudioContext::Reset
328 // ---------------------------------------------------------------------------
330 TInt CAudioContext::Reset()
332 DP_CONTEXT(CAudioContext::Reset *CD1*, CtxDevSound, DPLOCAL);
339 iDesiredChain->ResetMessage();
340 iDesiredChain->CopySettings(*iActualChain);
344 // ---------------------------------------------------------------------------
345 // From class MMultimediaResourceControlObserver
346 // CAudioContext::ReceiveResourceResponse
347 // ---------------------------------------------------------------------------
349 void CAudioContext::ReceiveResourceResponse(MLogicalChain* aAppliedChain, TInt aError)
351 DP_CONTEXT(CAudioContext::ReceiveResourceResponse *CD1*, CtxDevSound, DPLOCAL);
354 iCriticalSection.Wait();
356 iMMRC.ResetMessages();
357 iCriticalSection.Signal();
359 if ( aError == KErrNone || iPreempted )
365 // Desired chain was commited succesfully
367 MLogicalChain* lc = NULL;
368 TRAP(err, lc = aAppliedChain->CloneL());
369 DP1(DLERR,"ECloneLeftWhenReceivingResourceResponse %d", err);
370 __ASSERT_DEBUG(err == KErrNone, Panic(ECloneLeftWhenReceivingResourceResponse));
373 iActualChain->Release();
379 iDesiredChain->CopySettings(*iActualChain);
381 iDesiredChain->ResetMessage();
382 ContextEventSignal(KUidA3FContextUpdateComplete, aError);
387 // ---------------------------------------------------------------------------
388 // From class MMultimediaResourceControlObserver
389 // CAudioContext::ReceiveResourceUpdate
390 // ---------------------------------------------------------------------------
392 void CAudioContext::ReceiveResourceUpdate(MLogicalChain* /*aMessage*/, TInt aError)
394 DP_CONTEXT(CAudioContext::ReceiveResourceUpdate *CD1*, CtxDevSound, DPLOCAL);
396 ContextEventSignal(KUidA3FContextCommitUpdate, aError);
401 // ---------------------------------------------------------------------------
402 // From class MMultimediaResourceControlObserver
403 // CAudioContext::ReceivePreemptionUpdate
404 // ---------------------------------------------------------------------------
406 void CAudioContext::ReceivePreemptionUpdate(MLogicalChain* /*aMessage*/, TInt aError)
408 DP_CONTEXT(CAudioContext::ReceivePreemptionUpdate *CD1*, CtxDevSound, DPLOCAL);
413 // Send only one callback
414 ContextEventSignal(KUidA3FContextPreEmptedCommit, aError);
418 // Send two callbacks
419 ContextEventSignal(KUidA3FContextPreEmption, aError);
420 ContextEventSignal(KUidA3FContextPreEmptionUpdate, aError);
426 // ---------------------------------------------------------------------------
427 // From class MLogicalSettingObserver
428 // CAudioContext::ReceiveComponentSettingsChange
429 // ---------------------------------------------------------------------------
430 void CAudioContext::ReceiveComponentSettingsChange(TUid /*aId*/, TMMRCMessageType aMessageType)
432 iDesiredChain->SetMessageType(aMessageType);
435 // ---------------------------------------------------------------------------
437 // CAudioContext::GetAndSetInstanceID
438 // ---------------------------------------------------------------------------
439 TAudioComponentId CAudioContext::GetAndSetInstanceID()
441 DP_CONTEXT(CAudioContext::GetAndSetInstanceID *CD1*, CtxDevSound, DPLOCAL);
443 TUint id(1); // start ID count from 1
444 TAudioComponentId idComponent(1);
445 TUint count = iAudioProcessingUnits.Count();
446 if ( count < KMaxTUint )
455 // ---------------------------------------------------------------------------
457 // CAudioContext::ContextEventSignal
458 // ---------------------------------------------------------------------------
459 void CAudioContext::ContextEventSignal(TUid aEvent, TInt aError)
461 DP_CONTEXT(CAudioContext::ContextEventSignal *CD1*, CtxDevSound, DPLOCAL);
463 TUint count = iAudioContextObservers.Count();
464 for ( TUint idx(0); idx < count; idx++ )
466 iAudioContextObservers[idx]->ContextEvent(aEvent, aError);
471 // ---------------------------------------------------------------------------
472 // CAudioContext::GetLogicalChain
473 // ---------------------------------------------------------------------------
474 EXPORT_C MLogicalChain* CAudioContext::GetLogicalChain(TInt aIndex)
476 DP_CONTEXT(CAudioContext::GetLogicalChain *CD1*, CtxDevSound, DPLOCAL);
478 MLogicalChain* logChain = NULL;
481 logChain = iDesiredChain;
485 logChain = iActualChain;
492 // ---------------------------------------------------------------------------
493 // CAudioContext::RegisterAsClient
494 // ---------------------------------------------------------------------------
495 TInt CAudioContext::RegisterAsClient(TUid aEventType, const TDesC8& aNotificationRegistrationData, MA3FDevSoundAutoPauseResumeObserver* aObserverPtr)
497 DP_CONTEXT(CAudioContext::RegisterAsClient *CD1*, CtxDevSound, DPLOCAL);
500 iObserverPtr = aObserverPtr;
501 err = iMMRC.RegisterAsClient(aEventType, aNotificationRegistrationData);
505 // ---------------------------------------------------------------------------
506 // CAudioContext::CancelRegisterAsClient
507 // ---------------------------------------------------------------------------
508 TInt CAudioContext::CancelRegisterAsClient(TUid aEventType)
510 DP_CONTEXT(CAudioContext::CancelRegisterAsClient *CD1*, CtxDevSound, DPLOCAL);
513 err = iMMRC.CancelRegisterAsClient(aEventType);
517 // ---------------------------------------------------------------------------
518 // CAudioContext::WillResumePlay
519 // ---------------------------------------------------------------------------
520 TInt CAudioContext::WillResumePlay()
522 DP_CONTEXT(CAudioContext::WillResumePlay *CD1*, CtxDevSound, DPLOCAL);
525 err = iMMRC.WillResumePlay();
529 // ---------------------------------------------------------------------------
530 // From class MMultimediaResourceControlObserver
531 // CAudioContext::CanResume
532 // ---------------------------------------------------------------------------
534 void CAudioContext::CanResume()
536 DP_CONTEXT(CAudioContext::CanResume *CD1*, CtxDevSound, DPLOCAL);
540 iObserverPtr->NotifyResume();
545 void CAudioContext::Panic(TAudioContextPanicCodes aCode)
547 User::Panic(KAudioContextPanicCategory, aCode);
550 EXPORT_C TInt CAudioContext::MsgVersion()
555 EXPORT_C RCriticalSection& CAudioContext::CriticalSection()
557 return iCriticalSection;