C++ 流和循环MS ADPCM(波形格式ADPCM)

C++ 流和循环MS ADPCM(波形格式ADPCM),c++,audio-streaming,xaudio2,adpcm,C++,Audio Streaming,Xaudio2,Adpcm,我试图用XOdio2(C++中)流MS-ADPCM文件,但这个问题似乎不是语言相关的。 该文件使用ADPCMEncode.exe进行编码,这将生成一个WAV文件,其格式标签为WAVE_format_ADPCM 与任何流一样,我创建了一个IXAudio2SourceVoice(从文件开始就有完整的ADPCMWAVEFORMAT),并根据请求向其提供块对齐的缓冲区。在循环时间到来之前,数据似乎表现良好 循环读卡器正如您所期望的那样:如果发生短读,则将偏移量返回到起始位置,然后进行另一次读取以填充缓冲

我试图用XOdio2(C++中)流MS-ADPCM文件,但这个问题似乎不是语言相关的。 该文件使用ADPCMEncode.exe进行编码,这将生成一个WAV文件,其格式标签为WAVE_format_ADPCM

与任何流一样,我创建了一个IXAudio2SourceVoice(从文件开始就有完整的ADPCMWAVEFORMAT),并根据请求向其提供块对齐的缓冲区。在循环时间到来之前,数据似乎表现良好

循环读卡器正如您所期望的那样:如果发生短读,则将偏移量返回到起始位置,然后进行另一次读取以填充缓冲区的其余部分。PCM正常,但对于MS ADPCM,有时声音会停止。它似乎不再要求更多的缓冲区,因此耗尽并停止

错误发生的时间各不相同。有时,数据循环一次,有时循环几次之后,就会发生这种情况。显然,我需要通过XAUDIO2\u缓冲区传递一些额外的信息,但是我找不到任何文档告诉我什么


有人能给我指出正确的方向吗?

再一次,为互联网牺牲尊严带来了成果

我意识到我在ADPCM中错误地使用了示例循环WAV段。它仍然在样本中,而不是字节中,因此需要转换为字节(因为ADPCM大约有25%的压缩,而立体声样本有4个字节,这两个值是相似的,这就是愚弄我的原因>__
unsigned int samplesPerBlock = m_format.nBlockAlign - 12;

unsigned int startBlock = sampleLoop.start / samplesPerBlock;
unsigned int startBlockOffset = sampleLoop.start % samplesPerBlock;

unsigned int endBlock = sampleLoop.end / samplesPerBlock;
unsigned int endBlockOffset = sampleLoop.end % samplesPerBlock;

unsigned int loopStart = startBlock * m_format.nBlockAlign;
unsigned int loopLength = (endBlock - startBlock) * m_format.nBlockAlign;