2016-05-31 21 views
2

CSCoreを使い始めたばかりで、多くのC++の後でC#に戻っています。ここでは、デフォルトのオーディオセッションマネージャのオーディオセッションを列挙したテストプログラムです、とそれぞれに空のイベントハンドラをアタッチ:CSCore:オーディオセッションイベントを聞くとアクセス違反が発生する

using System; 
using CSCore.CoreAudioAPI; 

class Program 
{ 
    static void Main(string[] args) 
    { 
     using (var enumerator = new MMDeviceEnumerator()) 
     using (var device = enumerator.GetDefaultAudioEndpoint(DataFlow.Render, Role.Multimedia)) 
     using (var sessionManager = AudioSessionManager2.FromMMDevice(device)) 
     using (var sessionEnumerator = sessionManager.GetSessionEnumerator()) 
     { 
      foreach (var control in sessionEnumerator) 
      { 
       var control2 = control.QueryInterface<AudioSessionControl2>(); 
       RegisterAudioSession(control2); 
      } 
     } 

     Console.WriteLine("Waiting..."); 
     Console.ReadKey(); 
    } 

    static void RegisterAudioSession(AudioSessionControl2 session) 
    { 
     if (session.Process != null) 
     { 
      var events = new AudioSessionEvents(); 
      session.RegisterAudioSessionNotification(events); 
     } 
    } 
} 
このプログラムがある間、私は自分のコンピュータの音量を変更できるように期待

問題なく走っています。ただし、これを試すと、プログラムはネイティブコードでアクセス違反でクラッシュします。ここでスタックトレースです:

> AudioSes.dll!CLockedList<ATL::CComPtr<IAudioSessionEvents>,0,1>::ForEachEntry() Unknown 
AudioSes.dll!CAudioSessionControl::OnAudioSessionEvent() Unknown 
AudioSes.dll!CAudioSessionControl::CAudioSessionNotificationDelegator::OnMediaNotification(struct MEDIA_NOTIFICATION_BLOCK *) Unknown 
MMDevAPI.dll!CMediaNotifications::OnMediaNotificationWorkerHandler(struct _TP_CALLBACK_INSTANCE *) Unknown 
MMDevAPI.dll!CMediaNotifications::MediaNotificationWorkerHandler(struct _TP_CALLBACK_INSTANCE *,void *) Unknown 
ntdll.dll!TppSimplepExecuteCallback() Unknown 
ntdll.dll!TppWorkerThread() Unknown 
[email protected]@12() Unknown 
ntdll.dll!__RtlUserThreadStart() Unknown 
[email protected]() Unknown 

あなたはRegisterAudioSessionNotificationへの呼び出しを削除するとクラッシュが発生しません。

空でないイベントハンドラを登録すると、クラッシュが発生します。

必要なリソースが処分されているにも関わらず、使用ブロックにConsole.ReadKey();を移動しようとしましたが、失敗しました。

ここでは説明と解決方法を探しました。 CSCoreのgithubページに関連する未解決の問題はありません。私は、ネイティブコードのクラッシュは、しばしばラッパーアセンブリの不正なシグニチャーによって引き起こされると読んでいます。 CSCoreのIAudioSessionEventsのすべてのメソッドをネイティブのIAudioSessionEventsメソッド(hereに列挙)と比較しましたが、明白な矛盾は見つかりませんでした。

This Firefox bugは、この特定のスタックトレースにオンラインで見つかった唯一の参考資料であり、解決されました。明らかに、Flash Player 19.0.0.159で解決されましたが、ソースが閲覧に利用できないことがわかっている限りは、

私のコードでエラーが見落とされていますか、これはCSCoreのバグですか?

答えて

1

このクラッシュは、ターゲットプラットフォームが32ビット(または私の場合、「Any CPU」が32ビットVSプロセスで実行されている)の場合に発生します。 64ビットのターゲットプラットフォームに切り替えると、私のために固定

関連する問題