#if !defined(___VAIBOTTS_H___)
#define ___VAIBOTTS_H___


// Voice parameter
#define     VOICE_PARAM_MAX ( 100 )
#define     VOICE_PARAM_DEFAULT ( VOICE_PARAM_MAX / 2 )

// TTS engine type
enum    E_VAIBOTTS_ENGINE {
    E_VAIBOTTS_ENGINE_SONYTTS,  // SONY TTS 
    E_VAIBOTTS_ENGINE_SAPI,     // SAPI 
    E_VAIBOTTS_ENGINE_ILLEGAL,  // Illegal 
    MAX_E_VAIBOTTS_ENGINE
};

// Kind of lexicon 
enum    E_VAIBOTTS_LEXICON {
    E_VAIBOTTS_LEXICON_SONYTTS_J,   // SONY TTS 
    E_VAIBOTTS_LEXICON_SAPI_J,      // SAPI Japanese
    E_VAIBOTTS_LEXICON_SAPI_E,      // SAPI English
    MAX_E_VAIBOTTS_LEXICON
};

// Language of lexicon 
enum    E_VAIBOTTS_LANGUAGE {
    E_VAIBOTTS_LANGUAGE_JAPANESE,   // Japanese 
    E_VAIBOTTS_LANGUAGE_ENGLISH,    // English 
    MAX_E_VAIBOTTS_LANGUAGE
};

// WAVE Format 
enum {
	E_TTS_WAVE_FORMAT_22K_16BIT,	// 22kHz 16bit 
	E_TTS_WAVE_FORMAT_16K_16BIT,	// 16kHz 16bit 
	E_TTS_WAVE_FORMAT_8K_8BIT,		// 8kHz 8bit 
	MAX_E_TTS_WAVE_FORMAT
};

// Part 
enum    E_VAIBOTTS_PART {
    E_VAIBOTTS_PART_SAPI_NOUN,          // Noun(SAPI) 
    E_VAIBOTTS_PART_SAPI_VERB,          // Verb(SAPI) 
    E_VAIBOTTS_PART_SAPI_MODIFIER,      // Modifier(SAPI) 
    E_VAIBOTTS_PART_SAPI_FUNCTION,      // Function -- Zenchishi, Setuzokushi, Jodoushi etc(SAPI) 
    E_VAIBOTTS_PART_SAPI_INTERJECTION,  // Interjection(SAPI) 
    MAX_E_VAIBOTTS_PART_SAPI,
    E_VAIBOTTS_PART_SONYTTS_HEAD
             = MAX_E_VAIBOTTS_PART_SAPI,
    E_VAIBOTTS_PART_SONYTTS_FUTUU_NOUN          // Normal noun      Noun:General noun:Normal noun:::: 
             = E_VAIBOTTS_PART_SONYTTS_HEAD,
    E_VAIBOTTS_PART_SONYTTS_KOYUU_NOUN,         // Proper noun      Noun:General noun:Proper noun:::: 
    E_VAIBOTTS_PART_SONYTTS_SAHENKA_NOUN,       // Sa-hen noun      Noun:Sa-hen noun:Normal noun:::: 
    E_VAIBOTTS_PART_SONYTTS_SAHENDOUKA_NOUN,    // Sa-hen verb noun Noun:Sa-hen verb noun:Normal noun:::: 
    E_VAIBOTTS_PART_SONYTTS_JISHI_NOUN,         // Time noun        Noun:General noun:Time noun:::: 
    E_VAIBOTTS_PART_SONYTTS_SUUSHI_NOUN,        // Numeral          Noun:General noun:Numeral:::: 
    E_VAIBOTTS_PART_SONYTTS_PRONOUN,            // Pronoun          Noun:General noun:Pronoun:::: 
    E_VAIBOTTS_PART_SONYTTS_KEIDOUKA_NOUN,      // Adjective verb noun  Noun:Adjective verb noun:Normal noun:::: 
    E_VAIBOTTS_PART_SONYTTS_1DAN_IPPAN_VERB,    // 1-dan general verb   Verb:1-dan:general verb:::general: 
    E_VAIBOTTS_PART_SONYTTS_1DAN_KANOU_VERB,    // 1-dan possible verb  Verb:1-dan:possible verb:::general: 
    E_VAIBOTTS_PART_SONYTTS_5DAN_KAGYOU_VERB,   // 5-dan Ka-gyo verb    Verb:5-dan:general verb:::Ka-gyo 5-dan: 
    E_VAIBOTTS_PART_SONYTTS_5DAN_GAGYOU_VERB,   // 5-dan Ga-gyo verb    Verb:5-dan:general verb:::Ga-gyo 5-dan: 
    E_VAIBOTTS_PART_SONYTTS_5DAN_SAGYOU_VERB,   // 5-dan Sa-gyo verb    Verb:5-dan:general verb:::Sa-gyo 5-dan: 
    E_VAIBOTTS_PART_SONYTTS_5DAN_TAGYOU_VERB,   // 5-dan Ta-gyo verb    Verb:5-dan:general verb:::Ta-gyo 5-dan: 
    E_VAIBOTTS_PART_SONYTTS_5DAN_NAGYOU_VERB,   // 5-dan Na-gyo verb    Verb:5-dan:general verb:::Na-gyo 5-dan: 
    E_VAIBOTTS_PART_SONYTTS_5DAN_BAGYOU_VERB,   // 5-dan Ba-gyo verb    Verb:5-dan:general verb:::Ba-gyo 5-dan: 
    E_VAIBOTTS_PART_SONYTTS_5DAN_MAGYOU_VERB,   // 5-dan Ma-gyo verb    Verb:5-dan:general verb:::Ma-gyo 5-dan: 
    E_VAIBOTTS_PART_SONYTTS_5DAN_RAGYOU_VERB,   // 5-dan Ra-gyo verb    Verb:5-dan:general verb:::Ra-gyo 5-dan: 
    E_VAIBOTTS_PART_SONYTTS_5DAN_WAGYOU_VERB,   // 5-dan Wa-gyo verb    Verb:5-dan:general verb:::Wa-gyo 5-dan:  
    E_VAIBOTTS_PART_SONYTTS_ADJECTIVE,          // Adjective        Adjective:Adjective::General::Ku-katsuyo: 
    E_VAIBOTTS_PART_SONYTTS_ADJECTIVE_VERB,     // Adjective verb   Adjective verb:Adjective verb::General::Da-katsuyo:
    E_VAIBOTTS_PART_SONYTTS_ADVERB,             // Adverb           Adjective verb:Adjective verb::General::Da-katsuyo:
    E_VAIBOTTS_PART_SONYTTS_ATTRIBUTE,          // Attribute        Attribute:Attribute::::: 
    E_VAIBOTTS_PART_SONYTTS_SIGN,               // Sign             Sign:other sign::::: 
    MAX_E_VAIBOTTS_PART_SONYTTS,
    NUM_E_VAIBOTTS_PART_SONYTTS = ( MAX_E_VAIBOTTS_PART_SONYTTS - MAX_E_VAIBOTTS_PART_SAPI ),
    MAX_E_VAIBOTTS_PART = MAX_E_VAIBOTTS_PART_SONYTTS
};

