sl@0: /* sl@0: * Copyright (c) 2004-2009 Nokia Corporation and/or its subsidiary(-ies). sl@0: * All rights reserved. sl@0: * This component and the accompanying materials are made available sl@0: * under the terms of "Eclipse Public License v1.0" sl@0: * which accompanies this distribution, and is available sl@0: * at the URL "http://www.eclipse.org/legal/epl-v10.html". sl@0: * sl@0: * Initial Contributors: sl@0: * Nokia Corporation - initial contribution. sl@0: * sl@0: * Contributors: sl@0: * sl@0: * Description: sl@0: * sl@0: */ sl@0: sl@0: sl@0: sl@0: #ifndef LOGICALAUDIOSTREAM_H sl@0: #define LOGICALAUDIOSTREAM_H sl@0: sl@0: #include sl@0: #include sl@0: #include sl@0: #include sl@0: sl@0: #include sl@0: #include sl@0: sl@0: #include "componentparameters.h" sl@0: #include "audiostreammanager.h" sl@0: sl@0: #include sl@0: #include "../shared/a3fbackdooraccess.h" sl@0: #include "../audiocontext/audiocontext.h" sl@0: sl@0: // TO BE REMOVED WHEN MMRC SERVER IS READY sl@0: #include "mlogicalchain.h" sl@0: #include "maudiostreamadaptationobserver.h" sl@0: #include "maudiocodecadaptationobserver.h" sl@0: sl@0: #include sl@0: sl@0: #include "mstreambuffercontrol.h" sl@0: sl@0: sl@0: class MLogicalSettingObserver; sl@0: class CLogicalAudioCodec; sl@0: class CLogicalAudioGainControl; sl@0: class CLogicalBufferSource; sl@0: class CLogicalBufferSink; sl@0: class CLogicalAudioDeviceSink; sl@0: class CLogicalAudioDeviceSource; sl@0: sl@0: sl@0: /** sl@0: This is the implementation of audio stream API. sl@0: @see MAudioStream sl@0: */ sl@0: sl@0: NONSHARABLE_CLASS(CLogicalAudioStream) : public CAudioStreamManager, sl@0: public MCustomInterfaceSupport, sl@0: public MCustomInterfaceSupportObserver, sl@0: public MAudioStreamAdaptationObserver, sl@0: public MLogicalChain, sl@0: public MAudioCodecObserver, sl@0: public MA3FBackdoorAccessIf sl@0: { sl@0: friend class CAudioContext; sl@0: sl@0: public: sl@0: /** sl@0: Destructor. sl@0: sl@0: Deletes all objects and releases all resource owned by this instance. sl@0: */ sl@0: virtual ~CLogicalAudioStream(); sl@0: sl@0: // from MAudioStream sl@0: virtual TInt Initialize(); sl@0: virtual TInt Load(); sl@0: virtual TInt Activate(); sl@0: virtual TInt Stop(); sl@0: virtual TInt Unload(); sl@0: virtual TInt Uninitialize(); sl@0: virtual TInt Prime(); sl@0: virtual TInt Flush(); sl@0: sl@0: virtual TInt AddSource(MAudioProcessingUnit* aSource); sl@0: virtual TInt AddSink(MAudioProcessingUnit* aSink); sl@0: virtual TInt AddAudioCodec(MAudioProcessingUnit* aCodec); sl@0: virtual TInt AddGainControl(MAudioProcessingUnit* aGainControl); sl@0: virtual TInt RemoveProcessingUnit(MAudioProcessingUnit* aProcessingUnit); sl@0: virtual TInt ResetStreamTime(); sl@0: virtual TInt GetStreamTime(TTimeIntervalMicroSeconds& aStreamTime); sl@0: virtual TAny* Interface(TUid aType); sl@0: sl@0: // from MCustomInterfaceSupport sl@0: virtual TInt RequestCustomInterface(TUid aUid, TAny*& aPtr); sl@0: virtual TInt RegisterObserver(MCustomInterfaceSupportObserver& aObserver); sl@0: virtual void UnRegisterObserver(MCustomInterfaceSupportObserver& aObserver); sl@0: sl@0: // from MCustomInterfaceSupportObserver sl@0: virtual void CustomInterfaceRemoval(TUid aInterfaceUid, TAny* aPtr); sl@0: sl@0: // from MAudioStreamAdaptationObserver sl@0: void PhysicalAdaptationEvent(TPhysicalEvent aEvent, TInt aError); sl@0: void StateEvent(TInt aReason, TAudioState aNewState); sl@0: void AddProcessingUnitComplete(TUid aType, TInt aError); sl@0: void RemoveProcessingUnitComplete(TUid aType, TInt aError); sl@0: void ProcessingFinished (); sl@0: void FlushComplete (TInt aError); sl@0: sl@0: // from MLogicalChain sl@0: void SetMessageType(TMMRCMessageType aMessageType); sl@0: void ResetMessage(); sl@0: TUint MessageType(); sl@0: TUid AudioProcessingUnitUid(TInt aIndex); sl@0: TInt AudioProcessingUnitsCount(); sl@0: TAudioState StreamState(); sl@0: void SetStreamState(TAudioState aState); sl@0: TUid CodecFormat(); sl@0: TInt GetSampleRate(); sl@0: TUid GetMode(); sl@0: TInt Priority(); sl@0: void GetVolumeRampParameters(TUid& aRampOperation, TTimeIntervalMicroSeconds& aRampDuration); sl@0: MLogicalChain* CloneL(); sl@0: void Release(); sl@0: TAny* GetComponent(TUid aType); sl@0: sl@0: void CopySettings(const MLogicalChain& aChain); sl@0: void SetAdaptationSource(MMMFBufferSource& aSource); sl@0: void SetAdaptationSink(MMMFBufferSink& aSink); sl@0: void SetAdaptationGainControl(MAudioGainControl& aGain); sl@0: void SetStreamPositionControl(MStreamPositionControl& aControl ); sl@0: void SetCustomInterfaceProvider(MCustomInterfaceSupport& aControl); sl@0: void SetCodecConfiguration(RArray aSampleRate, RArray aMode); sl@0: void SetAdaptationStream(MConfigurationHelper& aStream); sl@0: void SetStreamBufferControl(MStreamBufferControl& aStreamBufferControl); sl@0: sl@0: // from MAudioCodecObserver sl@0: void SampleRateSet(TInt aError); sl@0: void ModeSet(TInt aError); sl@0: void GetSupportedSampleRatesComplete (TInt aError); sl@0: void GetSupportedModesComplete (TInt aError); sl@0: sl@0: // from MA3FBackdoorAccessIf sl@0: MAudioContext* AudioContext(); sl@0: MAudioStream* AudioStream(); sl@0: MAudioProcessingUnit* ProcessingUnit(TUid aType); sl@0: sl@0: /** sl@0: Create a new instance. sl@0: sl@0: @param aStream the stream implementation. Ownership of the pointer is transferred to the sl@0: create CAudioStream object instance. sl@0: @return CAudioStreamComponent* a pointer to the created instance. sl@0: */ sl@0: static CLogicalAudioStream* NewL(TUid aTypeId); sl@0: sl@0: //Get functions for configuration sl@0: void GetSupportedSampleRates(RArray& aSupportedRates); sl@0: void GetSupportedModes(RArray& aSupportedModes); sl@0: sl@0: virtual void SetParentContext(const CAudioContext& aContext); sl@0: sl@0: protected: sl@0: // Internal method sl@0: void MapUidToProcessingUnit(TUid aType, MAudioProcessingUnit*& aInstance); sl@0: sl@0: void CopyStreamSettings(const MLogicalChain& aChain); sl@0: void CopyCodecSettings(const MLogicalChain& aChain); sl@0: void CopyGainSettings(const MLogicalChain& aChain); sl@0: sl@0: private: sl@0: sl@0: void ConstructL(); sl@0: CLogicalAudioStream(); sl@0: TInt DoAddProcessingUnit(MAudioProcessingUnit* aUnit); sl@0: sl@0: private: sl@0: // Time processed sl@0: TTimeIntervalMicroSeconds iTimeProcessed; sl@0: sl@0: // Audio processing units at this context sl@0: RPointerArray iAudioProcessingUnits; sl@0: sl@0: // CI observers sl@0: RPointerArray iCISupportObservers; sl@0: sl@0: // Stream state sl@0: TAudioState iCurrentState; sl@0: sl@0: TAudioState iRequestState; sl@0: sl@0: // MLogical chain variables sl@0: MAudioProcessingUnit* iCodec; sl@0: sl@0: MAudioProcessingUnit* iGain; sl@0: sl@0: // General pointer, useful to manage all the audioprocessingunit sl@0: // never keeps specific information sl@0: MAudioProcessingUnit* iAudioProcessingUnit; sl@0: sl@0: // Adaptation interfaces sl@0: MStreamPositionControl* iPositionControl; sl@0: MStreamBufferControl* iStreamBufferControl; sl@0: sl@0: MCustomInterfaceSupport* iInterfaceProvider; sl@0: sl@0: // Message type sl@0: TUint iMessageType; sl@0: sl@0: TInt iContextPriority; sl@0: sl@0: // handle back to parent context sl@0: CAudioContext* iParentContext; sl@0: }; sl@0: sl@0: #endif // LOGICALAUDIOSTREAM_H