htiui/HtiServicePlugins/HtiAudioServicePlugin/src/HtiAudioServicePlugin.cpp
branchRCL_3
changeset 43 48060abbbeaf
parent 42 d40e813b23c0
child 45 b3cee849fa46
--- a/htiui/HtiServicePlugins/HtiAudioServicePlugin/src/HtiAudioServicePlugin.cpp	Thu Jul 15 18:39:46 2010 +0300
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,1672 +0,0 @@
-/*
-* Copyright (c) 2009 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:  Implements the ECom plugin for HTI audio playback control
-*                service.
-*
-*/
-
-
-
-// INCLUDE FILES
-#include <apgcli.h>
-#include <AudioPreference.h>
-#include <bautils.h>
-#include <e32std.h>
-#include <HtiDispatcherInterface.h>
-#include <HtiLogging.h>
-#include <pathinfo.h>
-
-#include "HtiAudioServicePlugin.h"
-
-// EXTERNAL DATA STRUCTURES
-
-// EXTERNAL FUNCTION PROTOTYPES
-
-// CONSTANTS
-const static TInt KPlayToneCmdLength    = 13;
-const static TInt KStopCmdLength        = 1;
-const static TInt KSetVolCmdLength      = 2;
-const static TInt KListCmdMinLength     = 4;
-const static TInt KPlayDtmfCmdMinLength = 17;
-const static TInt KPlayFileCmdMinLength = 21;
-const static TInt KDurationCmdMinLength = 6;
-const static TInt KMaxVolCmdMinLength   = 6;
-
-const static TInt KTUintSize = sizeof( TUint );
-
-// MACROS
-
-// LOCAL CONSTANTS AND MACROS
-const static TUid KAudioServiceUid = { 0x10210CCB };
-
-_LIT( KBackslash, "\\" );
-_LIT( KRngMimeType, "application/vnd.nokia.ringing-tone" );
-_LIT( KAudioMimeType, "audio/*" );
-
-// NOTE: Max length for error description is defined
-// in HtiDispatcherInterface.h (currently 118).
-_LIT8( KErrorNoCmd, "ERROR: No command given" );
-_LIT8( KErrorUnknownCmd, "ERROR: Unknown Audio Service command" );
-_LIT8( KErrorInvalidParameters,
-    "ERROR: Invalid parameter data for this command" );
-_LIT8( KErrorInvalidPath, "ERROR: Invalid path" );
-_LIT8( KErrorToneInitFailed, "ERROR: Tone initialization failed" );
-_LIT8( KErrorTonePlayFailed, "ERROR: Tone playing failed" );
-_LIT8( KErrorFileInitFailed, "ERROR: File playing initialization failed" );
-_LIT8( KErrorFilePlayFailed, "ERROR: File playing failed" );
-_LIT8( KErrorBusyPlaying, "ERROR: Currently busy playing" );
-_LIT8( KErrorNothingPlaying, "ERROR: Nothing playing" );
-_LIT8( KErrorDurationFailed, "ERROR: Duration query failed" );
-_LIT8( KErrorMaxVolFailed, "ERROR: Max volume query failed" );
-_LIT8( KErrorPosition, "ERROR: Invalid start or end position value" );
-
-// MODULE DATA STRUCTURES
-
-// LOCAL FUNCTION PROTOTYPES
-
-// FORWARD DECLARATIONS
-
-// ============================= LOCAL FUNCTIONS ===============================
-
-// ============================ MEMBER FUNCTIONS ===============================
-
-// -----------------------------------------------------------------------------
-// CHtiAudioServicePlugin::CHtiAudioServicePlugin
-// C++ default constructor can NOT contain any code, that might leave.
-// -----------------------------------------------------------------------------
-//
-CHtiAudioServicePlugin::CHtiAudioServicePlugin():iIsBusy( EFalse ),
-                                                 iIsPlaying( EFalse ),
-                                                 iCommandId( 0 ),
-                                                 iPlayCommandId( 0 ),
-                                                 iMessage( NULL ),
-                                                 iErrorCode( 0 ),
-                                                 iVolume( 0 ),
-                                                 iRepeats( 0 ),
-                                                 iTrailingSilence( 0 ),
-                                                 iDtmfLength( 0 ),
-                                                 iDtmfGapLength( 0 ),
-                                                 iStartPos( 0 ),
-                                                 iEndPos( 0 )
-    {
-    }
-
-
-// -----------------------------------------------------------------------------
-// CHtiAudioServicePlugin::ConstructL
-// Symbian 2nd phase constructor can leave.
-// -----------------------------------------------------------------------------
-//
-void CHtiAudioServicePlugin::ConstructL()
-    {
-    }
-
-
-// -----------------------------------------------------------------------------
-// CHtiAudioServicePlugin::NewL
-// Two-phased constructor.
-// -----------------------------------------------------------------------------
-//
-CHtiAudioServicePlugin* CHtiAudioServicePlugin::NewL()
-    {
-    CHtiAudioServicePlugin* self = new (ELeave) CHtiAudioServicePlugin;
-    CleanupStack::PushL( self );
-    self->ConstructL();
-    CleanupStack::Pop();
-    return self;
-    }
-
-
-// Destructor
-CHtiAudioServicePlugin::~CHtiAudioServicePlugin()
-    {
-    delete iMessage;
-    iMessage = NULL;
-    delete iAudioPlayer;
-    iAudioPlayer = NULL;
-    delete iTonePlayer;
-    iTonePlayer = NULL;
-    }
-
-
-// -----------------------------------------------------------------------------
-// CHtiAudioServicePlugin::ProcessMessageL
-// -----------------------------------------------------------------------------
-//
-void CHtiAudioServicePlugin::ProcessMessageL( const TDesC8& aMessage,
-                                        THtiMessagePriority /*aPriority*/ )
-    {
-    HTI_LOG_FUNC_IN( "CHtiAudioServicePlugin::ProcessMessageL" );
-    HTI_LOG_FORMAT( "Message length = %d", aMessage.Length() );
-
-    if ( iIsBusy )
-        {
-        HTI_LOG_TEXT( "Plugin is busy - leaving" );
-        User::Leave( KErrInUse );
-        }
-
-    // Will be set to EFalse in the SendResponseMsg or SendErrorResponseMsg
-    // methods when the response has been successfully sent and the plugin is
-    // ready for next message.
-    iIsBusy = ETrue;
-
-    if ( aMessage.Length() < 1 )
-        {
-        User::LeaveIfError(
-            SendErrorResponseMsg( KErrArgument, KErrorNoCmd ) );
-        return;
-        }
-
-    iCommandId = aMessage[0];
-    HTI_LOG_FORMAT( "Command = %d", iCommandId );
-    TInt err = KErrNone;
-
-    if ( iCommandId == ECmdListAudioFiles )
-        {
-        TRAP( err, HandleListAudioFilesCmdL( aMessage ) );
-        }
-
-    else if ( iCommandId == ECmdPlayFile )
-        {
-        TRAP( err, HandlePlayFileCmdL( aMessage ) );
-        }
-
-    else if ( iCommandId == ECmdPlayTone )
-        {
-        TRAP( err, HandlePlayToneCmdL( aMessage ) );
-        }
-
-    else if ( iCommandId == ECmdPlayDtmf )
-        {
-        TRAP( err, HandlePlayDtmfCmdL( aMessage ) );
-        }
-
-    else if ( iCommandId == ECmdStop )
-        {
-        TRAP( err, HandleStopCmdL( aMessage ) );
-        }
-
-    else if ( iCommandId == ECmdGetDuration )
-        {
-        TRAP( err, HandleGetDurationCmdL( aMessage ) );
-        }
-
-    else if ( iCommandId == ECmdGetMaxVol )
-        {
-        TRAP( err, HandleGetMaxVolCmdL( aMessage ) );
-        }
-
-    else if ( iCommandId == ECmdSetVol )
-        {
-        TRAP( err, HandleSetVolCmdL( aMessage ) );
-        }
-
-    else
-        {
-        User::LeaveIfError(
-            SendErrorResponseMsg( KErrArgument, KErrorUnknownCmd ) );
-        }
-
-    if ( err != KErrNone )
-        {
-        User::LeaveIfError(
-                SendErrorResponseMsg( err, KNullDesC8, iCommandId ) );
-        }
-
-    HTI_LOG_FUNC_OUT( "CHtiAudioServicePlugin::ProcessMessageL" );
-    }
-
-
-// -----------------------------------------------------------------------------
-// CHtiAudioServicePlugin::HandleListAudioFilesCmdL()
-// -----------------------------------------------------------------------------
-//
-void CHtiAudioServicePlugin::HandleListAudioFilesCmdL( const TDesC8& aMessage )
-    {
-    HTI_LOG_FUNC_IN( "CHtiAudioServicePlugin::HandleListAudioFilesCmdL" );
-
-    RFs fsSession;
-    User::LeaveIfError( fsSession.Connect() );
-    CleanupClosePushL( fsSession );
-
-    // Build a list of directories to scan
-    CDesCArraySeg* directories = new (ELeave) CDesCArraySeg( 5 );
-    CleanupStack::PushL( directories );
-
-    if ( aMessage.Length() == 1 )  // Add default sound directories
-        {
-        TFileName directory;
-
-        // ROM
-        directory.Append( PathInfo::RomRootPath() );
-        directory.Append( PathInfo::SoundsPath() );
-        if ( BaflUtils::PathExists( fsSession, directory ) )
-            {
-            directories->AppendL( directory );
-            AddSubdirsRecursivelyL( directories->MdcaPoint(
-                directories->Count() - 1 ), *directories, fsSession );
-            }
-
-        // Phone memory
-        directory.Zero();
-        directory.Append( PathInfo::PhoneMemoryRootPath() );
-        directory.Append( PathInfo::SoundsPath() );
-        if ( BaflUtils::PathExists( fsSession, directory ) )
-            {
-            directories->AppendL( directory );
-            AddSubdirsRecursivelyL( directories->MdcaPoint(
-                directories->Count() - 1 ), *directories, fsSession );
-            }
-
-        // Memory card
-        directory.Zero();
-        directory.Append( PathInfo::MemoryCardRootPath() );
-        directory.Append( PathInfo::SoundsPath() );
-        if ( BaflUtils::PathExists( fsSession, directory ) )
-            {
-            directories->AppendL( directory );
-            AddSubdirsRecursivelyL( directories->MdcaPoint(
-                directories->Count() - 1 ), *directories, fsSession );
-            }
-        }
-
-    else  // Add given directory
-        {
-        if ( aMessage.Length() < KListCmdMinLength )
-            {
-            User::LeaveIfError( SendErrorResponseMsg(
-                                    KErrArgument, KErrorInvalidParameters ) );
-            CleanupStack::PopAndDestroy( 2 ); // directories, fsSession
-            return;
-            }
-
-        TInt pathLength = aMessage[1];
-        if ( ( aMessage.Length() - pathLength ) != KListCmdMinLength - 2 )
-            {
-            User::LeaveIfError( SendErrorResponseMsg(
-                                    KErrArgument, KErrorInvalidParameters ) );
-            CleanupStack::PopAndDestroy( 2 ); // directories, fsSession
-            return;
-            }
-
-        TFileName directory;
-        TInt nextOffset = ParseString( aMessage, 1, directory );
-        TInt dirLength = directory.Length();
-        if ( dirLength < 2 || nextOffset < 0 )
-            {
-            User::LeaveIfError( SendErrorResponseMsg(
-                                    KErrArgument, KErrorInvalidParameters ) );
-            CleanupStack::PopAndDestroy( 2 ); // directories, fsSession
-            return;
-            }
-
-        HTI_LOG_DES( directory );
-
-        if ( directory[dirLength - 1] != '\\' )
-            {
-            HTI_LOG_TEXT( "Adding backslash to the end" );
-            directory.Append( KBackslash );
-            HTI_LOG_DES( directory );
-            }
-
-        if ( BaflUtils::PathExists( fsSession, directory ) )
-            {
-            HTI_LOG_TEXT( "Given path exists" );
-            directories->AppendL( directory );
-            AddSubdirsRecursivelyL( directories->MdcaPoint(
-                directories->Count() - 1 ), *directories, fsSession );
-            }
-        }
-
-    // Buffer for the file list that is returned
-    CBufFlat* fileListBuf = CBufFlat::NewL( 256 );
-    CleanupStack::PushL( fileListBuf );
-    TInt bufPos = 0;
-
-    TInt audioFileCount = 0;
-    TInt dirCount( directories->Count() );
-    HTI_LOG_FORMAT( "Total directory count = %d", dirCount );
-
-    if ( dirCount == 0 )
-        {
-        HTI_LOG_TEXT( "The given directory did not exist" );
-        User::LeaveIfError( SendErrorResponseMsg(
-                                KErrArgument, KErrorInvalidPath ) );
-        CleanupStack::PopAndDestroy( 3 ); // fileListBuf, directories, fsSession
-        return;
-        }
-
-    // Loop all the directories
-    for ( TInt i = 0; i < dirCount; i++ )
-        {
-        HTI_LOG_TEXT( "Reading dir:" );
-        HTI_LOG_DES( directories->MdcaPoint( i ) );
-        CDir* dir;
-        TInt err = fsSession.GetDir( directories->MdcaPoint( i ),
-            KEntryAttNormal, ESortNone, dir );
-        if ( err )
-            {
-            delete dir;
-            dir = NULL;
-            continue; // This dir is skipped
-            }
-        CleanupStack::PushL( dir );
-
-        // Loop all the entries in this directory
-        TInt fileCount( dir->Count() );
-        for ( TInt j = 0; j < fileCount; j++ )
-            {
-            TFileName filePath;
-            filePath.Copy( directories->MdcaPoint( i ) );
-            filePath.Append( ( *dir )[j].iName );
-
-            // Check MIME type match
-            if ( MatchMimeTypeL( filePath, KAudioMimeType ) ||
-                 MatchMimeTypeL( filePath, KRngMimeType ) )
-                {
-                HBufC8* filePathBuf8 = HBufC8::NewLC( KMaxFileName );
-                filePathBuf8->Des().Copy( filePath );
-                TInt pathLength = filePathBuf8->Length();
-                HTI_LOG_DES( *filePathBuf8 );
-                fileListBuf->ExpandL( bufPos, pathLength + 1 );
-                TBuf8<1> lengthBuf;
-                lengthBuf.Append( pathLength );
-                fileListBuf->Write( bufPos, lengthBuf, 1 );
-                bufPos++;
-                fileListBuf->Write( bufPos, filePathBuf8->Ptr(), pathLength );
-                bufPos += pathLength;
-                CleanupStack::PopAndDestroy(); // filePathBuf8
-                audioFileCount++;
-                }
-
-            } // files loop
-        CleanupStack::PopAndDestroy(); // dir
-        } // directories loop
-
-    HTI_LOG_FORMAT( "Total audio file count = %d", audioFileCount );
-
-    // All files added - write number of files to the beginning of buffer...
-    TBuf8<2> countBuf;
-    countBuf.Append( (TUint8*)(&audioFileCount), 2 );
-    fileListBuf->InsertL( 0, countBuf, 2 );
-
-    // ...and send it away
-    TPtr8 ptr = fileListBuf->Ptr( 0 );
-    User::LeaveIfError( SendResponseMsg( ptr ) );
-
-    CleanupStack::PopAndDestroy( 3 ); // fileListBuf, directories, fsSession
-
-    HTI_LOG_FUNC_OUT( "CHtiAudioServicePlugin::HandleListAudioFilesCmdL" );
-    }
-
-
-// -----------------------------------------------------------------------------
-// CHtiAudioServicePlugin::HandlePlayFileCmdL()
-// -----------------------------------------------------------------------------
-//
-void CHtiAudioServicePlugin::HandlePlayFileCmdL( const TDesC8&aMessage )
-    {
-    HTI_LOG_FUNC_IN( "CHtiAudioServicePlugin::HandlePlayFileCmdL" );
-
-    if ( iIsPlaying )
-        {
-        User::LeaveIfError( SendErrorResponseMsg(
-                                KErrInUse, KErrorBusyPlaying ) );
-        return;
-        }
-
-    iPlayCommandId = ECmdPlayFile;
-
-    /*
-    Message bytes:
-             0 = command code
-             1 = path length
-         2 - n = full path to file
-        next 1 = volume
-        next 4 = start position
-        next 4 = end position
-        next 1 = repeats
-        next 4 = silence between repeats
-        next 1 = audio setting
-    */
-
-    if ( aMessage.Length() < KPlayFileCmdMinLength )
-        {
-        User::LeaveIfError( SendErrorResponseMsg(
-                                KErrArgument, KErrorInvalidParameters ) );
-        return;
-        }
-
-    // Parse parameter values from the message
-    const TUint8* ptr = aMessage.Ptr();
-    TInt pathLength = aMessage[1];
-
-    if ( ( aMessage.Length() - pathLength ) !=
-         ( KPlayFileCmdMinLength - 4 ) )
-        {
-        User::LeaveIfError( SendErrorResponseMsg(
-                                KErrArgument, KErrorInvalidParameters ) );
-        return;
-        }
-
-    TFileName filePath;
-    TInt nextOffset = ParseString( aMessage, 1, filePath );
-    if ( filePath.Length() < 2 || nextOffset < 0 )
-        {
-        User::LeaveIfError( SendErrorResponseMsg(
-                                KErrArgument, KErrorInvalidParameters ) );
-        return;
-        }
-    HTI_LOG_TEXT( "Full file path:" );
-    HTI_LOG_DES( filePath );
-    iVolume = aMessage[nextOffset];
-    nextOffset++;
-    HTI_LOG_FORMAT( "Volume = %d", iVolume );
-    iStartPos = ParseUint32( ptr + nextOffset );
-    HTI_LOG_FORMAT( "Start position = %d", iStartPos );
-    nextOffset += 4;
-    iEndPos = ParseUint32( ptr + nextOffset );
-    HTI_LOG_FORMAT( "End position = %d", iEndPos );
-    nextOffset += 4;
-    iRepeats = aMessage[nextOffset];
-    nextOffset++;
-    HTI_LOG_FORMAT( "Repeats = %d", iRepeats );
-    iTrailingSilence = ParseUint32( ptr + nextOffset );
-    HTI_LOG_FORMAT( "Trailing silence = %d", iTrailingSilence );
-    nextOffset += 4;
-    TInt audioSetting = aMessage[nextOffset];
-    HTI_LOG_FORMAT( "Audio setting = %d", audioSetting );
-
-    // Set audio settings
-    if ( audioSetting > ERingTonePreview ) audioSetting = EDefault;
-    SetAudioSettings( ( TAudioSetting ) audioSetting );
-
-    // Check if file is rng ringtone, it has to be played using tone player -
-    // other formats are played with audio player.
-
-    TInt err = KErrNone;
-    TBool isRng = EFalse;
-    TRAP( err, isRng = MatchMimeTypeL( filePath, KRngMimeType ) );
-
-    if ( err )
-        {
-        User::LeaveIfError( SendErrorResponseMsg( err, KErrorFileInitFailed ) );
-        return;
-        }
-
-    if ( isRng )
-        {
-        HTI_LOG_TEXT( "File is RNG - creating tone player" );
-        TRAP( err, iTonePlayer = CMdaAudioToneUtility::NewL(
-                *this, NULL, iAudioPriority, iAudioPriorityPreference ) );
-        }
-
-    else
-        {
-        HTI_LOG_TEXT( "File is not RNG - creating audio player" );
-        TRAP( err, iAudioPlayer = CMdaAudioPlayerUtility::NewFilePlayerL(
-                filePath, *this, iAudioPriority, iAudioPriorityPreference ) );
-        // MapcInitComplete callback function will be called
-        }
-
-    if ( err )
-        {
-        delete iAudioPlayer;
-        iAudioPlayer = NULL;
-        delete iTonePlayer;
-        iTonePlayer = NULL;
-        User::LeaveIfError( SendErrorResponseMsg(
-                                err, KErrorFileInitFailed ) );
-        }
-
-    if ( iTonePlayer )
-        {
-        iTonePlayer->PrepareToPlayFileSequence( filePath );
-        // MatoPrepareComplete callback function will be called
-        }
-
-    HTI_LOG_FUNC_OUT( "CHtiAudioServicePlugin::HandlePlayFileCmdL" );
-    }
-
-
-// -----------------------------------------------------------------------------
-// CHtiAudioServicePlugin::HandlePlayToneCmdL()
-// -----------------------------------------------------------------------------
-//
-void CHtiAudioServicePlugin::HandlePlayToneCmdL( const TDesC8& aMessage )
-    {
-    HTI_LOG_FUNC_IN( "CHtiAudioServicePlugin::HandlePlayToneCmdL" );
-
-    if ( iIsPlaying )
-        {
-        User::LeaveIfError( SendErrorResponseMsg(
-                                KErrInUse, KErrorBusyPlaying ) );
-        return;
-        }
-
-    iPlayCommandId = ECmdPlayTone;
-
-    /*
-    Message bytes:
-            0  = command code
-        1 - 2  = frequency value
-        3 - 6  = duration value
-            7  = volume value
-            8  = repeat value
-        9 - 12 = silence between repeats
-    */
-
-    if ( aMessage.Length() != KPlayToneCmdLength )
-        {
-        User::LeaveIfError( SendErrorResponseMsg(
-                                KErrArgument, KErrorInvalidParameters ) );
-        return;
-        }
-
-    // Parse parameter values from the message
-    const TUint8* ptr = aMessage.Ptr();
-    TInt frequency = ParseUint16( ptr + 1 );
-    HTI_LOG_FORMAT( "Freq = %d", frequency );
-    TUint duration = ParseUint32( ptr + 3 );
-    HTI_LOG_FORMAT( "Duration = %d", duration );
-    iVolume = aMessage[7];
-    HTI_LOG_FORMAT( "Volume = %d", iVolume );
-    iRepeats = aMessage[8];
-    HTI_LOG_FORMAT( "Repeats = %d", iRepeats );
-    iTrailingSilence = ParseUint32( ptr + 9 );
-    HTI_LOG_FORMAT( "Silence = %d", iTrailingSilence );
-
-    TRAPD( err, iTonePlayer = CMdaAudioToneUtility::NewL( *this ) );
-
-    if ( err )
-        {
-        delete iTonePlayer;
-        iTonePlayer = NULL;
-        User::LeaveIfError( SendErrorResponseMsg(
-                                err, KErrorToneInitFailed ) );
-        }
-
-    iTonePlayer->PrepareToPlayTone( frequency,
-                              TTimeIntervalMicroSeconds( duration ) );
-    // MatoPrepareComplete callback function will be called when ready to play
-    HTI_LOG_FUNC_OUT( "CHtiAudioServicePlugin::HandlePlayToneCmdL" );
-    }
-
-
-// -----------------------------------------------------------------------------
-// CHtiAudioServicePlugin::HandlePlayDtmfCmdL()
-// -----------------------------------------------------------------------------
-//
-void CHtiAudioServicePlugin::HandlePlayDtmfCmdL( const TDesC8& aMessage )
-    {
-    HTI_LOG_FUNC_IN( "CHtiAudioServicePlugin::HandlePlayDtmfCmdL" );
-
-    if ( iIsPlaying )
-        {
-        User::LeaveIfError( SendErrorResponseMsg(
-                                KErrInUse, KErrorBusyPlaying ) );
-        return;
-        }
-
-    iPlayCommandId = ECmdPlayDtmf;
-
-    /*
-    Message bytes:
-             0 = command code
-             1 = DTMF string length
-         2 - n = dtmf string
-        next 4 = tone length
-        next 4 = tone gap length
-        next 1 = volume
-        next 1 = repeats
-        next 4 = silence between repeats
-    */
-
-    if ( aMessage.Length() < KPlayDtmfCmdMinLength )
-        {
-        User::LeaveIfError( SendErrorResponseMsg(
-                                KErrArgument, KErrorInvalidParameters ) );
-        return;
-        }
-
-    // Parse parameter values from the message
-    const TUint8* ptr = aMessage.Ptr();
-    TInt stringLength = aMessage[1];
-
-    if ( ( aMessage.Length() - stringLength ) !=
-         ( KPlayDtmfCmdMinLength - 1 ) )
-        {
-        User::LeaveIfError( SendErrorResponseMsg(
-                                KErrArgument, KErrorInvalidParameters ) );
-        return;
-        }
-
-    TBuf<255> dtmfString;
-    TInt nextOffset = ParseString( aMessage, 1, dtmfString );
-    if ( dtmfString.Length() < 1 || nextOffset < 0 )
-        {
-        User::LeaveIfError( SendErrorResponseMsg(
-                                KErrArgument, KErrorInvalidParameters ) );
-        return;
-        }
-    HTI_LOG_TEXT( "DTMF string:" );
-    HTI_LOG_DES( dtmfString );
-    iDtmfLength = ParseUint32( ptr + nextOffset );
-    nextOffset += 4;
-    HTI_LOG_FORMAT( "DTMF length = %d", iDtmfLength );
-    iDtmfGapLength = ParseUint32( ptr + nextOffset );
-    nextOffset += 4;
-    HTI_LOG_FORMAT( "DTMF gap length = %d", iDtmfGapLength );
-    iVolume = aMessage[nextOffset];
-    nextOffset++;
-    HTI_LOG_FORMAT( "Volume = %d", iVolume );
-    iRepeats = aMessage[nextOffset];
-    nextOffset++;
-    HTI_LOG_FORMAT( "Repeats = %d", iRepeats );
-    iTrailingSilence = ParseUint32( ptr + nextOffset );
-    HTI_LOG_FORMAT( "Trailing silence = %d", iTrailingSilence );
-
-    SetAudioSettings( EDtmfString );
-
-    TRAPD( err, iTonePlayer = CMdaAudioToneUtility::NewL(
-            *this, NULL, iAudioPriority, iAudioPriorityPreference ) );
-
-    if ( err )
-        {
-        delete iTonePlayer;
-        iTonePlayer = NULL;
-        User::LeaveIfError( SendErrorResponseMsg( err, KErrorToneInitFailed ) );
-        }
-
-    iTonePlayer->PrepareToPlayDTMFString( dtmfString );
-    // MatoPrepareComplete callback function will be called when ready to play
-    HTI_LOG_FUNC_OUT( "CHtiAudioServicePlugin::HandlePlayDtmfCmdL" );
-    }
-
-
-// -----------------------------------------------------------------------------
-// CHtiAudioServicePlugin::HandleStopCmdL()
-// -----------------------------------------------------------------------------
-//
-void CHtiAudioServicePlugin::HandleStopCmdL( const TDesC8& aMessage )
-    {
-    HTI_LOG_FUNC_IN( "CHtiAudioServicePlugin::HandleStopCmdL" );
-
-    if ( aMessage.Length() != KStopCmdLength )
-        {
-        User::LeaveIfError( SendErrorResponseMsg(
-                                KErrArgument, KErrorInvalidParameters ) );
-        return;
-        }
-
-    if ( !iIsPlaying )
-        {
-        HTI_LOG_TEXT( "Not playing - nothing to stop" );
-        // Just send "OK" reply if nothing is currently playing
-        User::LeaveIfError( SendResponseMsg( _L8( "OK" ) ) );
-        }
-
-    else
-        {
-        if ( iAudioPlayer )
-            {
-            HTI_LOG_TEXT( "Stopping audio player" );
-            iAudioPlayer->Stop();
-            iIsPlaying = EFalse;
-            delete iAudioPlayer;
-            iAudioPlayer = NULL;
-            // According to documentation should call MapcPlayComplete callback
-            // method but it doesn't, so sending reply here.
-            User::LeaveIfError( SendResponseMsg( _L8( "OK" ) ) );
-            }
-
-        else if ( iTonePlayer )
-            {
-            HTI_LOG_TEXT( "Stopping tone player" );
-            iTonePlayer->CancelPlay();
-            iIsPlaying = EFalse;
-            delete iTonePlayer;
-            iTonePlayer = NULL;
-            // Callback method MatoPlayComplete is not called -
-            // sending reply here.
-            User::LeaveIfError( SendResponseMsg( _L8( "OK" ) ) );
-            }
-        }
-    HTI_LOG_FUNC_OUT( "CHtiAudioServicePlugin::HandleStopCmdL" );
-    }
-
-
-// -----------------------------------------------------------------------------
-// CHtiAudioServicePlugin::HandleGetDurationCmdL()
-// -----------------------------------------------------------------------------
-//
-void CHtiAudioServicePlugin::HandleGetDurationCmdL( const TDesC8& aMessage )
-    {
-    HTI_LOG_FUNC_IN( "CHtiAudioServicePlugin::HandleGetDurationCmdL" );
-
-    if ( iIsPlaying )
-        {
-         // If currently playing, no parameters allowed. Returns the duration
-         // of currently playing sound.
-        if ( aMessage.Length() != 1 )
-            {
-            User::LeaveIfError( SendErrorResponseMsg(
-                                    KErrInUse, KErrorBusyPlaying ) );
-            return;
-            }
-
-        if ( iAudioPlayer )
-            {
-            TTimeIntervalMicroSeconds durationValue =
-                                iAudioPlayer->Duration();
-
-            if ( I64HIGH( durationValue.Int64() ) > 0 )
-                {
-                User::LeaveIfError( SendErrorResponseMsg(
-                                        KErrOverflow, KErrorDurationFailed ) );
-                return;
-                }
-            else
-                {
-                TUint duration = I64LOW( durationValue.Int64() );
-                TBuf8<KTUintSize> durationBuf;
-                durationBuf.Append( (TUint8*)(&duration), KTUintSize );
-                User::LeaveIfError( SendResponseMsg( durationBuf ) );
-                return;
-                }
-            }
-
-        else  // Duration supported only for audio player
-            {
-            User::LeaveIfError( SendErrorResponseMsg(
-                                    KErrNotSupported, KErrorDurationFailed ) );
-            return;
-            }
-        }
-
-    /* Command must have file path parameter if not currently playing.
-    Message bytes:
-             0 = command code
-             1 = path length
-         2 - n = full path to file
-    */
-
-    if ( aMessage.Length() < KDurationCmdMinLength )
-        {
-        User::LeaveIfError( SendErrorResponseMsg(
-                                KErrArgument, KErrorInvalidParameters ) );
-        return;
-        }
-
-    TInt pathLength = aMessage[1];
-    if ( ( aMessage.Length() - pathLength ) !=
-         ( KDurationCmdMinLength - 4 ) )
-        {
-        User::LeaveIfError( SendErrorResponseMsg(
-                                KErrArgument, KErrorInvalidParameters ) );
-        return;
-        }
-
-    // Parse parameter values from the message
-    TFileName filePath;
-    TInt nextOffset = ParseString( aMessage, 1, filePath );
-    if ( filePath.Length() < 2 || nextOffset < 0 )
-        {
-        User::LeaveIfError( SendErrorResponseMsg(
-                                KErrArgument, KErrorInvalidParameters ) );
-        return;
-        }
-    HTI_LOG_TEXT( "Full file path:" );
-    HTI_LOG_DES( filePath );
-
-    TRAPD( err, iAudioPlayer = CMdaAudioPlayerUtility::NewFilePlayerL(
-                                                        filePath, *this ) );
-    if ( err )
-        {
-        delete iAudioPlayer;
-        iAudioPlayer = NULL;
-        User::LeaveIfError( SendErrorResponseMsg( err, KErrorDurationFailed ) );
-        }
-
-    // MapcInitComplete callback function will be called
-    HTI_LOG_FUNC_OUT( "CHtiAudioServicePlugin::HandleGetDurationCmdL" );
-    }
-
-
-// -----------------------------------------------------------------------------
-// CHtiAudioServicePlugin::HandleGetMaxVolCmdL()
-// -----------------------------------------------------------------------------
-//
-void CHtiAudioServicePlugin::HandleGetMaxVolCmdL( const TDesC8& aMessage )
-    {
-    HTI_LOG_FUNC_IN( "CHtiAudioServicePlugin::HandleGetMaxVolCmdL" );
-
-    if ( iIsPlaying )
-        {
-         // If currently playing, no parameters allowed. Returns the max volume
-         // of currently playing sound.
-        if ( aMessage.Length() != 1 )
-            {
-            User::LeaveIfError( SendErrorResponseMsg(
-                                    KErrInUse, KErrorBusyPlaying ) );
-            return;
-            }
-
-        TInt maxVol = -1;
-
-        if ( iAudioPlayer )
-            {
-            maxVol = iAudioPlayer->MaxVolume();
-            }
-
-        else if ( iTonePlayer )
-            {
-            maxVol = iTonePlayer->MaxVolume();
-            }
-
-        HTI_LOG_FORMAT( "Max volume = %d", maxVol );
-
-        if ( maxVol < 0 )
-            {
-            // Should not happen
-            User::LeaveIfError( SendErrorResponseMsg(
-                                    KErrGeneral, KErrorMaxVolFailed ) );
-            return;
-            }
-
-        if ( maxVol > 255 ) maxVol = 255;
-        TBuf8<1> maxVolBuf;
-        maxVolBuf.Append( maxVol );
-        User::LeaveIfError( SendResponseMsg( maxVolBuf ) );
-        return;
-        }
-
-    /*
-    Message bytes:
-             0 = command code
-             1 = path length
-         2 - n = full path to file
-    */
-
-    if ( aMessage.Length() < KMaxVolCmdMinLength )
-        {
-        User::LeaveIfError( SendErrorResponseMsg(
-                                KErrArgument, KErrorInvalidParameters ) );
-        return;
-        }
-
-    TInt pathLength = aMessage[1];
-    if ( ( aMessage.Length() - pathLength ) != ( KMaxVolCmdMinLength - 4 ) )
-        {
-        User::LeaveIfError( SendErrorResponseMsg(
-                                KErrArgument, KErrorInvalidParameters ) );
-        return;
-        }
-
-    // Parse parameter values from the message
-    TFileName filePath;
-    TInt nextOffset = ParseString( aMessage, 1, filePath );
-    if ( filePath.Length() < 2 || nextOffset < 0 )
-        {
-        User::LeaveIfError( SendErrorResponseMsg(
-                                KErrArgument, KErrorInvalidParameters ) );
-        return;
-        }
-    HTI_LOG_TEXT( "Full file path:" );
-    HTI_LOG_DES( filePath );
-
-    TInt err = KErrNone;
-    TBool isRng = EFalse;
-    TRAP( err, isRng = MatchMimeTypeL( filePath, KRngMimeType ) );
-
-    if ( err )
-        {
-        User::LeaveIfError( SendErrorResponseMsg( err, KErrorMaxVolFailed ) );
-        return;
-        }
-
-    if ( isRng )
-        {
-        HTI_LOG_TEXT( "File is RNG - creating tone player" );
-        TRAP( err, iTonePlayer = CMdaAudioToneUtility::NewL( *this ) );
-        }
-
-    else
-        {
-        HTI_LOG_TEXT( "File is not RNG - creating audio player" );
-        TRAP( err, iAudioPlayer = CMdaAudioPlayerUtility::NewFilePlayerL(
-                                                        filePath, *this ) );
-        // MapcInitComplete callback function will be called
-        }
-
-    if ( err )
-        {
-        delete iAudioPlayer;
-        iAudioPlayer = NULL;
-        delete iTonePlayer;
-        iTonePlayer = NULL;
-        User::LeaveIfError( SendErrorResponseMsg( err, KErrorMaxVolFailed ) );
-        }
-
-    if ( iTonePlayer )
-        {
-        iTonePlayer->PrepareToPlayFileSequence( filePath );
-        // MatoPrepareComplete callback function will be called
-        }
-
-    HTI_LOG_FUNC_OUT( "CHtiAudioServicePlugin::HandleGetMaxVolCmdL" );
-    }
-
-
-// -----------------------------------------------------------------------------
-// CHtiAudioServicePlugin::HandleSetVolCmdL()
-// -----------------------------------------------------------------------------
-//
-void CHtiAudioServicePlugin::HandleSetVolCmdL( const TDesC8& aMessage )
-    {
-    HTI_LOG_FUNC_IN( "CHtiAudioServicePlugin::HandleSetVolCmdL" );
-
-    if ( aMessage.Length() != KSetVolCmdLength )
-        {
-        User::LeaveIfError( SendErrorResponseMsg( KErrArgument,
-                                                  KErrorInvalidParameters ) );
-        }
-
-    if ( !iIsPlaying )
-        {
-        HTI_LOG_TEXT( "Nothing playing - not setting volume" );
-        User::LeaveIfError( SendErrorResponseMsg(
-                                KErrNotReady, KErrorNothingPlaying ) );
-        }
-
-    else
-        {
-        TInt volume = aMessage[1]; // [0] = command code, [1] = volume value
-        HTI_LOG_FORMAT( "requested volume = %d", volume );
-
-        if ( iAudioPlayer )
-            {
-            HTI_LOG_TEXT( "Setting audio player volume" );
-            TInt maxVol = iAudioPlayer->MaxVolume();
-            HTI_LOG_FORMAT( "max volume = %d", maxVol );
-            if ( volume > maxVol ) volume = maxVol;
-            iAudioPlayer->SetVolume( volume );
-            TBuf8<1> volBuf;
-            volBuf.Append( volume );
-            User::LeaveIfError( SendResponseMsg( volBuf ) );
-            }
-        else if ( iTonePlayer )
-            {
-            HTI_LOG_TEXT( "Setting tone player volume" );
-            TInt maxVol = iTonePlayer->MaxVolume();
-            HTI_LOG_FORMAT( "max volume = %d", maxVol );
-            if ( volume > maxVol ) volume = maxVol;
-            iTonePlayer->SetVolume( volume );
-            TBuf8<1> volBuf;
-            volBuf.Append( volume );
-            User::LeaveIfError( SendResponseMsg( volBuf ) );
-            }
-        }
-    HTI_LOG_FUNC_OUT( "CHtiAudioServicePlugin::HandleSetVolCmdL" );
-    }
-
-
-// -----------------------------------------------------------------------------
-// CHtiAudioServicePlugin::MatoPrepareComplete()
-// Tone player prepare complete
-// -----------------------------------------------------------------------------
-//
-void CHtiAudioServicePlugin::MatoPrepareComplete( TInt aError )
-    {
-    HTI_LOG_FUNC_IN( "CHtiAudioServicePlugin::MatoPrepareComplete" );
-
-    if ( iCommandId == ECmdGetMaxVol )
-        {
-        if ( aError )
-            {
-            SendErrorResponseMsg( aError, KErrorMaxVolFailed );
-            }
-
-        else
-            {
-            TInt maxVol = iTonePlayer->MaxVolume();
-            HTI_LOG_FORMAT( "Max volume = %d", maxVol );
-            if ( maxVol > 255 ) maxVol = 255;
-            TBuf8<1> maxVolBuf;
-            maxVolBuf.Append( maxVol );
-            SendResponseMsg( maxVolBuf );
-            }
-
-        delete iTonePlayer;
-        iTonePlayer = NULL;
-        return;
-        }
-
-    if ( aError )
-        {
-        SendErrorResponseMsg( aError, KErrorToneInitFailed );
-        delete iTonePlayer;
-        iTonePlayer = NULL;
-        }
-
-    else
-        {
-        if ( iCommandId == ECmdPlayDtmf )
-            {
-            iTonePlayer->SetDTMFLengths(
-                TTimeIntervalMicroSeconds32( iDtmfLength ),
-                TTimeIntervalMicroSeconds32( iDtmfGapLength ),
-                TTimeIntervalMicroSeconds32( 0 ) );
-            }
-
-        if ( iVolume > iTonePlayer->MaxVolume() )
-            {
-            iVolume = iTonePlayer->MaxVolume();
-            }
-
-        iTonePlayer->SetVolume( iVolume );
-        iTonePlayer->SetRepeats( iRepeats + 1,
-                        TTimeIntervalMicroSeconds( iTrailingSilence ) );
-        iIsPlaying = ETrue;
-        iTonePlayer->Play();
-        iIsBusy = EFalse;
-        // MatoPlayComplete callback function will be called when playing ends.
-        }
-
-    HTI_LOG_FUNC_OUT( "CHtiAudioServicePlugin::MatoPrepareComplete" );
-    }
-
-
-// -----------------------------------------------------------------------------
-// CHtiAudioServicePlugin::MatoPlayComplete()
-// Tone play complete
-// -----------------------------------------------------------------------------
-//
-void CHtiAudioServicePlugin::MatoPlayComplete( TInt aError )
-    {
-    HTI_LOG_FUNC_IN( "CHtiAudioServicePlugin::MatoPlayComplete" );
-
-    iIsPlaying = EFalse;
-    iIsBusy = ETrue; // Busy dispatching the play complete message
-
-    if ( aError )
-        {
-        SendErrorResponseMsg( aError, KErrorTonePlayFailed, iPlayCommandId );
-        }
-
-    else
-        {
-        SendResponseMsg( _L8( "OK" ), iPlayCommandId );
-        }
-
-    delete iTonePlayer;
-    iTonePlayer = NULL;
-
-    HTI_LOG_FUNC_OUT( "CHtiAudioServicePlugin::MatoPlayComplete" );
-    }
-
-
-// -----------------------------------------------------------------------------
-// CHtiAudioServicePlugin::MapcInitComplete()
-// Audio player init complete
-// -----------------------------------------------------------------------------
-//
-void CHtiAudioServicePlugin::MapcInitComplete( TInt aError,
-                                 const TTimeIntervalMicroSeconds& aDuration )
-    {
-    HTI_LOG_FUNC_IN( "CHtiAudioServicePlugin::MapcInitComplete" );
-
-    if ( iCommandId == ECmdPlayFile )
-        {
-        if ( aError )
-            {
-            SendErrorResponseMsg( aError, KErrorFileInitFailed );
-            delete iAudioPlayer;
-            iAudioPlayer = NULL;
-            }
-
-        else
-            {
-            if ( iEndPos < iStartPos ||
-                        TTimeIntervalMicroSeconds( iStartPos ) > aDuration )
-                {
-                SendErrorResponseMsg( KErrArgument, KErrorPosition );
-                delete iAudioPlayer;
-                iAudioPlayer = NULL;
-                return;
-                }
-
-            if ( iEndPos > 0 )
-                {
-                iAudioPlayer->SetPlayWindow(
-                    TTimeIntervalMicroSeconds( iStartPos ),
-                    TTimeIntervalMicroSeconds( iEndPos ) );
-                }
-
-            HTI_LOG_FORMAT( "Max volume = %d", iAudioPlayer->MaxVolume() );
-            HTI_LOG_FORMAT( "Setting volume = %d", iVolume );
-            if ( iVolume > iAudioPlayer->MaxVolume() )
-                {
-                iVolume = iAudioPlayer->MaxVolume();
-                }
-
-            iAudioPlayer->SetVolume( iVolume );
-            iAudioPlayer->SetRepeats( iRepeats,
-                            TTimeIntervalMicroSeconds( iTrailingSilence ) );
-            iIsPlaying = ETrue;
-            iAudioPlayer->Play();
-
-            // Have to do this after play command because
-            // volume setting before play seems to have no effect.
-            iAudioPlayer->SetVolume( 0 );
-            iAudioPlayer->SetVolume( iVolume );
-
-            iIsBusy = EFalse;
-            // MapcPlayComplete callback function is called when playing ends
-            }
-        }
-
-    else if ( iCommandId == ECmdGetDuration )
-        {
-        if ( aError )
-            {
-            SendErrorResponseMsg( aError, KErrorDurationFailed );
-            }
-
-        else
-            {
-            if ( I64HIGH( aDuration.Int64() ) > 0 )
-                {
-                SendErrorResponseMsg( KErrOverflow, KErrorDurationFailed );
-                }
-            else
-                {
-                TUint duration = I64LOW( aDuration.Int64() );
-                TBuf8<KTUintSize> durationBuf;
-                durationBuf.Append( (TUint8*)(&duration), KTUintSize );
-                SendResponseMsg( durationBuf );
-                }
-            }
-        delete iAudioPlayer;
-        iAudioPlayer = NULL;
-        }
-
-    else if ( iCommandId == ECmdGetMaxVol )
-        {
-        if ( aError )
-            {
-            SendErrorResponseMsg( aError, KErrorMaxVolFailed );
-            }
-
-        else
-            {
-            TInt maxVol = iAudioPlayer->MaxVolume();
-            HTI_LOG_FORMAT( "Max volume = %d", maxVol );
-            if ( maxVol > 255 ) maxVol = 255;
-            TBuf8<1> maxVolBuf;
-            maxVolBuf.Append( maxVol );
-            SendResponseMsg( maxVolBuf );
-            }
-        delete iAudioPlayer;
-        iAudioPlayer = NULL;
-        }
-
-    HTI_LOG_FUNC_OUT( "CHtiAudioServicePlugin::MapcInitComplete" );
-    }
-
-
-// -----------------------------------------------------------------------------
-// CHtiAudioServicePlugin::MapcPlayComplete()
-// Audio play complete
-// -----------------------------------------------------------------------------
-//
-void CHtiAudioServicePlugin::MapcPlayComplete( TInt aError )
-    {
-    HTI_LOG_FUNC_IN( "CHtiAudioServicePlugin::MapcPlayComplete" );
-
-    iIsPlaying = EFalse;
-    iIsBusy = ETrue; // Busy dispatching the play complete message
-
-    if ( aError )
-        {
-        SendErrorResponseMsg( aError, KErrorFilePlayFailed, ECmdPlayFile );
-        }
-
-    else
-        {
-        SendResponseMsg( _L8( "OK" ), iPlayCommandId );
-        }
-
-    delete iAudioPlayer;
-    iAudioPlayer = NULL;
-
-    HTI_LOG_FUNC_OUT( "CHtiAudioServicePlugin::MapcPlayComplete" );
-    }
-
-
-// -----------------------------------------------------------------------------
-// CHtiAudioServicePlugin::NotifyMemoryChange
-// Called when HTI Framework has dispatched a message forward and the amount
-// of free memory in the message queue has changed.
-// -----------------------------------------------------------------------------
-//
-void CHtiAudioServicePlugin::NotifyMemoryChange( TInt aAvailableMemory )
-    {
-    if ( iIsBusy && iMessage )
-        {
-        if ( aAvailableMemory >= iMessage->Size() )
-            {
-            if ( iErrorCode == 0 )
-                {
-                TInt err = iDispatcher->DispatchOutgoingMessage(
-                    iMessage, KAudioServiceUid );
-
-                if ( err == KErrNone )
-                    {
-                    // Ownership of iMessage has been transferred
-                    iMessage = NULL;
-                    iIsBusy = EFalse;
-                    iDispatcher->RemoveMemoryObserver( this );
-                    }
-
-                else if ( err == KErrNoMemory )
-                    {
-                    // Keep retrying.
-                    }
-
-                else // Give up on sending
-                    {
-                    delete iMessage;
-                    iMessage = NULL;
-                    iIsBusy = EFalse;
-                    iDispatcher->RemoveMemoryObserver( this );
-                    }
-                }
-
-            else
-                {
-                TInt err = iDispatcher->DispatchOutgoingErrorMessage(
-                    iErrorCode, *iMessage, KAudioServiceUid );
-
-                // If it was success or some other error than KErrNoMemory
-                // we are done sending or trying to send this message.
-                if ( err != KErrNoMemory )
-                    {
-                    delete iMessage;
-                    iMessage = NULL;
-                    iIsBusy = EFalse;
-                    iDispatcher->RemoveMemoryObserver( this );
-                    }
-
-                else
-                    {
-                    // Keep retrying.
-                    }
-                }
-            }
-        }
-    }
-
-
-// -----------------------------------------------------------------------------
-// CHtiAudioServicePlugin::IsBusy
-// -----------------------------------------------------------------------------
-//
-TBool CHtiAudioServicePlugin::IsBusy()
-    {
-    return iIsBusy;
-    }
-
-
-// -----------------------------------------------------------------------------
-// CHtiAudioServicePlugin::SendResponseMsg
-// Sends a message out to the message dispatcher.
-// -----------------------------------------------------------------------------
-//
-TInt CHtiAudioServicePlugin::SendResponseMsg( const TDesC8& aMsg,
-                                              const TUint8 aCommandId )
-    {
-    HTI_LOG_FUNC_IN( "CHtiAudioServicePlugin::SendResponseMsg" );
-
-    iErrorCode = 0;
-
-    if ( iDispatcher == NULL )
-        {
-        iIsBusy = EFalse;
-        return KErrGeneral;
-        }
-
-    iDispatcher->RemoveMemoryObserver( this );
-
-    delete iMessage;
-    iMessage = NULL;
-    iMessage = HBufC8::New( aMsg.Length() + 1 );
-
-    if ( iMessage == NULL )
-        {
-        iIsBusy = EFalse;
-        return KErrNoMemory;
-        }
-
-    TPtr8 ptr8 = iMessage->Des();
-    if ( aCommandId != 0 )
-        {
-        ptr8.Append( aCommandId );
-        }
-    else
-        {
-        ptr8.Append( iCommandId );
-        }
-
-    ptr8.Append( aMsg );
-
-    TInt err = KErrNone;
-
-    err = iDispatcher->DispatchOutgoingMessage( iMessage, KAudioServiceUid );
-
-    if ( err == KErrNoMemory )
-        {
-        HTI_LOG_TEXT( "Message queue memory full - waiting" );
-        iIsBusy = ETrue; // Should already be true, but just in case
-        iDispatcher->AddMemoryObserver( this );
-        // For the caller of this method all is OK, sending is just delayed
-        err = KErrNone;
-        }
-
-    else if ( err == KErrNone )
-        {
-        HTI_LOG_TEXT( "Message sent to dispatcher" );
-        iMessage = NULL; // Ownership of iMessage has been transferred
-        iIsBusy = EFalse;
-        }
-
-    else // give up on sending
-        {
-        HTI_LOG_FORMAT( "Other dispatcher error %d", err );
-        delete iMessage;
-        iMessage = NULL;
-        iIsBusy = EFalse;
-        }
-
-    HTI_LOG_FUNC_OUT( "CHtiAudioServicePlugin::SendResponseMsg" );
-    return err;
-    }
-
-
-// -----------------------------------------------------------------------------
-// CHtiAudioServicePlugin::SendErrorResponseMsg
-// Sends an error message out to the message dispatcher.
-// -----------------------------------------------------------------------------
-//
-TInt CHtiAudioServicePlugin::SendErrorResponseMsg( TInt aErrorCode,
-                        const TDesC8& aErrorDescription,
-                        const TUint8 aCommandId )
-    {
-    HTI_LOG_FUNC_IN( "CHtiAudioServicePlugin::SendErrorResponseMsg" );
-
-    iErrorCode = aErrorCode;
-
-    if ( iDispatcher == NULL )
-        {
-        iIsBusy = EFalse;
-        return KErrGeneral;
-        }
-
-    iDispatcher->RemoveMemoryObserver( this );
-
-    delete iMessage;
-    iMessage = NULL;
-    iMessage = HBufC8::New( aErrorDescription.Length() + 1 );
-
-    if ( iMessage == NULL )
-        {
-        iIsBusy = EFalse;
-        return KErrNoMemory;
-        }
-
-    TPtr8 ptr8 = iMessage->Des();
-    if ( aCommandId != 0 )
-        {
-        ptr8.Append( aCommandId );
-        }
-    else
-        {
-        ptr8.Append( iCommandId );
-        }
-
-    ptr8.Append( aErrorDescription );
-
-    TInt err = KErrNone;
-
-    err = iDispatcher->DispatchOutgoingErrorMessage(
-        aErrorCode, *iMessage, KAudioServiceUid );
-
-    if ( err == KErrNoMemory )
-        {
-        HTI_LOG_TEXT( "Message queue memory full - waiting" );
-        iIsBusy = ETrue; // Should already be true, but just in case
-        iDispatcher->AddMemoryObserver( this );
-        // For the caller of this method all is OK, sending is just delayed
-        err = KErrNone;
-        }
-
-    else if ( err == KErrNone )
-        {
-        HTI_LOG_TEXT( "Error message sent to dispatcher" );
-        delete iMessage;
-        iMessage = NULL;
-        iIsBusy = EFalse;
-        }
-
-    else // give up on sending
-        {
-        HTI_LOG_FORMAT( "Other dispatcher error %d", err );
-        delete iMessage;
-        iMessage = NULL;
-        iIsBusy = EFalse;
-        }
-
-    HTI_LOG_FUNC_OUT( "CHtiAudioServicePlugin::SendErrorResponseMsg" );
-    return err;
-    }
-
-
-// -----------------------------------------------------------------------------
-// CHtiAudioServicePlugin::ParseString()
-// -----------------------------------------------------------------------------
-//
-TInt CHtiAudioServicePlugin::ParseString( const TDesC8& aRequest,
-                                          TInt aOffset,
-                                          TDes& aResult )
-    {
-    HTI_LOG_FUNC_IN( "CHtiAudioServicePlugin::ParseString" );
-
-    // If offset outside the string return empty string
-    if ( aOffset >= aRequest.Size() )
-        {
-        return aOffset;
-        }
-
-    TInt length = aRequest[aOffset];
-    HTI_LOG_FORMAT( "String length = %d", length );
-
-    // If length is zero return empty string
-    if ( length < 1 )
-        {
-        return aOffset + 1;
-        }
-
-    if ( length > aResult.MaxLength() )
-        {
-        return KErrBadDescriptor;
-        }
-
-    TInt nextOffset = length + aOffset + 1;
-    HTI_LOG_FORMAT( "Next offset = %d", nextOffset );
-    HTI_LOG_FORMAT( "Request size = %d", aRequest.Size() );
-
-    if ( nextOffset > aRequest.Size() )
-        {
-        return KErrArgument;
-        }
-
-    aResult.Copy( aRequest.Mid( aOffset + 1, length ) );
-
-    HTI_LOG_FUNC_OUT( "CHtiAudioServicePlugin::ParseString" );
-    return nextOffset;
-    }
-
-
-// -----------------------------------------------------------------------------
-// CHtiAudioServicePlugin::AddSubdirsRecursivelyL
-// Scan all subdirectories from the given path and add them to the aArray.
-// -----------------------------------------------------------------------------
-//
-void CHtiAudioServicePlugin::AddSubdirsRecursivelyL( const TDesC& aPath,
-                                                     CDesCArraySeg& aArray,
-                                                     RFs& aFs )
-    {
-    HTI_LOG_FUNC_IN( "CHtiAudioServicePlugin::AddSubdirsRecursivelyL" );
-
-    CDirScan* dirScan = CDirScan::NewL( aFs );
-    CleanupStack::PushL( dirScan );
-
-    TFileName* path = new (ELeave) TFileName;
-    CleanupStack::PushL( path );
-
-    CDir* directory = NULL;
-    TPtrC currentPath;
-
-    dirScan->SetScanDataL( aPath, KEntryAttMatchExclusive | KEntryAttDir, ESortNone );
-    dirScan->NextL( directory );
-
-    while ( directory )
-        {
-        CleanupStack::PushL( directory );
-        currentPath.Set( dirScan->FullPath() );
-
-        TInt dirCount( directory->Count() );
-        for ( TInt i = 0; i < dirCount ; ++i )
-            {
-            path->Copy( currentPath );
-            path->Append( ( *directory )[ i ].iName );
-            path->Append( KBackslash );
-            aArray.AppendL( *path );
-            }
-
-        CleanupStack::PopAndDestroy( directory );
-        directory = NULL;
-
-        dirScan->NextL( directory );
-        }
-
-    CleanupStack::PopAndDestroy( 2 ); // path, dirScan
-
-    HTI_LOG_FUNC_OUT( "CHtiAudioServicePlugin::AddSubdirsRecursivelyL" );
-    }
-
-
-// -----------------------------------------------------------------------------
-// CHtiAudioServicePlugin::MatchMimeTypeL
-// Check if the MIME type of the given file matches to the given pattern.
-// -----------------------------------------------------------------------------
-//
-TBool CHtiAudioServicePlugin::MatchMimeTypeL( const TDesC& aFilePath,
-                      const TDesC& aMimeTypeMatchPattern )
-    {
-    HTI_LOG_FUNC_IN( "CHtiAudioServicePlugin::MatchMimeTypeL" );
-
-    RApaLsSession apaSession;
-    User::LeaveIfError( apaSession.Connect() );
-    CleanupClosePushL( apaSession );
-
-    TUid dummyUid( KNullUid );
-    TDataType dataType;
-    User::LeaveIfError( apaSession.AppForDocument( aFilePath,
-                                                   dummyUid,
-                                                   dataType ) );
-    CleanupStack::PopAndDestroy(); // apaSession
-
-    if ( dataType.Des().MatchF( aMimeTypeMatchPattern ) >= 0 )
-        {
-        HTI_LOG_TEXT( "Match" );
-        return ETrue;
-        }
-
-    HTI_LOG_TEXT( "Not match" );
-    HTI_LOG_FUNC_OUT( "CHtiAudioServicePlugin::MatchMimeTypeL" );
-    return EFalse;
-    }
-
-
-// -----------------------------------------------------------------------------
-// CHtiAudioServicePlugin::SetAudioSettings
-// Set the audio priority and priority preference values.
-// -----------------------------------------------------------------------------
-//
-void CHtiAudioServicePlugin::SetAudioSettings( TAudioSetting aSetting )
-    {
-    HTI_LOG_FUNC_IN( "CHtiAudioServicePlugin::SetAudioSettings" );
-    HTI_LOG_FORMAT( "Setting values for audio setting %d", aSetting );
-
-    switch ( aSetting )
-        {
-        case EGeneralMusic:
-            {
-            iAudioPriority = KAudioPriorityRealOnePlayer;
-            iAudioPriorityPreference =
-                ( TMdaPriorityPreference ) KAudioPrefRealOneLocalPlayback;
-            break;
-            }
-
-        case ERingTonePreview:
-            {
-            iAudioPriority = KAudioPriorityRingingTonePreview;
-            iAudioPriorityPreference =
-                ( TMdaPriorityPreference ) KAudioPrefRingFilePreview;
-            break;
-            }
-/*
-        case EIncomingCall:
-            {
-            iAudioPriority = KAudioPriorityPhoneCall;
-            iAudioPriorityPreference =
-                ( TMdaPriorityPreference ) KAudioPrefIncomingCall;
-            break;
-            }
-*/
-        case EDtmfString:
-            {
-
-            iAudioPriority = KAudioPriorityDTMFString;
-            iAudioPriorityPreference =
-                ( TMdaPriorityPreference ) KAudioDTMFString;
-            break;
-            }
-
-        default:
-            {
-            iAudioPriority = EMdaPriorityNormal;
-            iAudioPriorityPreference = EMdaPriorityPreferenceTimeAndQuality;
-            break;
-            }
-        }
-
-    HTI_LOG_FUNC_OUT( "CHtiAudioServicePlugin::SetAudioSettings" );
-    }
-
-
-// ========================== OTHER EXPORTED FUNCTIONS =========================
-
-//  End of File