// SonyTTS Part of speech classification(For the indication) 
#ifdef VAIBOTTS_EXPORTS
extern __declspec( dllexport ) char* strSonyTTSParts[ NUM_E_VAIBOTTS_PART_SONYTTS ];
#else
extern __declspec( dllimport ) char* strSonyTTSParts[ NUM_E_VAIBOTTS_PART_SONYTTS ];
#endif // _AFXDLL 

// Error code
enum {
    E_VAIBOTTS_NOERROR,
    // All 
    E_VAIBOTTS_ERROR,                                   // Error
    E_VAIBOTTS_ERROR_NOT_START,                         // TTS engine is not initialized
    E_VAIBOTTS_ERROR_ILLEGAL_LEXICON,                   // Illegal lexicon
    // SonyTTS 
    E_VAIBOTTS_ERROR_SONYTTS_INIT,                      // Initialization of the Sony TTS engine failed 
    E_VAIBOTTS_ERROR_SONYTTS_NOT_START,                 // Sony TTS engine is not initialized
    E_VAIBOTTS_ERROR_SONYTTS_OPENFILE,                  // Sony TTS Wave file open error
    E_VAIBOTTS_ERROR_SONYTTS_CONVERTER,                 // Sony TTS Wave data conversion error
    E_VAIBOTTS_ERROR_SONYTTS_BUFFER_SIZE_OVER,          // Sony TTS buffer overflow
    E_VAIBOTTS_ERROR_SONYTTS_ACM_FORMAT_COMVERTER,      // Sony TTS Wave data(ACM format) conversion error
    E_VAIBOTTS_ERROR_SONYTTS_LEXICON_INIT,              // Sony TTS lexicon open error
    E_VAIBOTTS_ERROR_SONYTTS_LEXICON_ILLEGAL_WORDNO,    // Sony TTS lexicon illegal word index
    E_VAIBOTTS_ERROR_SONYTTS_LEXICON_ILLEGAL_WORD,      // Sony TTS lexicon illegal word
    E_VAIBOTTS_ERROR_SONYTTS_LEXICON_ILLEGAL_PHONE,     // Sony TTS lexicon illegal word phone
    E_VAIBOTTS_ERROR_SONYTTS_LEXICON_ILLEGAL_PART,      // Sony TTS lexicon illegal word part
    E_VAIBOTTS_ERROR_SONYTTS_LEXICON_ENTRY_API,         // Sony TTS lexicon entry API error
    // SAPI 
    E_VAIBOTTS_ERROR_SAPI_INIT,                           // Initialization of the SAPI engine failed
    E_VAIBOTTS_ERROR_SAPI_NOT_START,                      // SAPI engine is not initialized
    E_VAIBOTTS_ERROR_SAPI_OUTPUTSTREAM,                   // SAPI output stream voice error
    E_VAIBOTTS_ERROR_SAPI_LEXICON_INIT,                   // SAPI lexicon open error
    E_VAIBOTTS_ERROR_SAPI_LEXICON_NOT_START,              // SAPI lexicon is not initialized
    E_VAIBOTTS_ERROR_SAPI_LEXICON_ILLEGAL_WORDNO,         // SAPI lexicon illegal word index
    E_VAIBOTTS_ERROR_SAPI_LEXICON_ILLEGAL_LANGUAGE,       // SAPI lexicon illegal language
    E_VAIBOTTS_ERROR_SAPI_LEXICON_ILLEGAL_PART,           // SAPI lexicon illegal word part 
    E_VAIBOTTS_ERROR_SAPI_LEXICON_CONVERTER,              // SAPI lexicon converter error
	// Speak
	E_VAIBOTTS_ERROR_OVER_STRING,
	E_VAIBOTTS_ERROR_NOT_CONNECTED,
	E_VAIBOTTS_ERROR_BUSY_NETAUDIO,
	E_VAIBOTTS_ERROR_NOT_START_NETAUDIO,
	E_VAIBOTTS_ERROR_NOT_MAKEWAVEFILE,
	E_VAIBOTTS_ERROR_NOT_SNEDWAVEFILE,

