First public contribution.
1 // Copyright (c) 2004-2009 Nokia Corporation and/or its subsidiary(-ies).
2 // All rights reserved.
3 // This component and the accompanying materials are made available
4 // under the terms of "Eclipse Public License v1.0"
5 // which accompanies this distribution, and is available
6 // at the URL "http://www.eclipse.org/legal/epl-v10.html".
8 // Initial Contributors:
9 // Nokia Corporation - initial contribution.
18 #include "logicalaudiogaincontrol.h"
19 #include "logicalaudiocodec.h"
20 #include "logicalbuffersource.h"
21 #include "logicalbuffersink.h"
22 #include "logicalaudiodevicesink.h"
23 #include "logicalaudiodevicesource.h"
24 #include "logicalaudiostream.h"
26 #include <mmf/server/sounddevice.h>
27 #include <a3f/audioprocessingunittypeuids.h>
28 #include <a3f/maudiocodec.h>
29 #include <a3f/maudiocontext.h>
30 #include "audiocontext.h"
32 // TODO: Remove when the MMRC Extension mechanism is ready
33 #include "mstreampositioncontrol.h"
34 #include "mstreampositioncontrol.h"
35 #include "audioprocessingunit.h"
37 #include <ecom/implementationproxy.h> // For making it ECom plugin
40 // Exported proxy for instantiation method resolution
41 // Define the interface UIDs
42 const TImplementationProxy ImplementationTable[] =
44 IMPLEMENTATION_PROXY_ENTRY(KAudioStreamUid, CLogicalAudioStream::NewL)
47 EXPORT_C const TImplementationProxy* ImplementationGroupProxy(TInt& aTableCount)
49 aTableCount = sizeof(ImplementationTable) / sizeof(TImplementationProxy);
50 return ImplementationTable;
53 // ---------------------------------------------------------------------------
55 // ---------------------------------------------------------------------------
57 CLogicalAudioStream::CLogicalAudioStream()
58 : CAudioStreamManager(),
59 iCurrentState(EUninitialized),
60 iMessageType(ERegisterStreamObserver)
63 DP_CONTEXT(CLogicalAudioStream::CLogicalAudioStream *CD1*, CtxDevSound, DPLOCAL);
68 // ---------------------------------------------------------------------------
69 // CLogicalAudioStream::NewL
70 // ---------------------------------------------------------------------------
71 CLogicalAudioStream* CLogicalAudioStream::NewL(TUid /*aTypeId*/)
73 DP_STATIC_CONTEXT(CLogicalAudioStream::NewL *CD0*, CtxDevSound, DPLOCAL);
75 CLogicalAudioStream* self = new(ELeave)CLogicalAudioStream();
76 CleanupStack::PushL(self);
78 CleanupStack::Pop(self);
79 DP0_RET(self, "0x%x");
82 // ---------------------------------------------------------------------------
83 // Second phase constructor
84 // ---------------------------------------------------------------------------
85 void CLogicalAudioStream::ConstructL()
87 DP_CONTEXT(CLogicalAudioStream::ConstructL *CD1*, CtxDevSound, DPLOCAL);
92 // ---------------------------------------------------------------------------
94 // ---------------------------------------------------------------------------
96 CLogicalAudioStream::~CLogicalAudioStream()
98 DP_CONTEXT(CLogicalAudioStream::~CLogicalAudioStream *CD1*, CtxDevSound, DPLOCAL);
100 iAudioProcessingUnits.Close();
101 iCISupportObservers.Close();
107 // ---------------------------------------------------------------------------
108 // CLogicalAudioStream::Uninitialize
109 // ---------------------------------------------------------------------------
110 TInt CLogicalAudioStream::Uninitialize()
112 DP_CONTEXT(CLogicalAudioStream::Uninitialize *CD1*, CtxDevSound, DPLOCAL);
114 if (iCurrentState != EInitialized)
116 DP0_RET(KErrNotReady, "%d");
119 iCurrentState = EUninitialized;
120 DP0_RET(KErrNone, "%d");
123 // ---------------------------------------------------------------------------
124 // CLogicalAudioStream::Initialize
125 // ---------------------------------------------------------------------------
126 TInt CLogicalAudioStream::Initialize()
128 DP_CONTEXT(CLogicalAudioStream::Initialize *CD1*, CtxDevSound, DPLOCAL);
130 if (iCurrentState != EUninitialized)
132 DP0_RET(KErrNotReady, "%d");
136 iCurrentState = EInitialized;
137 DP0_RET(KErrNone, "%d");
140 // ---------------------------------------------------------------------------
141 // CLogicalAudioStream::Load
142 // ---------------------------------------------------------------------------
143 TInt CLogicalAudioStream::Load()
145 DP_CONTEXT(CLogicalAudioStream::Load *CD1*, CtxDevSound, DPLOCAL);
147 if (iCurrentState != EInitialized)
149 DP0_RET(KErrNotReady, "%d");
152 iCurrentState = EIdle;
154 DP0_RET(KErrNone, "%d");
157 // ---------------------------------------------------------------------------
158 // CLogicalAudioStream::Stop
159 // ---------------------------------------------------------------------------
160 TInt CLogicalAudioStream::Stop()
162 DP_CONTEXT(CLogicalAudioStream::Stop *CD1*, CtxDevSound, DPLOCAL);
164 if (iCurrentState != EActive && iCurrentState != EPrimed)
166 DP0_RET(KErrNotReady, "%d");
168 iCurrentState = EIdle;
169 DP0_RET(KErrNone, "%d");
172 // ---------------------------------------------------------------------------
173 // CLogicalAudioStream::Unload
174 // ---------------------------------------------------------------------------
175 TInt CLogicalAudioStream::Unload()
177 DP_CONTEXT(CLogicalAudioStream::Unload *CD1*, CtxDevSound, DPLOCAL);
179 if (iCurrentState != EIdle)
181 DP0_RET(KErrNotReady, "%d");
184 iCurrentState = EInitialized;
185 DP0_RET(KErrNone, "%d");
188 // ---------------------------------------------------------------------------
189 // CLogicalAudioStream::Prime
190 // ---------------------------------------------------------------------------
191 TInt CLogicalAudioStream::Prime()
193 DP_CONTEXT(CLogicalAudioStream::Prime *CD1*, CtxDevSound, DPLOCAL);
195 if (iCurrentState != EActive && iCurrentState != EIdle)
197 DP0_RET(KErrNotReady, "%d");
200 iCurrentState = EPrimed;
201 DP0_RET(KErrNone, "%d");
204 // ---------------------------------------------------------------------------
205 // CLogicalAudioStream::Flush
206 // ---------------------------------------------------------------------------
207 TInt CLogicalAudioStream::Flush()
209 DP_CONTEXT(CLogicalAudioStream::Flush *CD1*, CtxDevSound, DPLOCAL);
211 if (iCurrentState != EIdle && iCurrentState != EPrimed)
213 DP0_RET(KErrNotReady, "%d");
216 if(!iStreamBufferControl)
218 DP0_RET(KErrNotReady, "%d");
220 //Empty any buffers that have been filled
221 iStreamBufferControl->FlushBuffers();
223 DP0_RET(KErrNone, "%d");
226 // ---------------------------------------------------------------------------
227 // CLogicalAudioStream::Activate
228 // ---------------------------------------------------------------------------
229 TInt CLogicalAudioStream::Activate()
231 DP_CONTEXT(CLogicalAudioStream::Activate *CD1*, CtxDevSound, DPLOCAL);
233 if (iCurrentState != EIdle && iCurrentState != EPrimed)
235 DP0_RET(KErrNotReady, "%d");
238 //The start-up procedures include requesting permission for audio processing
239 //from audio policy. If permission to start is denied by audio policy, a state
240 //change callback to the current state will occur.
241 iCurrentState = EActive;
242 DP0_RET(KErrNone, "%d");
245 // ---------------------------------------------------------------------------
246 // CLogicalAudioStream::AddSource
247 // ---------------------------------------------------------------------------
248 TInt CLogicalAudioStream::AddSource(MAudioProcessingUnit* aSource)
250 DP_CONTEXT(CLogicalAudioStream::AddSource *CD1*, CtxDevSound, DPLOCAL);
253 if (aSource->IsTypeOf(KUidMmfBufferSource) || aSource->IsTypeOf(KUidAudioDeviceSource))
255 if (iCurrentState == EUninitialized)
257 err = DoAddProcessingUnit(aSource);
266 err = KErrNotSupported;
272 // ---------------------------------------------------------------------------
273 // CLogicalAudioStream::AddSink
274 // ---------------------------------------------------------------------------
275 TInt CLogicalAudioStream::AddSink(MAudioProcessingUnit* aSink)
277 DP_CONTEXT(CLogicalAudioStream::AddSink *CD1*, CtxDevSound, DPLOCAL);
280 if (aSink->IsTypeOf(KUidMmfBufferSink) || aSink->IsTypeOf(KUidAudioDeviceSink) )
282 if (iCurrentState == EUninitialized)
284 err = DoAddProcessingUnit(aSink);
293 err = KErrNotSupported;
298 // ---------------------------------------------------------------------------
299 // CLogicalAudioStream::AddCodec
300 // ---------------------------------------------------------------------------
301 TInt CLogicalAudioStream::AddAudioCodec(MAudioProcessingUnit* aCodec)
303 DP_CONTEXT(CLogicalAudioStream::AddAudioCodec *CD1*, CtxDevSound, DPLOCAL);
308 DP0_RET(KErrInUse, "%d");
311 if (aCodec->IsTypeOf(KUidAudioCodec))
313 if (iCurrentState == EUninitialized)
315 err = DoAddProcessingUnit(aCodec);
324 err = KErrNotSupported;
329 // ---------------------------------------------------------------------------
330 // CLogicalAudioStream::AddGainControl
331 // ---------------------------------------------------------------------------
332 TInt CLogicalAudioStream::AddGainControl(MAudioProcessingUnit* aGainControl)
334 DP_CONTEXT(CLogicalAudioStream::AddGainControl *CD1*, CtxDevSound, DPLOCAL);
340 DP0_RET(KErrInUse, "%d");
343 if (aGainControl->IsTypeOf(KUidAudioGainControl))
345 if (iCurrentState == EUninitialized)
347 err = DoAddProcessingUnit(aGainControl);
356 err = KErrNotSupported;
361 // ---------------------------------------------------------------------------
362 // CLogicalAudioStream::RemoveProcessigUnit
363 // ---------------------------------------------------------------------------
364 TInt CLogicalAudioStream::RemoveProcessingUnit(MAudioProcessingUnit* aProcessingUnit)
366 DP_CONTEXT(CLogicalAudioStream::RemoveProcessingUnit *CD1*, CtxDevSound, DPLOCAL);
369 if(iCurrentState != EUninitialized)
371 DP0_RET(KErrNotReady, "%d");
374 TInt err(KErrNotFound);
375 if (aProcessingUnit != NULL)
377 TAudioComponentId param = aProcessingUnit->InstanceId();
378 TUint count= iAudioProcessingUnits.Count();
380 if (aProcessingUnit->IsTypeOf(KUidAudioCodec))
384 else if (aProcessingUnit->IsTypeOf(KUidAudioGainControl))
389 for ( TUint i(0); i < count; i++ )
391 // find and remove component
392 if( iAudioProcessingUnits[i]->InstanceId() == param)
394 iAudioProcessingUnits.Remove(i);
398 SetMessageType(EComponentDestruction);
404 // ---------------------------------------------------------------------------
405 // CLogicalAudioStream::ResetStreamTime
406 // ---------------------------------------------------------------------------
407 TInt CLogicalAudioStream::ResetStreamTime()
409 DP_CONTEXT(CLogicalAudioStream::ResetStreamTime *CD1*, CtxDevSound, DPLOCAL);
412 if (iCurrentState != EIdle)
414 DP0_RET(KErrNotReady, "%d");
418 iPositionControl->ResetControlPosition();
425 // ---------------------------------------------------------------------------
426 // CLogicalAudioStream::GetStreamTime
427 // ---------------------------------------------------------------------------
428 TInt CLogicalAudioStream::GetStreamTime(TTimeIntervalMicroSeconds& aStreamTime)
430 DP_CONTEXT(CLogicalAudioStream::GetStreamTime *CD1*, CtxDevSound, DPLOCAL);
436 err = iPositionControl->GetControlPosition(aStreamTime);
439 iTimeProcessed = aStreamTime;
444 aStreamTime = iTimeProcessed;
449 // ---------------------------------------------------------------------------
450 // CLogicalAudioStream::Interface
451 // ---------------------------------------------------------------------------
452 TAny* CLogicalAudioStream::Interface(TUid aType)
454 DP_CONTEXT(CLogicalAudioStream::Interface *CD1*, CtxDevSound, DPLOCAL);
456 TAny* interface(NULL);
457 if( aType == KUidAudioStream)
459 interface = static_cast<MAudioStream*>(this);
461 else if( aType == KUidExtensionInferface)
463 interface = static_cast<MCustomInterfaceSupport*>(this);
465 else if (aType == KUidAudioStreamAdaptationObserver)
467 interface = static_cast<MAudioStreamAdaptationObserver*>(this);
468 DP0_RET(interface, "0x%x");
470 else if (aType == KUidAudioCodecObserver)
472 interface = static_cast<MAudioCodecObserver*>(this);
473 DP0_RET(interface, "0x%x");
480 // ---------------------------------------------------------------------------
481 // From MCustomInterfaceSupport
482 // CAudioStream::RequestCustomInterface
483 // ---------------------------------------------------------------------------
484 TInt CLogicalAudioStream::RequestCustomInterface(TUid aUid, TAny*& aPtr)
486 DP_CONTEXT(CLogicalAudioStream::RequestCustomInterface *CD1*, CtxDevSound, DPLOCAL);
489 if (aUid == KA3FBackdoorAccessIfUid)
491 MA3FBackdoorAccessIf* self = this;
494 else if(iInterfaceProvider)
496 err = iInterfaceProvider->RequestCustomInterface(aUid, aPtr);
509 // ---------------------------------------------------------------------------
510 // From MCustomInterfaceSupport
511 // CAudioStream::RegisterObserver
512 // ---------------------------------------------------------------------------
513 TInt CLogicalAudioStream::RegisterObserver(MCustomInterfaceSupportObserver& aObserver)
515 DP_CONTEXT(CLogicalAudioStream::RegisterObserver *CD1*, CtxDevSound, DPLOCAL);
518 err = iCISupportObservers.Find(&aObserver);
519 if( err != KErrNotFound )
521 err = KErrAlreadyExists;
525 err = iCISupportObservers.Append(&aObserver);
530 // ---------------------------------------------------------------------------
531 // From MCustomInterfaceSupport
532 // CAudioStream::UnRegisterObserver
533 // ---------------------------------------------------------------------------
534 void CLogicalAudioStream::UnRegisterObserver(MCustomInterfaceSupportObserver& aObserver)
536 DP_CONTEXT(CLogicalAudioStream::UnRegisterObserver *CD1*, CtxDevSound, DPLOCAL);
538 TInt idxOrErr = iCISupportObservers.Find(&aObserver);
539 if( idxOrErr != KErrNotFound )
541 iCISupportObservers.Remove(idxOrErr);
546 // ---------------------------------------------------------------------------
547 // From MCustomInterfaceSupport
548 // CAudioStream::CustomInterfaceRemoval
549 // ---------------------------------------------------------------------------
550 void CLogicalAudioStream::CustomInterfaceRemoval(TUid aInterfaceUid, TAny* aPtr)
552 DP_CONTEXT(CLogicalAudioStream::CustomInterfaceRemoval *CD1*, CtxDevSound, DPLOCAL);
554 TUint count = iCISupportObservers.Count();
555 for ( TUint idx(0); idx < count; idx++ )
557 iCISupportObservers[idx]->CustomInterfaceRemoval(aInterfaceUid, aPtr);
562 // ---------------------------------------------------------------------------
563 // From MAudioStreamAdaptationObserver
564 // CAudioStream::PhysicalAdaptationEvent
565 // ---------------------------------------------------------------------------
566 void CLogicalAudioStream::PhysicalAdaptationEvent(TPhysicalEvent /*aEvent*/, TInt /*aError*/)
568 DP_CONTEXT(CLogicalAudioStream::PhysicalAdaptationEvent *CD1*, CtxDevSound, DPLOCAL);
573 // ---------------------------------------------------------------------------
574 // CAudioStream::StateEvent
575 // ---------------------------------------------------------------------------
576 void CLogicalAudioStream::StateEvent(TInt aReason, TAudioState aNewState)
578 DP_CONTEXT(CLogicalAudioStream::StateEvent *CD1*, CtxDevSound, DPLOCAL);
581 RDebug::Print(_L("CLogicalAudioStream::StateEvent Error %d Stay %d"), aReason, aNewState);
583 TUint count = iAudioStreamObserver.Count();
584 for ( TUint idx(0); idx < count; idx++ )
586 iAudioStreamObserver[idx]->StateEvent(*this, aReason, aNewState);
588 iCurrentState = aNewState;
592 // ---------------------------------------------------------------------------
593 // CLogicalAudioStream::AddProcessingUnitComplete
594 // ---------------------------------------------------------------------------
595 void CLogicalAudioStream::AddProcessingUnitComplete(TUid aType, TInt aError)
597 DP_CONTEXT(CLogicalAudioStream::AddProcessingUnitComplete *CD1*, CtxDevSound, DPLOCAL);
599 MAudioProcessingUnit* instance = NULL;
600 MapUidToProcessingUnit(aType, instance);
601 TUint count = iAudioStreamObserver.Count();
602 for ( TUint idx(0); idx < count; idx++ )
604 iAudioStreamObserver[idx]->AddProcessingUnitComplete(*this, instance, aError);
609 // ---------------------------------------------------------------------------
610 // CLogicalAudioStream::RemoveProcessingUnitComplete
611 // ---------------------------------------------------------------------------
612 void CLogicalAudioStream::RemoveProcessingUnitComplete(TUid aType, TInt aError)
614 DP_CONTEXT(CLogicalAudioStream::RemoveProcessingUnitComplete *CD1*, CtxDevSound, DPLOCAL);
616 MAudioProcessingUnit* instance = NULL;
617 MapUidToProcessingUnit(aType, instance);
618 TUint count = iAudioStreamObserver.Count();
619 for ( TUint idx(0); idx < count; idx++ )
621 iAudioStreamObserver[idx]->RemoveProcessingUnitComplete(*this, instance, aError);
626 // ---------------------------------------------------------------------------
627 // From MAudioStreamAdaptationObserver
628 // CLogicalAudioStream::ProcessingFinished
629 // ---------------------------------------------------------------------------
630 void CLogicalAudioStream::ProcessingFinished()
632 DP_CONTEXT(CLogicalAudioStream::ProcessingFinished *CD1*, CtxDevSound, DPLOCAL);
634 TUint count = iAudioStreamObserver.Count();
635 for ( TUint idx(0); idx < count; idx++ )
637 iAudioStreamObserver[idx]->ProcessingFinished(*this);
642 // ---------------------------------------------------------------------------
643 // CLogicalAudioStream::FlushComplete
644 // ---------------------------------------------------------------------------
645 void CLogicalAudioStream::FlushComplete(TInt aError)
647 DP_CONTEXT(CLogicalAudioStream::FlushComplete *CD1*, CtxDevSound, DPLOCAL);
649 TUint count = iAudioStreamObserver.Count();
650 for ( TUint idx(0); idx < count; idx++ )
652 iAudioStreamObserver[idx]->FlushComplete(*this, aError);
658 // ---------------------------------------------------------------------------
660 // CLogicalAudioStream::DoAddProcessingUnit
661 // ---------------------------------------------------------------------------
662 TInt CLogicalAudioStream::DoAddProcessingUnit(MAudioProcessingUnit* aProcessingUnit)
664 DP_CONTEXT(CLogicalAudioStream::DoAddProcessingUnit *CD1*, CtxDevSound, DPLOCAL);
668 if (aProcessingUnit->IsTypeOf(KUidAudioCodec) )
670 // Need for tone handling error
671 CAudioProcessingUnit* pUnit = static_cast<CAudioProcessingUnit*>(aProcessingUnit);
672 iCodec = static_cast<MAudioProcessingUnit*>(pUnit);
674 else if (aProcessingUnit->IsTypeOf(KUidAudioGainControl) )
676 CAudioProcessingUnit* pUnit = static_cast<CAudioProcessingUnit*>(aProcessingUnit);
677 iGain = static_cast<MAudioProcessingUnit*>(pUnit);
680 err = iAudioProcessingUnits.Append(aProcessingUnit);
681 SetMessageType(EComponentCreation);
686 // ---------------------------------------------------------------------------
688 // CLogicalAudioStream::MapUidToProcessingUnit
689 // ---------------------------------------------------------------------------
690 void CLogicalAudioStream::MapUidToProcessingUnit(TUid aType, MAudioProcessingUnit*& aInstance)
692 DP_CONTEXT(CLogicalAudioStream::MapUidToProcessingUnit *CD1*, CtxDevSound, DPLOCAL);
694 TUint count = iAudioProcessingUnits.Count();
695 for(TUint i=0; i<count; i++)
697 aInstance = static_cast<MAudioProcessingUnit*>(iAudioProcessingUnits[i]);
698 if ( aInstance->IsTypeOf(aType) )
707 // From MLogicalChain
708 // ---------------------------------------------------------------------------
709 // CLogicalAudioStream::SetMessageType
710 // ---------------------------------------------------------------------------
711 void CLogicalAudioStream::SetMessageType(TMMRCMessageType aMessageType)
713 DP_CONTEXT(CLogicalAudioStream::SetMessageType *CD1*, CtxDevSound, DPLOCAL);
715 iMessageType |= aMessageType;
719 // ---------------------------------------------------------------------------
720 // CLogicalAudioStream::ResetMessage
721 // ---------------------------------------------------------------------------
722 void CLogicalAudioStream::ResetMessage()
724 DP_CONTEXT(CLogicalAudioStream::SetMessageType *CD1*, CtxDevSound, DPLOCAL);
726 iMessageType = ENoMessage;
730 // ---------------------------------------------------------------------------
731 // CLogicalAudioStream::MessageType
732 // ---------------------------------------------------------------------------
733 TUint CLogicalAudioStream::MessageType()
735 DP_CONTEXT(CLogicalAudioStream::MessageType *CD1*, CtxDevSound, DPLOCAL);
737 DP0_RET(iMessageType, "Message type %d");
741 // ---------------------------------------------------------------------------
742 // CLogicalAudioStream::AudioProcessingUnitUid
743 // ---------------------------------------------------------------------------
744 TUid CLogicalAudioStream::AudioProcessingUnitUid(TInt aIndex)
746 DP_CONTEXT(CLogicalAudioStream::AudioProcessingUnitUid *CD1*, CtxDevSound, DPLOCAL);
749 MAudioProcessingUnit* pUnit(NULL);
752 pUnit = static_cast<MAudioProcessingUnit*>(iAudioProcessingUnits[aIndex]);
757 if (pUnit->IsTypeOf(KUidAudioDecoder))
759 uid = KUidAudioDecoder;
761 else if (pUnit->IsTypeOf(KUidAudioEncoder))
763 uid = KUidAudioEncoder;
765 else if (pUnit->IsTypeOf(KUidMmfBufferSource))
767 uid = KUidMmfBufferSource;
769 else if (pUnit->IsTypeOf(KUidAudioGainControl))
771 uid = KUidAudioGainControl;
773 else if (pUnit->IsTypeOf(KUidAudioDeviceSink))
775 uid = KUidAudioDeviceSink;
777 else if (pUnit->IsTypeOf(KUidMmfBufferSink))
779 uid = KUidMmfBufferSink;
781 else if (pUnit->IsTypeOf(KUidAudioDeviceSource))
783 uid = KUidAudioDeviceSource;
785 else if (pUnit->IsTypeOf(KUidAudioCodec))
787 uid = KUidAudioCodec;
794 // ---------------------------------------------------------------------------
795 // CLogicalAudioStream::AudioProcessingUnitsCount
796 // ---------------------------------------------------------------------------
797 TInt CLogicalAudioStream::AudioProcessingUnitsCount()
799 DP_CONTEXT(CLogicalAudioStream::AudioProcessingUnitsCount *CD1*, CtxDevSound, DPLOCAL);
801 DP0_RET(iAudioProcessingUnits.Count(), "%d");
804 // ---------------------------------------------------------------------------
805 // CLogicalAudioStream::StreamState
806 // ---------------------------------------------------------------------------
807 TAudioState CLogicalAudioStream::StreamState()
809 DP_CONTEXT(CLogicalAudioStream::StreamState *CD1*, CtxDevSound, DPLOCAL);
811 DP0_RET(iCurrentState, "Stream state %d");
814 // ---------------------------------------------------------------------------
815 // From MLogicalChain
816 // CLogicalAudioStream::SetStreamState
817 // ---------------------------------------------------------------------------
818 void CLogicalAudioStream::SetStreamState(TAudioState aAudioState)
820 DP_CONTEXT(CLogicalAudioStream::StreamState *CD1*, CtxDevSound, DPLOCAL);
822 iCurrentState = aAudioState;
826 // ---------------------------------------------------------------------------
827 // From MLogicalChain
828 // CLogicalAudioStream::CodecFormat
829 // ---------------------------------------------------------------------------
830 TUid CLogicalAudioStream::CodecFormat()
832 DP_CONTEXT(CLogicalAudioStream::CodecFormat *CD1*, CtxDevSound, DPLOCAL);
834 CLogicalAudioCodec* codec = static_cast<CLogicalAudioCodec*>(iCodec);
839 return codec->iFormat;
847 // ---------------------------------------------------------------------------
848 // From MLogicalChain
849 // CLogicalAudioStream::GetSampleRate
850 // ---------------------------------------------------------------------------
851 TInt CLogicalAudioStream::GetSampleRate()
853 DP_CONTEXT(CLogicalAudioStream::GetSampleRate *CD1*, CtxDevSound, DPLOCAL);
855 const TUint KDefaultSampleRate = 8000; // Default sample rate
856 CLogicalAudioCodec* codec = static_cast<CLogicalAudioCodec*>(iCodec);
858 TInt sampleRateValue = KDefaultSampleRate;
861 sampleRateValue = codec->iSampleRateConfig;
863 return sampleRateValue;
866 // ---------------------------------------------------------------------------
867 // From MLogicalChain
868 // CLogicalAudioStream::GetMode
869 // ---------------------------------------------------------------------------
870 TUid CLogicalAudioStream::GetMode()
872 DP_CONTEXT(CLogicalAudioStream::GetMode *CD1*, CtxDevSound, DPLOCAL);
874 CLogicalAudioCodec* codec = static_cast<CLogicalAudioCodec*>(iCodec);
879 return codec->iModeConfig;
888 // ---------------------------------------------------------------------------
889 // From MLogicalChain
890 // CLogicalAudioStream::Priority
891 // ---------------------------------------------------------------------------
892 TInt CLogicalAudioStream::Priority()
894 DP_CONTEXT(CLogicalAudioStream::Priority*CD1*, CtxDevSound, DPLOCAL);
896 DP0_RET(iAudioTypeSettings.iPriority, "Priority %d");
899 // ---------------------------------------------------------------------------
900 // From MLogicalChain
901 // CLogicalAudioStream::GetVolumeRampParameters
902 // ---------------------------------------------------------------------------
903 void CLogicalAudioStream::GetVolumeRampParameters(TUid& aRampOperation, TTimeIntervalMicroSeconds& aRampDuration)
905 DP_CONTEXT(CLogicalAudioStream::GetVolumeRampParameters*CD1*, CtxDevSound, DPLOCAL);
907 CLogicalAudioGainControl* gain = static_cast<CLogicalAudioGainControl*>(iGain);
910 aRampOperation = gain->iDesiredRampOperation;
911 aRampDuration = gain->iDesiredRampTime;
916 // ---------------------------------------------------------------------------
917 // From MLogicalChain
918 // CLogicalAudioStream::CopySettings
919 // @param the logical chain from where the parameter will be copied
920 // ---------------------------------------------------------------------------
921 void CLogicalAudioStream::CopySettings(const MLogicalChain& aChain)
923 DP_CONTEXT(CLogicalAudioStream::CopySettings *CD1*, CtxDevSound, DPLOCAL);
925 CopyStreamSettings(aChain);
926 CopyCodecSettings(aChain);
927 CopyGainSettings(aChain);
931 void CLogicalAudioStream::CopyStreamSettings(const MLogicalChain& aChain)
933 DP_CONTEXT(CLogicalAudioStream::CopyStreamSettings *CD1*, CtxDevSound, DPLOCAL);
935 // LogicalAudioStream settings
936 CLogicalAudioStream& srcChain = static_cast<CLogicalAudioStream&>(const_cast<MLogicalChain&>(aChain));
938 iAudioTypeSettings = srcChain.iAudioTypeSettings;
939 iCurrentState = srcChain.iCurrentState;
940 iRequestState = srcChain.iRequestState;
941 iMessageType = srcChain.iMessageType;
942 iTimeProcessed = srcChain.iTimeProcessed;
946 void CLogicalAudioStream::CopyCodecSettings(const MLogicalChain& aChain)
948 DP_CONTEXT(CLogicalAudioStream::CopyCodecSettings *CD1*, CtxDevSound, DPLOCAL);
951 CLogicalAudioStream& srcChain = static_cast<CLogicalAudioStream&>(const_cast<MLogicalChain&>(aChain));
952 // Copy codec settings
953 CLogicalAudioCodec* srcCodec = static_cast<CLogicalAudioCodec*>(srcChain.iCodec);
954 if(iCodec && srcCodec)
956 CLogicalAudioCodec* logicalCodec = static_cast<CLogicalAudioCodec*>(iCodec);
957 logicalCodec->iFormat = srcCodec->iFormat;
958 logicalCodec->iSampleRateConfig = srcCodec->iSampleRateConfig;
959 logicalCodec->iModeConfig = srcCodec->iModeConfig;
965 void CLogicalAudioStream::CopyGainSettings(const MLogicalChain& aChain)
967 DP_CONTEXT(CLogicalAudioStream::CopyGainSettings *CD1*, CtxDevSound, DPLOCAL);
970 CLogicalAudioStream& srcChain = static_cast<CLogicalAudioStream&>(const_cast<MLogicalChain&>(aChain));
971 // Copy gain settings
972 CLogicalAudioGainControl* srcGain = static_cast<CLogicalAudioGainControl*>(srcChain.iGain);
973 if (iGain && srcGain )
975 if(srcGain->iDesiredChannels.Count() > 0)
977 CLogicalAudioGainControl* logicalGain = static_cast<CLogicalAudioGainControl*>(iGain);
978 TUint count = srcGain->iDesiredChannels.Count();
979 for (TUint i(0); i < count; i++)
981 logicalGain->iDesiredChannels[i] = srcGain->iDesiredChannels[i];
983 logicalGain->iDesiredRampOperation = srcGain->iDesiredRampOperation;
984 logicalGain->iDesiredRampTime = srcGain->iDesiredRampTime;
990 // ---------------------------------------------------------------------------
991 // From MLogicalChain
992 // CLogicalAudioStream::CloneL
993 // ---------------------------------------------------------------------------
994 MLogicalChain* CLogicalAudioStream::CloneL()
996 DP_CONTEXT(CLogicalAudioStream::CloneL *CD1*, CtxDevSound, DPLOCAL);
999 MLogicalChain* newLogicalChain = NULL;
1001 // Create another audiostream
1002 CAudioStreamManager *manager = NULL;
1003 manager = CAudioStreamManager::NewL(KUidAudioStream);
1004 // Copy stream settings
1005 CLogicalAudioStream* logicalAudioStream = static_cast<CLogicalAudioStream*>(manager);
1007 MAudioProcessingUnit* pUnit=NULL;
1008 TInt count = iAudioProcessingUnits.Count();
1009 for(TInt i = 0; i < count ; i++)
1011 // Create processing unit
1012 TUid type = AudioProcessingUnitUid(i);
1013 TComponentParameters cParameters;
1014 cParameters.iTypeUid = type;
1015 cParameters.iInstanceId = 0;
1016 cParameters.iContextId = 0;
1017 cParameters.iSettingsObserver = NULL;
1018 pUnit = CAudioProcessingUnit::NewL(cParameters);
1020 // If no error then add to the stream
1021 if ( (type == KUidAudioDecoder) || (type == KUidAudioEncoder) )
1023 err = logicalAudioStream->AddAudioCodec(pUnit);
1025 else if (type == KUidMmfBufferSource || (type == KUidAudioDeviceSource) )
1027 err = logicalAudioStream->AddSource(pUnit);
1029 else if (type == KUidAudioGainControl)
1031 err = logicalAudioStream->AddGainControl(pUnit);
1033 else if (type == KUidAudioDeviceSink || ( type == KUidMmfBufferSink) )
1035 err = logicalAudioStream->AddSink(pUnit);
1038 // Check this couldn't be added
1041 logicalAudioStream->iAudioProcessingUnits.Remove(iAudioProcessingUnits.Count()-1);
1045 // Cast to MLogicalChain
1046 newLogicalChain = static_cast<MLogicalChain*>(logicalAudioStream);
1047 newLogicalChain->CopySettings(*this);
1049 DP0_RET(newLogicalChain, "0x%x");
1052 // ---------------------------------------------------------------------------
1053 // From MLogicalChain
1054 // CLogicalAudioStream::Release
1055 // ---------------------------------------------------------------------------
1056 void CLogicalAudioStream::Release()
1058 DP_CONTEXT(CLogicalAudioStream::Release *CD1*, CtxDevSound, DPLOCAL);
1061 TInt count = iAudioProcessingUnits.Count();
1063 for (i=0; i<count; i++)
1065 CAudioProcessingUnit* pUnit = static_cast<CAudioProcessingUnit*>(iAudioProcessingUnits[i]);
1068 iAudioProcessingUnits.Reset();
1073 // ---------------------------------------------------------------------------
1074 // From MLogicalChain
1075 // CLogicalAudioStream::GetComponent
1076 // ---------------------------------------------------------------------------
1077 TAny* CLogicalAudioStream::GetComponent(TUid aType)
1079 DP_CONTEXT(CLogicalAudioStream::GetComponent *CD1*, CtxDevSound, DPLOCAL);
1081 TAny* interface = NULL;
1083 // go through this or our subcomponents to see if somebody knows about the interface
1084 interface = Interface(aType);
1085 if (interface==NULL)
1087 TUint count = iAudioProcessingUnits.Count();
1088 // go through components looking for valid interface
1089 for ( TInt i=0; i < count; i++ )
1091 interface = iAudioProcessingUnits[i]->Interface(aType);
1092 if (interface!=NULL)
1100 DP0_RET(interface, "0x%x");
1105 // ---------------------------------------------------------------------------
1106 // From MLogicalChain
1107 // CLogicalAudioStream::SetAdaptationSource
1108 // ---------------------------------------------------------------------------
1109 void CLogicalAudioStream::SetAdaptationSource(MMMFBufferSource& aSource)
1111 DP_CONTEXT(CLogicalAudioStream::SetAdaptationSource *CD1*, CtxDevSound, DPLOCAL);
1113 MapUidToProcessingUnit(KUidMmfBufferSource, iAudioProcessingUnit);
1114 ASSERT(iAudioProcessingUnit);
1116 CAudioProcessingUnit* cUnit = static_cast<CAudioProcessingUnit*>(iAudioProcessingUnit);
1117 CLogicalBufferSource* bufferSource = (static_cast<CLogicalBufferSource*>(cUnit));
1119 bufferSource->iAdaptationBufferSource = &aSource;
1120 aSource.SetDataSupplier(*bufferSource);
1122 iAudioProcessingUnit = NULL;
1126 // ---------------------------------------------------------------------------
1127 // From MLogicalChain
1128 // CLogicalAudioStream::SetAdaptationSink
1129 // ---------------------------------------------------------------------------
1130 void CLogicalAudioStream::SetAdaptationSink(MMMFBufferSink& aSink)
1132 DP_CONTEXT(CLogicalAudioStream::SetAdaptationSink *CD1*, CtxDevSound, DPLOCAL);
1134 MapUidToProcessingUnit(KUidMmfBufferSink, iAudioProcessingUnit);
1135 ASSERT(iAudioProcessingUnit);
1137 CAudioProcessingUnit* cUnit = static_cast<CAudioProcessingUnit*>(iAudioProcessingUnit);
1138 CLogicalBufferSink* bufferSink = (static_cast<CLogicalBufferSink*>(cUnit));
1140 bufferSink->iAdaptationBufferSink = &aSink;
1141 aSink.SetDataConsumer(*bufferSink);
1143 iAudioProcessingUnit = NULL;
1147 // ---------------------------------------------------------------------------
1148 // From MLogicalChain
1149 // CLogicalAudioStream::SetAdaptationGainControl
1150 // ---------------------------------------------------------------------------
1151 void CLogicalAudioStream::SetAdaptationGainControl(MAudioGainControl& aGain)
1153 DP_CONTEXT(CLogicalAudioStream::SetAdaptationGainControl *CD1*, CtxDevSound, DPLOCAL);
1156 CLogicalAudioGainControl* gain = static_cast<CLogicalAudioGainControl*>(iGain);
1157 gain->iAdaptationGain = &aGain;
1158 aGain.RegisterAudioGainControlObserver(*gain);
1164 // ---------------------------------------------------------------------------
1165 // From MLogicalChain
1166 // CLogicalAudioStream::SetPositionControl
1167 // ---------------------------------------------------------------------------
1168 void CLogicalAudioStream::SetStreamPositionControl(MStreamPositionControl& aPositionControl)
1170 DP_CONTEXT(CLogicalAudioStream::SetStreamPositionControl *CD1*, CtxDevSound, DPLOCAL);
1172 iPositionControl = &aPositionControl;
1176 // ---------------------------------------------------------------------------
1177 // CLogicalAudioStream::SetAdaptationStream
1178 // ---------------------------------------------------------------------------
1179 void CLogicalAudioStream::SetAdaptationStream(MConfigurationHelper& aStream)
1181 DP_CONTEXT(CLogicalAudioStream::SetAdaptationStream *CD1*, CtxDevSound, DPLOCAL);
1183 CLogicalAudioCodec* codec = static_cast<CLogicalAudioCodec*>(iCodec);
1186 if (codec->iAdaptationStream == NULL)
1188 codec->iAdaptationStream = &aStream;
1194 // ---------------------------------------------------------------------------
1195 // CLogicalAudioStream::SetStreamBufferControl
1196 // ---------------------------------------------------------------------------
1197 void CLogicalAudioStream::SetStreamBufferControl(MStreamBufferControl& aStreamBufferControl)
1199 DP_CONTEXT(CLogicalAudioStream::SetAdaptationStream *CD1*, CtxDevSound, DPLOCAL);
1201 iStreamBufferControl = &aStreamBufferControl;
1206 // ---------------------------------------------------------------------------
1207 // CLogicalAudioStream::SetCustomInterfaceProvider
1208 // ---------------------------------------------------------------------------
1209 void CLogicalAudioStream::SetCustomInterfaceProvider(MCustomInterfaceSupport& aInterfaceProvider)
1211 DP_CONTEXT(CLogicalAudioStream::SetCustomInterfaceProvider *CD1*, CtxDevSound, DPLOCAL);
1213 iInterfaceProvider = &aInterfaceProvider;
1217 // ---------------------------------------------------------------------------
1218 // CLogicalAudioStream::SampleRateSet
1219 // ---------------------------------------------------------------------------
1220 void CLogicalAudioStream::SampleRateSet(TInt aError)
1222 DP_CONTEXT(CLogicalAudioStream::SampleRateSet *CD1*, CtxDevSound, DPLOCAL);
1224 CLogicalAudioCodec* codec = static_cast<CLogicalAudioCodec*>(iCodec);
1227 TUint count = codec->iAudioCodecObserver.Count();
1228 for ( TUint idx(0); idx < count; idx++ )
1230 codec->iAudioCodecObserver[idx]->SampleRateSet(aError);
1236 // ---------------------------------------------------------------------------
1237 // CLogicalAudioStream::ModeSet
1238 // ---------------------------------------------------------------------------
1239 void CLogicalAudioStream::ModeSet(TInt aError)
1241 DP_CONTEXT(CLogicalAudioStream::SampleRateSet *CD1*, CtxDevSound, DPLOCAL);
1243 CLogicalAudioCodec* codec = static_cast<CLogicalAudioCodec*>(iCodec);
1246 TUint count = codec->iAudioCodecObserver.Count();
1247 for ( TUint idx(0); idx < count; idx++ )
1249 codec->iAudioCodecObserver[idx]->ModeSet(aError);
1255 // ---------------------------------------------------------------------------
1256 // CLogicalAudioStream::GetSupportedSampleRatesComplete
1257 // ---------------------------------------------------------------------------
1258 void CLogicalAudioStream::GetSupportedSampleRatesComplete (TInt aError)
1260 DP_CONTEXT(CLogicalAudioStream::SampleRateSet *CD1*, CtxDevSound, DPLOCAL);
1262 CLogicalAudioCodec* codec = static_cast<CLogicalAudioCodec*>(iCodec);
1265 TUint count = codec->iAudioCodecObserver.Count();
1266 for ( TUint idx(0); idx < count; idx++ )
1268 codec->iAudioCodecObserver[idx]->GetSupportedSampleRatesComplete(aError);
1274 // ---------------------------------------------------------------------------
1275 // CLogicalAudioStream::GetSupportedModesComplete
1276 // ---------------------------------------------------------------------------
1277 void CLogicalAudioStream::GetSupportedModesComplete (TInt aError)
1279 DP_CONTEXT(CLogicalAudioStream::SampleRateSet *CD1*, CtxDevSound, DPLOCAL);
1281 CLogicalAudioCodec* codec = static_cast<CLogicalAudioCodec*>(iCodec);
1284 TUint count = codec->iAudioCodecObserver.Count();
1285 for ( TUint idx(0); idx < count; idx++ )
1287 codec->iAudioCodecObserver[idx]->GetSupportedModesComplete(aError);
1293 // ---------------------------------------------------------------------------
1294 // CLogicalAudioStream::SetParentContext
1295 // ---------------------------------------------------------------------------
1296 void CLogicalAudioStream::SetParentContext(const CAudioContext& aContext)
1298 iParentContext = const_cast<CAudioContext*>(&aContext);
1302 // from MA3FBackdoorAccessIf
1304 MAudioContext* CLogicalAudioStream::AudioContext()
1306 return iParentContext;
1309 MAudioStream* CLogicalAudioStream::AudioStream()
1314 MAudioProcessingUnit* CLogicalAudioStream::ProcessingUnit(TUid aType)
1316 // look through our processing units for something of the correct type
1317 TInt numProcessingUnits = iAudioProcessingUnits.Count();
1318 for (TInt index=0; index < numProcessingUnits; index++)
1320 MAudioProcessingUnit* ptr = iAudioProcessingUnits[index];
1321 if (ptr->IsTypeOf(aType))