You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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 = 1
  • wBitsPerSample = 16,对应nBlockAlign = 2(声道数×位深/8),nAvgBytesPerSec = 22050×2 = 44100
  • wFormatTag必须为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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 18:20:33