我正在编写一个C++WinRT组件DLL,用于我的基于.NET的WinRT应用程序。DLL定义了一个SoundSample ref类,该类通过调用IXAudio2::CreateSourceVoice来创建XAudio语音。CreateSourceVoice采用"IXAudio2VoiceCallback*pCallback"参数来启用对各种音频事件的回调。现在我正试图在本文的基础上实现回调。XAudio应该只是回调我的SoundCallback类的方法,定义为:
#pragma once
#include "xaudio2.h"
#include "pch.h"
class SoundCallback
: public IXAudio2VoiceCallback
{
private:
//SoundSample^ sample; //does not compile
public:
SoundCallback(void);
~SoundCallback(void);
//Called when the voice has just finished playing a contiguous audio stream.
void OnStreamEnd();
void OnVoiceProcessingPassEnd();
void OnVoiceProcessingPassStart(UINT32 SamplesRequired);
void OnBufferEnd(void * pBufferContext);
void OnBufferStart(void * pBufferContext);
void OnLoopEnd(void * pBufferContext);
void OnVoiceError(void * pBufferContext, HRESULT Error);
};
一切都很好,直到我试图弄清楚如何从本机回调类的实例回调到父SoundSample对象。我想我可以将SoundSample类的一个实例传递给SoundCallback对象,但它似乎不允许我在原生类中声明ref类字段:
SoundCallback.h(9): error C2143: syntax error : missing ';' before '^'
SoundCallback.h(9): error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
SoundCallback.h(9): error C3699: '^' : cannot use this indirection on type 'int'
我回顾了在本机C++中实现回调的过程,到目前为止我还没有找到一个合理的解决方案。做这件事最好/最简单的方法是什么?
解决了它(多亏了Jeremiah Morrill)-问题不在于任何障碍阻止在基类中使用ref类。C4430意味着SoundSample是一个未被识别的类型,它被Intellisense隐藏了——因为这似乎表明SoundSample是已知的。需要添加的是SoundSample类型的声明,这一切都开始正常工作。
我刚刚添加了
namespace MyNamespace { ref class SoundSample; }
在SoundCallback类声明之前,然后SoundCallback类可以声明:
MyNamespace::SoundSample^ sample;