2012-04-03 15 views
5

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?

+0

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. –

+0

¿Por qué está etiquetado con C++ 11? – Ivan

+0

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 ... –

Respuesta

3

Resuelto (gracias a Jeremiah Morrill) - el problema no es con ninguna barrera que bloquee el uso de las clases de ref en las clases básicas. C4430 significa que SoundSample es un tipo no reconocido, que fue ocultado por Intellisense, ya que parecía indicar que SoundSample es conocido. Lo que debe agregarse es una declaración del tipo SoundSample y todo comienza a funcionar bien.

acabo añade

namespace MyNamespace { ref class SoundSample; } 

antes de la declaración de la clase SoundCallback y después de clase SoundCallback podría declarar:

MyNamespace::SoundSample^ sample; 
Cuestiones relacionadas