windows-nt/Source/XPSP1/NT/enduser/speech/tts/common/localttsenginesite/localttsenginesite.h

129 lines
4.3 KiB
C
Raw Normal View History

2020-09-26 03:20:57 -05:00
//////////////////////////////////////////////////////////////////////
// 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 <sapiddk.h>
#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_)