Как лучше всего получить обратный вызов от экземпляра собственный класс C++ для класса ссылки C++/CX?

Я пишу 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++ и Я не мог найти разумного решения до сих пор. Как это лучше/проще всего сделать?

5
задан James McNellis 4 April 2012 в 02:58
поделиться