svgtopt/SVG/SVGImpl/src/SVGAudioElementImpl.cpp
author hgs
Tue, 22 Jun 2010 12:13:10 +0300
changeset 27 2cc5318a4e7d
parent 0 d46562c3d99d
permissions -rw-r--r--
201025

/*
* Copyright (c) 2005 - 2006 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:  SVG Implementation source file
 *
*/



#if !defined(__E32BASE_H__)
#include <e32base.h>
#endif

#include <AudioPreference.h> // For priority/pref values

#include "SVGAudioElementImpl.h"
#include "SVGDocumentImpl.h"
#include "SVGEngineImpl.h"
#include "SVGSchemaData.h"
#include "SVGTimeContainer.h"

_LIT(KAudioAMR, "audio/amr");
_LIT(KAudioAWB, "audio/amr-wb");
_LIT(KAudioMP3, "audio/mpeg");
_LIT(KAudioMP4, "audio/mp4");
_LIT(KAudio3GP, "audio/3gp");
_LIT(KAudio3G2, "audio/3g2");
_LIT(KAudioAAC, "audio/aac");
_LIT(KAudioMID, "audio/midi");
_LIT(KAudioMID2, "audio/sp-midi");
_LIT(KAudioRMF, "audio/rmf");
_LIT(KAudioRMF2, "audio/x-rmf");
_LIT(KAudioRMF3, "audio/x-beatnik-rmf");
_LIT(KAudioMXMF, "audio/mobile-xmf");
_LIT(KAudioWMA, "audio/x-ms-wma");
_LIT(KAttrAudioType,  "type" );
_LIT(KXlinkHref,  "xlink:href" );
_LIT(KDur,"dur");
_LIT(KMedia,"media");
_LIT(KAudioLevelStr,  "audio-level");
_LIT(KVolumeStr,  "volume");

// audio-level property by default is  100%
const TInt KAudioLevelDefaultPercent = 100;
const  TInt KMillisecondsPerMicrosecond = 1000;
// ---------------------------------------------------------------------------
// Create new element of audioelementimpl
// ---------------------------------------------------------------------------
CSvgAudioElementImpl* CSvgAudioElementImpl::NewL(  const TUint8 aElemID,
                                                  CSvgDocumentImpl* aDoc )
    {
    CSvgAudioElementImpl*   self    = new ( ELeave )
                                      CSvgAudioElementImpl( aDoc );
    CleanupStack::PushL( self );
    self->ConstructL(  aElemID, aDoc );
    CleanupStack::Pop();
    return self;
    }

// ---------------------------------------------------------------------------
// Create new element of audioelementimpl
// ---------------------------------------------------------------------------
CSvgAudioElementImpl* CSvgAudioElementImpl::NewLC(  const TUint8 aElemID,
                                                   CSvgDocumentImpl* aDoc )
    {
    CSvgAudioElementImpl*   self    = new ( ELeave )
                                      CSvgAudioElementImpl( aDoc );
    CleanupStack::PushL( self );
    self->ConstructL(  aElemID,aDoc );
    return self;
    }

// ---------------------------------------------------------------------------
// Create new element of audioelementimpl
// ---------------------------------------------------------------------------
void CSvgAudioElementImpl::ConstructL(  const TUint8 aElemID,
                                       CSvgDocumentImpl* /* aDoc */ )
    {
    iPercentLevelVolume = KAudioLevelDefaultPercent;
	CSvgMediaElementBase::ConstructL( aElemID );
	iStoredPos = 0;
    }

// ---------------------------------------------------------------------------
// Destructor for Audioelement
// ---------------------------------------------------------------------------
CSvgAudioElementImpl::~CSvgAudioElementImpl()
    {
	if ( iAudioPlayer )
        {
        iAudioPlayer->Stop();
   	    delete iAudioPlayer;
   	    iAudioPlayer = NULL;
        }
    if( iUri)
        {
        delete iUri;
        iUri= NULL;
        }
    }

