private Collection <RecognizedPhrase> ExtractAlternates(int numberOfAlternates, bool isSapi53Header) { Collection <RecognizedPhrase> alternates = new(); if (numberOfAlternates > 0) { GCHandle gc = GCHandle.Alloc(_sapiAlternatesBlob, GCHandleType.Pinned); try { IntPtr buffer = gc.AddrOfPinnedObject(); int sizeOfSpSerializedPhraseAlt = Marshal.SizeOf <SPSERIALIZEDPHRASEALT>(); int offset = 0; for (int i = 0; i < numberOfAlternates; i++) { IntPtr altBuffer = new((long)buffer + offset); SPSERIALIZEDPHRASEALT alt = Marshal.PtrToStructure <SPSERIALIZEDPHRASEALT>(altBuffer); offset += sizeOfSpSerializedPhraseAlt; // advance over SPSERIALIZEDPHRASEALT if (isSapi53Header) { offset += (int)((alt.cbAltExtra + 7) & ~7); // advance over extra data with alignment padding } else { offset += (int)alt.cbAltExtra; // no alignment padding } // we cannot use a constructor parameter because RecognitionResult also derives from RecognizedPhrase IntPtr phraseBuffer = new((long)buffer + offset); SPSERIALIZEDPHRASE serializedPhrase = RecognizedPhrase.GetPhraseHeader(phraseBuffer, _header.ulPhraseAltDataSize - (uint)offset, _isSapi53Header); int serializedPhraseSize = (int)serializedPhrase.ulSerializedSize; RecognizedPhrase phrase = new(); // Get the alphabet of the raw phrase alternate, which should be the same as the engine bool hasIPAPronunciation = (_header.fAlphabet & (uint)SPRESULTALPHABET.SPRA_ENGINE_UPS) != 0; phrase.InitializeFromSerializedBuffer(this, serializedPhrase, phraseBuffer, serializedPhraseSize, isSapi53Header, hasIPAPronunciation); if (isSapi53Header) { offset += ((serializedPhraseSize + 7) & ~7); // advance over phrase with alignment padding } else { offset += serializedPhraseSize; // advance over phrase } alternates.Add(phrase); } } finally { gc.Free(); } } return(alternates); }
private Collection <RecognizedPhrase> ExtractAlternates(int numberOfAlternates, bool isSapi53Header) { Collection <RecognizedPhrase> collection = new Collection <RecognizedPhrase>(); if (numberOfAlternates > 0) { GCHandle gCHandle = GCHandle.Alloc(_sapiAlternatesBlob, GCHandleType.Pinned); try { IntPtr value = gCHandle.AddrOfPinnedObject(); int num = Marshal.SizeOf(typeof(SPSERIALIZEDPHRASEALT)); int num2 = 0; for (int i = 0; i < numberOfAlternates; i++) { IntPtr ptr = new IntPtr((long)value + num2); SPSERIALIZEDPHRASEALT sPSERIALIZEDPHRASEALT = (SPSERIALIZEDPHRASEALT)Marshal.PtrToStructure(ptr, typeof(SPSERIALIZEDPHRASEALT)); num2 += num; num2 = ((!isSapi53Header) ? (num2 + (int)sPSERIALIZEDPHRASEALT.cbAltExtra) : (num2 + (int)((sPSERIALIZEDPHRASEALT.cbAltExtra + 7) & -8))); IntPtr phraseBuffer = new IntPtr((long)value + num2); SPSERIALIZEDPHRASE phraseHeader = RecognizedPhrase.GetPhraseHeader(phraseBuffer, (uint)((int)_header.ulPhraseAltDataSize - num2), _isSapi53Header); int ulSerializedSize = (int)phraseHeader.ulSerializedSize; RecognizedPhrase recognizedPhrase = new RecognizedPhrase(); bool hasIPAPronunciation = (_header.fAlphabet & 2) != 0; recognizedPhrase.InitializeFromSerializedBuffer(this, phraseHeader, phraseBuffer, ulSerializedSize, isSapi53Header, hasIPAPronunciation); num2 = ((!isSapi53Header) ? (num2 + ulSerializedSize) : (num2 + ((ulSerializedSize + 7) & -8))); collection.Add(recognizedPhrase); } return(collection); } finally { gCHandle.Free(); } } return(collection); }