accessoryservices/accessoryserver/src/accpolaudiodevicetopology/accpolaudiounitbase.cpp
changeset 0 4e1aa6a622a0
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/accessoryservices/accessoryserver/src/accpolaudiodevicetopology/accpolaudiounitbase.cpp	Tue Feb 02 00:53:00 2010 +0200
@@ -0,0 +1,586 @@
+/*
+* Copyright (c) 2007 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:  Implementation for audio feature unit object.
+*
+*/
+
+#include <accpolaudiounitbase.h>
+#include <accpolaudiotopologyobjectcon.h>
+#include <accpolvolumecontrol.h>
+#include <accpolmutecontrol.h>
+#include <accpolinputcontrol.h>
+#include "acc_debug.h"
+
+// -----------------------------------------------------------------------------
+// CAccPolAudioUnitBase::CAccPolAudioUnitBase
+// C++ default constructor can NOT contain any code, that
+// might leave.
+// -----------------------------------------------------------------------------
+//
+CAccPolAudioUnitBase::CAccPolAudioUnitBase(
+    const TTopologyConObjectType aObjecType,
+    CAccPolObjectCon* aObject ) :
+    CAccPolObjectBase( aObjecType, aObject )
+    {
+    API_TRACE_( "[AccFW: ACCPOLAUDIODEVICETOPOLOGY] CAccPolAudioUnitBase::CAccPolAudioUnitBase() -Enter" );
+    API_TRACE_( "[AccFW: ACCPOLAUDIODEVICETOPOLOGY] CAccPolAudioUnitBase::CAccPolAudioUnitBase() - Return" );
+    }
+
+// -----------------------------------------------------------------------------
+// CAccPolAudioUnitBase::CAccPolAudioUnitBase
+// C++ default constructor can NOT contain any code, that
+// might leave.
+// -----------------------------------------------------------------------------
+//
+CAccPolAudioUnitBase::CAccPolAudioUnitBase( const TUint8 aUnitId,
+    const TTopologyConObjectType aObjecType ) :
+    CAccPolObjectBase( aObjecType )
+    {
+    API_TRACE_( "[AccFW: ACCPOLAUDIODEVICETOPOLOGY] CAccPolAudioUnitBase::CAccPolAudioUnitBase() - Enter" );
+    iUnitId = aUnitId;
+    API_TRACE_( "[AccFW: ACCPOLAUDIODEVICETOPOLOGY] CAccPolAudioUnitBase::CAccPolAudioUnitBase() - Return" );
+    }
+
+// -----------------------------------------------------------------------------
+// CAccPolAudioUnitBase::CAccPolAudioUnitBase
+// C++ default constructor can NOT contain any code, that
+// might leave.
+// -----------------------------------------------------------------------------
+//
+CAccPolAudioUnitBase::CAccPolAudioUnitBase( const TUint8 aUnitId,
+    const TUint8 aSourceId,
+    const TTopologyConObjectType aObjecType ) :
+    CAccPolObjectBase( aObjecType )
+    {
+    API_TRACE_( "[AccFW: ACCPOLAUDIODEVICETOPOLOGY] CAccPolAudioUnitBase::CAccPolAudioUnitBase() -Enter" );
+    iUnitId = aUnitId;
+    iSourceId.Append( aSourceId );
+    API_TRACE_( "[AccFW: ACCPOLAUDIODEVICETOPOLOGY] CAccPolAudioUnitBase::CAccPolAudioUnitBase() - Return" );
+    }
+
+// Destructor
+EXPORT_C CAccPolAudioUnitBase::~CAccPolAudioUnitBase()
+    {
+    API_TRACE_( "[AccFW: ACCPOLAUDIODEVICETOPOLOGY] CAccPolAudioUnitBase::~CAccPolAudioUnitBase() - Enter" );
+    iSourceId.Close();
+    TInt count = iAudioControls.Count();
+    if( count > 0 )
+        {
+        for( TInt i = 0; i < count; i++ )
+            {
+            delete iAudioControls.operator[]( i );
+            }
+        }
+    iAudioControls.Close();
+    API_TRACE_( "[AccFW: ACCPOLAUDIODEVICETOPOLOGY] CAccPolAudioUnitBase::~CAccPolAudioUnitBase() - Return" );
+    }
+
+// ---------------------------------------------------------------------------
+// CAccPolAudioUnitBase::operator()
+// ---------------------------------------------------------------------------
+//
+EXPORT_C CAccPolAudioUnitBase& CAccPolAudioUnitBase::operator=(
+    const CAccPolAudioUnitBase& aAudioUnitBaseObject )
+    {
+    TRAP_IGNORE ( CopyL ( aAudioUnitBaseObject ) );
+    
+    return ( *this );
+    }
+
+void CAccPolAudioUnitBase::CopyL ( const CAccPolAudioUnitBase& aAudioUnitBaseObject )
+    {
+    API_TRACE_( "[AccFW: ACCPOLAUDIODEVICETOPOLOGY] CAccPolAudioUnitBase::operator() - Enter" );
+    // Copy base	
+    CAccPolObjectBase::operator=( ( CAccPolObjectBase& )aAudioUnitBaseObject );
+
+    //Copy Unit id
+    iUnitId = aAudioUnitBaseObject.UnitId();
+    RArray<TInt> sourceIds;
+    CleanupClosePushL( sourceIds );
+    
+    //Copy source Ids
+    aAudioUnitBaseObject.GetSourceIds( sourceIds );
+
+    for( TInt i = 0; i < sourceIds.Count(); i++ )
+        {
+        iSourceId.AppendL( sourceIds.operator[]( i ) );
+        }
+
+    //Copy previous unit id
+    iPreUnitId = aAudioUnitBaseObject.PreviousUnitId();
+
+    //Copy audio controls.
+    RPointerArray<CAccPolAudioControlBase> audioControls;
+    CleanupClosePushL( audioControls );
+    
+    aAudioUnitBaseObject.GetAudioControlsL( audioControls );
+    
+    for( TInt j = 0; j < audioControls.Count(); j++ )
+        {
+        TUint8 objectType;
+        objectType = audioControls.operator[]( j )->ObjectType();
+
+        switch( objectType )
+            {
+            case EAccPolAudioVolumeControlObject:
+                {
+                CAccPolVolumeControl *volumeControl =
+                    CAccPolVolumeControl::NewL();
+                CleanupStack::PushL( volumeControl );
+                *volumeControl
+                    = *( CAccPolVolumeControl* )audioControls.operator[]( j );
+                iAudioControls.AppendL( volumeControl );
+                CleanupStack::Pop();
+                }
+                break;
+
+            case EAccPolAudioMuteControlObject:
+                {
+                CAccPolMuteControl *muteControl = CAccPolMuteControl::NewL();
+                CleanupStack::PushL( muteControl );
+                *muteControl
+                    = *( CAccPolMuteControl* )audioControls.operator[]( j );
+                iAudioControls.AppendL( muteControl );
+                CleanupStack::Pop();
+                }
+                break;
+
+            case EAccPolAudioInputControlObject:
+                {
+                CAccPolInputControl *inputControl = CAccPolInputControl::NewL();
+                CleanupStack::PushL( inputControl );
+                *inputControl
+                    = *( CAccPolInputControl* )audioControls.operator[]( j );
+                iAudioControls.AppendL( inputControl );
+                CleanupStack::Pop();
+                }
+                break;
+
+            default:
+                {
+                User::Leave( KErrNotSupported );
+                }
+                break;
+            }
+        }
+
+    CleanupStack::PopAndDestroy (); //audioControls...dont use ResetAndDestroy on this!
+    CleanupStack::PopAndDestroy (); //sourceIds
+        
+    
+    API_TRACE_( "[AccFW: ACCPOLAUDIODEVICETOPOLOGY] CAccPolAudioUnitBase::operator() - Return" );
+    }
+
+// ---------------------------------------------------------------------------
+// CAccPolAudioUnitBase::PreviousUnitId
+// ---------------------------------------------------------------------------
+//
+TUint8 CAccPolAudioUnitBase::PreviousUnitId() const
+    {
+    API_TRACE_( "[AccFW: ACCPOLAUDIODEVICETOPOLOGY] CAccPolAudioUnitBase::PreviousUnitId() - Enter" );
+    API_TRACE_1( "[AccFW: ACCPOLAUDIODEVICETOPOLOGY] CAccPolAudioUnitBase::PreviousUnitId() - Return %d", iPreUnitId );
+    return iPreUnitId;
+    }
+
+// ---------------------------------------------------------------------------
+// CAccPolAudioUnitBase::SetPreviousUnitId
+// ---------------------------------------------------------------------------
+//
+void CAccPolAudioUnitBase::SetPreviousUnitId( TUint8 aPreUnitId )
+    {
+    API_TRACE_( "[AccFW: ACCPOLAUDIODEVICETOPOLOGY] CAccPolAudioUnitBase::SetPreviousUnitId() - Enter" );
+    API_TRACE_1( "[AccFW: ACCPOLAUDIODEVICETOPOLOGY] CAccPolAudioUnitBase::SetPreviousUnitId() - PreUnit Id %d", aPreUnitId );
+    API_TRACE_( "[AccFW: ACCPOLAUDIODEVICETOPOLOGY] CAccPolAudioUnitBase::SetPreviousUnitId() - Return" );
+    iPreUnitId = aPreUnitId;
+    }
+
+// ---------------------------------------------------------------------------
+// CAccPolAudioUnitBase::UnitId
+// ---------------------------------------------------------------------------
+//
+EXPORT_C TUint8 CAccPolAudioUnitBase::UnitId() const
+    {
+    API_TRACE_( "[AccFW: ACCPOLAUDIODEVICETOPOLOGY] CAccPolAudioUnitBase::UnitId() - Enter" );
+    API_TRACE_1( "[AccFW: ACCPOLAUDIODEVICETOPOLOGY] CAccPolAudioUnitBase::UnitId() - Return %d", iUnitId );
+    return iUnitId;
+    }
+
+// ---------------------------------------------------------------------------
+// CAccPolAudioUnitBase::SourceId
+// ---------------------------------------------------------------------------
+//
+EXPORT_C TUint8 CAccPolAudioUnitBase::SourceId() const
+    {
+    API_TRACE_( "[AccFW: ACCPOLAUDIODEVICETOPOLOGY] CAccPolAudioUnitBase::SourceId() - Enter" );
+    API_TRACE_1( "[AccFW: ACCPOLAUDIODEVICETOPOLOGY] CAccPolAudioUnitBase::SourceId() - Return %d", iSourceId.operator[]( 0 ) );
+    return ( TUint8 )iSourceId.operator[]( 0 );
+    }
+
+// ---------------------------------------------------------------------------
+// CAccPolAudioUnitBase::GetSourceIds
+// ---------------------------------------------------------------------------
+//
+EXPORT_C void CAccPolAudioUnitBase::GetSourceIds( RArray<TInt>& aSourceIds ) const
+    {
+    API_TRACE_( "[AccFW: ACCPOLAUDIODEVICETOPOLOGY] CAccPolAudioUnitBase::SourceIds() - Enter" );
+    TInt count = iSourceId.Count();
+    for( TInt i = 0; i < count; i++ )
+        {
+        API_TRACE_1( "[AccFW: ACCPOLAUDIODEVICETOPOLOGY] CAccPolAudioUnitBase::SourceIds() Return SourceId=%d", iSourceId.operator[]( i ) );
+        aSourceIds.Append( ( TInt )iSourceId.operator[]( i ) );
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// CAccPolAudioUnitBase::SourceIdCount
+// ---------------------------------------------------------------------------
+//
+EXPORT_C TInt CAccPolAudioUnitBase::SourceIdCount() const
+    {
+    API_TRACE_( "[AccFW: ACCPOLAUDIODEVICETOPOLOGY] CAccPolAudioUnitBase::SourceIdCount() -Enter" );
+    API_TRACE_1( "[AccFW: ACCPOLAUDIODEVICETOPOLOGY] CAccPolAudioUnitBase::SourceIdCount() return count=%d", iSourceId.Count() );
+    return iSourceId.Count();
+    }
+
+// ---------------------------------------------------------------------------
+// CAccPolAudioUnitBase::AddSourceIdL
+// ---------------------------------------------------------------------------
+//
+EXPORT_C void CAccPolAudioUnitBase::AddSourceIdL( TUint8 aSourceId )
+    {
+    API_TRACE_1( "[AccFW: ACCPOLAUDIODEVICETOPOLOGY] CAccPolAudioUnitBase::AddSourceIdL() Enter - Source Id=%d", aSourceId );
+    iSourceId.AppendL( aSourceId );
+    API_TRACE_( "[AccFW: ACCPOLAUDIODEVICETOPOLOGY] CAccPolAudioUnitBase::AddSourceIdL() - Return" );
+    }
+
+// ---------------------------------------------------------------------------
+// CAccPolAudioUnitBase::GetAudioControlL
+// ---------------------------------------------------------------------------
+//
+EXPORT_C TBool CAccPolAudioUnitBase::GetAudioControlL(
+    TTopologyConObjectType aObjectType,
+    TUint32 aChannel,
+    CAccPolAudioControlBase*& aAudioControl ) const
+    {
+    API_TRACE_2( "[AccFW: ACCPOLAUDIODEVICETOPOLOGY] CAccPolAudioUnitBase::GetAudioControlL() - Object type=%d, Channel number=%d", aObjectType, aChannel );
+    TBool bFound( EFalse );
+    aAudioControl = NULL;
+    if( aObjectType == EAccPolAudioVolumeControlObject || aObjectType
+        == EAccPolAudioMuteControlObject )
+        {
+        TInt count = iAudioControls.Count();
+        for( TInt i = 0; i < count; i++ )
+            {
+            if( iAudioControls.operator[]( i )->ObjectType() == aObjectType
+                && iAudioControls.operator[]( i )->Channel() == aChannel )
+                {
+                aAudioControl = iAudioControls.operator[]( i );
+                bFound = ETrue;
+                break;
+                }
+            }
+        }
+    else
+        {
+        User::Leave( KErrGeneral );
+        }
+    API_TRACE_1( "[AccFW: ACCPOLAUDIODEVICETOPOLOGY] CAccPolAudioUnitBase::GetAudioControlL() - Return=%d", bFound );
+    return bFound;
+    }
+// ---------------------------------------------------------------------------
+// CAccPolAudioUnitBase::GetAudioControlsL
+// ---------------------------------------------------------------------------
+//
+EXPORT_C void CAccPolAudioUnitBase::GetAudioControlsL( TUint32 aChannel,
+    RPointerArray<CAccPolAudioControlBase>& aAudioControls ) const
+    {
+    API_TRACE_1( "[AccFW: ACCPOLAUDIODEVICETOPOLOGY] CAccPolAudioUnitBase::GetAudioControlsL() - Channel number=%d", aChannel );
+    TInt count = iAudioControls.Count();
+    API_TRACE_1( "[AccFW: ACCPOLICY] CAccPolAudioUnitBase::GetAudioControlsL() - count=%d", count );
+    for( TInt i = 0; i < count; i++ )
+        {
+        if( iAudioControls.operator[]( i )->Channel() == aChannel )
+            {
+            aAudioControls.AppendL( iAudioControls.operator[]( i ) );
+            }
+        }
+    API_TRACE_( "[AccFW: ACCPOLAUDIODEVICETOPOLOGY] CAccPolAudioUnitBase::GetAudioControlL() Return" );
+    }
+
+// ---------------------------------------------------------------------------
+// CAccPolAudioUnitBase::GetAudioControlsL
+// ---------------------------------------------------------------------------
+//
+EXPORT_C void CAccPolAudioUnitBase::GetAudioControlsL(
+    RPointerArray<CAccPolAudioControlBase>& aAudioControls ) const
+    {
+    API_TRACE_( "[AccFW: ACCPOLAUDIODEVICETOPOLOGY] CAccPolAudioUnitBase::GetAudioControlsL() -Enter" );
+    TInt count = iAudioControls.Count();
+    API_TRACE_1( "[AccFW: ACCPOLAUDIODEVICETOPOLOGY] CAccPolAudioUnitBase::GetAudioControlsL() - count=%d", count );
+    for( TInt i = 0; i < count; i++ )
+        {
+        aAudioControls.AppendL( iAudioControls.operator[]( i ) );
+        }
+    API_TRACE_( "[AccFW: ACCPOLAUDIODEVICETOPOLOGY] CAccPolAudioUnitBase::GetAudioControlsL() - Return" );
+    }
+
+// ---------------------------------------------------------------------------
+// CAccPolAudioUnitBase::GetAudioControlsL
+// ---------------------------------------------------------------------------
+//
+EXPORT_C TBool CAccPolAudioUnitBase::GetNextAudioUnitL(
+    CAccPolAudioUnitBase*& aAudioUnit ) const
+    {
+    API_TRACE_( "[AccFW: ACCPOLAUDIODEVICETOPOLOGY] CAccPolAudioUnitBase::GetNextAudioUnitL() - Enter" );
+    RPointerArray<CAccPolAudioUnitBase> audioUnits;
+    TBool bFound = EFalse;
+
+    reinterpret_cast<CAccPolAudioTopologyObjectCon*> ( iObjectContainer )->GetAudioUnitsL(
+        audioUnits );
+
+    TInt count = audioUnits.Count();
+
+    aAudioUnit = NULL;
+    for( TInt i = 0; i < count; i++ )
+        {
+
+        if( iSourceId.Count() != 0 ) //JNI
+            {
+            API_TRACE_1( "[AccFW: ACCPOLAUDIODEVICETOPOLOGY] SourceId - count=%d", iSourceId.Count() );
+            TInt sourceid = iSourceId.operator[]( 0 );
+            if( iSourceId.operator[]( 0 )
+                == audioUnits.operator[]( i )->UnitId() )
+                {
+                aAudioUnit = audioUnits.operator[]( i );
+                aAudioUnit->SetPreviousUnitId( UnitId() );
+                bFound = ETrue;
+                break;
+                }
+            }
+        }
+
+    API_TRACE_1( "[AccFW: ACCPOLAUDIODEVICETOPOLOGY] CAccPolAudioUnitBase::GetNextAudioUnitL() - Return=%d", bFound );
+    return bFound;
+    }
+
+// ---------------------------------------------------------------------------
+// CAccPolAudioUnitBase::GetAudioControlsL
+// ---------------------------------------------------------------------------
+//
+EXPORT_C TBool CAccPolAudioUnitBase::GetPreviousAudioUnitL(
+    CAccPolAudioUnitBase*& aAudioUnit ) const
+    {
+    API_TRACE_( "[AccFW: ACCPOLAUDIODEVICETOPOLOGY] CAccPolAudioUnitBase::GetPreviousAudioUnitL() - Enter" );
+    TBool bFound = EFalse;
+    RPointerArray<CAccPolAudioUnitBase> audioUnits;
+
+    reinterpret_cast<CAccPolAudioTopologyObjectCon*> ( iObjectContainer )->GetAudioUnitsL(
+        audioUnits );
+    TInt count = audioUnits.Count();
+
+    aAudioUnit = NULL;
+    for( TInt i = 0; i < count; i++ )
+        {
+        if( PreviousUnitId() == audioUnits.operator[]( i )->UnitId() )
+            {
+            aAudioUnit = audioUnits.operator[]( i );
+            bFound = ETrue;
+            break;
+            }
+        }
+    API_TRACE_1( "[AccFW: ACCPOLAUDIODEVICETOPOLOGY] CAccPolAudioUnitBase::GetPreviousAudioUnitL() - Return=%d", bFound );
+    return bFound;
+    }
+
+// ---------------------------------------------------------------------------
+// CAccPolAudioUnitBase::GetAudioControlsL
+// ---------------------------------------------------------------------------
+//
+EXPORT_C void CAccPolAudioUnitBase::GetAudioUnitListL(
+    RPointerArray<CAccPolAudioUnitBase>& aAudioUnits ) const
+    {
+    API_TRACE_( "[AccFW: ACCPOLAUDIODEVICETOPOLOGY] CAccPolAudioUnitBase::GetAudioUnitListL() - Enter" );
+    RPointerArray<CAccPolAudioUnitBase> audioUnits;
+
+    reinterpret_cast<CAccPolAudioTopologyObjectCon*> ( iObjectContainer )->GetAudioUnitsL(
+        audioUnits );
+    TInt audioUnitCount = audioUnits.Count();
+    TInt sourceIdCount = iSourceId.Count();
+    API_TRACE_1( "[AccFW: ACCPOLAUDIODEVICETOPOLOGY] CAccPolAudioUnitBase::GetAudioUnitListL() - Source id count=%d", sourceIdCount );
+    for( TInt i = 0; i < sourceIdCount; i++ )
+        {
+        for( TInt j = 0; j < audioUnitCount; j++ )
+            {
+            if( iSourceId.operator[]( i )
+                == audioUnits.operator[]( j )->UnitId() )
+                {
+                aAudioUnits.AppendL( audioUnits.operator[]( j ) );
+                audioUnits.operator[]( j )->SetPreviousUnitId( UnitId() ); //JNI               
+                }
+            }
+        }
+    API_TRACE_( "[AccFW: ACCPOLAUDIODEVICETOPOLOGY] CAccPolAudioUnitBase::GetAudioUnitListL() - Return" );
+    }
+
+// ---------------------------------------------------------------------------
+// CAccPolAudioUnitBase::AddControlL
+// ---------------------------------------------------------------------------
+//
+EXPORT_C void CAccPolAudioUnitBase::AddControlL(
+    CAccPolAudioControlBase& aAudioControl )
+    {
+    API_TRACE_( "[AccFW: ACCPOLAUDIODEVICETOPOLOGY] CAccPolAudioUnitBase::AddControlL() - Enter" );
+    aAudioControl.SetUnitId( iUnitId );
+
+    TUint8 objectType;
+    objectType = aAudioControl.ObjectType();
+
+    switch( objectType )
+        {
+        case EAccPolAudioVolumeControlObject:
+            {
+            CAccPolVolumeControl *volumeControl = CAccPolVolumeControl::NewL();
+            CleanupStack::PushL( volumeControl );
+            *volumeControl = ( CAccPolVolumeControl& )aAudioControl;
+            iAudioControls.AppendL( volumeControl );
+            CleanupStack::Pop();
+            }
+            break;
+
+        case EAccPolAudioMuteControlObject:
+            {
+            CAccPolMuteControl *muteControl = CAccPolMuteControl::NewL();
+            CleanupStack::PushL( muteControl );
+            *muteControl = ( CAccPolMuteControl& )aAudioControl;
+            iAudioControls.AppendL( muteControl );
+            CleanupStack::Pop();
+            }
+            break;
+
+        case EAccPolAudioInputControlObject:
+            {
+            CAccPolInputControl *inputControl = CAccPolInputControl::NewL();
+            CleanupStack::PushL( inputControl );
+            *inputControl = ( CAccPolInputControl& )aAudioControl;
+            iAudioControls.AppendL( inputControl );
+            CleanupStack::Pop();
+            }
+            break;
+
+        default:
+            {
+            User::Leave( KErrNotSupported );
+            }
+            break;
+        }
+
+    API_TRACE_( "[AccFW: ACCPOLAUDIODEVICETOPOLOGY] CAccPolAudioUnitBase::AddControlL() - Return" );
+    }
+// ---------------------------------------------------------------------------
+// CAccPolObjectBase::ExternalizeBaseLd
+// ---------------------------------------------------------------------------
+//
+EXPORT_C void CAccPolAudioUnitBase::ExternalizeAudioUnitBaseL(
+    RWriteStream& aStream ) const
+    {
+    API_TRACE_( "[AccFW: ACCPOLAUDIODEVICETOPOLOGY] CAccPolAudioUnitBase::ExternalizeAudioUnitBaseL() - Enter" );
+    TInt count( KErrNone );
+    //Add data
+    aStream.WriteUint8L( iUnitId );
+    count = iSourceId.Count();
+    aStream.WriteInt8L( iSourceId.Count() );
+    for( TInt i = 0; i < count; i++ )
+        {
+        aStream.WriteUint8L( ( TUint8 )iSourceId.operator[]( i ) );
+        }
+    count = iAudioControls.Count();
+    aStream.WriteInt8L( count );
+
+    API_TRACE_1( "[AccFW: ACCPOLAUDIODEVICETOPOLOGY] CAccPolAudioUnitBase::ExternalizeAudioUnitBaseL - Unit id         = %d", iUnitId );
+    API_TRACE_1( "[AccFW: ACCPOLAUDIODEVICETOPOLOGY] CAccPolAudioUnitBase::ExternalizeAudioUnitBaseL - Source id count = %d", iSourceId.Count() );
+    API_TRACE_1( "[AccFW: ACCPOLAUDIODEVICETOPOLOGY] CAccPolAudioUnitBase::ExternalizeAudioUnitBaseL - Audio controls count = %d", iAudioControls.Count() );
+
+    for( TInt i = 0; i < iAudioControls.Count(); i++ )
+        {
+        iAudioControls[i]->ExternalizeL( aStream );
+        }
+    API_TRACE_( "[AccFW: ACCPOLAUDIODEVICETOPOLOGY] CAccPolAudioUnitBase::ExternalizeBaseL - Return" );
+    }
+
+// ---------------------------------------------------------------------------
+// CAccPolObjectBase::InternalizeBaseL
+// ---------------------------------------------------------------------------
+//
+EXPORT_C void CAccPolAudioUnitBase::InternalizeAudioUnitBaseL(
+    RReadStream& aStream )
+    {
+    API_TRACE_( "[AccFW: ACCPOLAUDIODEVICETOPOLOGY] CAccPolAudioUnitBase::InternalizeAudioUnitBaseL() - Enter" );
+    TInt count( KErrNone );
+    iUnitId = aStream.ReadUint8L();
+    count = aStream.ReadInt8L();
+    for( TInt i = 0; i < count; i++ )
+        {
+        iSourceId.Append( ( TInt )aStream.ReadUint8L() );
+        }
+
+    API_TRACE_1( "[AccFW: ACCPOLAUDIODEVICETOPOLOGY] CAccPolAudioUnitBase::InternalizeAudioUnitBaseL - Unit id         = %d", iUnitId );
+    API_TRACE_1( "[AccFW: ACCPOLAUDIODEVICETOPOLOGY] CAccPolAudioUnitBase::InternalizeAudioUnitBaseL - Source id count = %d", iSourceId.Count() );
+
+    count = aStream.ReadInt8L();
+    for( TInt i = 0; i < count; i++ )
+        {
+        //Object type
+        TUint8 objectType = aStream.ReadUint8L();
+        switch( objectType )
+            {
+            case EAccPolAudioVolumeControlObject:
+                {
+                CAccPolVolumeControl *volumeControl =
+                    CAccPolVolumeControl::NewLC();
+                volumeControl->InternalizeL( aStream );
+                this->AddControlL( *volumeControl );
+                CleanupStack::PopAndDestroy( volumeControl );
+                }
+                break;
+
+            case EAccPolAudioMuteControlObject:
+                {
+                CAccPolMuteControl *muteControl = CAccPolMuteControl::NewLC();
+                muteControl->InternalizeL( aStream );
+                this->AddControlL( *muteControl );
+                CleanupStack::PopAndDestroy( muteControl );
+                }
+                break;
+
+            case EAccPolAudioInputControlObject:
+                {
+                CAccPolInputControl *inputControl =
+                    CAccPolInputControl::NewLC();
+                inputControl->InternalizeL( aStream );
+                this->AddControlL( *inputControl );
+                CleanupStack::PopAndDestroy( inputControl );
+                }
+                break;
+
+            default:
+                {
+                User::Leave( KErrNotSupported );
+                }
+                break;
+            }
+        }
+    API_TRACE_1( "[AccFW: ACCPOLAUDIODEVICETOPOLOGY] CAccPolAudioUnitBase::InternalizeAudioUnitBaseL - Audio controls count = %d", iAudioControls.Count() );
+
+    API_TRACE_( "[AccFW: ACCPOLAUDIODEVICETOPOLOGY] CAccPolAudioUnitBase::InternalizeAudioUnitBaseL - Return" );
+    }