// SpResult.h : Declaration of the CSpResult #ifndef __SPRESULT_H_ #define __SPRESULT_H_ #include "resource.h" // main symbols #include "speventq.h" #include "spphrase.h" #include "spcollec.h" #include "StreamHlp.h" ///interface SpContextPrivate; // defined in recoctxt.h class CRecoCtxt; //////////////////////////////////////////////////////////////////////////// // CSpResult class ATL_NO_VTABLE CSpResult; class ATL_NO_VTABLE CSpPhraseAlt; class ATL_NO_VTABLE CRecoContext; typedef CComObject CSpResultObject; class ATL_NO_VTABLE CSpResult : public CComObjectRootEx, public ISpRecoResult #ifdef SAPI_AUTOMATION , public IDispatchImpl #endif SAPI_AUTOMATION { private: float m_fRetainedScaleFactor; public: CSpResultObject * m_pNext; // weak reference SPRESULTHEADER * m_pResultHeader; BOOL m_fWeakCtxtRef; CRecoCtxt * m_pCtxt; CComPtr m_Phrase; CSpResult() : m_pNext(NULL), m_pResultHeader(NULL), m_pAltRequest(NULL), m_pCtxt(NULL) { CComObject *pPhrase; CComObject::CreateInstance(&pPhrase); m_Phrase = pPhrase; m_fWeakCtxtRef = FALSE; m_fRetainedScaleFactor = 0.0F; m_fUseTextReplacements = VARIANT_TRUE; } void FinalRelease(); void RemoveAllAlternates(); void RemoveAlternate(CSpPhraseAlt *pAlt); HRESULT CommitAlternate(SPPHRASEALT *pAlt); HRESULT DeserializeCnCAlternates( ULONG ulRequestCount, ISpPhraseAlt **ppAlts, ULONG *pcAltsReturned ); DECLARE_GET_CONTROLLING_UNKNOWN(); DECLARE_PROTECT_FINAL_CONSTRUCT() BEGIN_COM_MAP(CSpResult) COM_INTERFACE_ENTRY(ISpPhrase) COM_INTERFACE_ENTRY(ISpRecoResult) #ifdef SAPI_AUTOMATION COM_INTERFACE_ENTRY(ISpeechRecoResult) COM_INTERFACE_ENTRY(IDispatch) #endif // SAPI_AUTOMATION END_COM_MAP() // // ISpRecoResult // STDMETHODIMP GetResultTimes(SPRECORESULTTIMES *pTimes); STDMETHODIMP GetAlternates(ULONG ulAltCount, ULONG ulStartElement, ULONG cElements, ISpPhraseAlt **ppPhrases, ULONG *pcPhrasesReturned); STDMETHODIMP Serialize(SPSERIALIZEDRESULT ** ppCoMemSerializedResult); STDMETHODIMP GetAudio(ULONG ulStartElement, ULONG cElements, ISpStreamFormat **ppStream); STDMETHODIMP SpeakAudio(ULONG ulStartElement, ULONG cElements, DWORD dwFlags, ULONG * pulStreamNumber); STDMETHODIMP ScaleAudio(const GUID *pAudioFormatId, const WAVEFORMATEX *pWaveFormatEx); // // ISpPhrase // STDMETHODIMP GetPhrase(SPPHRASE ** ppPhrase) { return m_Phrase->GetPhrase(ppPhrase); } STDMETHODIMP GetSerializedPhrase(SPSERIALIZEDPHRASE ** ppPhrase) { return m_Phrase->GetSerializedPhrase(ppPhrase); } STDMETHODIMP GetText(ULONG ulStart, ULONG ulCount, BOOL fUseTextReplacements, WCHAR ** ppszCoMemText, BYTE * pbDisplayAttributes) { return m_Phrase->GetText(ulStart, ulCount, fUseTextReplacements, ppszCoMemText, pbDisplayAttributes); } STDMETHODIMP Discard(DWORD dwFlags); STDMETHODIMP GetRecoContext(ISpRecoContext ** ppRecoContext); #ifdef SAPI_AUTOMATION //--- ISpeechRecoResult ----------------------------------------------------- STDMETHODIMP get_RecoContext( ISpeechRecoContext** RecoContext ); STDMETHODIMP get_Times( ISpeechRecoResultTimes** Times ); STDMETHODIMP putref_AudioFormat( ISpeechAudioFormat* pFormat ); STDMETHODIMP get_AudioFormat( ISpeechAudioFormat** ppFormat ); STDMETHODIMP get_PhraseInfo( ISpeechPhraseInfo** ppPhraseInfo ); STDMETHODIMP Alternates( long lRequestCount, long lStartElement, long cElements, ISpeechPhraseAlternates** Alternates ); STDMETHODIMP Audio( long lStartElement, long cElements, ISpeechMemoryStream **Stream ); STDMETHODIMP SpeakAudio( long lStartElement, long cElements, SpeechVoiceSpeakFlags eFlags, long* StreamNumber ); STDMETHODIMP SaveToMemory( VARIANT* ResultBlock ); STDMETHODIMP DiscardResultInfo( SpeechDiscardType DiscardTypes ); #endif // SAPI_AUTOMATION #ifdef _WIN32_WCE // Dummy Compare funcs are here because the CE compiler // is expanding templates for functions that aren't being called static LONG Compare(const CSpResult *, const CSpResult *) { return 0; } #endif HRESULT Init(CRecoCtxt * pParent, SPRESULTHEADER *pPhrase); void WeakCtxtRef(BOOL fWeakCtxtRef); STDMETHODIMP ScalePhrase(void); private: STDMETHODIMP InternalScalePhrase(SPRESULTHEADER *pNewPhraseHdr); STDMETHODIMP InternalScalePhrase(SPRESULTHEADER *pNewPhraseHdr, SPINTERNALSERIALIZEDPHRASE *pPhraseData); // We hold a pointer to the latest request, for correction SPPHRASEALTREQUEST * m_pAltRequest; // We hold the list of alternates we've passed out so we can kill // them when we're released CSPList m_listpAlts; VARIANT_BOOL m_fUseTextReplacements; }; class ATL_NO_VTABLE CSpResultAudioStream : public CComObjectRootEx, public ISpStreamFormat, public ISpEventSource #ifdef SAPI_AUTOMATION , public IDispatchImpl #endif SAPI_AUTOMATION { public: CSpEventSource m_SpEventSource; CSpStreamFormat m_StreamFormat; ULONG m_cbDataSize; ULONG m_ulCurSeekPos; BYTE * m_pData; BEGIN_COM_MAP(CSpResultAudioStream) COM_INTERFACE_ENTRY(IStream) COM_INTERFACE_ENTRY(ISpStreamFormat) COM_INTERFACE_ENTRY(ISpEventSource) COM_INTERFACE_ENTRY(ISpNotifySource) #ifdef SAPI_AUTOMATION COM_INTERFACE_ENTRY(ISpeechMemoryStream) COM_INTERFACE_ENTRY(ISpeechBaseStream) COM_INTERFACE_ENTRY(IDispatch) #endif // SAPI_AUTOMATION END_COM_MAP() DECLARE_SPEVENTSOURCE_METHODS(m_SpEventSource) CSpResultAudioStream() : m_SpEventSource(this), m_cbDataSize(0), m_ulCurSeekPos(0), m_pData(NULL) { m_SpEventSource._SetInterest(SPFEI(SPEI_WORD_BOUNDARY), SPFEI(SPEI_WORD_BOUNDARY)); } ~CSpResultAudioStream() { delete[] m_pData; } HRESULT Init(ULONG cbAudioSizeIncFormat, const BYTE * pAudioDataIncFormat, ULONG ulAudioStartOffset, ULONG ulAudioSize, const SPEVENT * pEvents, ULONG cEvents); // // IStream // STDMETHODIMP Read(void * pv, ULONG cb, ULONG * pcbRead); STDMETHODIMP Write(const void * pv, ULONG cb, ULONG * pcbWritten) { return STG_E_ACCESSDENIED; } STDMETHODIMP Seek(LARGE_INTEGER dlibMove, DWORD dwOrigin, ULARGE_INTEGER *plibNewPosition); STDMETHODIMP SetSize(ULARGE_INTEGER libNewSize) { return STG_E_ACCESSDENIED; } STDMETHODIMP CopyTo(IStream *pStreamDest, ULARGE_INTEGER cb, ULARGE_INTEGER *pcbRead, ULARGE_INTEGER __RPC_FAR *pcbWritten) { return SpGenericCopyTo(this, pStreamDest, cb, pcbRead, pcbWritten); } STDMETHODIMP Commit(DWORD grfCommitFlags) { return S_OK; } STDMETHODIMP Revert(void) { return E_NOTIMPL; } STDMETHODIMP LockRegion(ULARGE_INTEGER libOffset, ULARGE_INTEGER cb, DWORD dwLockType) { return E_NOTIMPL; } STDMETHODIMP UnlockRegion(ULARGE_INTEGER libOffset, ULARGE_INTEGER cb, DWORD dwLockType) { return E_NOTIMPL; } STDMETHODIMP Stat(STATSTG *pstatstg, DWORD grfStatFlag); STDMETHODIMP Clone(IStream ** ppstm) { return E_NOTIMPL; } // // ISpStreamFormat // STDMETHODIMP GetFormat(GUID * pFormatId, WAVEFORMATEX ** ppCoMemWaveFormatEx); #ifdef SAPI_AUTOMATION //--- ISpeechMemoryStream ------------------------------------------------------- STDMETHODIMP get_Format(ISpeechAudioFormat** StreamFormat); STDMETHODIMP putref_Format(ISpeechAudioFormat* StreamFormat) { return E_FAIL; }; STDMETHODIMP Read(VARIANT* Buffer, long NumBytes, long* BytesRead); STDMETHODIMP Write(VARIANT Buffer, long* BytesWritten) { return STG_E_ACCESSDENIED; }; STDMETHODIMP Seek(VARIANT Position, SpeechStreamSeekPositionType Origin, VARIANT* NewPosition); STDMETHODIMP SetData(VARIANT Data) { return STG_E_ACCESSDENIED; }; STDMETHODIMP GetData(VARIANT* pData); #endif // SAPI_AUTOMATION }; #endif //__SPRESULT_H_