// ---------------------------------------------------------------------------
// Sets attributes of audio element
// ---------------------------------------------------------------------------
TInt CSvgAudioElementImpl::SetAttributeL( const TDesC& aName,
                                          const TDesC& aValue )
    {
    if (!iTargetSet)
        {
	    iTargetElement = ( CSvgElementImpl * ) ParentNode();// default is parent element
		if (iTargetElement)
			{
    	    iTargetSet = ETrue;
			}
        }

    if(aName == KDur && aValue != KMedia)
        {
    	iDurMedia = EFalse;
    	
        }
    
    if( aName == KXlinkHref)
        {
        this->SetXlinkAttributeL(aName,aValue);
        iUri = aValue.AllocL();        
        }
    if ( aName == KAttrAudioType )
        {
        HBufC16* tempValue = aValue.Alloc();
        TPtr16 lowercaseValue = tempValue->Des();
        lowercaseValue.LowerCase();

        if ( !( (lowercaseValue == KAudioAMR) ||
            (lowercaseValue == KAudioAWB)  ||
            (lowercaseValue == KAudioMP3)  ||
            (lowercaseValue == KAudioMP4)  ||
            (lowercaseValue == KAudio3GP)  ||
            (lowercaseValue == KAudio3G2)  ||
            (lowercaseValue == KAudioAAC)  ||
            (lowercaseValue == KAudioMID)  ||
            (lowercaseValue == KAudioMID2) ||
            (lowercaseValue == KAudioRMF)  ||
            (lowercaseValue == KAudioRMF2) ||
            (lowercaseValue == KAudioRMF3) ||
            (lowercaseValue == KAudioMXMF) ||
            (lowercaseValue == KAudioWMA) ))
                {
                iAudioStatus = EPlayerProhibit;
                }
        delete tempValue;
        }
    else if  (( aName ==  KAudioLevelStr)  || ( aName ==  KVolumeStr ))
        {
        TLex value  ( aValue );
        TReal32 volume;
        if( value.Val( volume, '.' ) == KErrNone)
            {
            iVolume = volume < 0 ? 0 : volume;
            iVolume = volume > 1 ? 1 : volume;
            }
        return KErrNone;
        }
    return CSvgMediaElementBase::SetAttributeL( aName, aValue );
    }

// ---------------------------------------------------------------------------
// Sets attributes of audio element
// ---------------------------------------------------------------------------

TInt  CSvgAudioElementImpl::SetAttributeDesL( const TInt aNameId,
											   const TDesC& aValue )
	{
	return CSvgElementImpl::SetAttributeDesL( aNameId, aValue );
    }

// ---------------------------------------------------------------------------
// Sets attributes of audio element
// ---------------------------------------------------------------------------
TInt CSvgAudioElementImpl::SetAttributeFloatL( const TInt aNameId,
                                               TFloatFixPt aValue )
    {
	return CSvgMediaElementBase::SetAttributeFloatL(aNameId,aValue);
    }


// ---------------------------------------------------------------------------
// Gets attributes of audio element
// ---------------------------------------------------------------------------
TInt CSvgAudioElementImpl::GetAttributeFloat(const TInt aNameId,
                                                TFloatFixPt& aValue )
    {
	return CSvgMediaElementBase::GetAttributeFloat(aNameId,aValue);
    }


// perform a deep clone of this object
// ---------------------------------------------------------------------------
// Deep Copy of the parent
// ---------------------------------------------------------------------------
MXmlElement* CSvgAudioElementImpl::CloneL(MXmlElement* aParentElement)
    {
    CSvgAudioElementImpl* newElement = CSvgAudioElementImpl::NewL(
        this->ElemID(), ((CSvgDocumentImpl*)iOwnerDocument) );

    CleanupStack::PushL(newElement);
    newElement->iParentNode = aParentElement;
    // copy everything over
    this->CopyL(newElement);
    CleanupStack::Pop();
    return newElement;
    }


