srsf/tsrc/public/basic/ttsutilitytest/src/ttsutilitytestblocks.cpp
author Pat Downey <patd@symbian.org>
Wed, 01 Sep 2010 12:29:17 +0100
branchRCL_3
changeset 19 e36f3802f733
parent 0 bf1d17376201
permissions -rw-r--r--
Revert incorrect RCL_3 drop: Revision: 201033 Kit: 201035

/*
* 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:
*
*/



// INCLUDE FILES
#include <e32svr.h>
#include <stifparser.h>
#include <stiftestinterface.h>
#include <stiftesteventinterface.h>

#include <audiopreference.h>
#include <nssttscustomcommands.h>
#include <utf.h>

#include "ttsutilitytest.h"

_LIT( Kttsutilitytest, "ttsutilitytest" );


// ============================ MEMBER FUNCTIONS ===============================

// -----------------------------------------------------------------------------
// Cttsutilitytest::Delete
// Delete here all resources allocated and opened from test methods. 
// Called from destructor. 
// -----------------------------------------------------------------------------
//
void Cttsutilitytest::Delete() 
    {
    iFs.Close();
    }

// -----------------------------------------------------------------------------
// Cttsutilitytest::RunMethodL
// Run specified method. Contains also table of test mothods and their names.
// -----------------------------------------------------------------------------
//
TInt Cttsutilitytest::RunMethodL( 
    CStifItemParser& aItem ) 
    {
    TStifFunctionInfo const KFunctions[] =
        {  
        ENTRY( "CreateTtsUtility",      Cttsutilitytest::CreateTtsUtilityL ),
        ENTRY( "DestroyTtsUtility",     Cttsutilitytest::DestroyTtsUtilityL ),
        ENTRY( "StyleSettings",         Cttsutilitytest::StyleSettingsL ),
        ENTRY( "PlaybackProperties",    Cttsutilitytest::PlaybackPropertiesL ),
        ENTRY( "Play",                  Cttsutilitytest::Play ),
        ENTRY( "Pause",                 Cttsutilitytest::Pause ),
        ENTRY( "Stop",                  Cttsutilitytest::Stop ),
        ENTRY( "OpenDes",               Cttsutilitytest::OpenDesL ),
        ENTRY( "OpenDes8",              Cttsutilitytest::OpenDes8L ),
        ENTRY( "OpenFile",              Cttsutilitytest::OpenFileL ),
        ENTRY( "OpenParsedText",        Cttsutilitytest::OpenParsedTextL ),
        ENTRY( "OpenAndPlayDes",        Cttsutilitytest::OpenAndPlayDesL ),
        ENTRY( "OpenAndPlayDes8",       Cttsutilitytest::OpenAndPlayDes8L ),
        ENTRY( "OpenAndPlayFile",       Cttsutilitytest::OpenAndPlayFileL ),
        ENTRY( "OpenAndPlayParsedText", Cttsutilitytest::OpenAndPlayParsedTextL ),
        ENTRY( "SynthesisToFile",       Cttsutilitytest::SynthesisToFileL ),
        ENTRY( "CustomCommands",        Cttsutilitytest::CustomCommandsL ),
        ENTRY( "CustomCommands2",       Cttsutilitytest::CustomCommands2L ),
        };

    const TInt count = sizeof( KFunctions ) / 
                        sizeof( TStifFunctionInfo );

    return RunInternalL( KFunctions, count, aItem );
    }

// -----------------------------------------------------------------------------
// Cttsutilitytest::CreateTtsUtilityL
// 
// -----------------------------------------------------------------------------
//
TInt Cttsutilitytest::CreateTtsUtilityL()
    {
    TestModuleIf().Printf( 0, Kttsutilitytest, _L("In CreateTtsUtilityL") );
    
    if ( iTtsUtility )
        {
        User::LeaveIfError( KErrAlreadyExists );
        }
    
    iTtsUtility = CTtsUtility::NewL( *this );
    
    return KErrNone;
    }

// -----------------------------------------------------------------------------
// Cttsutilitytest::DestroyTtsUtilityL
// 
// -----------------------------------------------------------------------------
//
TInt Cttsutilitytest::DestroyTtsUtilityL()
    {
    TestModuleIf().Printf( 0, Kttsutilitytest, _L("In DestroyTtsUtilityL") );
    
    delete iParsedText;
    iParsedText = NULL;
    
    iTtsUtility->Close();
    
    delete iTtsUtility;
    iTtsUtility = NULL; 
    
    return KErrNone;
    }

