1

基本的に、オーディオストリームの内容をchar *バッファに読み込んで、FFTを適用しようとしています。FFTを適用した後に行う必要のある変換を単純化するためにSAPIを使用しています。

HGLOBALに割り当てたIStreamバッファがあります

// 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

4

1 に答える 1

3

SAPIがストリームを書き込んだ後、ストリームの位置は最後にあるため、IStream::Readはその「読み取り」出力をゼロバイトに設定します。

ストリームから読み取る前に、IStream :: Seek(zero、STREAM_SEEK_SET、NULL)を呼び出すと、データを読み取ることができます。

于 2013-03-14T06:22:27.947 に答える