--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/srsf/devasr/src/devasrsrsalgorithmmanager.cpp Thu Dec 17 08:46:30 2009 +0200
@@ -0,0 +1,2150 @@
+/*
+* Copyright (c) 2004-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: This file contains the implementation of Algorithm Manager,
+* a submodule of DevASR.
+*
+*/
+
+
+// INCLUDE FILES
+#include <mmfdatabuffer.h>
+#include <AudioPreference.h>
+#include <nssdevasr.h>
+#include "devasrsrsalgorithmmanager.h"
+#include "devasrvmalgorithmmanager.h"
+#include "rubydebug.h"
+#include "devasrcenrep.h"
+#include "srsfbldvariant.hrh"
+
+// CONSTANTS
+const TInt KPlay = 1;
+const TInt KRecord = KPlay + 1;
+
+// Extra error values
+const TInt KErrTooEarly = -100; // if speech was started too early
+const TInt KErrNoSpeech = -101; // if it was silent
+const TInt KErrTooLong = -102; // if speech did not stop before timeout
+const TInt KErrTooShort = -103; // if speech was too short
+
+// Default priority for recording
+const TInt KDefaultPriority = KAudioPriorityVoiceDial;
+
+// ============================ MEMBER FUNCTIONS ===============================
+
+// -----------------------------------------------------------------------------
+// CSRSAlgorithmManager::CSRSAlgorithmManager
+// C++ default constructor can NOT contain any code, that
+// might leave.
+// -----------------------------------------------------------------------------
+//
+CSRSAlgorithmManager::CSRSAlgorithmManager( MDevASRObserver& aObserver )
+ : CActive( CActive::EPriorityStandard ),
+ iDevASRObserver( &aObserver ),
+ iDevSound( NULL ),
+ iCurrentVolume( 0 ),
+ iCurrentGain( 0 ),
+ iRecognitionAlgMgr( NULL ),
+ iVMAlgorithmManager( NULL ),
+ iStartRecognition( EFalse ),
+ iPendingRequestSpeechData( EFalse ),
+ iStartPoint( 0 ),
+ iStopPoint( 0 ),
+ iAudioBuffer( NULL ),
+ iPtr( NULL, 0, 0 ),
+ iOverallLength( 0 ),
+ iOverallSampled( 0 ),
+ iProcessingUtterance( EFalse ),
+ iEndFlag( 0 ),
+ iStartFrame( 0 ),
+ iEndFrame( 0 ),
+ iFrameLength( 0 ),
+ iBufferStartPoint( 0 ),
+ iBufferEndPoint( 0 ),
+ iDevASRState( EDASRIdle ),
+ iDevSoundState( ESoundDeviceNotInitialized ),
+ iRequestFunction( 0 ),
+ iBufferUnderConstruction( NULL ),
+ iConstructionPoint( 0 ),
+ iPreSamplingStarted( EFalse )
+ {
+ RUBY_DEBUG0( "CSRSAlgorithmManager::CSRSAlgorithmManager()" );
+#ifdef AUDIOBUFFER_TO_FILE
+ iFileCreated = EFalse;
+#endif
+
+ }
+
+
+// -----------------------------------------------------------------------------
+// CSRSAlgorithmManager::ConstructL
+// Symbian 2nd phase constructor can leave.
+// -----------------------------------------------------------------------------
+//
+void CSRSAlgorithmManager::ConstructL()
+ {
+ RUBY_DEBUG_BLOCK( "CSRSAlgorithmManager::ConstructL()" );
+
+ // Resource handler reads the DevASR resource file
+ iResourceHandler = CDevASRResourceHandler::NewL();
+
+ iRecognitionAlgMgr = CRecognitionAlgMgr::NewL( *this );
+ iVMAlgorithmManager = CVMAlgorithmManager::NewL( *iDevASRObserver, *this );
+
+ // Queue containing audio buffers
+ iAudioBufferQue = new ( ELeave ) TSglQue<CQueItem>( _FOFF( CQueItem, iLink ) );
+
+ // Set default priority settings
+ iPrioritySettings.iState = EMMFStateRecording;
+ iPrioritySettings.iPriority = KDefaultPriority;
+ iPrioritySettings.iPref = ( TMdaPriorityPreference ) KAudioPrefVocosRecog;
+
+ // CenRep utility class
+ CDevAsrCenRep* cenRep = CDevAsrCenRep::NewL();
+ CleanupStack::PushL( cenRep );
+
+ iRecognitionAlgMgr->SetRejection( cenRep->RejectionValue() );
+
+ CleanupStack::PopAndDestroy( cenRep );
+
+ CActiveScheduler::Add( this );
+
+ RUBY_DEBUG1( "associated DevSound instance [%x]", iDevSound );
+ RUBY_DEBUG1( "associated Recognition AlgMgr instance [%x]", iRecognitionAlgMgr );
+ RUBY_DEBUG1( "associated Vocabulary AlgMgr instance [%x]", iRecognitionAlgMgr );
+ }
+
+
+// -----------------------------------------------------------------------------
+// CSRSAlgorithmManager::NewL
+// Two-phased constructor.
+// -----------------------------------------------------------------------------
+//
+CSRSAlgorithmManager* CSRSAlgorithmManager::NewL( MDevASRObserver& aObserver )
+ {
+ CSRSAlgorithmManager* self = new( ELeave ) CSRSAlgorithmManager( aObserver );
+
+ CleanupStack::PushL( self );
+ self->ConstructL();
+ CleanupStack::Pop( self );
+
+ return self;
+ }
+
+
+// -----------------------------------------------------------------------------
+// CSRSAlgorithmManager::~CSRSAlgorithmManager
+// Destructor.
+// -----------------------------------------------------------------------------
+//
+CSRSAlgorithmManager::~CSRSAlgorithmManager()
+ {
+ RUBY_DEBUG0( "CSRSAlgorithmManager::~CSRSAlgorithmManager()" );
+
+ //delete iAudioBuffer;
+ delete iQueItem;
+
+ // Empty audio queue if there happens to be something
+ if ( iAudioBufferQue )
+ {
+ while ( !iAudioBufferQue->IsEmpty() )
+ {
+ iQueItem = iAudioBufferQue->First();
+ iAudioBufferQue->Remove( *iQueItem );
+ delete iQueItem;
+ }
+
+ delete iAudioBufferQue;
+ }
+
+ delete iBufferUnderConstruction;
+ iBufferUnderConstruction = NULL;
+ iConstructionPoint = 0;
+
+ delete iDevSound;
+ delete iRecognitionAlgMgr;
+ delete iVMAlgorithmManager;
+ delete iResourceHandler;
+ }
+
+
+// -----------------------------------------------------------------------------
+// CSRSAlgorithmManager::AdaptL
+// Adapts vocabulary and models based on correct result.
+// -----------------------------------------------------------------------------
+//
+void CSRSAlgorithmManager::AdaptL( const CSIResultSet& aResultSet,
+ TInt aResultIndex )
+ {
+ RUBY_DEBUG_BLOCK( "CSRSAlgorithmManager::AdaptL()" );
+
+ // Adapt vocab
+ iVMAlgorithmManager->AdaptVocabL( aResultSet, aResultIndex );
+
+ // Find language of correct result
+ const CSIResult& iCorrectResult = aResultSet.AtL( aResultIndex );
+ TSIGrammarID grammarID = iCorrectResult.GrammarID();
+ TSIRuleID ruleID = iCorrectResult.RuleID();
+ TSIRuleVariantID ruleVariantID = iCorrectResult.RuleVariantID();
+ CSICompiledGrammar* siActiveGrammar = NULL;
+ CSICompiledGrammar* siNonActiveGrammar = NULL;
+ CSICompiledGrammar* siGrammar = NULL;
+
+ TRAPD( error, GetGrammarL( grammarID, &siActiveGrammar, &siNonActiveGrammar ) );
+ User::LeaveIfError( error );
+
+ TInt index = 0;
+
+ if ( siActiveGrammar != NULL )
+ {
+ siGrammar = siActiveGrammar;
+ }
+ else if ( siNonActiveGrammar != NULL )
+ {
+ siGrammar = siNonActiveGrammar;
+ }
+ else
+ {
+ User::Leave( KErrNotFound );
+ }
+
+ index = siGrammar->Find( ruleID );
+ User::LeaveIfError( index );
+ CSIRule& rule = siGrammar->AtL( index );
+
+ index = rule.Find( ruleVariantID );
+ User::LeaveIfError( index );
+ CSIRuleVariant& ruleVariant = rule.AtL( index );
+
+ // Adapt models
+ iRecognitionAlgMgr->AdaptModelsL( aResultSet, aResultIndex, ruleVariant.Language() );
+ }
+
+
+// -----------------------------------------------------------------------------
+// CSRSAlgorithmManager::CompileGrammarL
+// Forward call to CVMAlgorithmManager.
+// -----------------------------------------------------------------------------
+//
+void CSRSAlgorithmManager::CompileGrammarL( CSICompiledGrammar& aGrammar/*,
+ CSIModelBank& aModelBank*/ )
+ {
+ RUBY_DEBUG_BLOCK( "CSRSAlgorithmManager::CompileGrammarL()" );
+
+ iVMAlgorithmManager->CompileGrammarL( aGrammar/*, aModelBank*/ );
+ }
+
+
+// -----------------------------------------------------------------------------
+// CSRSAlgorithmManager::ComputeNewGrammarSizeL
+// Forward call to CVMAlgorithmManager.
+// -----------------------------------------------------------------------------
+//
+void CSRSAlgorithmManager::ComputeNewGrammarSizeL( const CSIGrammar& aGrammar,
+ const TUint32 aTargetNRuleVariants,
+ const TUint32 aMaxNRuleVariants,
+ const RArray<TUint>& aNewRuleScores,
+ RArray<TUint>& aNNeNRuleVariants,
+ TUint32& aNPrune )
+ {
+ RUBY_DEBUG_BLOCK( "CSRSAlgorithmManager::ComputeNewGrammarSizeL()" );
+
+ iVMAlgorithmManager->ComputeNewGrammarSizeL( aGrammar,
+ aTargetNRuleVariants,
+ aMaxNRuleVariants,
+ aNewRuleScores,
+ aNNeNRuleVariants,
+ aNPrune );
+ }
+
+
+// -----------------------------------------------------------------------------
+// CSRSAlgorithmManager::PruneGrammar
+// Forward call to CVMAlgorithmManager.
+// -----------------------------------------------------------------------------
+//
+TBool CSRSAlgorithmManager::PruneGrammar( const CSIGrammar& aGrammar,
+ const TUint32 aMinNumber,
+ RArray<TSIRuleVariantInfo>& aPrunedRuleVariants )
+ {
+ return iVMAlgorithmManager->PruneGrammar( aGrammar, aMinNumber, aPrunedRuleVariants );
+ }
+
+
+// -----------------------------------------------------------------------------
+// CSRSAlgorithmManager::StartTrainingFromTextL
+// Forward call to CVMAlgorithmManager.
+// -----------------------------------------------------------------------------
+//
+void CSRSAlgorithmManager::StartTrainingFromTextL( CSITtpWordList& aWordList,
+ const RArray<TLanguage>& aDefaultLanguage,
+ const RArray<TUint32>& aMaxNPronunsForWord )
+ {
+ RUBY_DEBUG_BLOCK( "CSRSAlgorithmManager::StartTrainingFromTextL()" );
+
+ iVMAlgorithmManager->TrainFromTextL( aWordList, aDefaultLanguage, aMaxNPronunsForWord );
+ }
+
+
+// -----------------------------------------------------------------------------
+// CSRSAlgorithmManager::ResolveResult
+// Forward call to CVMAlgorithmManager.
+// -----------------------------------------------------------------------------
+//
+void CSRSAlgorithmManager::ResolveResult( const RArray<TUint>& aNBestIDs,
+ CSIResultSet& aSIResultSet,
+ const RPointerArray<CSICompiledGrammar>& aSICompiledGrammar,
+ const TDesC8& aCombinedData/*,
+ CSIModelBank& iSIModelBank*/ )
+ {
+ iVMAlgorithmManager->ResolveResult( aNBestIDs, aSIResultSet,
+ aSICompiledGrammar, aCombinedData/*,
+ iSIModelBank*/ );
+ }
+
+
+// -----------------------------------------------------------------------------
+// CSRSAlgorithmManager::CombineGrammarL
+// Forward call to CVMAlgorithmManager.
+// -----------------------------------------------------------------------------
+//
+void CSRSAlgorithmManager::CombineGrammarL( const RPointerArray<CSICompiledGrammar>& aCompiledGrammars,
+ const RPointerArray<TSIRuleVariantInfo>& aExcludedRules )
+ {
+ RUBY_DEBUG_BLOCK( "CSRSAlgorithmManager::CombineGrammarL()" );
+
+ iVMAlgorithmManager->CombineGrammarL( aCompiledGrammars, aExcludedRules );
+ }
+
+
+// -----------------------------------------------------------------------------
+// CSRSAlgorithmManager::ConfigureSoundDeviceL
+// Configure sound device according to resource file parameters
+// -----------------------------------------------------------------------------
+//
+void CSRSAlgorithmManager::ConfigureSoundDeviceL()
+ {
+ RUBY_DEBUG_BLOCK( "CSRSAlgorithmManager::ConfigureSoundDeviceL()" );
+
+ // Fetch the default configuration from DevSound
+ iDevSoundCapabilities = iDevSound->Config();
+
+ // Now, configure it according to resource file parameters
+ switch ( iResourceHandler->iSamplingRate )
+ {
+ case 8000:
+ iDevSoundCapabilities.iRate = EMMFSampleRate8000Hz;
+ break;
+ case 11025:
+ iDevSoundCapabilities.iRate = EMMFSampleRate11025Hz;
+ break;
+ case 16000:
+ iDevSoundCapabilities.iRate = EMMFSampleRate16000Hz;
+ break;
+ case 22050:
+ iDevSoundCapabilities.iRate = EMMFSampleRate22050Hz;
+ break;
+ case 32000:
+ iDevSoundCapabilities.iRate = EMMFSampleRate32000Hz;
+ break;
+ case 44100:
+ iDevSoundCapabilities.iRate = EMMFSampleRate44100Hz;
+ break;
+ case 48000:
+ iDevSoundCapabilities.iRate = EMMFSampleRate48000Hz;
+ break;
+ case 88200:
+ iDevSoundCapabilities.iRate = EMMFSampleRate88200Hz;
+ break;
+ case 96000:
+ iDevSoundCapabilities.iRate = EMMFSampleRate96000Hz;
+ break;
+ default:
+ iDevSoundCapabilities.iRate = EMMFSampleRate8000Hz;
+ break;
+ }
+
+ iDevSoundCapabilities.iBufferSize = iResourceHandler->iBufferSize;
+
+ if ( iResourceHandler->iBitsPerSample == 8 )
+ {
+ iDevSoundCapabilities.iEncoding = EMMFSoundEncoding8BitPCM;
+ }
+ else
+ {
+ iDevSoundCapabilities.iEncoding = EMMFSoundEncoding16BitPCM;
+ }
+
+ // Now, configure DevSound according to new parameters.
+ iDevSound->SetConfigL( iDevSoundCapabilities );
+
+ RUBY_DEBUG1( "DevSound Max Volume = %d", iDevSound->MaxVolume() );
+ RUBY_DEBUG1( "DevSound Max Gain = %d", iDevSound->MaxGain() );
+
+ // In order to avoid truncation, computation must be done this way.
+ iCurrentVolume = ( ( iDevSound->MaxVolume() * iResourceHandler->iSpeakerVolume ) + 50 ) / 100;
+ iCurrentGain = ( ( iDevSound->MaxGain() * iResourceHandler->iMicrophoneGain ) + 50 ) / 100;
+
+ // The speaker volume is set to the percentage of max volume supported.
+ iDevSound->SetVolume( iCurrentVolume );
+ // The gain is set to the percentage of max gain supported.
+ iDevSound->SetGain( iCurrentGain );
+
+ iDevSoundCapabilities = iDevSound->Config();
+
+ RUBY_DEBUG1( "DevSound Set Volume = %d", iCurrentVolume );
+ RUBY_DEBUG1( "DevSound Set Gain = %d", iCurrentGain );
+ RUBY_DEBUG1( "DevSound Buffer Size = %d", iDevSoundCapabilities.iBufferSize );
+ }
+
+
+// -----------------------------------------------------------------------------
+// CSRSAlgorithmManager::GetEnginePropertiesL
+// Retreive the properties of the underlying speech recognition engine.
+// An array of values corresponding to the querried identifiers will be populated.
+// The function may leave with KErrArgument.
+// -----------------------------------------------------------------------------
+//
+void CSRSAlgorithmManager::GetEnginePropertiesL( const RArray<TInt>& aPropertyId,
+ RArray<TInt>& aPropertyValue )
+ {
+ RUBY_DEBUG_BLOCK( "SRSAlgorithmManager::EnginePropertiesL()" );
+
+ // Check that arrays are ok
+ if ( aPropertyId.Count() != aPropertyValue.Count() )
+ {
+ User::Leave( KErrArgument );
+ }
+
+ // Run through the engine properties and fill in known values
+ for ( TInt index = 0; index < aPropertyId.Count(); index++)
+ {
+ switch( aPropertyId[index] )
+ {
+ case KSamplingRate:
+ aPropertyValue[index] = iResourceHandler->iSamplingRate;
+ break;
+
+ case KBitsPerSample:
+ aPropertyValue[index] = iResourceHandler->iBitsPerSample;
+ break;
+
+ default:
+ break;
+
+ }
+ }
+ // Get engine properties from other sources.
+ iRecognitionAlgMgr->GetEnginePropertiesL( aPropertyId, aPropertyValue );
+ iVMAlgorithmManager->GetEnginePropertiesL( aPropertyId, aPropertyValue );
+ }
+
+
+// -----------------------------------------------------------------------------
+// CSRSAlgorithmManager::InitFrontEnd
+// Initializes the recognition front end.
+// -----------------------------------------------------------------------------
+//
+void CSRSAlgorithmManager::InitFrontEnd( TRecognizerMode aMode )
+ {
+ RUBY_DEBUG0( "CSRSAlgorithmManager::InitFrontEnd()" );
+
+ iProcessingUtterance = EFalse;
+
+ if ( iMode != aMode )
+ {
+ return;
+ }
+
+ StateTransition( EDASRInitRecognition );
+
+ iRecognitionAlgMgr->InitFrontEnd( aMode );
+ }
+
+
+// -----------------------------------------------------------------------------
+// CSRSAlgorithmManager::InitRecognizerBE
+// Initializes the recognition back-end. The module responsible for recognition
+// function is started as a result.
+// -----------------------------------------------------------------------------
+//
+void CSRSAlgorithmManager::InitRecognizerBE( CSIResultSet& aResult )
+ {
+ RUBY_DEBUG0( "CSRSAlgorithmManager::InitRecognizerBE()" );
+
+ iRecognitionAlgMgr->InitRecognizerBE( aResult );
+ }
+
+
+// -----------------------------------------------------------------------------
+// CSRSAlgorithmManager::IsGrammarLoaded
+// Checks if grammar has been loaded.
+// -----------------------------------------------------------------------------
+//
+TBool CSRSAlgorithmManager::IsGrammarLoaded( TSIGrammarID aGrammarID )
+ {
+ CSICompiledGrammar* siActiveGrammar = NULL;
+ CSICompiledGrammar* siNonActiveGrammar = NULL;
+
+ TRAPD( error, GetGrammarL( aGrammarID, &siActiveGrammar, &siNonActiveGrammar ) );
+ if ( error != KErrNone )
+ {
+ return EFalse;
+ }
+
+ if ( siActiveGrammar != NULL )
+ {
+ return ETrue;
+ }
+ else if ( siNonActiveGrammar != NULL )
+ {
+ return ETrue;
+ }
+
+ return EFalse;
+ }
+
+
+// -----------------------------------------------------------------------------
+// CSRSAlgorithmManager::IsGrammarActive
+// Checks if grammar is currently active.
+// -----------------------------------------------------------------------------
+//
+TBool CSRSAlgorithmManager::IsGrammarActive( TSIGrammarID aGrammarID )
+ {
+ RUBY_DEBUG0( "CSRSAlgorithmManager::IsGrammarActive()" );
+
+ CSICompiledGrammar* siActiveGrammar = NULL;
+ CSICompiledGrammar* siNonActiveGrammar = NULL;
+
+ TRAPD( error, GetGrammarL( aGrammarID, &siActiveGrammar, &siNonActiveGrammar ) );
+ if ( error != KErrNone )
+ {
+ return EFalse;
+ }
+
+ if ( siActiveGrammar != NULL )
+ {
+ return ETrue;
+ }
+ else if ( siNonActiveGrammar != NULL )
+ {
+ return EFalse;
+ }
+
+ return EFalse;
+ }
+
+
+// -----------------------------------------------------------------------------
+// CSRSAlgorithmManager::LoadGrammarL
+// Load the specified grammar into the recognizer.
+// -----------------------------------------------------------------------------
+//
+void CSRSAlgorithmManager::LoadGrammarL( const CSIGrammar& aGrammar )
+ {
+ RUBY_DEBUG_BLOCK( "CSRSAlgorithmManager::LoadGrammarL(si non-compiled)" );
+
+ iRecognitionAlgMgr->LoadGrammarL( aGrammar );
+ }
+
+
+// -----------------------------------------------------------------------------
+// CSRSAlgorithmManager::LoadGrammarL
+// Load the specified grammar into the recognizer.
+// -----------------------------------------------------------------------------
+//
+void CSRSAlgorithmManager::LoadGrammarL( const CSICompiledGrammar& aGrammar )
+ {
+ RUBY_DEBUG_BLOCK( "CSRSAlgorithmManager::LoadGrammarL(si compiled)" );
+
+ iRecognitionAlgMgr->LoadGrammarL( aGrammar );
+ }
+
+
+// -----------------------------------------------------------------------------
+// CSRSAlgorithmManager::LoadGrammarL
+// Unloads the specified grammar from the recognizer.
+// -----------------------------------------------------------------------------
+//
+void CSRSAlgorithmManager::UnloadGrammarL( const CSIGrammar& aGrammar )
+ {
+ RUBY_DEBUG_BLOCK( "CSRSAlgorithmManager::UnloadGrammarL(si non-compiled)" );
+
+ iRecognitionAlgMgr->UnloadGrammarL( aGrammar );
+ }
+
+
+// -----------------------------------------------------------------------------
+// CSRSAlgorithmManager::UnloadGrammarL
+// Unloads the specified grammar from the recognizer.
+// -----------------------------------------------------------------------------
+//
+void CSRSAlgorithmManager::UnloadGrammarL( const CSICompiledGrammar& aGrammar )
+ {
+ RUBY_DEBUG_BLOCK( "CSRSAlgorithmManager::UnloadGrammarL(si compiled)" );
+
+ iRecognitionAlgMgr->UnloadGrammarL( aGrammar );
+ }
+
+
+// -----------------------------------------------------------------------------
+// CSRSAlgorithmManager::ActivateGrammarL
+// Unload the specified grammar from the recognizer.
+// -----------------------------------------------------------------------------
+//
+void CSRSAlgorithmManager::ActivateGrammarL( const TSIGrammarID aGrammarID )
+ {
+ RUBY_DEBUG_BLOCK( "CSRSAlgorithmManager::ActivateGrammarL()" );
+
+ iRecognitionAlgMgr->ActivateGrammarL( aGrammarID );
+ }
+
+
+// -----------------------------------------------------------------------------
+// CSRSAlgorithmManager::DeactivateGrammarL
+// Unload the specified grammar from the recognizer.
+// -----------------------------------------------------------------------------
+//
+void CSRSAlgorithmManager::DeactivateGrammarL( const TSIGrammarID aGrammarID )
+ {
+ RUBY_DEBUG_BLOCK( "CSRSAlgorithmManager::DeactivateGrammarL()" );
+
+ iRecognitionAlgMgr->DeactivateGrammarL( aGrammarID );
+ }
+
+
+// -----------------------------------------------------------------------------
+// CSRSRecognitionAlgMgr::GetGrammar
+// Find grammar based on identifier
+// -----------------------------------------------------------------------------
+//
+void CSRSAlgorithmManager::GetGrammarL( const TSIGrammarID aGrammarID,
+ CSICompiledGrammar** aSIActiveGrammar,
+ CSICompiledGrammar** aSIDeActivatedGrammar )
+ {
+ RUBY_DEBUG_BLOCK( "CSRSAlgorithmManager::GetGrammarL()" );
+
+ iRecognitionAlgMgr->GetGrammarL( aGrammarID,
+ aSIActiveGrammar,
+ aSIDeActivatedGrammar );
+ }
+
+
+// -----------------------------------------------------------------------------
+// CSRSAlgorithmManager::UnloadRule
+// Request to unload rule.
+// -----------------------------------------------------------------------------
+//
+void CSRSAlgorithmManager::UnloadRule( TSIGrammarID aGrammarID,
+ TSIRuleID aRuleID )
+ {
+ RUBY_DEBUG0( "CSRSAlgorithmManager::UnloadRule()" );
+
+ iRecognitionAlgMgr->UnloadRule( aGrammarID, aRuleID );
+ }
+
+
+// -----------------------------------------------------------------------------
+// CSRSAlgorithmManager::LoadEngineParametersL
+// Load the specified recognizer parameter(s).
+// -----------------------------------------------------------------------------
+//
+void CSRSAlgorithmManager::LoadEnginePropertiesL( const RArray<TInt>& aParameterId,
+ const RArray<TInt>& aParameterValue )
+ {
+ RUBY_DEBUG_BLOCK( "CSRSAlgorithmManager::LoadEnginePropertiesL()" );
+
+ // Check that parameter ids are valid, settable values
+ for ( TInt i = 0; i < aParameterId.Count(); i++ )
+ {
+ if ( ( aParameterId[i] != KDevASRSendFeatures ) &&
+ ( aParameterId[i] != KDevASRAdaptation ) )
+ {
+ User::Leave( KErrNotSupported );
+ }
+ }
+ iRecognitionAlgMgr->LoadEnginePropertiesL( aParameterId, aParameterValue );
+ iVMAlgorithmManager->LoadEnginePropertiesL( aParameterId, aParameterValue );
+ }
+
+
+// -----------------------------------------------------------------------------
+// CSRSAlgorithmManager::LoadLexiconL
+// Load the specified lexicion into the recognizer.
+// -----------------------------------------------------------------------------
+//
+void CSRSAlgorithmManager::LoadLexiconL( const CSILexicon& aLexicon )
+ {
+ RUBY_DEBUG_BLOCK( "CSRSAlgorithmManager::LoadLexiconL()" );
+
+ iSILexicon = &aLexicon;
+
+ iRecognitionAlgMgr->LoadLexiconL( aLexicon );
+ }
+
+
+// -----------------------------------------------------------------------------
+// CSRSAlgorithmManager::LoadModelsL
+// Load the specified models into the recognizer.
+// -----------------------------------------------------------------------------
+//
+void CSRSAlgorithmManager::LoadModelsL( const CSIModelBank& aModels )
+ {
+ RUBY_DEBUG_BLOCK( "CSRSAlgorithmManager::LoadModelsL()" );
+
+ iSIModelBank = &aModels;
+
+ iRecognitionAlgMgr->LoadModelsL( aModels );
+ }
+
+
+// -----------------------------------------------------------------------------
+// CSRSAlgorithmManager::UtteranceData
+// Get the recorded audio data accumulated during training.
+// -----------------------------------------------------------------------------
+//
+void CSRSAlgorithmManager::GetUtteranceData( TDes8* /*aBuffer*/,
+ TTimeIntervalMicroSeconds32& /*aDuration*/ )
+ {
+ RUBY_DEBUG0( "CSRSAlgorithmManager::GetUtteranceData()" );
+ // Not supported
+ }
+
+
+// -----------------------------------------------------------------------------
+// CSRSAlgorithmManager::HandlePlay
+// Asynchronously handles the play request.
+// -----------------------------------------------------------------------------
+//
+void CSRSAlgorithmManager::HandlePlayL()
+ {
+ RUBY_DEBUG0( "CSRSAlgorithmManager::HandlePlayL()" );
+ }
+
+
+// -----------------------------------------------------------------------------
+// CSRSAlgorithmManager::StartRecognition
+// Request to begin recording.
+// -----------------------------------------------------------------------------
+//
+void CSRSAlgorithmManager::StartRecognition( TTimeIntervalMicroSeconds32 aRecordDuration )
+ {
+ RUBY_DEBUG0( "CSRSAlgorithmManager::StartRecognition()" );
+
+ iEndFlag = EFalse;
+ iRecordDuration = aRecordDuration;
+ iRequestFunction = KRecord;
+ Ready( KErrNone );
+ }
+
+// -----------------------------------------------------------------------------
+// CSRSAlgorithmManager::PreStartSamplingL
+// Pre-starts sampling
+// -----------------------------------------------------------------------------
+//
+void CSRSAlgorithmManager::PreStartSamplingL()
+ {
+ RUBY_DEBUG_BLOCK( "" );
+#ifdef __FULLDUPLEX_CHANGE
+ InitializeDevSoundL();
+ StartDevSoundL();
+ iPreSamplingStarted = ETrue;
+#endif // __FULLDUPLEX_CHANGE
+ }
+
+// -----------------------------------------------------------------------------
+// CSRSAlgorithmManager::StopRecognition
+// Request to stop recording.
+// -----------------------------------------------------------------------------
+//
+void CSRSAlgorithmManager::StopRecognition()
+ {
+ RUBY_DEBUG0( "CSRSAlgorithmManager::StopRecognition()" );
+
+ iEndFlag = ETrue;
+ }
+
+
+// -----------------------------------------------------------------------------
+// CSRSAlgorithmManager::HandleRecord
+// Asynchronously handles the recording request.
+// -----------------------------------------------------------------------------
+//
+void CSRSAlgorithmManager::HandleRecordL()
+ {
+ RUBY_DEBUG_BLOCK( "CSRSAlgorithmManager::HandleRecordL()" );
+
+ if ( StateTransition( EDASRSampling ) ) // Attempt to change state
+ {
+ // Allocate a buffer big enough for recording.
+
+ if ( iRecordDuration.Int() == 0 )
+ {
+ iOverallLength = 0;
+ }
+ else
+ {
+ TInt bytesPerSecond = ( TInt ) ( iResourceHandler->iSamplingRate * ( iResourceHandler->iBitsPerSample / 8 ) );
+ iOverallLength = ( TInt) ( iRecordDuration.Int() * 0.000001 * bytesPerSecond );
+ }
+
+ iOverallSampled = 0;
+
+ TInt err = KErrNone;
+
+
+ // Start the devSound only if client does not provide utterance data.
+ if ( iMode == ESiRecognition )
+ {
+#ifdef __FULLDUPLEX_CHANGE
+ if ( !iPreSamplingStarted )
+ {
+ TRAP( err, StartDevSoundL() );
+ }
+#else
+ iDevSound->SetPrioritySettings( iPrioritySettings );
+ TRAP( err, iDevSound->RecordInitL() );
+#endif // __FULLDUPLEX_CHANGE
+
+ // Mark that recognition should be started when first buffer arrives
+ iStartRecognition = ETrue;
+ }
+ else
+ {
+ TRAPD ( error, iRecognitionAlgMgr->StartRecognitionL() );
+ if ( error != KErrNone )
+ {
+ iRecognitionAlgMgr->Cancel();
+ StateTransition( EDASRIdle );
+ iDevASRObserver->DevASREvent( EDevASRRecord, error );
+ }
+ }
+
+ if ( err == KErrNone )
+ {
+ iDevSoundState = ESoundDeviceRecord;
+ iDevASRObserver->DevASREvent( EDevASRRecordStarted, KErrNone );
+
+ // Empty audio buffer queue if there happens to be some garbage
+ // from previous recognition.
+ while ( !iAudioBufferQue->IsEmpty() )
+ {
+ iQueItem = iAudioBufferQue->First();
+ iAudioBufferQue->Remove( *iQueItem );
+ delete iQueItem;
+ iQueItem = NULL;
+ }
+ delete iBufferUnderConstruction;
+ iBufferUnderConstruction = NULL;
+ iConstructionPoint = 0;
+ iPendingRequestSpeechData = EFalse;
+ }
+ else
+ {
+ RUBY_DEBUG1( "RecordInitL() Error: %d", err );
+ iRecognitionAlgMgr->Cancel();
+ StateTransition( EDASRIdle );
+ iDevASRObserver->DevASREvent( EDevASRRecord, err );
+ }
+ }
+ else // Wrong state to handle this request
+ {
+ iDevASRObserver->DevASREvent( EDevASRRecord, KErrAsrInvalidState );
+
+ RUBY_DEBUG1( "HandleRecord in wrong state: %d", iDevASRState );
+ }
+
+ }
+
+
+// -----------------------------------------------------------------------------
+// CSRSAlgorithmManager::StartRecSession
+// Signal the start of a recognition sesion.
+// -----------------------------------------------------------------------------
+//
+TInt CSRSAlgorithmManager::StartRecSession( TRecognizerMode aMode )
+ {
+ RUBY_DEBUG0( "CSRSAlgorithmManager::StartRecSession()" );
+
+ TInt err( KErrNone );
+
+#ifdef __FULLDUPLEX_CHANGE
+ if ( !iPreSamplingStarted )
+ {
+ TRAP( err, InitializeDevSoundL() );
+ }
+#else
+ TRAP( err, InitializeDevSoundL() );
+#endif // __FULLDUPLEX_CHANGE
+
+ if ( err == KErrNone )
+ {
+ iMode = aMode;
+
+ err = iRecognitionAlgMgr->StartRecSession( aMode );
+ if ( err == KErrNone )
+ {
+ StateTransition( EDASRPreRecognition );
+ }
+ }
+
+ return err;
+ }
+
+
+// -----------------------------------------------------------------------------
+// CSRSAlgorithmManager::EndRecSession
+// Signal the end of a recognition sesion.
+// -----------------------------------------------------------------------------
+//
+void CSRSAlgorithmManager::EndRecSession()
+ {
+ RUBY_DEBUG0( "CSRSAlgorithmManager::EndRecSession()" );
+
+ iRecognitionAlgMgr->EndRecSession();
+ StateTransition( EDASRIdle );
+ if ( iDevASRState == EDASRIdle )
+ {
+ iSIModelBank = NULL;
+ iSILexicon = NULL;
+ }
+
+ delete iDevSound;
+ iDevSound = NULL;
+ }
+
+
+// -----------------------------------------------------------------------------
+// CSRSAlgorithmManager::SendSpeechData
+// Gives data buffer to recognizer.
+// -----------------------------------------------------------------------------
+//
+void CSRSAlgorithmManager::SendSpeechData( TPtrC8& aBuffer, TBool aEnd )
+ {
+ if ( iMode == ESiRecognitionSpeechInput )
+ {
+ iRecognitionAlgMgr->SendSpeechData( aBuffer, aEnd );
+ }
+ }
+
+
+// -----------------------------------------------------------------------------
+// CSRSAlgorithmManager::Cancel
+// Cancels the current and any on going requests/tasks.
+// -----------------------------------------------------------------------------
+//
+void CSRSAlgorithmManager::Cancel()
+ {
+ RUBY_DEBUG0( "CSRSAlgorithmManager::Cancel()" );
+
+ iVMAlgorithmManager->Cancel();
+
+ iRecognitionAlgMgr->Cancel();
+
+ if( iDevASRState != EDASRIdle )
+ {
+ //StateTransition( EDASRPreRecognition );
+ // Force to pre recognition state
+ iDevASRState = EDASRPreRecognition;
+ }
+
+ if ( iDevSoundState != ESoundDeviceNotInitialized )
+ {
+ RUBY_DEBUG0( "CSRSAlgorithmManager::Cancel(), Stopping DevSound..." );
+
+ if ( iMode == ESiRecognition )
+ {
+ if ( iDevSound )
+ {
+ iDevSound->Stop();
+ }
+ }
+ iDevSoundState = ESoundDeviceStopped;
+ }
+
+ CActive::Cancel();
+ }
+
+
+// -----------------------------------------------------------------------------
+// CRecognitionAlgMgr::DoCancel
+// Cancels the current and any on going CActive requests/tasks.
+// -----------------------------------------------------------------------------
+//
+void CSRSAlgorithmManager::DoCancel()
+ {
+ RUBY_DEBUG0( "CSRSAlgorithmManager::DoCancel()" );
+ }
+
+
+// -----------------------------------------------------------------------------
+// CSRSAlgorithmManager::EmptyBuffer
+// Copies the contents of the received buffer to the holding buffer. Subsequent
+// call to EmptyBuffer will append to existing buffer.
+// -----------------------------------------------------------------------------
+//
+TInt CSRSAlgorithmManager::EmptyBuffer( CMMFDataBuffer& aBuffer,
+ TInt aBufferLength )
+ {
+ RUBY_DEBUG1( "CSRSAlgorithmManager::EmptyBuffer(): Len=%d bytes", aBufferLength );
+
+ TInt i = 0;
+ TInt status = KErrNone;
+ TBool iBufferCreated = EFalse;
+#ifdef __WINS__
+ TInt KNumberOfBuffers = iResourceHandler->iBuffersInWins;
+#else
+ TInt KNumberOfBuffers = iResourceHandler->iBuffersInThumb;
+#endif
+
+ TDes8& ReceivedData = aBuffer.Data();
+ TInt iSize = ReceivedData.Length();
+
+#ifdef __FULLDUPLEX_CHANGE
+ // If state is not EDASRSampling, then end immediately
+ // Samples will be negelected until real recognition starts
+ if ( iDevASRState != EDASRRecognitionSampling )
+ {
+ iDevSound->RecordData();
+ return status;
+ }
+ else
+ {
+ // Reset pre-sampling flag
+ iPreSamplingStarted = EFalse;
+ }
+#endif // __FULLDUPLEX_CHANGE
+
+ // If DevSound has not filled the whole buffer, something
+ // is wrong in the sampling
+ if( aBufferLength < ReceivedData.MaxLength() )
+ {
+ status = KErrEof;
+ }
+
+ // iOverallLength checks how much is sampled during all the callbacks
+ if ( iOverallLength != 0 )
+ {
+ if ( iOverallSampled >= iOverallLength )
+ {
+ status = KErrOverflow;
+ }
+ }
+
+ TInt silentFrames = iResourceHandler->iSilenceFrames;
+
+ // Create new buffer if previous one has been queued
+ if ( iBufferUnderConstruction == NULL )
+ {
+ iBufferUnderConstruction = new TUint8[ iSize * KNumberOfBuffers ];
+ if ( !iBufferUnderConstruction )
+ {
+ return KErrNoMemory;
+ }
+ iConstructionPoint = 0;
+ }
+
+ // Copy data, put silence into the beginning of buffer if needed
+ for ( i = 0; i < iSize; i++ )
+ {
+ if ( ( iOverallSampled + i ) < silentFrames )
+ {
+ // Do not copy zeros
+ //iBufferUnderConstruction[ iConstructionPoint ] = 0;
+ }
+ else
+ {
+ iBufferUnderConstruction[ iConstructionPoint ] = ReceivedData[ i ];
+ iConstructionPoint++;
+ }
+ }
+
+ // Count the number of sampled bytes
+ iOverallSampled = iOverallSampled + iSize;
+
+ // If internal buffer overflowed or EOF, mark this the final block of data
+ // Mark as the final block also if EndRecord() has been explicitly called
+ if ( ( status == KErrOverflow ) || ( status == KErrEof ) || iEndFlag )
+ {
+ CQueItem* qItem( NULL );
+ TRAPD( err, qItem = CQueItem::NewL( &iBufferUnderConstruction[0], iConstructionPoint ) );
+ if ( err != KErrNone )
+ {
+ return err;
+ }
+ qItem->iFinalBlock = ETrue;
+ iEndFlag = EFalse;
+ iAudioBufferQue->AddLast( *qItem );
+ iBufferUnderConstruction = NULL;
+ iConstructionPoint = 0;
+ iBufferCreated = ETrue;
+
+ RUBY_DEBUG0( "CSRSAlgorithmManager::EmptyBuffer(): Sampling ended due to timeout!!" );
+ }
+ else
+ {
+ // Notify devsound
+ iDevSound->RecordData();
+
+ // If next buffer does not fit to the buffer under construction
+ // put it to queue and start new when next callback arrives
+ if ( iConstructionPoint + iSize > iSize * KNumberOfBuffers )
+ {
+ // Put data to queue
+ CQueItem* qItem( NULL );
+ TRAPD( err, qItem = CQueItem::NewL( &iBufferUnderConstruction[0], iConstructionPoint ) );
+ if ( err != KErrNone )
+ {
+ return err;
+ }
+ qItem->iFinalBlock = EFalse;
+ iAudioBufferQue->AddLast( *qItem );
+ iBufferCreated = ETrue;
+ }
+ }
+
+ if ( iBufferCreated )
+ {
+
+#ifdef AUDIOBUFFER_TO_FILE
+ TInt connectError = iFs.Connect();
+ if ( connectError != KErrNone )
+ {
+ return connectError;
+ }
+ _LIT( KBufferFileName, "C:\\documents\\devasraudiobuffer.raw" );
+ if ( !iFileCreated )
+ {
+ iBufferDataFile.Replace( iFs, KBufferFileName, EFileWrite );
+ iFileCreated = ETrue;
+ }
+ else
+ {
+ TInt openError = iBufferDataFile.Open( iFs, KBufferFileName, EFileWrite );
+ if ( openError != KErrNone )
+ {
+ return openError;
+ }
+ }
+
+ TPtr8 ptr( &iBufferUnderConstruction[0], iConstructionPoint, iConstructionPoint );
+ TInt pos = 0;
+ iBufferDataFile.Seek( ESeekEnd, pos );
+ iBufferDataFile.Write( pos, ptr );
+ iBufferDataFile.Close();
+ iFs.Close();
+#endif
+
+ iBufferUnderConstruction = NULL;
+ iConstructionPoint = 0;
+
+ // Start recognition if it has not been already started
+ if ( iStartRecognition )
+ {
+ TRAP( status, iRecognitionAlgMgr->StartRecognitionL() );
+ iStartRecognition = EFalse;
+ }
+
+ // If RequestSpeechData() gets called when there is no data in queue, we
+ // should call it again to deliver the new data to recognizer
+ if ( iPendingRequestSpeechData )
+ {
+ iPendingRequestSpeechData = EFalse;
+ RequestSpeechData();
+ }
+ }
+
+ return status;
+ }
+
+
+// -----------------------------------------------------------------------------
+// CSRSAlgorithmManager::FillBuffer
+// Copies a portion of the holding buffer to the received buffer.
+// -----------------------------------------------------------------------------
+//
+TInt CSRSAlgorithmManager::FillBuffer( CMMFDataBuffer& /*aBuffer*/,
+ TInt /*aBufferLength*/ )
+ {
+ RUBY_DEBUG0( "CSRSAlgorithmManager::FillBuffer()" );
+
+ return KErrNotSupported;
+ }
+
+
+// -----------------------------------------------------------------------------
+// CSRSAlgorithmManager::SetPrioritySettings
+// Store the priority setting for the sound device.
+// -----------------------------------------------------------------------------
+//
+void CSRSAlgorithmManager::SetPrioritySettings( const TMMFPrioritySettings& aPrioritySettings )
+ {
+ iPrioritySettings = aPrioritySettings;
+ // Always use preference meant for recognition
+ iPrioritySettings.iPref = ( TMdaPriorityPreference ) KAudioPrefVocosRecog;
+ }
+
+
+// -----------------------------------------------------------------------------
+// CSRSAlgorithmManager::InitializeDevSoundL
+//
+// -----------------------------------------------------------------------------
+//
+void CSRSAlgorithmManager::InitializeDevSoundL()
+ {
+ if ( !iDevSound )
+ {
+ // Instance
+ iDevSound = CMMFDevSound::NewL();
+ }
+
+ // Initialization
+ iDevSound->InitializeL( *this, EMMFStateRecording );
+
+ // Wait for initialization callback
+ if ( !iAudioWait.IsStarted() )
+ {
+ iAudioWait.Start();
+ }
+
+ // Configuration
+ ConfigureSoundDeviceL();
+ }
+
+
+// -----------------------------------------------------------------------------
+// CSRSAlgorithmManager::StartDevSoundL
+//
+// -----------------------------------------------------------------------------
+//
+void CSRSAlgorithmManager::StartDevSoundL()
+ {
+ RUBY_DEBUG_BLOCK( "" );
+ iDevSound->SetPrioritySettings( iPrioritySettings );
+ iDevSound->RecordInitL();
+ iDevSoundState = ESoundDeviceRecord;
+ }
+
+
+// -----------------------------------------------------------------------------
+// CSRSAlgorithmManager::StateTransition
+// Change to the specified state if possible. If state change is invalid,
+// EFalse is returned, otherwise, ETrue.
+// -----------------------------------------------------------------------------
+//
+TBool CSRSAlgorithmManager::StateTransition( TDevASRState aTargetState )
+ {
+
+ TBool result = ETrue;
+
+#ifdef _DEBUG
+ DevASRState();
+#endif
+
+ switch ( aTargetState )
+ {
+ case EDASRIdle:
+ iDevASRState = aTargetState;
+ break;
+
+ case EDASRInitTrain:
+ if ( iDevASRState == EDASRIdle )
+ {
+ iDevASRState = aTargetState;
+ }
+ else
+ {
+ result = EFalse;
+ }
+ break;
+
+ case EDASRTrain:
+ if ( ( iDevASRState == EDASRTrain ) ||
+ ( iDevASRState == EDASRInitTrain ) ||
+ ( iDevASRState == EDASRTrainSampling ) )
+ {
+ iDevASRState = aTargetState;
+ }
+ else
+ {
+ result = EFalse;
+ }
+ break;
+
+ case EDASRSampling:
+ if ( iDevASRState == EDASRTrain )
+ {
+ iDevASRState = EDASRTrainSampling;
+ }
+ else if ( iDevASRState == EDASRRecognition )
+ {
+ iDevASRState = EDASRRecognitionSampling;
+ }
+ else
+ {
+ result = EFalse;
+ }
+ break;
+
+ case EDASRPlayback:
+ if ( iDevASRState == EDASRIdle )
+ {
+ iDevASRState = EDASRPlayback;
+ }
+ else if ( iDevASRState == EDASRPreRecognition )
+ {
+ iDevASRState = EDASRRecognitionPlayback;
+ }
+ else
+ {
+ result = EFalse;
+ }
+ break;
+
+ case EDASRPreRecognition:
+ if ( ( iDevASRState == EDASRIdle ) ||
+ ( iDevASRState == EDASRRecognition ) ||
+ ( iDevASRState == EDASRRecognitionPlayback ) )
+ {
+ iDevASRState = aTargetState;
+ }
+ else
+ {
+ result = EFalse;
+ }
+ break;
+
+ case EDASRRecognitionPlayback:
+ if (iDevASRState == EDASRPreRecognition)
+ {
+ iDevASRState = aTargetState;
+ }
+ else
+ {
+ result=EFalse;
+ }
+ break;
+
+ case EDASRInitRecognition:
+ if ((iDevASRState == EDASRInitRecognition) ||
+ (iDevASRState == EDASRPreRecognition))
+ {
+ iDevASRState = aTargetState;
+ }
+ else
+ {
+ result=EFalse;
+ }
+ break;
+
+ case EDASRRecognition:
+ if ( ( iDevASRState == EDASRInitRecognition ) ||
+ ( iDevASRState == EDASRRecognitionSampling ) )
+ {
+ iDevASRState = aTargetState;
+ }
+ else
+ {
+ result = EFalse;
+ }
+ break;
+
+ case EDASRCancel:
+ break;
+
+ default:
+ RUBY_DEBUG1( "Invalid state: %d", aTargetState );
+ break;
+ };
+
+#ifdef _DEBUG
+ DevASRState();
+ iRecognitionAlgMgr->AlgorithmState();
+#endif
+ return result;
+ }
+
+
+// -----------------------------------------------------------------------------
+// CSRSAlgorithmManager::TranslateError
+// Translate internal errors to system errors
+// -----------------------------------------------------------------------------
+//
+TInt CSRSAlgorithmManager::TranslateError( TInt aError )
+ {
+ RUBY_DEBUG1( "CSRSAlgorithmManager::TranslateError(%d)", aError );
+
+ TInt error = aError;
+
+ switch ( aError )
+ {
+ case KErrTooEarly:
+ error = KErrAsrSpeechTooEarly;
+ break;
+ case KErrNoSpeech:
+ error = KErrAsrNoSpeech;
+ break;
+ case KErrTooLong:
+ error = KErrAsrSpeechTooLong;
+ break;
+ case KErrTooShort:
+ error = KErrAsrSpeechTooShort;
+ break;
+ default:
+ RUBY_DEBUG1( "Unmapped Error: %d", aError );
+ break;
+ };
+
+ return error;
+ }
+
+
+// -----------------------------------------------------------------------------
+// DevSound Observer MIXIN implementation begins
+// -----------------------------------------------------------------------------
+
+// -----------------------------------------------------------------------------
+// CSRSAlgorithmManager::InitializeComplete
+// Initialization of DevSound is complete.
+// -----------------------------------------------------------------------------
+//
+void CSRSAlgorithmManager::InitializeComplete( TInt aError )
+ {
+ RUBY_DEBUG1( "InitializeComplete[%d]", aError );
+
+ if ( aError == KErrNone )
+ {
+ iDevSoundState = ESoundDeviceInitialized;
+ }
+
+ // Free wait loop
+ if ( iAudioWait.IsStarted() )
+ {
+ iAudioWait.AsyncStop();
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CSRSAlgorithmManager::ToneFinished
+// Finished playing tones
+// -----------------------------------------------------------------------------
+//
+void CSRSAlgorithmManager::ToneFinished( TInt /*aError*/ )
+ {
+ // Should never be called because no tone services is required.
+ }
+
+
+// -----------------------------------------------------------------------------
+// CSRSAlgorithmManager::BufferToBeFilled
+// Buffer from DevSound to be filled with audio data.
+// -----------------------------------------------------------------------------
+//
+void CSRSAlgorithmManager::BufferToBeFilled( CMMFBuffer* aBuffer )
+ {
+ CMMFDataBuffer* buffer = STATIC_CAST( CMMFDataBuffer*, aBuffer );
+
+ if ( FillBuffer( *buffer, aBuffer->RequestSize() ) == KErrNone )
+ {
+ iDevSound->PlayData();
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CSRSAlgorithmManager::PlayError
+// Playing of an audio sample has completed successfully or otherwise.
+// -----------------------------------------------------------------------------
+//
+void CSRSAlgorithmManager::PlayError( TInt aError )
+ {
+ RUBY_DEBUG1( "CSRSAlgorithmManager::PlayError[%d]", aError );
+
+ if ( iDevASRState != EDASRIdle )
+ {
+
+ if ( iDevASRState == EDASRRecognitionPlayback )
+ {
+ StateTransition( EDASRPreRecognition );
+ }
+ else
+ {
+ StateTransition( EDASRIdle );
+ }
+
+ if ( aError == KErrUnderflow )
+ {
+ iDevASRObserver->DevASREvent( EDevASRPlay, KErrNone );
+ }
+ else
+ {
+ iDevASRObserver->DevASREvent( EDevASRPlay, aError );
+ }
+
+ }
+
+ }
+
+// -----------------------------------------------------------------------------
+// CSRSAlgorithmManager::BufferToBeEmptied
+// An audio buffer is ready to be emptied.
+// -----------------------------------------------------------------------------
+//
+void CSRSAlgorithmManager::BufferToBeEmptied( CMMFBuffer* aBuffer )
+ {
+ RUBY_DEBUG0( "" );
+ if ( iDevASRState == EDASRIdle && !iPreSamplingStarted )
+ {
+ RUBY_DEBUG0( "stopping devsound" );
+ iDevSound->Stop();
+ iDevSoundState = ESoundDeviceStopped;
+ return;
+ }
+
+ RUBY_DEBUG0( "processing callback" );
+ CMMFDataBuffer* buffer = STATIC_CAST( CMMFDataBuffer*, aBuffer );
+ EmptyBuffer( *buffer, aBuffer->RequestSize() );
+ }
+
+
+// -----------------------------------------------------------------------------
+// CSRSAlgorithmManager::RecordError
+// Recording has completed successfully or otherwise.
+// -----------------------------------------------------------------------------
+//
+void CSRSAlgorithmManager::RecordError( TInt aError )
+ {
+ RUBY_DEBUG1( "CSRSAlgorithmManager::RecordError[%d]", aError );
+
+ iPreSamplingStarted = EFalse;
+ iRecognitionAlgMgr->Cancel();
+ StateTransition( EDASRIdle );
+ iDevASRObserver->DevASREvent( EDevASRRecord, aError );
+ }
+
+
+// -----------------------------------------------------------------------------
+// CSRSAlgorithmManager::ConvertError
+// Conversion has completed successfully or otherwise.
+// -----------------------------------------------------------------------------
+//
+void CSRSAlgorithmManager::ConvertError( TInt /*aError*/ )
+ {
+ // This method should never be called.
+ }
+
+
+// -----------------------------------------------------------------------------
+// CSRSAlgorithmManager::RecordError
+// Callback for custom commands
+// -----------------------------------------------------------------------------
+//
+void CSRSAlgorithmManager::DeviceMessage( TUid /*aMessageType*/,
+ const TDesC8& /*aMsg*/ )
+ {
+ RUBY_DEBUG0( "CSRSAlgorithmManager::DeviceMessage" );
+ }
+
+// -----------------------------------------------------------------------------
+// CSRSAlgorithmManager::SendEventToClient
+// Receives and event from DevSound send it to the appropriate handler.
+// -----------------------------------------------------------------------------
+//
+void CSRSAlgorithmManager::SendEventToClient( const TMMFEvent& aEvent )
+ {
+ RUBY_DEBUG0( "CSRSAlgorithmManager::SendEventToClient()" );
+
+ if ( aEvent.iErrorCode != KErrNone )
+ {
+ if ( iDevSoundState == ESoundDeviceRecord )
+ {
+ RecordError( aEvent.iErrorCode );
+ }
+ else if ( iDevSoundState == ESoundDevicePlayback )
+ {
+ PlayError( aEvent.iErrorCode );
+ }
+ }
+
+ }
+
+
+// -----------------------------------------------------------------------------
+// DevSound Observer MIXIN impl ends
+// -----------------------------------------------------------------------------
+
+
+// -----------------------------------------------------------------------------
+// RecognitionAlgMgr Observer MIXIN implementation begins
+// -----------------------------------------------------------------------------
+
+// -----------------------------------------------------------------------------
+// CSRSAlgorithmManager::AdaptComplete
+// Model adaptation has finished.
+// -----------------------------------------------------------------------------
+//
+void CSRSAlgorithmManager::AdaptComplete( TInt aResultCode )
+ {
+ RUBY_DEBUG1( "CSRSAlgorithmManager::AdaptComplete(%d)", aResultCode );
+
+ iDevASRObserver->DevASREvent( EDevASRAdapt, aResultCode );
+ }
+
+
+// -----------------------------------------------------------------------------
+// CSRSAlgorithmManager::InitFEComplete
+// Initialization of frontend algorithm has completed.
+// -----------------------------------------------------------------------------
+//
+void CSRSAlgorithmManager::InitFEComplete( TInt aResultCode )
+ {
+ RUBY_DEBUG1( "CSRSAlgorithmManager::InitFEComplete(%d)", aResultCode );
+
+ // Ignore events if we're idle.
+ if ( ( iDevASRState == EDASRInitTrain ) || ( iDevASRState == EDASRInitRecognition ) )
+ {
+ if ( aResultCode == KErrNone )
+ {
+ if ( iDevASRState == EDASRInitTrain )
+ {
+ iDevASRState = EDASRTrain;
+ }
+ else if ( iDevASRState == EDASRInitRecognition )
+ {
+ iDevASRState = EDASRRecognition;
+ }
+ iDevASRObserver->DevASREvent( EDevASRInitFrontend, aResultCode );
+ }
+ else
+ {
+ StateTransition( EDASRIdle );
+ iDevASRObserver->DevASREvent( EDevASRInitFrontend, TranslateError( aResultCode ) );
+ }
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CSRSAlgorithmManager::InitRecognizerBEComplete
+// Initialization of backend algorithm for recognition has completed.
+// -----------------------------------------------------------------------------
+//
+void CSRSAlgorithmManager::InitRecognizerBEComplete( TInt aResultCode )
+ {
+ RUBY_DEBUG1( "CSRSAlgorithmManager::InitRecognizerBEComplete(%d)", aResultCode );
+
+ if ( StateTransition( EDASRInitRecognition ) )
+ {
+ if ( aResultCode == KErrNone )
+ {
+ iDevASRObserver->DevASREvent( EDevASRInitRecognitionBackend, aResultCode );
+ }
+ else
+ {
+ StateTransition( EDASRIdle );
+ iDevASRObserver->DevASREvent( EDevASRInitRecognitionBackend, TranslateError( aResultCode ) );
+ }
+ }
+
+ }
+
+// -----------------------------------------------------------------------------
+// CSRSAlgorithmManager::LoadGrammarComplete
+// Loading of grammar into recognizer has completed.
+// -----------------------------------------------------------------------------
+//
+void CSRSAlgorithmManager::LoadGrammarComplete( TInt aResultCode )
+ {
+ RUBY_DEBUG1( "CSRSAlgorithmManager::LoadGrammarComplete(%d)", aResultCode );
+
+ TDevASREvent event = EDevASRLoadGrammar;
+
+ if ( aResultCode == KErrNone )
+ {
+ iDevASRObserver->DevASREvent( event, aResultCode );
+ }
+ else
+ {
+ //StateTransition( EDASRIdle );
+ iDevASRObserver->DevASREvent( event, TranslateError( aResultCode ) );
+ }
+ }
+
+
+// -----------------------------------------------------------------------------
+// CSRSAlgorithmManager::UnloadGrammarComplete
+// Grammar has beed unloaded.
+// -----------------------------------------------------------------------------
+//
+void CSRSAlgorithmManager::UnloadGrammarComplete( TInt aResultCode )
+ {
+ RUBY_DEBUG1( "CSRSAlgorithmManager::UnloadGrammarComplete(%d)", aResultCode );
+
+ TDevASREvent event = EDevASRUnloadGrammar;
+
+ if ( aResultCode == KErrNone )
+ {
+ iDevASRObserver->DevASREvent( event, aResultCode );
+ }
+ else
+ {
+ iDevASRObserver->DevASREvent( event, TranslateError( aResultCode ) );
+ }
+ }
+
+
+// -----------------------------------------------------------------------------
+// CSRSAlgorithmManager::ActivateGrammarComplete
+// Grammar activation has been completed.
+// -----------------------------------------------------------------------------
+//
+void CSRSAlgorithmManager::ActivateGrammarComplete( TInt aResultCode )
+ {
+ RUBY_DEBUG1( "CSRSAlgorithmManager::ActivateGrammarComplete(%d)", aResultCode );
+
+ if ( iDevASRState == EDASRPreRecognition )
+ {
+ iDevASRObserver->DevASREvent( EDevASRActivateGrammar, aResultCode );
+ }
+ }
+
+
+// -----------------------------------------------------------------------------
+// CSRSAlgorithmManager::DeActivateGrammarComplete
+// Grammar deactivation has been completed.
+// -----------------------------------------------------------------------------
+//
+void CSRSAlgorithmManager::DeActivateGrammarComplete( TInt aResultCode )
+ {
+ RUBY_DEBUG1( "CSRSAlgorithmManager::DeActivateGrammarComplete(%d)", aResultCode );
+
+ if ( iDevASRState == EDASRPreRecognition )
+ {
+ iDevASRObserver->DevASREvent( EDevASRDeactivateGrammar, aResultCode );
+ }
+ }
+
+
+// -----------------------------------------------------------------------------
+// CSRSAlgorithmManager::LoadLexiconComplete
+// Loading of lexicon into recognizer has completed.
+// -----------------------------------------------------------------------------
+//
+void CSRSAlgorithmManager::LoadLexiconComplete( TInt aResultCode )
+ {
+ RUBY_DEBUG1( "CSRSAlgorithmManager::LoadLexiconComplete(%d)", aResultCode );
+
+ if ( aResultCode == KErrNone )
+ {
+ iDevASRObserver->DevASREvent( EDevASRLoadLexicon, aResultCode );
+ }
+ else
+ {
+ //StateTransition( EDASRIdle );
+ iDevASRObserver->DevASREvent( EDevASRLoadLexicon, TranslateError( aResultCode ) );
+ }
+ }
+
+
+// -----------------------------------------------------------------------------
+// CSRSAlgorithmManager::LoadModelsComplete
+// Loading of models into recognizer has completed.
+// -----------------------------------------------------------------------------
+//
+void CSRSAlgorithmManager::LoadModelsComplete( TInt aResultCode )
+ {
+ RUBY_DEBUG1( "CSRSAlgorithmManager::LoadModelsComplete(%d)", aResultCode );
+
+ if ( aResultCode == KErrNone )
+ {
+ iDevASRObserver->DevASREvent( EDevASRLoadModels, aResultCode );
+ }
+ else
+ {
+ //StateTransition( EDASRIdle );
+ iDevASRObserver->DevASREvent( EDevASRLoadModels, TranslateError( aResultCode ) );
+ }
+ }
+
+
+// -----------------------------------------------------------------------------
+// CSRSAlgorithmManager::RequestSpeechData
+// Speech data is needed.
+// -----------------------------------------------------------------------------
+//
+void CSRSAlgorithmManager::RequestSpeechData()
+ {
+ RUBY_DEBUG0( "CSRSAlgorithmManager::RequestSpeechData()" );
+
+ if ( iMode == ESiRecognitionSpeechInput )
+ {
+ iDevASRObserver->RequestSpeechData();
+ }
+ else
+ {
+ // The processed sample descriptor can be deleted
+ delete iQueItem;
+ iQueItem = NULL;
+
+ if ( ( iDevASRState == EDASRTrainSampling ) || ( iDevASRState == EDASRRecognitionSampling ) )
+ {
+ // Check if there's more data to send and if so, send the next block of data
+ if ( iAudioBufferQue->IsEmpty() )
+ {
+ iPendingRequestSpeechData = ETrue;
+ iProcessingUtterance = EFalse;
+ }
+ else
+ {
+ iQueItem = iAudioBufferQue->First();
+ iRecognitionAlgMgr->SendSpeechData( iQueItem->iDataBlock, iQueItem->iFinalBlock );
+ iAudioBufferQue->Remove( *iQueItem );
+ }
+ }
+ }
+ }
+
+
+// -----------------------------------------------------------------------------
+// CSRSAlgorithmManager::FeatureVectorDataRcvd
+// Feature vector data received from frontend.
+// -----------------------------------------------------------------------------
+//
+void CSRSAlgorithmManager::FeatureVectorDataRcvd( const TDesC8& aFV,
+ TInt32 aSNR,
+ TInt32 aPosition )
+ {
+ iDevASRObserver->FeatureVectorDataRcvd( aFV, aSNR, aPosition );
+ }
+
+
+// -----------------------------------------------------------------------------
+// CSRSAlgorithmManager::EouDetected
+// Frontend finished extracting feature vectors from PCM data.
+// -----------------------------------------------------------------------------
+//
+void CSRSAlgorithmManager::EouDetected( TInt aResultCode )
+ {
+ RUBY_DEBUG1( "CSRSAlgorithmManager::EouDetected(%d)", aResultCode );
+
+ if ( iDevASRState == EDASRTrainSampling )
+ {
+
+ if ( aResultCode != KErrNone )
+ {
+ RUBY_DEBUG1( "CSRSAlgorithmManager::EouDetected(): Training ERROR %d", aResultCode );
+
+ StateTransition( EDASRIdle );
+ iDevSound->Stop();
+ iDevSoundState = ESoundDeviceStopped;
+ iDevASRObserver->DevASREvent( EDevASRTrain, TranslateError( aResultCode ) );
+ return;
+ }
+
+ // If we fail to get the utterance duration, there's probably not enough frames to calculate
+ // utterance duration. We will fail training with "too short".
+ if ( !iRecognitionAlgMgr->GetUtteranceDuration(iStartFrame, iEndFrame, iFrameLength) )
+ {
+ StateTransition(EDASRIdle);
+ iDevSound->Stop();
+ iDevSoundState = ESoundDeviceStopped;
+ iDevASRObserver->DevASREvent( EDevASRTrain, KErrAsrSpeechTooShort );
+ return;
+ }
+
+ RUBY_DEBUG1( "Start frame: %d", iStartFrame );
+ RUBY_DEBUG1( "End frame: %d", iEndFrame );
+ RUBY_DEBUG1( "Frame Length: %f", iFrameLength );
+
+ // Now, calculate the start and end point in the audio buffer for encoding
+
+ RUBY_DEBUG1( "Padding start frames: %d", iResourceHandler->iPadStartFrames );
+
+ // Pad additional frame to start and end to prevent clipping during utterance playback.
+
+ if( (iStartFrame - iResourceHandler->iPadStartFrames) <= 0 )
+ {
+ iStartFrame = 0;
+ }
+ else
+ {
+ iStartFrame = iStartFrame - iResourceHandler->iPadStartFrames;
+ }
+
+ iBufferStartPoint = (TUint32)(iStartFrame * iFrameLength * iResourceHandler->iSamplingRate * 2);
+
+ RUBY_DEBUG1( "Padding start frames: %d", iResourceHandler->iPadEndFrames );
+
+ iBufferEndPoint = (TUint32)((iEndFrame + iResourceHandler->iPadEndFrames) * iFrameLength *
+ iResourceHandler->iSamplingRate * 2);
+
+ if ( iBufferEndPoint >= iStartPoint - 1 ) // Do not pad beyond recorded point
+ {
+ iBufferEndPoint = iStartPoint - 1; // Set to the last byte recorded
+ }
+
+ if ( iBufferEndPoint > iStopPoint ) // Cannot pad more than buffer size allows
+ {
+ iBufferEndPoint = iStopPoint;
+ }
+
+ StateTransition(EDASRTrain);
+ iDevSound->Stop();
+ iDevSoundState = ESoundDeviceStopped;
+ }
+
+ // It is possible that the frontend has completed processing while the audio
+ // buffer is not yet full.
+ // The recording can be stopped as the frontend has detected end of utterance.
+
+ else if ( iDevASRState == EDASRRecognitionSampling )
+ {
+
+ if ( ( aResultCode != KErrNone ) && ( aResultCode != KErrTooLong ) )
+ {
+ RUBY_DEBUG1( "CSRSAlgorithmManager::EouDetected(): Recognition ERROR %d", aResultCode );
+
+ StateTransition( EDASRIdle );
+ iRecognitionAlgMgr->Cancel();
+ iDevSound->Stop();
+ iDevASRObserver->DevASREvent( EDevASRRecognize, TranslateError( aResultCode ) );
+ return;
+ }
+
+ StateTransition( EDASRRecognition );
+
+ iDevSound->Stop();
+
+ iDevSoundState = ESoundDeviceStopped;
+ }
+ else // We are in the wrong state to handle this event
+ {
+ RUBY_DEBUG0( "CSRSAlgorithmManager::EouDetected(): WRONG STATE" );
+ return;
+ }
+
+ iDevASRObserver->DevASREvent( EDevASREouDetected, KErrNone );
+ }
+
+
+// -----------------------------------------------------------------------------
+// CSRSAlgorithmManager::TrainComplete
+// The training backend has finished processing feature vectors. A Model is
+// created.
+// -----------------------------------------------------------------------------
+//
+void CSRSAlgorithmManager::TrainComplete( TInt aResultCode )
+ {
+ RUBY_DEBUG1( "CSRSAlgorithmManager::TrainComplete(%d)", aResultCode );
+
+ if ( iDevASRState == EDASRTrain )
+ {
+ // Training is complete, DevASR can return to Idle state.
+ StateTransition( EDASRIdle );
+
+ iDevASRObserver->DevASREvent( EDevASRTrain, TranslateError( aResultCode ) );
+ }
+ }
+
+
+// -----------------------------------------------------------------------------
+// CSRSAlgorithmManager::UnloadRuleComplete
+// Rule has been blacklisted successfully or otherwise.
+// -----------------------------------------------------------------------------
+//
+void CSRSAlgorithmManager::UnloadRuleComplete( TInt aResultCode )
+ {
+ RUBY_DEBUG1( "CSRSAlgorithmManager::UnloadRuleComplete(%d)", aResultCode );
+
+ iDevASRObserver->DevASREvent( EDevASRUnloadRule, aResultCode );
+ }
+
+
+// -----------------------------------------------------------------------------
+// CSRSAlgorithmManager::RecognitionComplete
+// The recognition backend has finished processing feature vectors. A recognition
+// result is created.
+// -----------------------------------------------------------------------------
+//
+void CSRSAlgorithmManager::RecognitionComplete( TInt aResultCode )
+ {
+ RUBY_DEBUG1( "CSRSAlgorithmManager::RecognitionComplete(%d)", aResultCode );
+
+ // Recognition is complete, DevASR can return to pre-recognition state
+ if ( StateTransition( EDASRPreRecognition ) )
+ {
+ // Mark that sampling can be ended if not stopped yet
+ iEndFlag = ETrue;
+ iDevASRObserver->DevASREvent( EDevASRRecognize, TranslateError( aResultCode ) );
+ }
+ else
+ {
+ if ( iDevASRState == EDASRRecognitionSampling )
+ {
+ StateTransition( EDASRRecognition );
+ iDevSound->Stop();
+ iDevSoundState = ESoundDeviceStopped;
+ iDevASRObserver->DevASREvent( EDevASREouDetected, KErrNone );
+ StateTransition( EDASRPreRecognition );
+ iDevASRObserver->DevASREvent( EDevASRRecognize, TranslateError( aResultCode ) );
+ }
+ }
+ }
+
+
+// -----------------------------------------------------------------------------
+// RecAlgMgr Observer MIXIN impl ends
+// -----------------------------------------------------------------------------
+
+// -----------------------------------------------------------------------------
+// MVmAlgMgrObserver MIXIN impl starts
+// -----------------------------------------------------------------------------
+
+// -----------------------------------------------------------------------------
+// CSRSAlgorithmManager::CombineComplete
+// Grammar combination is ready.
+// -----------------------------------------------------------------------------
+//
+void CSRSAlgorithmManager::CombineComplete( HBufC8* aResult, TInt aError )
+ {
+ // Forward call to reco alg manager
+ iRecognitionAlgMgr->CombineComplete( aResult, aError );
+ }
+
+
+// -----------------------------------------------------------------------------
+// MVmAlgMgrObserver MIXIN impl ends
+// -----------------------------------------------------------------------------
+
+
+// -----------------------------------------------------------------------------
+// Active object implementation begins
+// -----------------------------------------------------------------------------
+
+
+// -----------------------------------------------------------------------------
+// CSRSAlgorithmManager::RunL
+// Handle the requested function asynchronously.
+// result is created.
+// -----------------------------------------------------------------------------
+//
+void CSRSAlgorithmManager::RunL()
+ {
+
+ switch ( iRequestFunction )
+ {
+ case KRecord:
+ TRAPD( err, HandleRecordL() );
+ if ( err )
+ {
+ iRecognitionAlgMgr->Cancel();
+ StateTransition( EDASRIdle );
+ iDevASRObserver->DevASREvent( EDevASRRecord, TranslateError( err ) );
+ }
+ break;
+
+ case KPlay:
+
+ TRAPD( err1, HandlePlayL() );
+ if ( err1 )
+ {
+ StateTransition( EDASRIdle );
+ iDevASRObserver->DevASREvent( EDevASRPlay, TranslateError( err1 ) );
+ }
+ break;
+
+ default:
+ break;
+ };
+ }
+
+
+// -----------------------------------------------------------------------------
+// CSRSAlgorithmManager::Ready
+// Utility function to post a request complete.
+// result is created.
+// -----------------------------------------------------------------------------
+//
+void CSRSAlgorithmManager::Ready( const TInt aStatus )
+ {
+ TRequestStatus* stat = &iStatus;
+ User::RequestComplete( stat, aStatus );
+ SetActive();
+ }
+
+
+// -----------------------------------------------------------------------------
+// Active object impl ends
+// -----------------------------------------------------------------------------
+
+
+// -----------------------------------------------------------------------------
+// CSRSAlgorithmManager::DevASRState
+// Utility function print out the state of DevASR for unit testing.
+// result is created.
+// -----------------------------------------------------------------------------
+//
+void CSRSAlgorithmManager::DevASRState()
+ {
+
+#ifdef _DEBUG
+ switch ( iDevASRState )
+ {
+ case EDASRIdle:
+ RUBY_DEBUG1( "DevASR is: [%d] - EDASRIdle", iDevASRState );
+ break;
+
+ case EDASRInitTrain:
+ RUBY_DEBUG1( "DevASR is: [%d] - EDASRInitTrain", iDevASRState );
+ break;
+
+ case EDASRTrain:
+ RUBY_DEBUG1( "DevASR is: [%d] - EDASRTrain", iDevASRState );
+ break;
+
+ case EDASRRecognitionSampling:
+ RUBY_DEBUG1( "DevASR is: [%d] - EDASRRecognitionSampling", iDevASRState );
+ break;
+
+ case EDASRTrainSampling:
+ RUBY_DEBUG1( "DevASR is: [%d] - EDASRTrainSampling", iDevASRState );
+ break;
+
+ case EDASRPlayback:
+ RUBY_DEBUG1( "DevASR is: [%d] - EDASRPlayback", iDevASRState );
+ break;
+
+ case EDASRPreRecognition:
+ RUBY_DEBUG1( "DevASR is: [%d] - EDASRPreRecognition", iDevASRState );
+ break;
+
+ case EDASRRecognitionPlayback:
+ RUBY_DEBUG1( "DevASR is: [%d] - EDASRRecognitionPlayback", iDevASRState );
+ break;
+
+ case EDASRInitRecognition:
+ RUBY_DEBUG1( "DevASR is: [%d] - EDASRInitRecognition", iDevASRState );
+ break;
+
+ case EDASRRecognition:
+ RUBY_DEBUG1( "DevASR is: [%d] - EDASRRecognition", iDevASRState );
+ break;
+
+ case EDASRCancel:
+ RUBY_DEBUG1( "DevASR is: [%d] - EDASRCancel", iDevASRState );
+ default:
+ RUBY_DEBUG1( "DevASR is: [%d] - Unknown", iDevASRState );
+ break;
+ };
+#endif
+
+ }