// -----------------------------------------------------------------------------
// Cttsutilitytest::StyleSettingsL
// 
// -----------------------------------------------------------------------------
//
TInt Cttsutilitytest::StyleSettingsL()
    {
    TestModuleIf().Printf( 0, Kttsutilitytest, _L("In StyleSettingsL") );
    
    OpenPluginL();
    
    iStyle.iLanguage = ELangEnglish;
    iStyle.iVoice    = KDefaultVoiceNameMale;
    iStyle.iQuality  = ETtsQualityLowPreferred;
    
    iTtsUtility->SetDefaultStyleL( iStyle );
    
    TTtsStyle defaultStyle = iTtsUtility->DefaultStyleL();
    if ( iStyle.iLanguage != defaultStyle.iLanguage || 
         iStyle.iVoice    != defaultStyle.iVoice || 
         iStyle.iQuality  != defaultStyle.iQuality )
        {
        User::Leave( KErrGeneral );
        }
    
    TTtsStyleID styleId = iTtsUtility->AddStyleL( iStyle ); 
    
    TTtsStyle style = iTtsUtility->StyleL( styleId ); 
    
    if ( iStyle.iLanguage != style.iLanguage || 
         iStyle.iVoice    != style.iVoice || 
         iStyle.iQuality  != style.iQuality )
        {
        User::Leave( KErrGeneral );
        }
    
    // There should be only one style
    TUint16 index = 1;
    TRAPD( error, style = iTtsUtility->StyleL( index ) );
    if ( error != KErrNotFound )
        {
        User::Leave( KErrGeneral );
        }
        
    if ( iTtsUtility->NumberOfStyles() == 1 )
        {
        iTtsUtility->DeleteStyle( styleId );
        }
    
    RArray<TLanguage> languages;
    CleanupClosePushL( languages );
    
    iTtsUtility->GetSupportedLanguagesL( languages );
    
    if ( languages.Count() > 0 )
        {
        RArray<TTtsStyle> voices;
        
        iTtsUtility->GetSupportedVoicesL( languages[0], voices );
        
        if ( voices.Count() == 0 )
            {
            User::Leave( KErrNotFound );
            }
            
        voices.Close();
        }
    else
        {
        User::Leave( KErrNotFound );
        }
    
    CleanupStack::PopAndDestroy( &languages );
    
    return KErrNone;
    }
    
// -----------------------------------------------------------------------------
// Cttsutilitytest::PlaybackPropertiesL
// 
// -----------------------------------------------------------------------------
//
TInt Cttsutilitytest::PlaybackPropertiesL()
    {
    TestModuleIf().Printf( 0, Kttsutilitytest, _L("In PlaybackPropertiesL") );
    
    OpenPluginL();
    
    TInt maxVolume( iTtsUtility->MaxVolume() );
    iTtsUtility->SetVolume( maxVolume );
    
    TInt volume;
    iTtsUtility->GetVolume( volume );
    
    if ( volume != maxVolume )
        {
        User::Leave( KErrGeneral );
        }
    
    TRAP_IGNORE( TInt speakingRate = iTtsUtility->SpeakingRateL() );
    TRAP_IGNORE( iTtsUtility->SetSpeakingRateL( KTtsMaxSpeakingRate ) );
    
    iTtsUtility->SetRepeats( 1, 1000 );
    
    TInt balance;
    iTtsUtility->GetBalance( balance );
    iTtsUtility->SetBalance( balance );
    
    TTimeIntervalMicroSeconds duration = iTtsUtility->Duration();
    
    iTtsUtility->SetPriority( KAudioPriorityVoiceDial, 
                              (TMdaPriorityPreference)KAudioPrefVocosPlayback );
    
    iTtsUtility->GetPosition( duration );
    iTtsUtility->SetPosition( duration );
    
    TInt wordIndex( KErrNotFound );
    iTtsUtility->GetPosition( wordIndex );
    iTtsUtility->SetPosition( wordIndex );
    
    return KErrNone;
    }

// -----------------------------------------------------------------------------
// Cttsutilitytest::Play
// 
// -----------------------------------------------------------------------------
//
TInt Cttsutilitytest::Play()
    {
    TestModuleIf().Printf( 0, Kttsutilitytest, _L("In Play") );
    
    iTtsUtility->Play();
    
    return KErrNone;
    }

