c++ - IXAudio2->CreateSoundVoice 返回错误
问题描述
我正在尝试制作简单的声音缓冲区并使用 XAudio 2 播放它。
首先我初始化了 IXAudio2
IXAudio2* XAudio = 0;
int XAudioInitFailed = XAudio2Create(&XAudio, 0, XAUDIO2_DEFAULT_PROCESSOR);
//check for failure
IXAudio2MasteringVoice* MasterVoice = 0;
XAudio->CreateMasteringVoice(&MasterVoice);
接下来我填充我的数据。
// Mono 8-bit 44.1kHz PCM format
WAVEFORMATEX WaveFormat = {};
WaveFormat.wFormatTag = WAVE_FORMAT_PCM;
WaveFormat.nChannels = 1;
WaveFormat.nSamplesPerSec = 44100;
WaveFormat.wBitsPerSample = 8;
WaveFormat.nBlockAlign = WaveFormat.nChannels * WaveFormat.wBitsPerSample / 8;
WaveFormat.nAvgBytesPerSec = WaveFormat.nSamplesPerSec * WaveFormat.nBlockAlign;
WaveFormat.cbSize = sizeof(WAVEFORMATEX);
// Populating my SoundBuffer
// Creating XAudio sound buffer struct
IXAudio2SourceVoice* SourceVoice = 0;
int code = XAudio->CreateSourceVoice(&SourceVoice, &WaveFormat);
SourceVoice->SubmitSourceBuffer(&XBuffer); //this line triggers exceptions
SourceVoice->Start(0);
而当我运行代码时,就会触发异常SourceVoice->SubmitSourceBuffer(&XBuffer);
,代码是根据Microsoft windows API页面的0x88960001
意思。XAUDIO2_E_INVALID_CALL
帮我弄清楚可能是什么问题。
更新:完整代码:
WinAudio = {};
IXAudio2* XAudio = 0;
int XAudioInitFailed = XAudio2Create(&XAudio, 0, XAUDIO2_DEFAULT_PROCESSOR);
if(!XAudioInitFailed) {
//NOTE: creating the mastering voice
IXAudio2MasteringVoice* MasterVoice = 0;
XAudio->CreateMasteringVoice(&MasterVoice);
//NOTE: initializing PlayBuffer
// Mono 8-bit 44.1kHz PCM format
WAVEFORMATEX WaveFormat = {};
WaveFormat.wFormatTag = WAVE_FORMAT_PCM;
WaveFormat.nChannels = 1;
WaveFormat.nSamplesPerSec = 44100;
WaveFormat.wBitsPerSample = 8;
WaveFormat.nBlockAlign = WaveFormat.nChannels * WaveFormat.wBitsPerSample / 8;
WaveFormat.nAvgBytesPerSec = WaveFormat.nSamplesPerSec * WaveFormat.nBlockAlign;
WaveFormat.cbSize = sizeof(WAVEFORMATEX);
// NOTE: initializing SoundBuffer
int SampleFrequency = 256;
int Samples = WaveFormat.nSamplesPerSec;
int AudioBytes = Samples * WaveFormat.nBlockAlign;
i1* SoundBuffer = (i1*)malloc(AudioBytes);
i1* WritePointer = SoundBuffer;
for(int Sample = 0;
Sample < Samples;
Sample ++) {
i1 value = ((Sample / SampleFrequency)%2)*10;
*WritePointer++ = value;
//*WritePointer++ = value;
}
// NOTE: Creating Sound
XAUDIO2_BUFFER XBuffer = {};
XBuffer.Flags = XAUDIO2_END_OF_STREAM;
XBuffer.AudioBytes = AudioBytes;
XBuffer.pAudioData = (const BYTE*)SoundBuffer;
// NOTE: The following parameters are
// measured in samples
XBuffer.PlayBegin = 0;
XBuffer.PlayLength = 0;
XBuffer.LoopBegin = 0;
XBuffer.LoopLength = 0;
XBuffer.LoopCount = XAUDIO2_LOOP_INFINITE;
IXAudio2SourceVoice* SourceVoice = 0;
int code = XAudio->CreateSourceVoice(&SourceVoice, &WaveFormat);
SourceVoice->SubmitSourceBuffer(&XBuffer);
SourceVoice->Start(0);
} else {
// TODO: Diagnose
InvalidCodePath;
}
解决方案
您必须检查错误CreateMasterVoice
,如果失败,CreateSourceVoice
也会失败。该错误XAUDIO2_E_INVALID_CALL
使我认为那CreateMasterVoice
并不成功。
来自 will 的错误CreateMasterVoice
会为您提供有关该问题的更多提示。例如,您可能忘记CoInitialize
在创建 XAudio2 之前调用,在这种情况下CreateMasterVoice
失败并显示CO_E_NOTINITIALIZED
.
推荐阅读
- heroku - Heroku Container multi-stage build failing to find file
- javascript - logic that works on every browser/device except samsung internet
- javascript - add id to checkbox using loop
- wordpress - XAMPP Wordpress 在 localhost 下创建不同的网站
- c - GtkDrawingArea won't update when drawing happens if Glade is used
- multithreading - 使用信号量同步 N 个进程 - 条件竞争
- c++ - C++/WinApi Memory Usage rising when moving window
- android - java.lang.RuntimeException: Parcelable encountered IOException writing serializable
- azure - Azure IOT Central 复杂规则
- python - 相似词替换成新词