// ---------------------------------------------------------------------------
// From MSvgEventReceiver
// ---------------------------------------------------------------------------
TBool CSvgAudioElementImpl::ReceiveEventL( MSvgEvent* aEvent )
    {
    return CSvgMediaElementBase::ReceiveEventProcL( aEvent, this );
    }

// ---------------------------------------------------------------------------
// CSvgAudioElementImpl::InitAnimationL
// From CSvgMediaElementBase
// ---------------------------------------------------------------------------
void CSvgAudioElementImpl::InitAnimationL()
    {
    CSvgMediaElementBase::InitAnimationL();
    }

// ---------------------------------------------------------------------------
// CSvgAudioElementImpl::ResetAnimationL
// From CSvgMediaElementBase
// ---------------------------------------------------------------------------
void CSvgAudioElementImpl::ResetAnimationL()
    {
	if (( iAnimStatus == KAnimActive ) ||
		( iAnimStatus == KAnimFinished) ||
		( iAnimStatus == KAnimEnd))
		{
			
		if (( iAudioStatus == EPlayerStatePlaying ) ||
		( iAudioStatus == EPlayerStateComplete ))
    		{
    		// Save the audio start offset
            iAudioStartOffset = 
                ( ( CSvgDocumentImpl* )iOwnerDocument)->CurrentTime();
            iStoredPos = 0;    
    		// if previously audio is still playing, and asked to play again...
        	iAudioPlayer->Stop();
            //For  Negative Begin
        	if ( iNegativeBeginTime < 0)
    	        {
    	            const TInt64 aInterval = iNegativeBeginTime * -KMillisecondsPerMicrosecond;
    	            TTimeIntervalMicroSeconds aTime(aInterval);        
    	            iAudioPlayer->SetPosition(aTime);
    	            iStoredPos = aTime;
    	        }
            //For  Negative Begin

        	iAudioPlayer->Play();
        	iAudioStatus = EPlayerStatePlaying;
    		}
		}
    }

// ---------------------------------------------------------------------------
// CSvgAudioElementImpl::Reset
// From CSvgMediaElementBase
// ---------------------------------------------------------------------------
void CSvgAudioElementImpl::Reset( MSvgEvent* aEvent )
	{

	iIsUserSeek = ETrue;
    iStoredPos = 0;
	// call the animation base function.
	TSvgTimerEvent* timerEvent  = ( TSvgTimerEvent* ) aEvent;
	if((TInt32)timerEvent->Time() < iAbsoluteBeginTime)
		{
		// let it come to initial position.
		//((CSvgDocumentImpl*)iOwnerDocument)->iInitialDrawFlag = ETrue;
		ReInitializeAnimation();
		return;
		}
	TRAPD(error,CSvgAnimationBase::ResetL( aEvent, this));
    if (error != KErrNone)
        {
        // error processing not processed
        return;
        }
	}  
	
// ---------------------------------------------------------------------------
// Call AnimaProcL
// ---------------------------------------------------------------------------
TBool CSvgAudioElementImpl::DoAnimProcL(MSvgEvent* aEvent)
    {
    return this->AnimProcL((MSvgTimerEvent*)aEvent);
    }


