Я пишу DLL-библиотеку компонента WinRT на C++ для использования в моем приложении WinRT на основе .NET. Библиотека DLL определяет класс ссылки SoundSample, который создает голос XAudio, вызывая IXAudio2::CreateSourceVoice. 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++ и Я не мог найти разумного решения до сих пор. Как это лучше/проще всего сделать?