Source code of Windows XP (NT5)
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

258 lines
8.4 KiB

  1. // SpResult.h : Declaration of the CSpResult
  2. #ifndef __SPRESULT_H_
  3. #define __SPRESULT_H_
  4. #include "resource.h" // main symbols
  5. #include "speventq.h"
  6. #include "spphrase.h"
  7. #include "spcollec.h"
  8. #include "StreamHlp.h"
  9. ///interface SpContextPrivate; // defined in recoctxt.h
  10. class CRecoCtxt;
  11. ////////////////////////////////////////////////////////////////////////////
  12. // CSpResult
  13. class ATL_NO_VTABLE CSpResult;
  14. class ATL_NO_VTABLE CSpPhraseAlt;
  15. class ATL_NO_VTABLE CRecoContext;
  16. typedef CComObject<CSpResult> CSpResultObject;
  17. class ATL_NO_VTABLE CSpResult :
  18. public CComObjectRootEx<CComMultiThreadModel>,
  19. public ISpRecoResult
  20. #ifdef SAPI_AUTOMATION
  21. , public IDispatchImpl<ISpeechRecoResult, &IID_ISpeechRecoResult, &LIBID_SpeechLib, 5>
  22. #endif SAPI_AUTOMATION
  23. {
  24. private:
  25. float m_fRetainedScaleFactor;
  26. public:
  27. CSpResultObject * m_pNext; // weak reference
  28. SPRESULTHEADER * m_pResultHeader;
  29. BOOL m_fWeakCtxtRef;
  30. CRecoCtxt * m_pCtxt;
  31. CComPtr<CPhrase> m_Phrase;
  32. CSpResult() : m_pNext(NULL), m_pResultHeader(NULL), m_pAltRequest(NULL), m_pCtxt(NULL)
  33. {
  34. CComObject<CPhrase> *pPhrase;
  35. CComObject<CPhrase>::CreateInstance(&pPhrase);
  36. m_Phrase = pPhrase;
  37. m_fWeakCtxtRef = FALSE;
  38. m_fRetainedScaleFactor = 0.0F;
  39. m_fUseTextReplacements = VARIANT_TRUE;
  40. }
  41. void FinalRelease();
  42. void RemoveAllAlternates();
  43. void RemoveAlternate(CSpPhraseAlt *pAlt);
  44. HRESULT CommitAlternate(SPPHRASEALT *pAlt);
  45. HRESULT DeserializeCnCAlternates( ULONG ulRequestCount, ISpPhraseAlt **ppAlts, ULONG *pcAltsReturned );
  46. DECLARE_GET_CONTROLLING_UNKNOWN();
  47. DECLARE_PROTECT_FINAL_CONSTRUCT()
  48. BEGIN_COM_MAP(CSpResult)
  49. COM_INTERFACE_ENTRY(ISpPhrase)
  50. COM_INTERFACE_ENTRY(ISpRecoResult)
  51. #ifdef SAPI_AUTOMATION
  52. COM_INTERFACE_ENTRY(ISpeechRecoResult)
  53. COM_INTERFACE_ENTRY(IDispatch)
  54. #endif // SAPI_AUTOMATION
  55. END_COM_MAP()
  56. //
  57. // ISpRecoResult
  58. //
  59. STDMETHODIMP GetResultTimes(SPRECORESULTTIMES *pTimes);
  60. STDMETHODIMP GetAlternates(ULONG ulAltCount, ULONG ulStartElement, ULONG cElements,
  61. ISpPhraseAlt **ppPhrases, ULONG *pcPhrasesReturned);
  62. STDMETHODIMP Serialize(SPSERIALIZEDRESULT ** ppCoMemSerializedResult);
  63. STDMETHODIMP GetAudio(ULONG ulStartElement, ULONG cElements, ISpStreamFormat **ppStream);
  64. STDMETHODIMP SpeakAudio(ULONG ulStartElement, ULONG cElements, DWORD dwFlags, ULONG * pulStreamNumber);
  65. STDMETHODIMP ScaleAudio(const GUID *pAudioFormatId, const WAVEFORMATEX *pWaveFormatEx);
  66. //
  67. // ISpPhrase
  68. //
  69. STDMETHODIMP GetPhrase(SPPHRASE ** ppPhrase)
  70. {
  71. return m_Phrase->GetPhrase(ppPhrase);
  72. }
  73. STDMETHODIMP GetSerializedPhrase(SPSERIALIZEDPHRASE ** ppPhrase)
  74. {
  75. return m_Phrase->GetSerializedPhrase(ppPhrase);
  76. }
  77. STDMETHODIMP GetText(ULONG ulStart, ULONG ulCount, BOOL fUseTextReplacements,
  78. WCHAR ** ppszCoMemText, BYTE * pbDisplayAttributes)
  79. {
  80. return m_Phrase->GetText(ulStart, ulCount, fUseTextReplacements,
  81. ppszCoMemText, pbDisplayAttributes);
  82. }
  83. STDMETHODIMP Discard(DWORD dwFlags);
  84. STDMETHODIMP GetRecoContext(ISpRecoContext ** ppRecoContext);
  85. #ifdef SAPI_AUTOMATION
  86. //--- ISpeechRecoResult -----------------------------------------------------
  87. STDMETHODIMP get_RecoContext( ISpeechRecoContext** RecoContext );
  88. STDMETHODIMP get_Times( ISpeechRecoResultTimes** Times );
  89. STDMETHODIMP putref_AudioFormat( ISpeechAudioFormat* pFormat );
  90. STDMETHODIMP get_AudioFormat( ISpeechAudioFormat** ppFormat );
  91. STDMETHODIMP get_PhraseInfo( ISpeechPhraseInfo** ppPhraseInfo );
  92. STDMETHODIMP Alternates( long lRequestCount, long lStartElement,
  93. long cElements, ISpeechPhraseAlternates** Alternates );
  94. STDMETHODIMP Audio( long lStartElement, long cElements, ISpeechMemoryStream **Stream );
  95. STDMETHODIMP SpeakAudio( long lStartElement, long cElements, SpeechVoiceSpeakFlags eFlags, long* StreamNumber );
  96. STDMETHODIMP SaveToMemory( VARIANT* ResultBlock );
  97. STDMETHODIMP DiscardResultInfo( SpeechDiscardType DiscardTypes );
  98. #endif // SAPI_AUTOMATION
  99. #ifdef _WIN32_WCE
  100. // Dummy Compare funcs are here because the CE compiler
  101. // is expanding templates for functions that aren't being called
  102. static LONG Compare(const CSpResult *, const CSpResult *)
  103. {
  104. return 0;
  105. }
  106. #endif
  107. HRESULT Init(CRecoCtxt * pParent, SPRESULTHEADER *pPhrase);
  108. void WeakCtxtRef(BOOL fWeakCtxtRef);
  109. STDMETHODIMP ScalePhrase(void);
  110. private:
  111. STDMETHODIMP InternalScalePhrase(SPRESULTHEADER *pNewPhraseHdr);
  112. STDMETHODIMP InternalScalePhrase(SPRESULTHEADER *pNewPhraseHdr, SPINTERNALSERIALIZEDPHRASE *pPhraseData);
  113. // We hold a pointer to the latest request, for correction
  114. SPPHRASEALTREQUEST * m_pAltRequest;
  115. // We hold the list of alternates we've passed out so we can kill
  116. // them when we're released
  117. CSPList<CSpPhraseAlt*, CSpPhraseAlt*> m_listpAlts;
  118. VARIANT_BOOL m_fUseTextReplacements;
  119. };
  120. class ATL_NO_VTABLE CSpResultAudioStream :
  121. public CComObjectRootEx<CComMultiThreadModel>,
  122. public ISpStreamFormat,
  123. public ISpEventSource
  124. #ifdef SAPI_AUTOMATION
  125. , public IDispatchImpl<ISpeechMemoryStream, &IID_ISpeechMemoryStream, &LIBID_SpeechLib, 5>
  126. #endif SAPI_AUTOMATION
  127. {
  128. public:
  129. CSpEventSource m_SpEventSource;
  130. CSpStreamFormat m_StreamFormat;
  131. ULONG m_cbDataSize;
  132. ULONG m_ulCurSeekPos;
  133. BYTE * m_pData;
  134. BEGIN_COM_MAP(CSpResultAudioStream)
  135. COM_INTERFACE_ENTRY(IStream)
  136. COM_INTERFACE_ENTRY(ISpStreamFormat)
  137. COM_INTERFACE_ENTRY(ISpEventSource)
  138. COM_INTERFACE_ENTRY(ISpNotifySource)
  139. #ifdef SAPI_AUTOMATION
  140. COM_INTERFACE_ENTRY(ISpeechMemoryStream)
  141. COM_INTERFACE_ENTRY(ISpeechBaseStream)
  142. COM_INTERFACE_ENTRY(IDispatch)
  143. #endif // SAPI_AUTOMATION
  144. END_COM_MAP()
  145. DECLARE_SPEVENTSOURCE_METHODS(m_SpEventSource)
  146. CSpResultAudioStream() :
  147. m_SpEventSource(this),
  148. m_cbDataSize(0),
  149. m_ulCurSeekPos(0),
  150. m_pData(NULL)
  151. {
  152. m_SpEventSource._SetInterest(SPFEI(SPEI_WORD_BOUNDARY), SPFEI(SPEI_WORD_BOUNDARY));
  153. }
  154. ~CSpResultAudioStream()
  155. {
  156. delete[] m_pData;
  157. }
  158. HRESULT Init(ULONG cbAudioSizeIncFormat, const BYTE * pAudioDataIncFormat,
  159. ULONG ulAudioStartOffset, ULONG ulAudioSize,
  160. const SPEVENT * pEvents, ULONG cEvents);
  161. //
  162. // IStream
  163. //
  164. STDMETHODIMP Read(void * pv, ULONG cb, ULONG * pcbRead);
  165. STDMETHODIMP Write(const void * pv, ULONG cb, ULONG * pcbWritten)
  166. {
  167. return STG_E_ACCESSDENIED;
  168. }
  169. STDMETHODIMP Seek(LARGE_INTEGER dlibMove, DWORD dwOrigin, ULARGE_INTEGER *plibNewPosition);
  170. STDMETHODIMP SetSize(ULARGE_INTEGER libNewSize)
  171. {
  172. return STG_E_ACCESSDENIED;
  173. }
  174. STDMETHODIMP CopyTo(IStream *pStreamDest, ULARGE_INTEGER cb, ULARGE_INTEGER *pcbRead, ULARGE_INTEGER __RPC_FAR *pcbWritten)
  175. {
  176. return SpGenericCopyTo(this, pStreamDest, cb, pcbRead, pcbWritten);
  177. }
  178. STDMETHODIMP Commit(DWORD grfCommitFlags)
  179. {
  180. return S_OK;
  181. }
  182. STDMETHODIMP Revert(void)
  183. {
  184. return E_NOTIMPL;
  185. }
  186. STDMETHODIMP LockRegion(ULARGE_INTEGER libOffset, ULARGE_INTEGER cb, DWORD dwLockType)
  187. {
  188. return E_NOTIMPL;
  189. }
  190. STDMETHODIMP UnlockRegion(ULARGE_INTEGER libOffset, ULARGE_INTEGER cb, DWORD dwLockType)
  191. {
  192. return E_NOTIMPL;
  193. }
  194. STDMETHODIMP Stat(STATSTG *pstatstg, DWORD grfStatFlag);
  195. STDMETHODIMP Clone(IStream ** ppstm)
  196. {
  197. return E_NOTIMPL;
  198. }
  199. //
  200. // ISpStreamFormat
  201. //
  202. STDMETHODIMP GetFormat(GUID * pFormatId, WAVEFORMATEX ** ppCoMemWaveFormatEx);
  203. #ifdef SAPI_AUTOMATION
  204. //--- ISpeechMemoryStream -------------------------------------------------------
  205. STDMETHODIMP get_Format(ISpeechAudioFormat** StreamFormat);
  206. STDMETHODIMP putref_Format(ISpeechAudioFormat* StreamFormat) { return E_FAIL; };
  207. STDMETHODIMP Read(VARIANT* Buffer, long NumBytes, long* BytesRead);
  208. STDMETHODIMP Write(VARIANT Buffer, long* BytesWritten) { return STG_E_ACCESSDENIED; };
  209. STDMETHODIMP Seek(VARIANT Position, SpeechStreamSeekPositionType Origin, VARIANT* NewPosition);
  210. STDMETHODIMP SetData(VARIANT Data) { return STG_E_ACCESSDENIED; };
  211. STDMETHODIMP GetData(VARIANT* pData);
  212. #endif // SAPI_AUTOMATION
  213. };
  214. #endif //__SPRESULT_H_