// -----------------------------------------------------------------------------
// Cttsutilitytest::Pause
// 
// -----------------------------------------------------------------------------
//
TInt Cttsutilitytest::Pause()
    {
    TestModuleIf().Printf( 0, Kttsutilitytest, _L("In Pause") );
    
    iTtsUtility->Pause();
    
    return KErrNone;
    }

// -----------------------------------------------------------------------------
// Cttsutilitytest::Stop
// 
// -----------------------------------------------------------------------------
//
TInt Cttsutilitytest::Stop()
    {
    TestModuleIf().Printf( 0, Kttsutilitytest, _L("In Stop") );
    
    iTtsUtility->Stop();
    
    return KErrNone;
    }

// -----------------------------------------------------------------------------
// Cttsutilitytest::OpenDesL
// 
// -----------------------------------------------------------------------------
//
TInt Cttsutilitytest::OpenDesL( CStifItemParser& aItem )
    {
    TestModuleIf().Printf( 0, Kttsutilitytest, _L("In OpenDesL") );
    
    TPtrC input;
    User::LeaveIfError( aItem.GetNextString ( input ) );
    
    iTtsUtility->OpenDesL( input );
    
    return KErrNone;
    }

// -----------------------------------------------------------------------------
// Cttsutilitytest::OpenDes8L
// 
// -----------------------------------------------------------------------------
//
TInt Cttsutilitytest::OpenDes8L( CStifItemParser& aItem )
    {
    TestModuleIf().Printf( 0, Kttsutilitytest, _L("In OpenDes8L") );
    
    TPtrC input;
    User::LeaveIfError( aItem.GetNextString ( input ) );
    
    HBufC8* input8 = HBufC8::NewLC( 4 * input.Length() );
    TPtr8 refText = input8->Des();
    
    User::LeaveIfError( CnvUtfConverter::ConvertFromUnicodeToUtf8( refText, input ) );

    iTtsUtility->OpenDesL( *input8 );
    
    CleanupStack::PopAndDestroy( input8 );
    
    return KErrNone;
    }

// -----------------------------------------------------------------------------
// Cttsutilitytest::OpenFileL
// 
// -----------------------------------------------------------------------------
//
TInt Cttsutilitytest::OpenFileL( CStifItemParser& aItem )
    {
    TestModuleIf().Printf( 0, Kttsutilitytest, _L("In OpenFileL") );
    
    TPtrC input;
    User::LeaveIfError( aItem.GetNextString ( input ) );
        
    iTtsUtility->OpenFileL( input );
    
    return KErrNone;
    }
// -----------------------------------------------------------------------------
// Cttsutilitytest::OpenParsedTextL
// 
// -----------------------------------------------------------------------------
//
TInt Cttsutilitytest::OpenParsedTextL( CStifItemParser& aItem )
    {
    TestModuleIf().Printf( 0, Kttsutilitytest, _L("In OpenParsedTextL") );
    
    TInt result( KErrGeneral );
    
    TPtrC input;
    User::LeaveIfError( aItem.GetNextString ( input ) );
    
    if ( iParsedText )
        {
        delete iParsedText;
        iParsedText = NULL;
        }
        
    iStyle.iLanguage = User::Language();
    iStyle.iVoice    = KDefaultVoiceNameFemale;
    iStyle.iQuality  = ETtsQualityLowOnly;
    
    iParsedText = CTtsParsedText::NewL();
    iParsedText->SetPhonemeNotationL( KNullDesC );
    iParsedText->SetTextL( input );
    
    iSegment.SetStyle( iStyle );
    iStyle = iSegment.StyleL();
    iSegment.ResetStyle();
    
    iSegment.SetTrailingSilenceL( iSegment.TrailingSilence() );
    
    iSegment.SetStyleID( iTtsUtility->AddStyleL( iStyle ) );
    iSegment.SetTextPtr( iParsedText->Text() );
    iParsedText->AddSegmentL( iSegment );   
    
    if ( iParsedText->IsValid() )
        {
        result = KErrNone;
        iTtsUtility->OpenParsedTextL( *iParsedText );
        }
        
    return result;
    }