    MAX_E_VAIBOTTS_ERROR
};


class CVAIBOTTSEX;
class CVAIBO;

#ifdef VAIBOTTS_EXPORTS
class __declspec( dllexport ) CVAIBOTTS {
#else
class __declspec( dllimport ) CVAIBOTTS {
#endif // VAIBOTTS_EXPORTS
public:

    CVAIBOTTS( int init = 0 );
    ~CVAIBOTTS();

    int     Init();
    int     End();

    int     GetTTSEngineNum( int& nListNum );
    int     GetTTSEngineName( int nIdx, char* strEngineName );
    E_VAIBOTTS_ENGINE       GetTTSEngineKind( int nIdx );
    int     GetVoiceEngine( int* pIdx );
    int     SetVoiceEngine( int nIdx );

    int     Speak( CVAIBO *m_vaibo, const char* strText );
    int     MakeWaveFile( const char* strText, const char* strFileName );
    int     MakePcmData( const char* strText, char* pPcmData, int* pPcmDataSize, int nMaxSize );


    int     SetVoiceSpeed( unsigned int unSpeed );
    int     SetVoicePitch( unsigned int unPitch );
    int     SetVoiceAccent( unsigned int unAccent );
    int     SetVoiceVolume( unsigned int unVolume );
    int     SetOutputFormat( int nWaveFormat );

    unsigned int    GetVoiceSpeed();
    unsigned int    GetVoicePitch();
    unsigned int    GetVoiceAccent();
    unsigned int    GetVoiceVolume();
    int             GetOutputFormat();

    // Lexicon
    int     GetWordNumInLexicon( E_VAIBOTTS_LEXICON eLexicon, int& nWord );
    int     GetWordInLexicon( E_VAIBOTTS_LEXICON eLexicon, int nIdx, char* strWord );
    int     GetPronunciationInLexicon( E_VAIBOTTS_LEXICON eLexicon, int nIdx, char* strPronunciation );
    int     GetPartInLexicon( E_VAIBOTTS_LEXICON eLexicon, int nIdx, char* strPart );
    int     AddWordInLexicon( E_VAIBOTTS_LEXICON eLexicon, char* strWord, char* strPhone, E_VAIBOTTS_PART ePart );
    int     DeleteWordInLexicon( E_VAIBOTTS_LEXICON eLexicon, int nIdx );

private:
	CVAIBOTTSEX	*m_pAibottsEX;
	
};

#endif // ___VAIBOTTS_H___ 