// ---------------------------------------------------------------------------
// From MsvgAnimationBase
// ---------------------------------------------------------------------------
TBool CSvgAudioElementImpl::AnimProcL( MSvgTimerEvent* /*aEvent*/ )
    {
#ifdef _DEBUG    
   	RDebug::Print(_L("%d %d"), iAnimStatus, IsAnimating());
#endif   	
    if ( iAudioStatus == EPlayerProhibit )
        return EFalse;
    
    if ( /*iAnimTime->DurationTime() == KTimeIndefinite ||*/ iAnimTime->DurationTime() == 0 )
        {
         return EFalse;
        }
	
    if ( !iAudioPlayer )
        {
    	iAudioPlayer = CMdaAudioPlayerUtility::NewL(*this);
        RDebug::Print(_L("SvgtAudioElem: Player created"));
        }

    if ( iAudioStatus != EPlayerStateIdle && !iAudioPlayer )
        {
        // Error case, when player is initialised but
        // iAudioPlayer pointer is NULL.
        return EFalse;
        }

    if( iAnimStatus != KAnimActive )
        {
        if ( iAudioStatus == EPlayerStatePlaying )
    		{
    		iStoredPos = 0;
        	iAudioPlayer->Stop();
        	iAudioStatus = EPlayerStateStop;
        	return EFalse;
    		}
        }
    else //iAnimStatus == KAnimActive
        {
        if ( !iHadBegun )
            {
            iHadBegun = ETrue;
            // Save the time the audio element starts
            iAudioStartOffset = 
                ( ( CSvgDocumentImpl* )iOwnerDocument)->CurrentTime();

            // this is a restart from begin list.
            if ((iAudioStatus != EPlayerStateIdle) &&
            	(iAudioStatus != EPlayerStatePlayInit))
            	{
		    	iStoredPos = 0;
		    	iAudioPlayer->Stop();
		    	iAudioPlayer->Play();
		    	iAudioStatus = EPlayerStatePlaying;
            	}
            return ETrue;
         }

        if ( iAudioStatus == EPlayerStateIdle ) // stopped
        {
        // Indicate to the time container that audio element 
        // is not ready
        ( ( CSvgDocumentImpl* )
            iOwnerDocument )->TimeContainer()->TimedEntityNotReady( 
            this );
        // Save the audio start offset
        iAudioStartOffset = 
            ( ( CSvgDocumentImpl* )iOwnerDocument)->CurrentTime();
        TPtrC href = Href();
        #ifdef _DEBUG            
        RDebug::Print(_L("CSvgAudioElementImpl::NewFilePlayerL is to be called"));
        RDebug::RawPrint(href);
        #endif           	           	

        //Check and load file here
        RFs  session;
        CSvgErrorImpl* SvgError  =  CSvgErrorImpl::NewL();
        CSvgDocumentImpl::OpenSession( session,  *SvgError  );

        RFile fileHandle;

        CSvgDocumentImpl* document = (CSvgDocumentImpl*)OwnerDocument();
        CSvgEngineImpl* engine  = document->Engine();
        MSvgRequestObserver* lRequestObserver = NULL;
        TInt lFetchStatus = KErrNone;
        if(engine!= NULL)
            {
            lRequestObserver =  engine->iRequestObserver;
            }
        else
            {
            return EFalse;
            }
            
        if(lRequestObserver != NULL)
            {
            lFetchStatus = lRequestObserver->FetchImage( *iUri, session, fileHandle );
            }
        else
            {
            return EFalse;
            }
        
        if(lFetchStatus == KErrNone)
         {
         iAudioPlayer->OpenFileL(fileHandle);
         
         }
           else
             {
             return EFalse;
             }
        if(SvgError) 
         {
         delete SvgError;
         }
        session.Close();
        iAudioStatus = EPlayerStatePlayInit;  	
        #ifdef _DEBUG       		
        RDebug::Print(_L("SvgtAudioElem: File opened"));
        #endif           	
        return ETrue;
        }
        if( iAudioStatus == EPlayerStateStop && iTcCommandState != ESvgTEPausedState)
        {

        		iAudioStartOffset = 
                ( ( CSvgDocumentImpl* )iOwnerDocument)->CurrentTime();
            // if previously audio is still playing, and asked to play again...
        	iAudioPlayer->Play();
        	iAudioStatus = EPlayerStatePlaying;
            }
        }
        return ETrue;
    }