// -----------------------------------------------------------------------------
// Cttsutilitytest::OpenAndPlayDesL
// 
// -----------------------------------------------------------------------------
//
TInt Cttsutilitytest::OpenAndPlayDesL( CStifItemParser& aItem )
    {
    TestModuleIf().Printf( 0, Kttsutilitytest, _L("In OpenAndPlayDesL") );
    
    TPtrC input;
    User::LeaveIfError( aItem.GetNextString ( input ) );
    
    iTtsUtility->OpenAndPlayDesL( input );
    
    return KErrNone;
    }

// -----------------------------------------------------------------------------
// Cttsutilitytest::OpenAndPlayDes8L
// 
// -----------------------------------------------------------------------------
//
TInt Cttsutilitytest::OpenAndPlayDes8L( CStifItemParser& aItem )
    {
    TestModuleIf().Printf( 0, Kttsutilitytest, _L("In OpenAndPlayDes8L") );
    
    TPtrC input;
    User::LeaveIfError( aItem.GetNextString ( input ) );
    
    HBufC8* input8 = HBufC8::NewLC( 4 * input.Length() );
    TPtr8 refText = input8->Des();
    
    User::LeaveIfError( CnvUtfConverter::ConvertFromUnicodeToUtf8( refText, input ) );

    iTtsUtility->OpenAndPlayDesL( *input8 );
    
    CleanupStack::PopAndDestroy( input8 );
    
    return KErrNone;
    }

// -----------------------------------------------------------------------------
// Cttsutilitytest::OpenAndPlayFileL
// 
// -----------------------------------------------------------------------------
//
TInt Cttsutilitytest::OpenAndPlayFileL( CStifItemParser& aItem )
    {
    TestModuleIf().Printf( 0, Kttsutilitytest, _L("In OpenAndPlayFileL") );
    
    TPtrC input;
    User::LeaveIfError( aItem.GetNextString ( input ) );
        
    iTtsUtility->OpenAndPlayFileL( input );
    
    return KErrNone;
    }
    
// -----------------------------------------------------------------------------
// Cttsutilitytest::OpenAndPlayParsedTextL
// 
// -----------------------------------------------------------------------------
//
TInt Cttsutilitytest::OpenAndPlayParsedTextL( CStifItemParser& aItem )
    {
    TestModuleIf().Printf( 0, Kttsutilitytest, _L("In OpenAndPlayParsedTextL") );
    
    TPtrC input;
    User::LeaveIfError( aItem.GetNextString ( input ) );
    
    if ( iParsedText == NULL )
        {
        iStyle.iLanguage = User::Language();
        iStyle.iVoice    = KDefaultVoiceNameFemale;
        iStyle.iQuality  = ETtsQualityLowOnly;
        
        iParsedText = CTtsParsedText::NewL();
        iParsedText->SetTextL( input );
    
        iSegment.SetStyleID( iTtsUtility->AddStyleL( iStyle ) );
        iSegment.SetTextPtr( iParsedText->Text() );
        iParsedText->AddSegmentL( iSegment );   
        }
        
    iTtsUtility->OpenAndPlayParsedTextL( *iParsedText );
    
    return KErrNone;
    }

// -----------------------------------------------------------------------------
// Cttsutilitytest::SynthesisToFileL
// 
// -----------------------------------------------------------------------------
//
TInt Cttsutilitytest::SynthesisToFileL( CStifItemParser& aItem )
    {
    TestModuleIf().Printf( 0, Kttsutilitytest, _L("In SynthesisToFileL") );
    
    TPtrC fileName;
    User::LeaveIfError( aItem.GetNextString ( fileName ) );
    
    User::LeaveIfError( iFs.Connect() );
    User::LeaveIfError( iFs.ShareProtected() ); 
    iFs.MkDirAll( fileName ); // Ignore error (KErrAlreadyExists comes quite often)
    
    User::LeaveIfError( iFile.Replace( iFs, fileName, EFileWrite ) ); 
    
    iTtsUtility->SetOutputFileL( iFile );
    
    return KErrNone;
    }

