Estoy escribiendo una DLL Componente WinRT C++ para usar en mi aplicación WinRT basada en .NET. La DLL define una clase ref de SoundSample que crea una voz de XAudio llamando al IXAudio2::CreateSourceVoice. CreateSourceVoice toma un parámetro "IXAudio2VoiceCallback * pCallback" para habilitar devoluciones de llamada en varios eventos de audio. Ahora estoy tratando de implementar esa devolución de llamada según this article. XAudio se supone que acaba de llamar de nuevo en los métodos de mi clase SoundCallback definidos como:¿Cuál es la mejor manera de obtener una devolución de llamada de una instancia de una clase C++ nativa a una clase ref C++/CX?
#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);
};
Todo está bien hasta que intento encontrar la manera de volver a llamar desde una instancia de mi clase de devolución de llamada nativa al objeto SoundSample padres. Estaba pensando que podía pasar una instancia de la clase SoundSample al objeto SoundCallback, pero parece que no me permite declarar una clase de campo ref en la clase nativa:
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'
Miré de nuevo a las devoluciones de llamada de ejecución en C++ nativo y no pude encontrar una solución razonable hasta el momento. ¿Cuál es la mejor/más fácil manera de hacer esto?
Por cierto, si usted sabe de alguna manera de resolverlo - que ayudaría. Estoy bastante oxidado en C++ y lo único que se me ocurre es que la instancia de clase de referencia desarrolle un subproceso/se ejecute en un subproceso de subprocesamiento y espere a que suban los eventos provenientes de la clase nativa, con cosas como SetEvent, ResetEvent , WaitForSingleObject etc. –
¿Por qué está etiquetado con C++ 11? – Ivan
No sé mucho sobre C++ 11, pero supongo que este es un problema de mezclar Windows 8 C++/CX y C++ nativo - puede haber algunos aspectos de C++ 11 ... –