Чтение из IStream в буфер (аудио)

Я в основном пытаюсь прочитать содержимое аудиопотока в буфер char *, чтобы применить FFT.
Я использую SAPI, чтобы упростить преобразования, которые мне нужно будет сделать после применения моего БПФ.

У меня есть буфер IStream, который я выделил на HGLOBAL

// Address of IStream* pointer variable that receives the interface pointer to the new stream object.
CComPtr<IStream> pMemStream;
// A memory handle allocated by the GlobalAlloc function, or if NULL a new handle is to be allocated instead.
HGLOBAL hGlobal = GlobalAlloc(GMEM_MOVEABLE, sizeof(pMemStream));
// Create stream object that uses an HGLOBAL memory handle to store the stream contents.
hr = ::CreateStreamOnHGlobal(hGlobal, TRUE, &pMemStream);

Затем я написал WAV содержание в этот поток

// Variable to receive ISpStream pointer
CComPtr<ISpStream> cpSpStream;
hr = cpSpStream.CoCreateInstance(CLSID_SpStream);
hr = cpSpStream->SetBaseStream(pMemStream, SPDFID_WaveFormatEx, defaultStreamFormat.WaveFormatExPtr());
hr = cpVoice->SetOutput(cpSpStream, TRUE);
hr = cpVoice->Speak(L"This is a phrase.", SPF_DEFAULT, NULL);

Я могу проверить, что поток содержит содержимое WAV, говоря поток:

// Speak the modified stream.
cpVoice->SetOutput(NULL, FALSE);
cpVoice->SpeakStream(cpSpStream, SPF_DEFAULT, NULL);

Однако, когда я пытаюсь получить буфер для потока, я читаю только данные мусора (все ‘=’ в буфере).

IStream *pIstream;
cpSpStream->GetBaseStream(&pIstream);
STATSTG stats;
pIstream->Stat(&stats, STATFLAG_NONAME);
ULONG sSize = stats.cbSize.QuadPart;
ULONG bytesRead;
char *pBuffer = new char[sSize];
pIstream->Read(pBuffer, sSize, &bytesRead);

Что я делаю неправильно? Это сводит меня с ума.
Спасибо,
-Francisco

1

Решение

После того, как SAPI записывает поток, позиция потока находится в конце, поэтому IStream :: Read установит свой вывод «read» в ноль байтов.

Перед чтением из потока вызовите IStream :: Seek (ноль, STREAM_SEEK_SET, NULL), и вы сможете прочитать данные.

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]