// -----------------------------------------------------------------------------
// Cttsutilitytest::CustomCommandsL
// 
// -----------------------------------------------------------------------------
//
TInt Cttsutilitytest::CustomCommandsL()
    {
    TestModuleIf().Printf( 0, Kttsutilitytest, _L("In CustomCommandsL") );
    
    TUid openPlugin = OpenPluginL();
    TMMFMessageDestinationPckg destination( openPlugin );
    
    TBuf8<2> dataTo;
    dataTo.AppendNum( 1 );    

    TInt err1 = iTtsUtility->CustomCommandSync( destination, ETtsCustomCommandSetAudioOutput, 
                                                dataTo, KNullDesC8 );
    
    TBuf8<16> dataFrom;
    TInt err2 = iTtsUtility->CustomCommandSync( destination, ETtsCustomCommandSetAudioOutput, 
                                                dataTo, KNullDesC8, dataFrom );

    TRequestStatus status1( KRequestPending );
    iTtsUtility->CustomCommandAsync( destination, ETtsCustomCommandSetAudioOutput, 
                                     dataTo, KNullDesC8, status1 );
    User::WaitForRequest( status1 );
    
    TRequestStatus status2( KRequestPending );
    iTtsUtility->CustomCommandAsync( destination, ETtsCustomCommandSetAudioOutput, 
                                    dataTo, KNullDesC8, dataFrom, status2 );
    
    User::WaitForRequest( status2 );
    
    TInt result( KErrNone );
    
    if ( err1 || err2 || status1.Int() || status2.Int() )
        {
        result = KErrGeneral;
        }
    
    return result;
    }

// -----------------------------------------------------------------------------
// Cttsutilitytest::CustomCommands2L
// 
// -----------------------------------------------------------------------------
//
TInt Cttsutilitytest::CustomCommands2L()
    {
    TestModuleIf().Printf( 0, Kttsutilitytest, _L("In CustomCommands2L") );
    
    const TUid KUidTtsPlugin = { 0x101FF934 };
    
    RMMFController controller;
    RTtsCustomCommands ttsCustomCommands( controller );
    TMMFPrioritySettings prioritySettings;
    
    User::LeaveIfError( controller.Open( KUidTtsPlugin, prioritySettings ) );
    
    TUint16 count;
    User::LeaveIfError( ttsCustomCommands.NumberOfStyles( count ) );
    
    if ( count > 0 )
        {
        TTtsStyleID styleId( 0 );
        User::LeaveIfError( ttsCustomCommands.Style( styleId, iStyle ) );
        
        TUint16 styleId16( 0 );
        User::LeaveIfError( ttsCustomCommands.Style( styleId16, iStyle ) );
        }
        
    controller.Close();
    
    return KErrNone;
    }
    
// -----------------------------------------------------------------------------
// Cttsutilitytest::OpenPluginL
// 
// -----------------------------------------------------------------------------
//
TUid Cttsutilitytest::OpenPluginL()
    {
    const TUid KUidTtsPlugin = { 0x101FF934 };
    
    RArray<TUid> uids;
    CleanupClosePushL( uids );    
    iTtsUtility->ListPluginsL( uids );
    
    TInt index = uids.Find( KUidTtsPlugin );
    TUid openUid( KNullUid );
    
    if ( index >= 0 )
        {
        openUid = uids[index];
        }
    else if ( uids.Count() > 0 )
        {
        openUid = uids[0];
        }
    else
        {
        User::Leave( KErrNotFound );
        }

    iTtsUtility->OpenPluginL( openUid );
    
    CleanupStack::PopAndDestroy( &uids );
    
    return openUid;
    }

// -----------------------------------------------------------------------------
// Cttsutilitytest::MapcInitComplete
//
// -----------------------------------------------------------------------------
// 
void Cttsutilitytest::MapcInitComplete( TInt aError, 
                                        const TTimeIntervalMicroSeconds& /*aDuration*/ )
    {
    if ( aError )
        {
        User::Panic( Kttsutilitytest, aError );
        }
    
    TEventIf stifEvent( TEventIf::ESetEvent, _L( "MapcInitComplete" ) );
    TestModuleIf().Event( stifEvent );    
    }
    
// -----------------------------------------------------------------------------
// Cttsutilitytest::MapcPlayComplete
//
// -----------------------------------------------------------------------------
// 
void Cttsutilitytest::MapcPlayComplete( TInt aError )
    {
    if ( aError )
        {
        User::Panic( Kttsutilitytest, aError );
        }
    
    TEventIf stifEvent( TEventIf::ESetEvent, _L( "MapcPlayComplete" ) );
    TestModuleIf().Event( stifEvent );
    }
    
//  End of File