// ---------------------------------------------------------------------------
// Set the volume of the Audio Player to the specified level
// ---------------------------------------------------------------------------
void CSvgAudioElementImpl::SetVolume(TInt aPercentage)
    {
    if(
    iAudioPlayer && 
    (iAudioStatus != EPlayerStateIdle && iAudioStatus != EPlayerStatePlayInit && iAudioStatus != EPlayerProhibit)
    )
        {
        TInt lVolLevel = 0;
        // Check if within limits
        if  ( aPercentage > 0  && aPercentage <= 100 )
            {
#ifdef __WINSCW__            
            const TReal32 KMaxAudioVolumeLevels = 65535;
#else
            const TReal32 KMaxAudioVolumeLevels = iAudioPlayer->MaxVolume();
#endif   
            // Calculating the volume based on system volume & element volume
            TReal32 lRealLevel = ((TReal32)aPercentage/100.0) * KMaxAudioVolumeLevels * iVolume;
            lVolLevel = lRealLevel;
            }
        iAudioPlayer->SetVolume(lVolLevel);
        }
    iPercentLevelVolume = aPercentage;
    }

// ---------------------------------------------------------------------------
// From CMdaAudioPlayerUtility
// Callback from Audio Player indicating the audio has finished initalisation
// ---------------------------------------------------------------------------
void CSvgAudioElementImpl::MapcInitComplete(TInt aError,
                const TTimeIntervalMicroSeconds& aDuration)
	{
	if ( aError == KErrNone )
	    {
       	if(iDurMedia)
          	{
            TTimeIntervalMicroSeconds durInMicroS;
            durInMicroS   = aDuration;


            TInt32 durInMilliS;
            durInMilliS  =  durInMicroS.Int64()  /  KMillisecondsPerMicrosecond;

            iAnimTime->SetDurationTime(durInMilliS);
            //In ReInitialize function of AnimTimeController
            // the duration is reinitialized from Org Duration
            iAnimTime->SetOrgDurationTime(durInMilliS);
           	}
#ifdef _DEBUG           	
    	RDebug::Print(_L("CSvgAudioElementImpl::MapcInitComplete :-> Open audio file OK!"));
#endif    	
    	iMediaDuration = aDuration;

        TInt lVolLevel = 0;

        // Check if within limits
        if  ( iPercentLevelVolume > 0  && iPercentLevelVolume <= 100 )
            {
#ifdef __WINSCW__            
            const TReal32 KMaxAudioVolumeLevels = 65535;
#else
            const TReal32 KMaxAudioVolumeLevels = iAudioPlayer->MaxVolume();
#endif            
            // Calculating the volume based on system volume & element volume
            TReal32 lRealLevel = ((TReal32)iPercentLevelVolume/100.0) * KMaxAudioVolumeLevels * iVolume;
            lVolLevel = lRealLevel;
            }
        iAudioPlayer->SetVolume(lVolLevel);
        // If the pause command was issued do not play, the resume should set 
        // it playing
        if(iTcCommandState == ESvgTEPlayingState)
            {
#ifdef _DEBUG            
            RDebug::Print(_L("To play"));
#endif            
            iAudioPlayer->Play();
            iAudioStatus = EPlayerStatePlaying;
            }
        else if(iTcCommandState == ESvgTEStoppedState)
            {
            iAudioStatus = EPlayerStateStop;
            }
        else
            {
             iAudioStatus = EPlayerStatePaused;
            }
        }
    else
        {
        #ifdef _DEBUG
    	RDebug::Print(_L("CSvgAudioElementImpl::MapcPlayComplete :-> Error code [%d]"), aError);
    	#endif
        }
    if ( iNegativeBeginTime < 0 )
        {
        const TInt64 aInterval = iNegativeBeginTime * -1000;
        TTimeIntervalMicroSeconds aTime(aInterval);        
        iAudioPlayer->SetPosition(aTime);
        iStoredPos = aTime;
        }
	// Indicate to time container that audio element is ready
    ( ( CSvgDocumentImpl* )iOwnerDocument )->TimeContainer()->TimedEntityReady( 
                this );	
        
	}

