devicediagnostics/diagplugins/diagloudspeakerplugin/src/diagspeakerplugin.cpp
changeset 0 3ce708148e4d
child 22 9360ca28b668
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/devicediagnostics/diagplugins/diagloudspeakerplugin/src/diagspeakerplugin.cpp	Thu Dec 17 08:40:12 2009 +0200
@@ -0,0 +1,1578 @@
+/*
+* 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:  Class Definition of CDiagSpeakerPlugin
+*
+*/
+
+
+// INCLUDE FILES
+
+// From System
+#include <AknQueryDialog.h>            // CAknQueryDialog
+#include <aknmessagequerydialog.h>     // CAknMessageQueryDialog
+#include <AknProgressDialog.h>         // CAknProgressDialog
+#include <eikprogi.h>                  // CEikProgressInfo
+#include <eikbtgpc.h>                  // CEikButtonGroupContainer
+#include <AudioPreference.h>           // KAudioPriorityRecording
+#include <mdaaudiosampleeditor.h>      // CMdaAudioRecorderUtility
+#include <mdaaudiosampleplayer.h>      // CMdaAudioPlayerUtility
+#include <StringLoader.h>              // StringLoader
+#include <DiagTestObserver.h>          // MDiagTestObserver
+#include <DiagTestExecParam.h>         // TDiagTestExecParam
+#include <DiagEngineCommon.h>          // MDiagEngine
+#include <DiagPluginPool.h>            // CDiagPluginPool
+#include <DiagResultsDbItemBuilder.h>  // CDiagResultsDbItemBuilder
+#include <DiagResultDetailBasic.h>     // CDiagResultDetailBasic
+#include <DiagFrameworkDebug.h>        // LOGSTRING
+#include <DiagCommonDialog.h>          // for EDiagCommonDialogConfirmCancelAll
+
+// For Central Repository
+#include <centralrepository.h>
+#include "diagspeakertestprivatecrkeys.h"
+
+// Speaker Plugin Headerfile
+#include "diagspeakerplugin.h"       // CDiagSpeakerPlugin
+#include "diagspeakerplugin.hrh"     // Button Id defined
+#include <devdiagspeakerpluginrsc.rsg>  // Resource Definitions
+#include <avkon.hrh>
+
+
+// Local Macro
+#define ASSERT_ALWAYS(c) __ASSERT_ALWAYS((c), User::Invariant())
+
+// Local Data Types
+enum TSpeakerSteps
+    {
+    EStepTestTitle,
+    EStepAskRecord,
+    EStepProgressRecord,
+    EStepAskPlay,
+    EStepProgressPlay,
+    EStepAskHeard,
+    EStepAskRepeat,
+    ESpeakerPluginTotalSteps
+    };
+
+// To Exit from Query it should be EAknSoftkeyOk
+// can't include in .hrh because it requires <eikon.rh>
+// leads compilation fail
+enum TSpeakerExitCBA
+    {
+    ECBACmdPlay  = EAknSoftkeyOk,
+    ECBACmdStop  = EAknSoftkeyOk,
+    ECBACmdStart = EAknSoftkeyOk
+    };
+
+// Local Constants
+const TInt KFinished      = 0;
+const TInt KMinFileSize   = 1024;
+const TInt KSamplingRate  = 8192;
+const TInt KStereo        = 2;
+const TInt KFive          = 5;
+const TInt KMicroSecond   = 1000*1000;
+const TInt KProgressDelay = 200000;
+const TInt KAudioServerRequestTimeoutValue = 16 * KMicroSecond;
+
+const TInt KProgressFinished    =  0;
+const TInt KProgressNotFinished =  1;
+const TUid KDiagSpeakerPluginUid  = { DIAG_SPEAKER_PLUGIN_UID };
+
+_LIT( KDiagSpeakerPluginResourceFileName, "z:DevDiagSpeakerPluginRsc.rsc" );
+_LIT( KDiagSpeakerPluginCategory,"DevDiagSpeakerPlugin" );
+
+const CAudioOutput::TAudioOutputPreference KTargetOutput = CAudioOutput::EPublic;
+
+
+// ========================= MEMBER FUNCTIONS ================================
+// ---------------------------------------------------------------------------
+// CDiagSpeakerPlugin::NewL()
+//
+// Symbian OS default constructor
+// ---------------------------------------------------------------------------
+MDiagPlugin* CDiagSpeakerPlugin::NewL( TAny* aInitParams )
+    {
+    CDiagSpeakerPlugin* self;
+    CDiagPluginConstructionParam* param;
+
+    ASSERT_ALWAYS( aInitParams );
+
+    param = static_cast<CDiagPluginConstructionParam*>( aInitParams );
+    CleanupStack::PushL( param );
+    self  = new( ELeave ) CDiagSpeakerPlugin ( param );
+    CleanupStack::Pop( param );
+
+
+    CleanupStack::PushL( self );
+    self->ConstructL();
+    CleanupStack::Pop( self ); // self
+
+    return self;
+    }
+
+// ----------------------------------------------------------------------------
+// CDiagSpeakerPlugin::~CDiagSpeakerPlugin
+//
+// Destructor
+// ----------------------------------------------------------------------------
+CDiagSpeakerPlugin::~CDiagSpeakerPlugin()
+    {
+    // Delete resources allocated during construction.
+    // Nothing to do since no new resource is allocated in constructor.
+    }
+
+// ----------------------------------------------------------------------------
+// CDiagSpeakerPlugin::CDiagSpeakerPlugin()
+//
+// Constructor
+// ----------------------------------------------------------------------------
+//
+CDiagSpeakerPlugin::CDiagSpeakerPlugin( CDiagPluginConstructionParam* aParam )
+    :    CDiagTestPluginBase( aParam )
+    {
+    }
+
+// ---------------------------------------------------------------------------
+// CDiagSpeakerPlugin::ConstructL()
+//
+// Symbian OS two-phased constructor
+// ---------------------------------------------------------------------------
+void CDiagSpeakerPlugin::ConstructL()
+    {
+    LOGSTRING( "CDiagSpeakerPlugin::ConstructL: Plugin created. IN" )
+
+    BaseConstructL ( KDiagSpeakerPluginResourceFileName );
+
+    TInt recording_time;
+
+    // Open Central Repository
+    CRepository* audioRecorderRepository = CRepository::NewL( KCRUidDiagSpeakerTestPlugin );
+    CleanupStack::PushL( audioRecorderRepository );
+
+    // Read File Path from CR
+    iRecordFilePath.FillZ();
+    User::LeaveIfError(
+        audioRecorderRepository->Get( KAudioRecorderFilePath, iRecordFilePath) );
+
+    // Read File Size from CR
+    User::LeaveIfError(
+        audioRecorderRepository->Get( KAudioRecorderRecordingTime , recording_time) );
+
+    iRecordFileSize = (recording_time * KSamplingRate * KStereo);    
+
+    CleanupStack::PopAndDestroy( audioRecorderRepository );
+    audioRecorderRepository = NULL;
+
+    // Set Audio Output
+    iOutput = KTargetOutput;
+
+    LOGSTRING( "CDiagSpeakerPlugin::ConstructL: Plugin created. OUT" )
+    }
+
+// ---------------------------------------------------------------------------
+// CDiagSpeakerPlugin::StartRecordL
+// ---------------------------------------------------------------------------
+//
+void CDiagSpeakerPlugin::StartRecordL()
+    {
+    LOGSTRING( "CDiagSpeakerPlugin::DoRunTest() IN" )
+    TBool       goNext;
+
+    // Delete Record File
+    DeleteRecordFile();
+
+    // Check Free Space
+    if ( !EnoughFreeSpace() )
+        {
+        CompleteTestL( CDiagResultsDatabaseItem::ENotPerformed );
+        return;
+        }
+
+    // Show Init Message Query
+    do
+        {
+        goNext = ETrue;
+
+        // Check session before launch before dialog starts
+        if ( !iSessionValid )
+            {
+            LOGSTRING( "CDiagSpeakerPlugin::StartRecordL - !iSessionValid 1" )
+            return;
+            }
+
+        // Report current Progress to Engine
+        ReportTestProgressL( EStepTestTitle );
+
+        // Show Message Query Title
+        TInt  buttonId;
+        TBool result = EFalse;
+
+        result = ShowMessageQueryL( R_MESSAGEQUERY_TITLE, buttonId );
+
+        // Check session is valid after dialog dismissed
+        if ( !result )
+            {
+            LOGSTRING( "CDiagSpeakerPlugin::StartRecordL - !iSessionValid 2" )
+            return;
+            }
+
+        // 1.1 Case for press Skip
+        if ( buttonId == ECBACmdSkip )
+            {
+            LOGSTRING( "CDiagSpeakerPlugin::StartRecordL: Skip has pressed" );
+            // ADO & Platformization Changes
+            TInt   cancelButtonId;
+
+            //cancelResult = AskCancelExecutionL( cancelButtonId );
+			CAknDialog* dlg = ExecutionParam().Engine().
+							  CreateCommonDialogLC( EDiagCommonDialogConfirmSkipAll, NULL );
+							  
+            if ( !RunWaitingDialogL( dlg, cancelButtonId ) )
+                {
+                LOGSTRING( "CDiagSpeakerPlugin::StartPlayL - !iSessionValid 3" )
+                return;
+                }
+
+			if(cancelButtonId)
+			return;
+			else
+			goNext = EFalse;          
+            
+
+			// ADO & Platformization Changes
+            //CompleteTestL( CDiagResultsDatabaseItem::ESkipped );
+            //return;
+            }
+
+        // 1.2 case for press Cancel
+        else if ( buttonId == ECBACmdCancel )
+            {
+            LOGSTRING( "CDiagSpeakerPlugin::StartRecordL: Cancel has pressed" )
+            CompleteTestL( CDiagResultsDatabaseItem::ESkipped );
+            return;
+            }
+        }
+    while ( goNext == EFalse );
+
+
+    // Show Record Message Query
+    do
+        {
+        goNext = ETrue;
+
+        // Check session before launch before dialog starts
+        if ( !iSessionValid )
+            {
+            LOGSTRING( "CDiagSpeakerPlugin::StartRecordL - !iSessionValid 4" )
+            return;
+            }
+
+        // Report current Progress to Engine
+        ReportTestProgressL( EStepAskRecord );
+
+        // Show Message Query Title
+        TInt  buttonId;
+        TBool result = EFalse;
+
+        result = ShowMessageQueryL( R_MESSAGEQUERY_ASK_RECORD, buttonId );
+
+        // Check session is valid after dialog dismissed
+        if ( !result )
+            {
+            LOGSTRING( "CDiagSpeakerPlugin::StartRecordL - !iSessionValid 5" )
+            return;
+            }
+
+        // 2.2 Case for press Skip
+        if ( buttonId == ECBACmdStart )
+            {
+            LOGSTRING( "CDiagSpeakerPlugin::StartRecordL: Start has pressed" )
+            RecordL();
+            return;
+            }
+        else if ( buttonId == ECBACmdSkip )
+            {
+            LOGSTRING( "CDiagSpeakerPlugin::StartRecordL: Skip has pressed" )
+            CompleteTestL( CDiagResultsDatabaseItem::ESkipped );
+            return;
+            }
+
+        // 2.3 case for press Cancel
+        else if ( buttonId == ECBACmdCancel )
+            {
+            LOGSTRING( "CDiagSpeakerPlugin::StartRecordL: Cancel has pressed" )
+
+            TInt  cancelButtonId;
+            TBool cancelResult = EFalse;
+
+            cancelResult = AskCancelExecutionL( cancelButtonId );
+
+            if ( !cancelResult )
+                {
+                LOGSTRING( "CDiagSpeakerPlugin::StartPlayL - !iSessionValid 6" )
+                return;
+                }
+            
+            if(cancelButtonId == EAknSoftkeyYes)
+                {
+                CompleteTestL( CDiagResultsDatabaseItem::ECancelled );
+                return;
+                }
+            else if(cancelButtonId)
+                {
+                return;
+                }
+            else
+                {
+                goNext = EFalse;
+                }
+            /*
+            switch ( cancelButtonId )
+                {
+                case EAknSoftkeyYes:
+                	CompleteTestL( CDiagResultsDatabaseItem::ECancelled );	 //Added for NTEI-7EZ96S
+                    return;
+                default:
+                    goNext = EFalse;
+                    break;
+                }
+                */
+            }
+        }
+    while ( goNext == EFalse );
+
+    }
+
+// ---------------------------------------------------------------------------
+// CDiagSpeakerPlugin::StartPlayL
+// ---------------------------------------------------------------------------
+//
+void CDiagSpeakerPlugin::StartPlayL()
+    {
+    LOGSTRING( "CDiagSpeakerPlugin::StartPlayL() IN" )
+    TBool goNext;
+
+
+    // Check Record File
+    if ( CheckRecordFile() == EFalse )
+        {
+        LOGSTRING( "CDiagSpeakerPlugin::StartPlayL() CheckRecordFile == EFalse" )
+        CompleteTestL( CDiagResultsDatabaseItem::ENotPerformed );
+        return;
+        }
+
+    do
+        {
+        goNext = ETrue;
+
+        // Check session before launch before dialog starts
+        if ( !iSessionValid )
+            {
+            LOGSTRING( "CDiagSpeakerPlugin::StartPlayL - !iSessionValid 1" )
+            return;
+            }
+
+        // Report current Progress to Engine
+        ReportTestProgressL( EStepAskPlay );
+
+        // Show ConfQuery to ask Play
+        TInt  buttonId;
+        TBool result = EFalse;
+
+        result = ShowConfQueryL( R_CONFQUERY_ASK_PLAY, buttonId );
+
+        // Check session is valid after dialog dismissed
+        if ( !result )
+            {
+            LOGSTRING( "CDiagSpeakerPlugin::StartPlayL - !iSessionValid 2" )
+            return;
+            }
+
+        // 1.1 Case for press Skip
+        if ( buttonId == ECBACmdSkip )
+            {
+            LOGSTRING( "CDiagSpeakerPlugin::StartPlayL: Skip has pressed" )
+            CompleteTestL( CDiagResultsDatabaseItem::ESkipped );
+            return;
+            }
+
+        // 1.2 case for press Cancel
+        else if ( buttonId == ECBACmdCancel )
+            {
+            LOGSTRING( "CDiagSpeakerPlugin::StartPlayL: Cancel has pressed" )
+            TInt  cancelButtonId;
+            TBool cancelResult = EFalse;
+
+            cancelResult = AskCancelExecutionL( cancelButtonId );
+
+            if ( !cancelResult )
+                {
+                LOGSTRING( "CDiagSpeakerPlugin::StartPlayL - !iSessionValid 3" )
+                return;
+                }
+            
+            
+            if(cancelButtonId == EAknSoftkeyYes)
+                {
+                CompleteTestL( CDiagResultsDatabaseItem::ECancelled );
+                return;
+                }
+            else if(cancelButtonId)
+                {
+                return;
+                }
+            else
+                {
+                goNext = EFalse;
+                }
+            /*
+
+            switch ( cancelButtonId )
+                {
+                case EAknSoftkeyYes:
+                    iState = EStateCancelled;
+                    SetActive();
+            		TRequestStatus* status = &iStatus;
+            		User::RequestComplete(status, KErrNone);
+                	//CompleteTestL( CDiagResultsDatabaseItem::ECancelled );	 //Commented by Ganesh
+                    return;
+                default:
+                    goNext = EFalse;
+                    break;
+                }
+             */
+            }
+        // 1.3 case for press Play
+        else if ( buttonId == ECBACmdPlay )
+            {
+            LOGSTRING( "CDiagSpeakerPlugin::StartPlayL: Play has pressed" )
+            iState = EStateRecorded;
+            PlayL();
+            }
+        } while ( !goNext );
+    }
+
+// ---------------------------------------------------------------------------
+// CDiagSpeakerPlugin::RecordingL
+// ---------------------------------------------------------------------------
+//
+void CDiagSpeakerPlugin::RecordingL()
+    {
+    LOGSTRING( "CDiagSpeakerPlugin::RecordingL IN" )
+    const TTimeIntervalMicroSeconds     position   = 0;
+
+    iFinalValue = iRecordFileSize / KSamplingRate / KStereo;
+
+    ReportTestProgressL( EStepProgressRecord );
+    ShowProgressNoteL( R_PROGRESS_NOTE_RECORDING, iFinalValue );
+
+    iRecorder->SetPriority(
+        KAudioPriorityAlarm + 1,
+        TMdaPriorityPreference( KAudioPrefVoiceRec )
+        );
+
+    iRecorder->SetPosition( position );
+    iRecorder->CropL();
+    iRecorder->SetMaxWriteLength( iRecordFileSize );
+
+    ResetWatchdog( KAudioServerRequestTimeoutValue, CDiagResultsDatabaseItem::EFailed ); 
+    iRecorder->RecordL(); // MoscoStateChangeEvent() will be called as return
+    LOGSTRING( "CDiagSpeakerPlugin::RecordingL OUT" )
+    }
+
+// ---------------------------------------------------------------------------
+// CDiagSpeakerPlugin::PlayingL
+// ---------------------------------------------------------------------------
+//
+void CDiagSpeakerPlugin::PlayingL()
+    {
+    LOGSTRING( "CDiagSpeakerPlugin::PlayingL IN" )
+
+    TInt64  interval   = 0;
+    TInt    finalValue = 0;
+
+    interval             = iMaxDurationMicroSec.Int64() / KMicroSecond;
+    finalValue           = ((I64INT(interval)));
+    iFinalValue          = finalValue;
+
+    // Save Audio Output
+    SaveAudioOutput();
+
+    ReportTestProgressL( EStepProgressPlay );
+    ShowProgressNoteL( R_PROGRESS_NOTE_PLAYING, iFinalValue );
+
+    iAudioPlayer->SetPosition( iPositionMicroSec );
+    iAudioPlayer->Play();
+
+    LOGSTRING( "CDiagSpeakerPlugin::PlayingL OUT" )
+    }
+
+// ---------------------------------------------------------------------------
+// CDiagSpeakerPlugin::AfterRecordL
+// ---------------------------------------------------------------------------
+//
+void CDiagSpeakerPlugin::AfterRecordL()
+    {
+    StartPlayL();
+    }
+
+// ---------------------------------------------------------------------------
+// CDiagSpeakerPlugin::AfterPlayL
+// ---------------------------------------------------------------------------
+//
+void CDiagSpeakerPlugin::AfterPlayL()
+    {
+    LOGSTRING( "CDiagSpeakerPlugin::AfterPlayL IN" )
+
+
+    // Check session before launch before dialog starts
+    if ( !iSessionValid )
+        {
+        LOGSTRING( "CDiagSpeakerPlugin::AfterPlayL - !iSessionValid 1.1" )
+        return;
+        }
+
+    // Report current Progress to Engine
+    ReportTestProgressL( EStepAskHeard );
+
+    // Show ConfQuery to ask Heard
+    TInt  buttonId;
+    TBool result = EFalse;
+    result = ShowConfQueryL( R_CONFQUERY_ASK_HEARD, buttonId );
+
+    // Check session is valid after dialog dismissed
+    if ( !result )
+        {
+        LOGSTRING( "CDiagSpeakerPlugin::AfterPlayL - !iSessionValid 1.2" )
+        return;
+        }
+
+    // Report Success on Yes
+    if ( buttonId == EAknSoftkeyYes )
+        {
+        LOGSTRING( "CDiagSpeakerPlugin::AfterPlayL - Yes has pressed - return ESuccess" )
+        CompleteTestL( CDiagResultsDatabaseItem::ESuccess );
+        return;
+        }
+    else if ( buttonId != ECBACmdCustomNo )
+        {
+        //return;  // ADO & Platformization Changes
+        }
+
+    // Check session before launch before dialog starts
+    if ( !iSessionValid )
+        {
+        LOGSTRING( "CDiagSpeakerPlugin::AfterPlayL - !iSessionValid 2.1" )
+        return;
+        }
+
+    // Report current Progress to Engine
+    ReportTestProgressL( EStepAskRepeat );
+
+    // Show ConfQuery to ask Heard
+    result = ShowConfQueryL( R_CONFQUERY_ASK_REPEAT, buttonId );
+
+   // Check session is valid after dialog dismissed
+    if ( !result )
+        {
+        LOGSTRING( "CDiagSpeakerPlugin::AfterPlayL - !iSessionValid 2.2" )
+        return;
+        }
+
+    // Report Success on Yes
+    if ( buttonId == EAknSoftkeyYes )
+        {
+        LOGSTRING( "CDiagSpeakerPlugin::AfterPlayL - Yes has pressed - Start Record Again" )
+
+        StartRecordL();
+        return;
+        }
+    else if ( buttonId == ECBACmdCustomNo || buttonId == EAknSoftkeyNo )
+        {
+        LOGSTRING( "CDiagSpeakerPlugin::AfterPlayL - No has pressed - Start Record Again" )
+        CompleteTestL( CDiagResultsDatabaseItem::EFailed );
+        }
+    else
+        {
+        CompleteTestL( CDiagResultsDatabaseItem::EFailed );
+        return;
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// CDiagSpeakerPlugin::RecordL
+// ---------------------------------------------------------------------------
+//
+void CDiagSpeakerPlugin::RecordL()
+    {
+    LOGSTRING( "CDiagSpeakerPlugin::RecordL IN" )
+
+    iAudioState = CMdaAudioRecorderUtility::ERecording;
+    
+    iState = EStateUnknown;
+
+    if ( iRecorder )
+        {
+        ResetWatchdog( KAudioServerRequestTimeoutValue, CDiagResultsDatabaseItem::EFailed );  
+        iRecorder->OpenFileL( iRecordFilePath ); // MoscoStateChangeEvent() will be called as return
+        }
+
+    LOGSTRING( "CDiagSpeakerPlugin::RecordL OUT" )
+    }
+
+// ---------------------------------------------------------------------------
+// CDiagSpeakerPlugin::PlayL
+// ---------------------------------------------------------------------------
+//
+void CDiagSpeakerPlugin::PlayL()
+    {
+    LOGSTRING( "CDiagSpeakerPlugin::PlayL IN" )
+    iAudioState = CMdaAudioRecorderUtility::EPlaying;
+
+    // Save Current Audio Output
+    LOGSTRING( "CDiagSpeakerPlugin::PlayL:SaveAudioOutput" )
+
+    // Invoke Play
+    if ( iAudioPlayer )
+        {
+        LOGSTRING( "CDiagSpeakerPlugin::PlayL:OpenFileL(iRecordFilePath);" )
+        ResetWatchdog( KAudioServerRequestTimeoutValue, CDiagResultsDatabaseItem::EFailed ); 
+        iAudioPlayer->OpenFileL( iRecordFilePath ); // MapcInitComplete() will be called as return
+        }
+
+    LOGSTRING( "CDiagSpeakerPlugin::PlayL OUT" )
+    }
+
+// ---------------------------------------------------------------------------
+// CDiagSpeakerPlugin::SaveAudioOutput()
+// ---------------------------------------------------------------------------
+//
+void CDiagSpeakerPlugin::SaveAudioOutput()
+    {
+    LOGSTRING( "CDiagSpeakerPlugin::SaveAudioOutput IN" )
+
+    if ( iAudioOutput )
+        {
+        iPrevAudioOutput = iAudioOutput->AudioOutput();
+        }
+
+    LOGSTRING( "CDiagSpeakerPlugin::SaveAudioOutput OUT" )
+    }
+
+// ---------------------------------------------------------------------------
+// CDiagSpeakerPlugin::RestoreAudioOutputL()
+// ---------------------------------------------------------------------------
+//
+void CDiagSpeakerPlugin::RestoreAudioOutputL()
+    {
+    LOGSTRING( "CDiagSpeakerPlugin::RestoreAudioOutputL IN" )
+
+    if ( iAudioOutput )
+        {
+        iAudioOutput->SetAudioOutputL( iPrevAudioOutput );
+        }
+
+    LOGSTRING( "CDiagSpeakerPlugin::RestoreAudioOutputL OUT" )
+    }
+
+// ---------------------------------------------------------------------------
+// CDiagSpeakerPlugin::ClosePeriodic
+// ---------------------------------------------------------------------------
+//
+void CDiagSpeakerPlugin::ClosePeriodic()
+    {
+    LOGSTRING( "CDiagSpeakerPlugin::ClosePeriodic IN" )
+
+    if ( iPeriodic )
+        {
+        delete iPeriodic;
+        iPeriodic = NULL;
+        }
+
+    LOGSTRING( "CDiagSpeakerPlugin::ClosePeriodic OUT" )
+    }
+
+// ---------------------------------------------------------------------------
+// CDiagSpeakerPlugin::CheckRecordFile
+// ---------------------------------------------------------------------------
+//
+TBool CDiagSpeakerPlugin::CheckRecordFile()
+    {
+    LOGSTRING( "CDiagSpeakerPlugin::CheckRecordFile IN" )
+
+    TInt        err;
+    TEntry      entry;
+    TBool       ret = EFalse;
+
+    err  = CoeEnv().FsSession().Entry( iRecordFilePath, entry );
+
+    // Check if there was an error
+    if ( err != KErrNone)
+        {
+        ret = EFalse;
+        }
+
+    // Check File Size
+    else
+        {
+        ret = entry.iSize >= KMinFileSize;
+        }
+
+    LOGSTRING2( "CDiagSpeakerPlugin::CheckRecordFile OUT ret=%d", ret )
+    return ret;
+    }
+
+// ---------------------------------------------------------------------------
+// CDiagAuioPlugin::DeleteRecordFile
+// ---------------------------------------------------------------------------
+//
+void CDiagSpeakerPlugin::DeleteRecordFile()
+    {
+    LOGSTRING( "CDiagSpeakerPlugin::DeleteRecordFile IN" )
+
+    CoeEnv().FsSession().Delete( iRecordFilePath );
+
+    LOGSTRING( "CDiagSpeakerPlugin::DeleteRecordFile OUT" )
+    }
+
+// ---------------------------------------------------------------------------
+// CDiagSpeakerPlugin::EnoughFreeSpace
+// ---------------------------------------------------------------------------
+//
+TBool CDiagSpeakerPlugin::EnoughFreeSpace()
+    {
+    LOGSTRING( "CDiagSpeakerPlugin::EnoughFreeSpace IN" )
+
+    TInt64      RecordFileSize64;
+    TVolumeInfo vol_info;
+    TBool       ret;
+
+    RecordFileSize64 = iRecordFileSize;
+    CoeEnv().FsSession().Volume( vol_info, EDriveC );
+    ret = vol_info.iFree >= RecordFileSize64;
+
+    LOGSTRING2( "CDiagSpeakerPlugin::EnoughFreeSpace OUT ret=%d", ret )
+    return ret;
+    }
+
+// ---------------------------------------------------------------------------
+// CDiagSpeakerPlugin::SetProgressDismissed
+// ---------------------------------------------------------------------------
+//
+void  CDiagSpeakerPlugin::SetProgressDismissed( TBool aDismissed )
+    {
+    LOGSTRING2( "CDiagSpeakerPlugin::SetProgressDismissed aDismissed=%d", aDismissed )
+    iProgressDismissed = aDismissed;
+    }
+
+// ---------------------------------------------------------------------------
+// CDiagSpeakerPlugin::ProgressDismissed
+// ---------------------------------------------------------------------------
+//
+TBool CDiagSpeakerPlugin::ProgressDismissed() const
+    {
+    LOGSTRING2( "CDiagSpeakerPlugin::ProgressDismissed iProgressDismissed=%d", iProgressDismissed )
+
+    return iProgressDismissed;
+    }
+
+// ---------------------------------------------------------------------------
+// CDiagSpeakerPlugin::AskCancelExecutionL
+// ---------------------------------------------------------------------------
+//
+TBool CDiagSpeakerPlugin::AskCancelExecutionL( TInt& aButtonId )
+    {
+    LOGSTRING( "CDiagSpeakerPlugin::AskCancelExecutionL() IN" )
+
+    CAknDialog* dialog;
+    TBool       result;
+
+    // set softkey for single execution
+    if ( !SinglePluginExecution() )
+        {
+    	// Create common dialog by invoking Engine
+    	dialog = ExecutionParam().Engine().
+             CreateCommonDialogLC( EDiagCommonDialogConfirmCancelAll, NULL );
+
+    	// Launch dialog and get result from it
+    	result = RunWaitingDialogL( dialog, aButtonId );
+	}	
+    else 
+       {
+       //CompleteTestL( CDiagResultsDatabaseItem::ECancelled );	 //commented for NTEI-7EZ96S
+       aButtonId = EAknSoftkeyYes;
+       return ETrue;
+       }
+    
+    LOGSTRING3( "CDiagSpeakerPlugin::AskCancelExecutionL() OUT aButtonId=%d result=%d", aButtonId, result )
+    return result;
+    }
+
+// ---------------------------------------------------------------------------
+// CDiagSpeakerPlugin::ShowConfQueryL
+// ---------------------------------------------------------------------------
+//
+TBool CDiagSpeakerPlugin::ShowConfQueryL( TInt aResourceId, TInt &aButtonId )
+    {
+    LOGSTRING( "CDiagSpeakerPlugin::ShowConfQueryL IN" )
+    CAknQueryDialog* dlg    = NULL;
+    TBool            result = EFalse;
+
+    // Create CAknQueryDialog instance
+    dlg = new ( ELeave ) CAknQueryDialog( CAknQueryDialog::ENoTone );
+
+    dlg->PrepareLC( aResourceId );
+
+    // set softkey for single execution
+    /*
+    if ( SinglePluginExecution() )
+        { */  // ADO & Platformization Changes
+        CEikButtonGroupContainer& cba = dlg->ButtonGroupContainer();
+
+        switch ( aResourceId )
+            {
+            case R_CONFQUERY_ASK_PLAY: 
+                cba.SetCommandSetL( R_DIAG_SPEAKER_SOFTKEYS_PLAY_CANCEL );
+                break;
+            default:
+                break;
+            }
+      /*  } */
+
+    result = RunWaitingDialogL( dlg, aButtonId );
+
+    LOGSTRING3( "CDiagSpeakerPlugin::ShowConfQueryL() OUT aButtonId=%d result=%d", aButtonId, result )
+    return result;
+    }
+
+// ---------------------------------------------------------------------------
+// CDiagSpeakerPlugin::ShowMessageQueryL
+// ---------------------------------------------------------------------------
+//
+TBool CDiagSpeakerPlugin::ShowMessageQueryL( TInt aResourceId, TInt &aButtonId  )
+    {
+    LOGSTRING( "CDiagSpeakerPlugin::ShowMessageQueryL IN" )
+    CAknMessageQueryDialog* dlg    = NULL;
+    TBool                   result = EFalse;
+
+    // Create CAknMessageQueryDialog instance
+    dlg = new ( ELeave ) CAknMessageQueryDialog();
+
+    dlg->PrepareLC( aResourceId );
+
+    // set softkey for single execution
+    
+    
+        CEikButtonGroupContainer& cba = dlg->ButtonGroupContainer();
+
+        switch ( aResourceId )
+            {
+            case R_MESSAGEQUERY_TITLE: 
+        	if ( SinglePluginExecution() )
+        		{
+                cba.SetCommandSetL( R_DIAG_SPEAKER_SOFTKEYS_OK_CANCEL );
+        		}
+        	else
+        		{
+        		cba.SetCommandSetL( R_DIAG_SPEAKER_SOFTKEYS_OK_SKIP );	
+        		}
+                break;
+            case R_MESSAGEQUERY_ASK_RECORD:
+                cba.SetCommandSetL( R_DIAG_SPEAKER_SOFTKEYS_START_CANCEL );
+                break;
+            default:
+                break;
+            }
+            
+    	
+
+    result = RunWaitingDialogL( dlg, aButtonId );
+
+    LOGSTRING3( "CDiagSpeakerPlugin::ShowMessageQueryL() OUT aButtonId=%d result=%d", aButtonId, result )
+    return result;
+    }
+
+// ---------------------------------------------------------------------------
+// CDiagSpeakerPlugin::ShowProgressNoteL
+// ---------------------------------------------------------------------------
+//
+void CDiagSpeakerPlugin::ShowProgressNoteL( TInt aResourceId, TInt aFinalValue )
+    {
+    LOGSTRING( "CDiagSpeakerPlugin::ShowProgressNoteL IN" )
+
+    CAknProgressDialog* dlg;
+
+    if ( iProgressDialog )
+        {
+        delete iProgressDialog;
+        iProgressDialog = NULL;
+        }
+
+    SetProgressDismissed( EFalse );
+
+    iProgressDialog = dlg = new ( ELeave ) CAknProgressDialog(
+        reinterpret_cast <CEikDialog**> (&iProgressDialog),
+        ETrue
+        );
+
+    dlg->SetCallback( this );
+    dlg->PrepareLC( aResourceId );
+
+    // set softkey for single execution
+  /*  if ( SinglePluginExecution() ) 
+        { */ // ADO & Platformization Changes
+        CEikButtonGroupContainer& cba = dlg->ButtonGroupContainer();
+        cba.SetCommandSetL( R_DIAG_SPEAKER_SOFTKEYS_STOP_CANCEL );
+      /*  } */ // ADO & Platformization Changes
+
+    iProgressInfo = dlg->GetProgressInfoL();
+    iProgressInfo->SetFinalValue( aFinalValue * KFive );
+
+    dlg->RunLD();
+
+    // Set up Periodic
+    ClosePeriodic();
+
+    iPeriodic = CPeriodic::NewL( EPriorityNormal );
+    TCallBack callback( CallbackIncrementProgressNoteL, this );
+    iPeriodic->Start( 0, KProgressDelay, callback );
+
+    LOGSTRING( "CDiagSpeakerPlugin::ShowProgressNoteL OUT" )
+    }
+
+// ---------------------------------------------------------------------------
+// CDiagSpeakerPlugin::CallbackIncrementProgressNoteL
+// ---------------------------------------------------------------------------
+//
+TInt CDiagSpeakerPlugin::CallbackIncrementProgressNoteL( TAny* aThis )
+    {
+    TInt err = KErrNone;
+    CDiagSpeakerPlugin* myThis  = (CDiagSpeakerPlugin *)aThis;
+
+    TRAP( err, myThis->UpdateProgressNoteL() );
+    if ( err != KErrNone )
+        {
+        LOGSTRING( "CDiagSpeakerPlugin::CallbackIncrementProgressNoteL:User::Panic() on UpdateProgressNoteL()" )
+        User::Panic( KDiagSpeakerPluginCategory, err );
+        }
+
+    return KFinished;
+    }
+
+// ---------------------------------------------------------------------------
+// CDiagSpeakerPlugin::UpdateProgressNoteL
+// ---------------------------------------------------------------------------
+//
+TInt CDiagSpeakerPlugin::UpdateProgressNoteL()
+    {
+    TTime              intervalTime;
+    TTime              currentTime;
+
+    // Prevent from Screen Saver
+    User::ResetInactivityTime();
+
+    if ( iProgressDialog )
+        {
+        iProgressInfo->IncrementAndDraw(1);
+
+        if ( (iFinalValue * KFive) <= iProgressInfo->CurrentValue() )
+            {
+            if ( ProgressDismissed() == EFalse )
+                {
+                iProgressDialog->ProcessFinishedL();
+                }
+
+            return KProgressFinished;
+            }
+        }
+
+    return KProgressNotFinished;
+    }
+
+// ---------------------------------------------------------------------------
+// From MDiagPlugin
+// CDiagSpeakerPlugin::IsVisible()
+// ---------------------------------------------------------------------------
+TBool CDiagSpeakerPlugin::IsVisible() const
+    {
+    return ETrue;
+    }
+
+// ---------------------------------------------------------------------------
+// From MDiagTestPlugin
+// CDiagSpeakerPlugin::RunMode()
+// ---------------------------------------------------------------------------
+MDiagTestPlugin::TRunMode CDiagSpeakerPlugin::RunMode() const
+    {
+    return EInteractiveDialog;
+    }
+
+// ---------------------------------------------------------------------------
+// From MDiagTestPlugin
+// CDiagSpeakerPlugin::TotalSteps()
+// ---------------------------------------------------------------------------
+TUint CDiagSpeakerPlugin::TotalSteps() const
+    {
+    return ESpeakerPluginTotalSteps;
+    }
+
+// ---------------------------------------------------------------------------
+// From MDiagPlugin
+// CDiagSpeakerPlugin::GetPluginNameL
+// ---------------------------------------------------------------------------
+HBufC* CDiagSpeakerPlugin::GetPluginNameL( TNameLayoutType aLayoutType ) const
+    {
+    switch ( aLayoutType )
+        {
+        case ENameLayoutHeadingPane:
+            return StringLoader::LoadL( R_DIAG_SPEAKER_PLUGIN_HEADING_PANE );
+
+        case ENameLayoutPopupInfoPane:
+            return StringLoader::LoadL( R_DIAG_SPEAKER_PLUGIN_POPUP_INFO_LIST_PANE );
+
+        case ENameLayoutTitlePane:
+            return StringLoader::LoadL( R_DIAG_SPEAKER_PLUGIN_TITLE_PANE );
+
+        case ENameLayoutListSingleGraphic:
+            return StringLoader::LoadL( R_DIAG_SPEAKER_PLUGIN_LIST_SINGLE_GRAPHIC_PANE );
+
+        case ENameLayoutListSingle:           
+            return StringLoader::LoadL( R_DIAG_SPEAKER_PLUGIN_LIST_SINGLE_GRAPHIC_HEADING_PANE );
+
+        default:
+            LOGSTRING2( "CDiagSpeakerPlugin::GetPluginNameL: "
+                L"ERROR: Unsupported layout type %d", aLayoutType )
+            __ASSERT_DEBUG( 0, User::Invariant() );
+            return StringLoader::LoadL ( R_DIAG_SPEAKER_PLUGIN_LIST_SINGLE_GRAPHIC_HEADING_PANE );
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// From MDiagPlugin
+// CDiagSpeakerPlugin::Uid
+// ---------------------------------------------------------------------------
+TUid CDiagSpeakerPlugin::Uid() const
+    {
+    return KDiagSpeakerPluginUid;
+    }
+
+// ---------------------------------------------------------------------------
+// From CDiagTestPluginBase
+// CDiagSpeakerPlugin::InitializeL()
+// ---------------------------------------------------------------------------
+void CDiagSpeakerPlugin::TestSessionBeginL(
+    MDiagEngineCommon& /*aEngine*/,
+    TBool              /*aSkipDependencyCheck*/,
+    TAny*              /*aCustomParams*/)
+    {
+    LOGSTRING( "CDiagSpeakerPlugin::TestSessionBeginL:: Deleting record file..." )
+    DeleteRecordFile();
+    }
+
+// ---------------------------------------------------------------------------
+// From CDiagTestPluginBase
+// CDiagSpeakerPlugin::CleanupL()
+// ---------------------------------------------------------------------------
+void CDiagSpeakerPlugin::TestSessionEndL(
+    MDiagEngineCommon& /*aEngine*/,
+    TBool              /*aSkipDependencyCheck*/,
+    TAny*              /*aCustomParams*/)
+    {
+    LOGSTRING( "CDiagSpeakerPlugin::TestSessionEndL:: Deleting record file..." )
+    DeleteRecordFile();
+    }
+
+// ---------------------------------------------------------------------------
+// From CDiagTestPluginBase
+// CDiagSpeakerPlugin::DoRunTestL()
+// ---------------------------------------------------------------------------
+void CDiagSpeakerPlugin::DoRunTestL()
+    {
+    LOGSTRING( "CDiagSpeakerPlugin::DoRunTest() IN" )
+
+    // Framework should never call DoRunTestL() before previous test
+    ASSERT_ALWAYS( iRecorder == NULL );
+    ASSERT_ALWAYS( iAudioPlayer == NULL );
+    iSessionValid = ETrue;
+
+    // Create Recorder
+    iRecorder = CMdaAudioRecorderUtility::NewL(
+        *this,
+        NULL,
+        KAudioPriorityRecording,
+        TMdaPriorityPreference( KAudioPrefRealOneLocalPlayback )
+        );
+
+    // Create Audio Player
+    iAudioPlayer = CMdaAudioPlayerUtility::NewL( *this );
+
+    // Check it has been recorded
+    if ( CheckRecordFile() == EFalse )
+        {
+        LOGSTRING( "CDiagSpeakerPlugin::DoRunTest() Record file does not exist. StartRecordL()" )
+        StartRecordL();
+        }
+     else
+        {
+        LOGSTRING( "CDiagSpeakerPlugin::DoRunTest() Record file exists. StartPlayL()" )
+        StartPlayL();
+        }
+
+    LOGSTRING( "CDiagSpeakerPlugin::DoRunTest() OUT" )
+    }
+
+// ---------------------------------------------------------------------------
+// CDiagSpeakerPlugin::DoStopAndCleanupL
+// ---------------------------------------------------------------------------
+//
+void CDiagSpeakerPlugin::DoStopAndCleanupL()
+    {
+    LOGSTRING( "CDiagSpeakerPlugin::DoStopAndCleanupL IN" )
+    // All memory and resource allocated during test execution should be
+    // cleaned up here.
+
+    // Set Session
+    iSessionValid = EFalse;
+
+    // Close Recorder
+    if ( iRecorder )
+    {
+        LOGSTRING( "CDiagAudioPlugin::DoStopAndCleanupL: Stop & Close AudioPlayer" )
+        iRecorder->Stop();
+        iRecorder->Close();
+    }
+
+    // Close Audio
+    if ( iAudioPlayer )
+    {
+        LOGSTRING( "CDiagSpeakerPlugin::DoStopAndCleanupL: Stop & Close AudioPlayer" )
+        iAudioPlayer->Stop();
+        iAudioPlayer->Close();
+    }
+
+    // Restore AudioOutput
+   RestoreAudioOutputL();
+
+    if ( ResultsDbItemBuilder().TestResult() == CDiagResultsDatabaseItem::ESuccess )
+        {
+        // Test was successful. Do not delete the temporary file.
+        LOGSTRING( "CDiagSpeakerPlugin::DoStopAndCleanupL: Keep file for next test." )
+        }
+    else
+        {
+        // test was not successful. Delete recorded file.
+        LOGSTRING( "CDiagSpeakerPlugin::DoStopAndCleanupL:DeleteRecordFile()" )
+        DeleteRecordFile();
+        }
+
+    if ( iAudioState == CMdaAudioRecorderUtility::EPlaying )
+        {
+        LOGSTRING( "CDiagSpeakerPlugin::DoStopAndCleanupL:RestoreAudioOutputL" )
+        TRAP_IGNORE( RestoreAudioOutputL() );
+        }
+
+    // Call Engine to Dismiss Any Dialog
+    DismissWaitingDialog();
+
+    // Close which can be recovered by running doRunTestL()
+    ClosePeriodic();
+
+    // Clean up resources allocated during object creation.
+    delete iRecorder;
+    iRecorder = NULL;
+
+    delete iAudioPlayer;
+    iAudioPlayer = NULL;
+
+    delete iAudioOutput;
+    iAudioOutput = NULL;
+
+    // Cleanup Progress Dialog
+    LOGSTRING( "Cleanup Progress Dialog" )
+    if ( iProgressDialog )
+        {
+        delete iProgressDialog;
+        iProgressDialog = NULL;
+        }
+
+    SetProgressDismissed( ETrue );
+
+    LOGSTRING( "CDiagSpeakerPlugin::DoStopAndCleanupL OUT" )
+    }
+
+// ---------------------------------------------------------------------------
+// From CActive
+// CDiagSpeakerPlugin::RunL
+// ---------------------------------------------------------------------------
+void CDiagSpeakerPlugin::RunL()
+    {
+    switch(iState)
+        {
+        case EStateCancelled:
+            CompleteTestL( CDiagResultsDatabaseItem::ESkipped );
+            return;
+        case EStateRecorded:
+            AfterRecordL();
+            break;
+        case EStatePlayed:
+            AfterPlayL();
+            break;
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// From CActive
+// CDiagSpeakerPlugin::DoCancel
+// ---------------------------------------------------------------------------
+void CDiagSpeakerPlugin::DoCancel()
+    {
+    // Stop active request. This class does not use Async request using iStatus.
+    }
+
+// ---------------------------------------------------------------------------
+// CDiagSpeakerPlugin::DialogDismissedL
+// ---------------------------------------------------------------------------
+//
+void CDiagSpeakerPlugin::DialogDismissedL( TInt aButtonId )
+    {
+    LOGSTRING2( "CDiagSpeakerPlugin::DialogDismissedL: aButtonId = %d", aButtonId )
+
+    TInt        prevState;
+
+    SetProgressDismissed( ETrue );
+
+    // Restore Audio Output in case of Playing
+    if ( iAudioState == CMdaAudioRecorderUtility::EPlaying )
+        {
+        LOGSTRING( "CDiagSpeakerPlugin::DialogDismissedL: Calling RestoreAudioOutputL" )
+        if ( iAudioOutput )
+        {
+            delete iAudioOutput;
+            iAudioOutput = NULL;
+        }
+
+        //RestoreAudioOutputL();
+        }
+
+    // Stop Recording / Playing
+    if ( iAudioState == CMdaAudioRecorderUtility::ERecording )
+        {
+        LOGSTRING( "CDiagSpeakerPlugin::DialogDismissedL:: Stop. Record" )
+        if ( iRecorder )
+            {
+            iRecorder->Stop();
+            iRecorder->Close();
+            }
+        }
+    else if ( iAudioState == CMdaAudioRecorderUtility::EPlaying )
+        {
+        LOGSTRING( "CDiagSpeakerPlugin::DialogDismissedL:: Stop. Play" )
+        if ( iAudioPlayer )
+            {
+            iAudioPlayer->Stop();
+            iAudioPlayer->Close();
+            }
+        }
+
+    // If button has not pressed
+    if ( ( aButtonId != ECBACmdSkip )   &&
+         ( aButtonId != EEikBidCancel ) &&   // ADO & Platformization Changes
+         ( aButtonId != EAknSoftkeyOk ) &&
+         ( aButtonId != EAknSoftkeyDone) &&
+         ( aButtonId != ECBACmdCancel )
+       )
+        {
+        LOGSTRING2( "CDiagAudioPlugin::DialogDismissedL: Button not pressed. aButtonId = %d", aButtonId )
+        return;
+        }
+
+    // Skip
+    if ( aButtonId == ECBACmdSkip )
+        {
+        LOGSTRING( "CDiagSpeakerPlugin::DialogDismissedL:: aButtonId == ECBACmdSkip" )
+        CompleteTestL( CDiagResultsDatabaseItem::ESkipped );
+        return;
+        }
+
+    // Cancel
+    else if ( aButtonId == EEikBidCancel ) // ADO & Platformization Changes
+        {
+        LOGSTRING( "CDiagSpeakerPlugin::DialogDismissedL:: aButtonId == ECBACmdCancel" )
+
+        prevState = iAudioState;
+        iAudioState    = CMdaAudioRecorderUtility::EOpen;
+
+        TInt   cancelButtonId;
+        TBool  cancelResult = EFalse;
+
+        cancelResult = AskCancelExecutionL( cancelButtonId );
+        
+        if ( !cancelResult )
+            {
+            LOGSTRING( "CDiagSpeakerPlugin::StartPlayL - !iSessionValid 3" )
+            return;
+            }
+
+        switch ( cancelButtonId )
+            {
+            case EAknSoftkeyYes:
+                SetAudioEvent(EStateCancelled);
+                LOGSTRING( "CDiagSpeakerPlugin::DialogDismissedL:: EAknSoftkeyYes return NOW!!" )
+                return;
+
+            default:
+                if ( prevState == CMdaAudioRecorderUtility::ERecording )
+                    {
+                    LOGSTRING( "CDiagSpeakerPlugin::DialogDismissedL:: Start RecordL" )
+                    RecordL();
+                    }
+                else if ( prevState == CMdaAudioRecorderUtility::EPlaying )
+                    {
+                    LOGSTRING( "CDiagSpeakerPlugin::DialogDismissedL:: Start PlayL" )
+                    PlayL();
+                    }
+                break;
+            }
+        return;
+        }
+
+    // Stop
+    else
+        {
+        LOGSTRING2( "CDiagSpeakerPlugin::DialogDismissedL: State = %d", iAudioState )
+        if ( iAudioState == CMdaAudioRecorderUtility::ERecording )
+            {
+            LOGSTRING( "CDiagAudioPlugin::DialogDismissedL:: Stop. Record" )
+            if ( iRecorder &&  iState == EStateUnknown)
+                {
+                LOGSTRING( "CDiagAudioPlugin::DialogDismissedL:: Stop. Call AfterRecordL()" )
+                SetAudioEvent(EStateRecorded);
+                }
+            /*
+            LOGSTRING( "CDiagSpeakerPlugin::DialogDismissedL:: Stop. Call AfterRecordL()" )
+            // Stop playback/recording
+            AfterRecordL(); */
+            }
+        else if ( iAudioState == CMdaAudioRecorderUtility::EPlaying )
+            {  
+            LOGSTRING( "CDiagAudioPlugin::DialogDismissedL:: Stop. Play" )
+            if ( iAudioPlayer && iState == EStateRecorded)
+                {
+                LOGSTRING( "CDiagAudioPlugin::DialogDismissedL:: Stop. Call AfterPlayL()" )
+                SetAudioEvent(EStatePlayed);
+                }
+            /*
+            LOGSTRING( "CDiagSpeakerPlugin::DialogDismissedL:: Stop. Call AfterPlayL()" )
+            // Stop playback/recording
+            AfterPlayL(); */
+            }
+        }
+    }
+
+
+void CDiagSpeakerPlugin::SetAudioEvent(TState aState)
+    {
+    iState = aState;
+    SetActive();
+    TRequestStatus* status = &iStatus;
+    User::RequestComplete(status, KErrNone);
+    }
+
+// ---------------------------------------------------------------------------
+// CDiagSpeakerPlugin::MoscoStateChangeEvent
+// ---------------------------------------------------------------------------
+//
+void CDiagSpeakerPlugin::MoscoStateChangeEvent(
+    CBase* /*aObject*/,
+    TInt   aPreviousState,
+    TInt   aCurrentState,
+    TInt   aErrorCode
+)
+    {
+    TInt err = KErrNone;
+
+    LOGSTRING4( "CDiagSpeakerPlugin::MoscoStateChangeEvent:IN (%d -> %d, %d )", aPreviousState, aCurrentState, aErrorCode )
+
+    // 1. Record reaches to the end of file
+    if ( aErrorCode == KErrEof )
+        {
+        iState = EStateRecorded;
+        iAudioState = CMdaAudioRecorderUtility::EOpen;
+        TRAP( err, AfterRecordL() );
+        }
+
+    // 2. Start - Recording
+    else if ( ( aPreviousState == CMdaAudioRecorderUtility::ENotReady)  &&
+              ( aCurrentState  == CMdaAudioRecorderUtility::EOpen    ) )
+        {
+        LOGSTRING( "CDiagSpeakerPlugin::MoscoStateChangeEvent: Leave on RecordingL()" )
+        TRAP( err, RecordingL() );
+        LOGSTRING2( "CDiagSpeakerPlugin::MoscoStateChangeEvent: RecordingL() err = %d", err )
+        }
+
+    // 3. Stopped - Recording
+    else if ( ( aPreviousState == CMdaAudioRecorderUtility::ERecording ) &&
+              ( aCurrentState  == CMdaAudioRecorderUtility::EOpen )
+            )
+        {
+        iState = EStateRecorded;
+        LOGSTRING( "CDiagSpeakerPlugin::MoscoStateChangeEvent: Leave on AfterRecordL()" )
+        TRAP( err, AfterRecordL() );
+        LOGSTRING2( "CDiagSpeakerPlugin::MoscoStateChangeEvent: AfterRecordL() err = %d", err )
+        }
+
+    // Handle for Trap
+    if (err != KErrNone)
+        {
+        LOGSTRING2( "CDiagSpeakerPlugin::MoscoStateChangeEvent:Call CompleteTestL with error = %d", err )
+        TRAP( err, CompleteTestL(CDiagResultsDatabaseItem::EFailed) );
+        if ( err != KErrNone )
+            {
+            LOGSTRING( "CDiagSpeakerPlugin::MoscoStateChangeEvent:User::Panic()" )
+            User::Panic( KDiagSpeakerPluginCategory, err );
+            }
+        return; // Fail Test
+        }
+    LOGSTRING( "CDiagSpeakerPlugin::MoscoStateChangeEvent OUT" )
+    }
+
+// ---------------------------------------------------------------------------
+// CDiagSpeakerPlugin::MapcInitComplete
+// ---------------------------------------------------------------------------
+//
+void CDiagSpeakerPlugin::MapcInitComplete(TInt aError, const TTimeIntervalMicroSeconds& aDuration)
+    {
+    LOGSTRING2( "CDiagSpeakerPlugin::MapcInitComplete: aError=%d", aError )
+    TInt err = KErrNone;
+
+    // Set Duration
+    iPositionMicroSec    = 0;
+    iMaxDurationMicroSec = aDuration;
+
+    // Set Priority of AudioPlayer
+    iAudioPlayer->SetPriority(
+        KAudioPriorityAlarm + 1,
+        TMdaPriorityPreference( KAudioPrefVoiceRec )
+        );
+
+    // Set Audio Output
+    if ( iAudioOutput )
+    {
+        delete iAudioOutput;
+        iAudioOutput = NULL;
+    }
+
+    // Create AudioOutput
+    TRAP(err,iAudioOutput = CAudioOutput::NewL( *iAudioPlayer ));
+    if ( err != KErrNone ) // Added for removing code scanner warning
+        {
+        LOGSTRING2( "CDiagSpeakerPlugin::MapcInitComplete:Call CompleteTestL with error = %d", err )
+        TRAP( err, CompleteTestL(CDiagResultsDatabaseItem::EFailed) );
+
+        if ( err != KErrNone )
+            {
+            LOGSTRING( "CDiagSpeakerPlugin::MapcInitComplete:User::Panic()" )
+            User::Panic( KDiagSpeakerPluginCategory, err );
+            }
+
+        return; // Fail Test
+        } 
+    
+    TRAP(err,iAudioOutput->SetAudioOutputL( iOutput ));
+    
+    if ( err != KErrNone ) // Added for removing code scanner warning
+        {
+        LOGSTRING2( "CDiagSpeakerPlugin::MapcInitComplete:Call CompleteTestL with error = %d", err )
+        TRAP( err, CompleteTestL(CDiagResultsDatabaseItem::EFailed) );
+
+        if ( err != KErrNone )
+            {
+            LOGSTRING( "CDiagSpeakerPlugin::MapcInitComplete:User::Panic()" )
+            User::Panic( KDiagSpeakerPluginCategory, err );
+            }
+
+        return; // Fail Test
+        } 
+
+    // Start Playing
+    TRAP( err, PlayingL() );
+
+    // Handle for Trap
+    if ( err != KErrNone )
+        {
+        LOGSTRING2( "CDiagSpeakerPlugin::MapcInitComplete:Call CompleteTestL with error = %d", err )
+        TRAP( err, CompleteTestL(CDiagResultsDatabaseItem::EFailed) );
+
+        if ( err != KErrNone )
+            {
+            LOGSTRING( "CDiagSpeakerPlugin::MapcInitComplete:User::Panic()" )
+            User::Panic( KDiagSpeakerPluginCategory, err );
+            }
+
+        return; // Fail Test
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// CDiagSpeakerPlugin::MapcPlayComplete
+// ---------------------------------------------------------------------------
+//
+void CDiagSpeakerPlugin::MapcPlayComplete(TInt aError)
+    {
+    LOGSTRING2( "CDiagSpeakerPlugin::MapcPlayComplete: aError=%d", aError )
+
+    if ( aError == KErrNone)
+        {
+        LOGSTRING( "CDiagSpeakerPlugin::MapcPlayComplete KErrNone" )
+        
+        if ( iAudioOutput )
+        {
+            delete iAudioOutput;
+            iAudioOutput = NULL;
+        }
+
+       // RestoreAudioOutputL();
+
+        
+        if(iState == EStateRecorded)
+            {
+        // Stop and Close Audio Player
+            if ( iAudioPlayer )
+                {
+                iAudioPlayer->Stop();
+                iAudioPlayer->Close();
+                iState = EStatePlayed;
+                }
+    
+            TRAPD(err,AfterPlayL());
+            
+            // Handle for Trap
+				    if ( err != KErrNone )
+				        {
+				        LOGSTRING2( "CDiagSpeakerPlugin::MapcInitComplete:Call CompleteTestL with error = %d", err )
+				        TRAP( err, CompleteTestL(CDiagResultsDatabaseItem::EFailed) );
+				
+				        if ( err != KErrNone )
+				            {
+				            LOGSTRING( "CDiagSpeakerPlugin::MapcInitComplete:User::Panic()" )
+				            User::Panic( KDiagSpeakerPluginCategory, err );
+				            }
+				
+				        return; // Fail Test
+				        }
+            }
+        return;
+        }
+    }
+// End of File
+