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