// ---------------------------------------------------------------------------
// From CMdaAudioPlayerUtility
// Callback from Audio Player indicating the audio has finished playing
// ---------------------------------------------------------------------------
void CSvgAudioElementImpl::MapcPlayComplete(TInt aError)
	{
    // normal play exit
	iAudioStatus = EPlayerStateComplete;

	if ( aError != KErrNone )
	    {
        #ifdef _DEBUG
	    RDebug::Print(_L("CSvgAudioElementImpl::MapcPlayComplete :-> Error code [%d]"), aError);
    	#endif
	    }
	}

    
// -----------------------------------------------------------------------------
// CSvgAudioElementImpl::CanGenerateTick
// From CSvgMediaElementBase
// -----------------------------------------------------------------------------
TBool CSvgAudioElementImpl::CanGenerateTick()
    {
    // If media is playing then audio element can generate tick
    if ( iAudioPlayer && 
        ( iAudioStatus == EPlayerStatePlaying || 
            iAudioStatus == EPlayerStatePlayInit ) )
        {
        return ETrue;
        }
    return EFalse;
    }

// -----------------------------------------------------------------------------
// CSvgAudioElementImpl::GetEntityCurrentTime
// From CSvgMediaElementBase
// -----------------------------------------------------------------------------
//        
void CSvgAudioElementImpl::GetEntityCurrentTime( TUint32& 
            aEntityCurTime ) // Current Entity Time in msecs. 
    {
    if ( iAudioPlayer && iAudioStatus != EPlayerStateIdle )
        {
        // Convert to  milliseconds and account for negative  begin  time
        // and the audio start offset  and  send back
        if(iAudioStatus == EPlayerStateComplete)
        {
            TTimeIntervalMicroSeconds lDuration = iAudioPlayer->Duration();
            aEntityCurTime = iAudioStartOffset +  lDuration.Int64() / KMillisecondsPerMicrosecond;
        }
        else
        {
            TTimeIntervalMicroSeconds lPos; 
            iAudioPlayer->GetPosition( lPos );
            
            // at EOF lPos returns zero, no point of time should 
            // iStorePos be greater than lPos
            if(iStoredPos > lPos)
                {
                lPos = iStoredPos;
                }
            else
                {
                iStoredPos = lPos;
                }
        #ifdef _DEBUG
    	RDebug::Printf("====================================");
    	RDebug::Printf("Audio gets current position \n");
    	RDebug::Printf("lpos %d", lPos.Int64());
    	RDebug::Printf("====================================");
    	#endif
        aEntityCurTime = iAudioStartOffset + lPos.Int64() / KMillisecondsPerMicrosecond;
        }
        if(iAudioStatus == EPlayerStatePlaying)
            {
            aEntityCurTime += iNegativeBeginTime;
            }
        }
    else
        {
        aEntityCurTime = iAudioStartOffset;
        }
    }

// -----------------------------------------------------------------------------
// CSvgAudioElementImpl::ResyncTimedEntity
// From CSvgMediaElementBase
// -----------------------------------------------------------------------------
void CSvgAudioElementImpl::ResyncTimedEntity( 
            TUint32 aSyncTime ) // Time for resync in msecs.
    {
    if ( iAudioPlayer && iAudioStatus == EPlayerStatePlaying )
        {
        // Convert sync to microsecs before setting position
        TTimeIntervalMicroSeconds  lSeekPos(  aSyncTime  *  KMillisecondsPerMicrosecond );
        iAudioPlayer->SetPosition( lSeekPos );
        iStoredPos = lSeekPos;
        }
    } 

// -----------------------------------------------------------------------------
// CSvgAudioElementImpl::PauseTimedEntity
// From CSvgMediaElementBase
// -----------------------------------------------------------------------------
void CSvgAudioElementImpl::PauseTimedEntity()
    {

    iTcCommandState = ESvgTEPausedState;
      if ( iAudioPlayer && iAudioStatus == EPlayerStatePlaying )
        {
            iAudioPlayer->Pause();
        	iAudioStatus = EPlayerStatePaused;
        }
    }

