////////////////////////////////////////////////////////////////////// // LocalTTSEngineSite.h: interface for the CLocalTTSEngineSite class. // // Created by JOEM 04-2000 // Copyright (C) 2000 Microsoft Corporation // All Rights Reserved // /////////////////////////////////////////////////////// JOEM 4-2000 // #if !defined(AFX_LOCALTTSENGINESITE_H__70B0DA93_23F5_4F17_B525_4027F78AF195__INCLUDED_) #define AFX_LOCALTTSENGINESITE_H__70B0DA93_23F5_4F17_B525_4027F78AF195__INCLUDED_ #include #include "tsm.h" #if _MSC_VER > 1000 #pragma once #endif // _MSC_VER > 1000 //------------------------------------------- // Translate -10 <--> +10 rate control to // 10th root of three rate scale //------------------------------------------- enum USER_RATE_VALUE { MIN_RATE = -10, BASE_RATE = 0, MAX_RATE = 10, }; const double g_dRateScale[] = { 1.0, 1.1161231740339044344426141383771, // 3 ^ 1/10 1.2457309396155173259666803366403, 1.3903891703159093404852542946161, 1.5518455739153596742733451355167, 1.7320508075688772935274463415059, 1.9331820449317627515248789432662, 2.1576692799745930995549489159803, 2.4082246852806920462855086141912, 2.6878753795222865835819210737269, 3, }; struct Event { SPEVENT event; Event* pPrev; Event* pNext; }; class CLocalTTSEngineSite : public ISpTTSEngineSite { public: CLocalTTSEngineSite(); ~CLocalTTSEngineSite(); public: //--- IUnknown -------------------------------------- STDMETHOD(QueryInterface) ( REFIID iid, void** ppvObject ); STDMETHOD_(ULONG, AddRef)(void); STDMETHOD_(ULONG, Release) (void); //--- ISpTTSEngineSite -------------------------------------- STDMETHOD(GetEventInterest)( ULONGLONG * pullEventInterest ) { return m_pMainOutputSite->GetEventInterest(pullEventInterest); } STDMETHOD(GetRate)( long* plRateAdjust ); STDMETHOD(GetSkipInfo)( SPVSKIPTYPE* peType, long* plNumItems ); STDMETHOD(CompleteSkip)( long lNumSkipped ); STDMETHOD(GetVolume)( USHORT* punVolume ); STDMETHOD(AddEvents)(const SPEVENT* pEventArray, ULONG ulCount ); STDMETHOD(Write)( const void* pBuff, ULONG cb, ULONG *pcbWritten ); STDMETHOD_(DWORD, GetActions)( void ); //--- CLocalTTSEngineSite -------------------------------------- void SetOutputSite(ISpTTSEngineSite* pOutputSite); STDMETHOD(SetBufferSize)(const ULONG ulSeconds); STDMETHOD(SetOutputFormat)(const GUID * pOutputFormatId, const WAVEFORMATEX *pOutputFormat); void UpdateBytesWritten() { m_ullPreviousBytesReceived = m_ullTotalBytesReceived; } private: STDMETHOD(WriteBuffer)(); STDMETHOD(WriteToSAPI)( const void* pvBuff, const ULONG cb, bool* pfAbort ); void ComputeRateAdj(const long lRate, float* flRate); STDMETHOD(ApplyGain)(const void* pvInBuff, void** ppvOutBuff, const int iNumSamples); STDMETHOD(SendEvents)(); void RescheduleEvents(Event* pStart); void FlushEvents(const ULONG cb); private: volatile LONG m_vcRef; // output vars ISpTTSEngineSite* m_pMainOutputSite; const GUID* m_pOutputFormatId; WAVEFORMATEX* m_pOutputFormat; // audio buffer char* m_pcBuffer; ULONG m_ulBufferBytes; ULONG m_ulBufferSeconds; ULONG m_ulMinBufferShift; ULONG m_ulDataEnd; ULONG m_ulCurrentByte; ULONG m_ulSkipForward; // eventing managers Event* m_pEventQueue; Event* m_pCurrentEvent; Event* m_pLastEvent; // event ullAudioStreamOffset managers ULONGLONG m_ullTotalBytesReceived; // sums every byte as they come in ULONGLONG m_ullPreviousBytesReceived; // sums every byte of previous ::Write calls ULONGLONG m_ullBytesWritten; // sums every byte written (before rate adj) ULONGLONG m_ullBytesWrittenToSAPI; // sums every byte written to SAPI (differs due to rate change) LONG m_lTotalBytesSkipped; // cumulative skipped, plus or minus // rate changer CTsm* m_pTsm; float m_flRateAdj; double m_flVol; }; #endif // !defined(AFX_LOCALTTSENGINESITE_H__70B0DA93_23F5_4F17_B525_4027F78AF195__INCLUDED_)