2012-04-03 11 views
5

.NETベースのWinRTアプリケーションで使用するためのC++ WinRTコンポーネントDLLを作成しています。 DLLは、IXAudio2::CreateSourceVoiceを呼び出してXAudio音声を生成するSoundSample refクラスを定義します。 CreateSourceVoiceは "IXAudio2VoiceCallback * pCallback"パラメータを取り、さまざまなオーディオイベントのコールバックを有効にします。今私はthis articleに基づいてそのコールバックを実装しようとしています。 XAudioは、おそらく同じように定義された私のSoundCallbackクラスのメソッドにコールバックします:私は親SoundSampleオブジェクトに私のネイティブのコールバッククラスのインスタンスからコールバックする方法を見つけ出すことを試みるまでネイティブC++クラスのインスタンスからC++/CX refクラスにコールバックを取得する最善の方法は何ですか?

#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); 
}; 

すべてが正常です。私はSoundCallbackオブジェクトにSoundSampleクラスのインスタンスを渡すことができ考えていたが、それは私がネイティブクラスの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 + +と私はこれまでの合理的な解決策を見つけることができませんでした。これを行う最も簡単な方法は何ですか?

+0

ところで、あなたはそれを解決する方法を知っていれば - 役立つだろう。私はC++ではむしろ錆びています。唯一のことは、refクラスのインスタンスをスレッド・スピンアップしてスレッド・スレッドで実行し、ネイティブ・クラスからのスレッド・イベントを待つことです。SetEvent、ResetEventなど、WaitForSingleObjectなど –

+0

これはC++ 11でタグ付けされているのはなぜですか? – Ivan

+0

私はC++ 11についてよく分かりませんが、これはWindows 8 C++/CXとネイティブC++の混在の問題であると思います.C++ 11の側面があるかもしれません... –

答えて

3

解決しました(Jeremiah Morrillのおかげで) - 問題は基本クラスのrefクラスの使用をブロックするバリアではありません。 C4430は、SoundSampleが認識されないタイプで、Intellisenseによって隠されていることを意味します.SoundSampleが知られていると思われるからです。 追加する必要があるのは、SoundSampleタイプの宣言で、これはすべて正常に動作します。

私はちょうどSoundCallbackクラス宣言の前
namespace MyNamespace { ref class SoundSample; } 

を添加し、次いでSoundCallbackクラスが宣言することができます:

MyNamespace::SoundSample^ sample; 
関連する問題