XAudio2 SubmitSourceBuffer调用失败(XAUDIO2_E_INVALID_CALL)求助
排查XAudio2调用SubmitSourceBuffer返回XAUDIO2_E_INVALID_CALL的问题
针对你遇到的pacman_siren.wav无法通过XAudio2播放,调用SubmitSourceBuffer返回XAUDIO2_E_INVALID_CALL(0x88960001)的问题,结合XAudio2的错误逻辑,按以下方向逐一排查:
1. 核对源Voice与WAV文件的格式匹配性
XAUDIO2_E_INVALID_CALL常见原因之一是源Voice的格式与音频Buffer格式不匹配。即使你确认WAV是单声道22050Hz 16位PCM,也要严格比对创建源Voice时的WAVEFORMATEX参数:
- 确保
nSamplesPerSec= 22050 nChannels= 1wBitsPerSample= 16,对应nBlockAlign= 2(声道数×位深/8),nAvgBytesPerSec= 22050×2 = 44100wFormatTag必须为WAVE_FORMAT_PCM(值为1),如果使用WAVEFORMATEXTENSIBLE,需保证SubFormat对应KSDATAFORMAT_SUBTYPE_PCM
2. 检查XAUDIO2_BUFFER参数的有效性
确认你传入SubmitSourceBuffer的XAUDIO2_BUFFER结构体没有参数错误:
AudioBytes必须是WAV文件实际音频数据的大小,而非整个文件大小(需跳过WAV文件头,标准PCM WAV头通常为44字节,但如果存在额外块需调整)pAudioData必须指向音频数据的起始位置,而非文件头- 检查
Flags设置:如果是单次播放,不要误设XAUDIO2_END_OF_STREAM(除非这是最后一个要提交的Buffer);避免设置冲突的标志位 - 若启用循环,
pLoopRegion的LoopBegin和LoopLength必须在AudioBytes范围内,且LoopLength不能为0
3. 验证WAV文件的实际格式与完整性
即使你认为格式正确,仍可能存在文件头异常:
- 用Audacity等工具重新导出该WAV文件,严格选择单声道、22050Hz采样率、16位PCM格式,替换原文件后测试
- 手动解析WAV文件头:确认fmt块的
wFormatTag为1(PCM),data块的大小与实际音频数据长度一致,避免文件头损坏或参数不匹配
4. 检查源Voice的状态与调用时机
- 确认创建源Voice时返回的HRESULT为
S_OK,排除Voice创建失败的隐性问题 - 若之前对该Voice调用过
Stop,需先调用Start恢复Voice状态,再提交Buffer - 确保调用
SubmitSourceBuffer时,Voice未处于销毁或未初始化状态
内容的提问来源于stack exchange,提问作者tmal
相关产品推荐
相关产品推荐