// -----------------------------------------------------------------------------
// CSvgAudioElementImpl::ResumeTimedEntity
// From CSvgMediaElementBase
// -----------------------------------------------------------------------------
void CSvgAudioElementImpl::ResumeTimedEntity()
    {
    iTcCommandState = ESvgTEPlayingState; 
    // Resume of the player is done only when it is Pause State
    // When resume is done on Stopped/Completed, it might start playing it
    // even though animation is not active or it is not supposed to repeat.
	if ( iAudioStatus == EPlayerStatePaused )
      {
    	iAudioPlayer->Play();
    	iAudioStatus = EPlayerStatePlaying;
      }
    }

// -----------------------------------------------------------------------------
// CSvgAudioElementImpl::StopTimedEntity
// From CSvgMediaElementBase
// -----------------------------------------------------------------------------
void CSvgAudioElementImpl::StopTimedEntity()
    {
    iTcCommandState = ESvgTEStoppedState;
    if ( iAudioPlayer && iAudioStatus != EPlayerStateIdle )
        {
        iStoredPos = 0;
        iAudioPlayer->Stop();
        iAudioStatus = EPlayerStateStop;
        }
    }
    
 
// ---------------------------------------------------------------------------
//From MSvgTimedEntityInterface
// ---------------------------------------------------------------------------
TSvgObjectType CSvgAudioElementImpl::ObjectType()
    {
	return ESvgAudioElement;	
    }



// ---------------------------------------------------------------------------
// returns the child time container of the element 
// used in timecontainer
// ---------------------------------------------------------------------------
CSvgTimeContainer* CSvgAudioElementImpl::GetChildTimeContainer()
    {
    return NULL;
    }
    
    
// ---------------------------------------------------------------------------
// Constructor for CSvgAudioElementImpl
// ---------------------------------------------------------------------------
CSvgAudioElementImpl::CSvgAudioElementImpl( CSvgDocumentImpl* aDoc )
                            : CSvgMediaElementBase( aDoc ),
                            iAudioStatus(EPlayerStateIdle),
                            iVolume(1),
                            iTcCommandState(ESvgTEPlayingState),
                            iDurMedia(ETrue)
    {
	iAttrId = KAtrAudioId;
	iAudioPlayer = NULL;
    }


// ---------------------------------------------------------------------------
// perform a deep copy of this object
// ---------------------------------------------------------------------------
void CSvgAudioElementImpl::CopyL( CSvgAudioElementImpl* aDestElement )
    {
    if(aDestElement)
        {
          // copy stuff from superclass
        this->CSvgElementImpl::CopyL(aDestElement);

        // copy the reference to idoc (CSvgDocumentImpl)
        aDestElement->iOwnerDocument = this->iOwnerDocument;
        aDestElement->iAudioPlayer = this->iAudioPlayer;
        aDestElement->iAudioStatus = this->iAudioStatus;
        aDestElement->iVolume = this->iVolume;
        aDestElement->iPercentLevelVolume = this->iPercentLevelVolume;
        aDestElement->iMediaDuration = this->iMediaDuration;
        aDestElement->iTcCommandState = this->iTcCommandState;
        aDestElement->iAudioStartOffset = this->iAudioStartOffset;
        aDestElement->iDurMedia = this->iDurMedia;
        }
    }
// ---------------------------------------------------------------------------
//
// ---------------------------------------------------------------------------
void CSvgAudioElementImpl::DeactivateAnimation()
	{
	CSvgAnimationBase::DeactivateAnimation(this);
	}

// ---------------------------------------------------------------------------
// 
// ---------------------------------------------------------------------------
void CSvgAudioElementImpl::Print( TBool aIsEncodeOn )
    {
	if (!aIsEncodeOn)
    	{
    	#ifdef _DEBUG
    	RDebug::Printf("<audio>");
    	#endif
        }
    }

// ---------------------------------------------------------------------------
// End of file
// ---------------------------------------------------------------------------