diff -r 000000000000 -r 3ce708148e4d devicediagnostics/diagplugins/diagloudspeakerplugin/src/diagspeakerplugin.cpp --- /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 // CAknQueryDialog +#include // CAknMessageQueryDialog +#include // CAknProgressDialog +#include // CEikProgressInfo +#include // CEikButtonGroupContainer +#include // KAudioPriorityRecording +#include // CMdaAudioRecorderUtility +#include // CMdaAudioPlayerUtility +#include // StringLoader +#include // MDiagTestObserver +#include // TDiagTestExecParam +#include // MDiagEngine +#include // CDiagPluginPool +#include // CDiagResultsDbItemBuilder +#include // CDiagResultDetailBasic +#include // LOGSTRING +#include // for EDiagCommonDialogConfirmCancelAll + +// For Central Repository +#include +#include "diagspeakertestprivatecrkeys.h" + +// Speaker Plugin Headerfile +#include "diagspeakerplugin.h" // CDiagSpeakerPlugin +#include "diagspeakerplugin.hrh" // Button Id defined +#include // Resource Definitions +#include + + +// 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 +// 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( 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 (&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 +